From 640e47a30549916cad3021a4f38948b861bc66bb Mon Sep 17 00:00:00 2001 From: open-fox Date: Sun, 9 Aug 2026 23:23:29 +0800 Subject: [PATCH] feat: open source Mkdirs --- .cursor/rules/01-project-overview.mdc | 33 + .cursor/rules/02-tech-stack.mdc | 43 + .cursor/rules/03-app-structure.mdc | 50 + .cursor/rules/04-sanity-integration.mdc | 63 + .cursor/rules/05-ai-integration.mdc | 33 + .cursor/rules/06-development-guide.mdc | 53 + .cursor/rules/07-best-practices.mdc | 73 + .env.example | 114 + .github/ISSUE_TEMPLATE/bug_report.md | 38 + .github/ISSUE_TEMPLATE/config.yml | 11 + .github/ISSUE_TEMPLATE/feature_request.md | 20 + .gitignore | 41 + .vscode/extensions.json | 7 + .vscode/settings.json | 22 + AGENTS.md | 79 + CLAUDE.md | 79 + Dockerfile | 61 + LICENSE | 201 + README.md | 52 + biome.json | 36 + components.json | 17 + emails/approval-email.tsx | 119 + emails/email-formats.ts | 62 + emails/newsletter-welcome.tsx | 98 + emails/notify-submission-to-admin.tsx | 99 + emails/notify-submission-to-user.tsx | 119 + emails/payment-success.tsx | 123 + emails/rejection-email.tsx | 107 + emails/reset-password.tsx | 109 + emails/verify-email.tsx | 101 + next.config.docker.mjs | 52 + next.config.mjs | 51 + package.json | 159 + pnpm-lock.yaml | 16791 ++++++++++++++++ postcss.config.js | 6 + public/android-chrome-192x192.png | Bin 0 -> 15248 bytes public/android-chrome-512x512.png | Bin 0 -> 34614 bytes public/apple-touch-icon.png | Bin 0 -> 13725 bytes public/favicon-16x16.png | Bin 0 -> 749 bytes public/favicon-32x32.png | Bin 0 -> 1753 bytes public/favicon.ico | Bin 0 -> 15406 bytes public/logo-dark.png | Bin 0 -> 8843 bytes public/logo.png | Bin 0 -> 8843 bytes public/logo_mkdirs.png | Bin 0 -> 8843 bytes public/og.png | Bin 0 -> 246035 bytes public/placeholder.svg | 1 + public/site.webmanifest | 1 + sanity-typegen.json | 6 + sanity.cli.ts | 14 + sanity.config.ts | 96 + sanity.types.ts | 2461 +++ schema.json | 3022 +++ scripts/batch-all.ts | 124 + scripts/batch-category.ts | 252 + scripts/batch-group.ts | 103 + scripts/batch-item-manual.ts | 252 + scripts/batch-item-microlink.ts | 243 + scripts/batch-item.ts | 375 + scripts/batch-tag.ts | 345 + scripts/explore-aisdk.ts | 162 + scripts/explore-microlink.ts | 138 + scripts/export-user-emails.ts | 29 + src/actions/admin.ts | 23 + src/actions/create-checkout-session.ts | 140 + src/actions/edit.ts | 184 + src/actions/fetch-website.ts | 270 + src/actions/get-banner-ad.ts | 52 + src/actions/login.ts | 74 + src/actions/logout.ts | 7 + src/actions/new-password.ts | 56 + src/actions/new-verification.ts | 41 + src/actions/open-customer-portal.ts | 44 + src/actions/publish.ts | 45 + src/actions/register.ts | 53 + src/actions/reset.ts | 37 + src/actions/settings.ts | 78 + src/actions/submit-to-review.ts | 67 + src/actions/submit.ts | 141 + src/actions/subscribe-to-newsletter.ts | 54 + src/actions/unpublish.ts | 46 + src/actions/unsubscribe-to-newsletter.ts | 47 + src/actions/update-link.ts | 56 + src/actions/update-name.ts | 56 + src/actions/update-password.ts | 60 + src/app/(sanity)/layout.tsx | 13 + src/app/(sanity)/studio/[[...index]]/page.tsx | 11 + .../(newsletter)/unsubscribe/page.tsx | 53 + .../(submit)/payment/[id]/layout.tsx | 20 + .../(submit)/payment/[id]/loading.tsx | 20 + .../(submit)/payment/[id]/page.tsx | 66 + .../(submit)/publish/[id]/layout.tsx | 20 + .../(submit)/publish/[id]/loading.tsx | 5 + .../(submit)/publish/[id]/page.tsx | 82 + .../(protected)/(submit)/submit/layout.tsx | 20 + .../(protected)/(submit)/submit/loading.tsx | 5 + .../(protected)/(submit)/submit/page.tsx | 28 + .../(protected)/dashboard/layout.tsx | 32 + .../(protected)/dashboard/loading.tsx | 5 + .../(website)/(protected)/dashboard/page.tsx | 61 + .../(protected)/edit/[id]/layout.tsx | 17 + .../(protected)/edit/[id]/loading.tsx | 5 + .../(website)/(protected)/edit/[id]/page.tsx | 66 + src/app/(website)/(protected)/layout.tsx | 32 + .../(website)/(protected)/settings/layout.tsx | 13 + .../(protected)/settings/loading.tsx | 5 + .../(website)/(protected)/settings/page.tsx | 34 + src/app/(website)/(public)/(home)/layout.tsx | 34 + src/app/(website)/(public)/(home)/loading.tsx | 5 + src/app/(website)/(public)/(home)/page.tsx | 81 + .../(public)/(test)/home2/layout.tsx | 24 + .../(public)/(test)/home2/loading.tsx | 16 + .../(website)/(public)/(test)/home2/page.tsx | 12 + .../(public)/(test)/home3/layout.tsx | 22 + .../(public)/(test)/home3/loading.tsx | 5 + .../(website)/(public)/(test)/home3/page.tsx | 85 + .../(public)/(test)/loading/page.tsx | 27 + src/app/(website)/(public)/[slug]/layout.tsx | 11 + src/app/(website)/(public)/[slug]/loading.tsx | 38 + src/app/(website)/(public)/[slug]/page.tsx | 65 + .../blog/(blog)/category/[slug]/loading.tsx | 5 + .../blog/(blog)/category/[slug]/page.tsx | 84 + .../(website)/(public)/blog/(blog)/layout.tsx | 29 + .../(public)/blog/(blog)/loading.tsx | 5 + .../(website)/(public)/blog/(blog)/page.tsx | 49 + .../(website)/(public)/blog/[slug]/layout.tsx | 17 + .../(public)/blog/[slug]/loading.tsx | 84 + .../(website)/(public)/blog/[slug]/page.tsx | 193 + .../(public)/category/[slug]/page.tsx | 107 + .../(website)/(public)/category/layout.tsx | 28 + .../(website)/(public)/category/loading.tsx | 5 + src/app/(website)/(public)/category/page.tsx | 73 + .../(public)/collection/[slug]/loading.tsx | 24 + .../(public)/collection/[slug]/page.tsx | 136 + .../(website)/(public)/collection/loading.tsx | 24 + .../(website)/(public)/collection/page.tsx | 74 + .../(website)/(public)/item/[slug]/layout.tsx | 17 + .../(public)/item/[slug]/loading.tsx | 123 + .../(website)/(public)/item/[slug]/page.tsx | 318 + src/app/(website)/(public)/layout.tsx | 24 + src/app/(website)/(public)/pricing/page.tsx | 57 + src/app/(website)/(public)/search/layout.tsx | 28 + src/app/(website)/(public)/search/loading.tsx | 5 + src/app/(website)/(public)/search/page.tsx | 83 + .../(website)/(public)/tag/[slug]/page.tsx | 99 + src/app/(website)/(public)/tag/layout.tsx | 26 + src/app/(website)/(public)/tag/loading.tsx | 5 + src/app/(website)/(public)/tag/page.tsx | 74 + src/app/(website)/auth/error/page.tsx | 15 + src/app/(website)/auth/layout.tsx | 37 + src/app/(website)/auth/loading.tsx | 5 + src/app/(website)/auth/login/page.tsx | 15 + src/app/(website)/auth/new-password/page.tsx | 15 + .../(website)/auth/new-verification/page.tsx | 15 + src/app/(website)/auth/register/page.tsx | 15 + src/app/(website)/auth/reset/page.tsx | 15 + src/app/(website)/error.tsx | 54 + src/app/(website)/layout.tsx | 64 + src/app/(website)/loading.tsx | 5 + src/app/(website)/not-found.tsx | 21 + src/app/api/auth/[...nextauth]/route.ts | 28 + src/app/api/disable-draft/route.ts | 14 + src/app/api/draft/route.tsx | 35 + src/app/api/og/route.tsx | 75 + src/app/api/send-email/route.ts | 74 + src/app/api/upload-image/route.ts | 23 + src/app/api/webhook/route.ts | 133 + src/app/robots.ts | 15 + src/app/sitemap.ts | 286 + ...bricolage-grotesque-v7-latin-regular.woff2 | Bin 0 -> 22528 bytes src/assets/fonts/index.ts | 45 + .../source-sans-3-v15-latin-regular.woff2 | Bin 0 -> 15628 bytes .../source-serif-4-v8-latin-regular.woff2 | Bin 0 -> 20044 bytes .../fonts/work-sans-v19-latin-regular.woff2 | Bin 0 -> 20000 bytes src/auth.config.ts | 76 + src/auth.ts | 111 + src/components/analytics/analytics.tsx | 26 + src/components/analytics/google-analytics.tsx | 22 + .../analytics/open-panel-analytics.tsx | 26 + .../analytics/plausible-analytics.tsx | 32 + src/components/analytics/umami-analytics.tsx | 33 + src/components/auth/auth-card.tsx | 52 + src/components/auth/bottom-button.tsx | 22 + src/components/auth/error-card.tsx | 18 + src/components/auth/login-button.tsx | 67 + src/components/auth/login-form.tsx | 158 + src/components/auth/new-password-form.tsx | 112 + src/components/auth/new-verification-form.tsx | 62 + src/components/auth/register-form.tsx | 141 + src/components/auth/reset-form.tsx | 107 + src/components/auth/role-gate.tsx | 22 + src/components/auth/social-login-button.tsx | 61 + src/components/blog/all-posts-button.tsx | 24 + src/components/blog/blog-card.tsx | 124 + src/components/blog/blog-category-filter.tsx | 26 + .../blog/blog-category-list-desktop.tsx | 64 + .../blog/blog-category-list-mobile.tsx | 77 + src/components/blog/blog-custom-mdx.tsx | 40 + src/components/blog/blog-grid.tsx | 34 + src/components/blog/blog-toc.tsx | 113 + src/components/category/category-filter.tsx | 40 + .../category/category-list-desktop.tsx | 34 + .../category/category-list-mobile.tsx | 78 + src/components/collection/collection-card.tsx | 92 + src/components/collection/collection-grid.tsx | 34 + src/components/container.tsx | 15 + src/components/dashboard/dashboard-button.tsx | 33 + src/components/dashboard/dashboard-header.tsx | 36 + .../dashboard/dashboard-submit-header.tsx | 43 + src/components/dashboard/pricing-plans.tsx | 153 + src/components/dashboard/publish-button.tsx | 72 + .../dashboard/submission-card-image.tsx | 93 + src/components/dashboard/submission-card.tsx | 152 + src/components/dashboard/submission-empty.tsx | 26 + src/components/dashboard/submission-list.tsx | 34 + .../dashboard/submission-status.tsx | 73 + src/components/dashboard/unpublish-button.tsx | 62 + src/components/edit/edit-form.tsx | 421 + .../home/home-category-list-client.tsx | 55 + .../home/home-category-list-item.tsx | 33 + src/components/home/home-category-list.tsx | 30 + src/components/home/home-content.tsx | 134 + .../home/home-group-list-client.tsx | 140 + src/components/home/home-hero.tsx | 44 + src/components/home/home-search-box.tsx | 81 + .../home/home-search-filter-client.tsx | 169 + src/components/home/home-search-filter.tsx | 89 + src/components/home2/home2-content.tsx | 134 + src/components/home2/home2-hero.tsx | 47 + src/components/home2/home2-search-box.tsx | 38 + src/components/home3/home3-hero-sponsor.tsx | 66 + src/components/home3/home3-search-box.tsx | 81 + .../home3/home3-search-filter-client.tsx | 167 + src/components/home3/home3-search-filter.tsx | 62 + src/components/icons/github.tsx | 23 + src/components/icons/google.tsx | 23 + src/components/icons/icons.tsx | 55 + src/components/icons/product-hunt.tsx | 40 + src/components/icons/twitter.tsx | 23 + src/components/icons/youtube.tsx | 23 + src/components/item/item-bread-crumb.tsx | 89 + src/components/item/item-card-2.tsx | 155 + src/components/item/item-card-sponsor.tsx | 96 + src/components/item/item-card.tsx | 158 + src/components/item/item-custom-mdx.tsx | 43 + src/components/item/item-grid-2.tsx | 39 + src/components/item/item-grid-client.tsx | 37 + src/components/item/item-grid.tsx | 54 + src/components/layout/banner-ad.tsx | 52 + src/components/layout/footer.tsx | 120 + src/components/layout/mode-toggle.tsx | 41 + src/components/layout/navbar.tsx | 228 + src/components/layout/user-button.tsx | 189 + src/components/logo.tsx | 34 + src/components/newsletter/newsletter-card.tsx | 23 + src/components/newsletter/newsletter-form.tsx | 95 + src/components/payment/free-plan-button.tsx | 137 + src/components/payment/pro-plan-button.tsx | 135 + .../payment/sponsor-plan-button.tsx | 132 + .../payment/submission-card-in-plan-page.tsx | 109 + src/components/pricing/pricing-faq.tsx | 26 + src/components/publish/publish-now-button.tsx | 66 + .../submission-card-in-publish-page.tsx | 145 + src/components/search/search-box.tsx | 68 + .../search/search-filter-client.tsx | 167 + src/components/search/search-filter.tsx | 63 + src/components/settings/section-columns.tsx | 23 + src/components/settings/settings-form.tsx | 232 + src/components/settings/user-link-form.tsx | 106 + src/components/settings/user-name-form.tsx | 105 + .../settings/user-password-form.tsx | 132 + src/components/shared/back-button-small.tsx | 37 + src/components/shared/back-button.tsx | 36 + src/components/shared/blur-image.tsx | 23 + src/components/shared/built-with-button.tsx | 36 + src/components/shared/callout.tsx | 86 + src/components/shared/card-skeleton.tsx | 20 + src/components/shared/combobox.tsx | 170 + src/components/shared/confetti-effect.tsx | 48 + src/components/shared/copy-button.tsx | 46 + src/components/shared/custom-command.tsx | 166 + src/components/shared/custom-mde.tsx | 89 + src/components/shared/custom-mdx.tsx | 334 + src/components/shared/custom-switch.tsx | 290 + src/components/shared/empty-grid.tsx | 9 + src/components/shared/empty-placeholder.tsx | 78 + src/components/shared/filter-item-desktop.tsx | 36 + src/components/shared/filter-item-mobile.tsx | 30 + src/components/shared/form-error.tsx | 16 + src/components/shared/form-success.tsx | 16 + src/components/shared/header-section.tsx | 52 + src/components/shared/image-upload.tsx | 186 + src/components/shared/multi-select.tsx | 375 + src/components/shared/pagination.tsx | 124 + src/components/shared/sort-filter.tsx | 25 + src/components/shared/sort-list-desktop.tsx | 70 + src/components/shared/sort-list-mobile.tsx | 90 + src/components/shared/stepper.tsx | 116 + src/components/shared/user-avatar.tsx | 28 + src/components/submit/submit-form.tsx | 522 + src/components/submit/submit-stepper.tsx | 60 + src/components/tag/tag-filter.tsx | 40 + src/components/tag/tag-list-desktop.tsx | 32 + src/components/tag/tag-list-mobile.tsx | 71 + src/components/tailwind-indicator.tsx | 14 + src/components/ui/accordion.tsx | 58 + src/components/ui/alert-dialog.tsx | 141 + src/components/ui/alert.tsx | 59 + src/components/ui/aspect-ratio.tsx | 7 + src/components/ui/avatar.tsx | 50 + src/components/ui/badge.tsx | 36 + src/components/ui/breadcrumb.tsx | 115 + src/components/ui/button.tsx | 56 + src/components/ui/card.tsx | 79 + src/components/ui/checkbox.tsx | 30 + src/components/ui/collapsible.tsx | 11 + src/components/ui/command.tsx | 155 + src/components/ui/context-menu.tsx | 200 + src/components/ui/dialog.tsx | 122 + src/components/ui/drawer.tsx | 118 + src/components/ui/dropdown-menu.tsx | 200 + src/components/ui/form.tsx | 178 + src/components/ui/hover-card.tsx | 29 + src/components/ui/input.tsx | 25 + src/components/ui/label.tsx | 26 + src/components/ui/menubar.tsx | 236 + src/components/ui/navigation-menu.tsx | 128 + src/components/ui/pagination.tsx | 119 + src/components/ui/popover.tsx | 31 + src/components/ui/progress.tsx | 28 + src/components/ui/radio-group.tsx | 44 + src/components/ui/scroll-area.tsx | 48 + src/components/ui/select.tsx | 160 + src/components/ui/separator.tsx | 31 + src/components/ui/sheet.tsx | 140 + src/components/ui/sidebar.tsx | 764 + src/components/ui/skeleton.tsx | 15 + src/components/ui/slider.tsx | 28 + src/components/ui/sonner.tsx | 31 + src/components/ui/switch.tsx | 29 + src/components/ui/table.tsx | 117 + src/components/ui/tabs.tsx | 55 + src/components/ui/textarea.tsx | 24 + src/components/ui/toast.tsx | 129 + src/components/ui/toaster.tsx | 35 + src/components/ui/toggle-group.tsx | 61 + src/components/ui/toggle.tsx | 45 + src/components/ui/tooltip.tsx | 30 + src/config/dashboard.ts | 26 + src/config/faq.ts | 41 + src/config/footer.ts | 42 + src/config/hero.ts | 15 + src/config/marketing.ts | 57 + src/config/price.ts | 56 + src/config/site.ts | 43 + src/config/user-button.ts | 21 + src/data/account.ts | 42 + src/data/blog.ts | 45 + src/data/collection.ts | 39 + src/data/item.ts | 167 + src/data/order.ts | 24 + src/data/password-reset-token.ts | 45 + src/data/submission.ts | 49 + src/data/user.ts | 57 + src/data/verification-token.ts | 63 + src/hooks/use-current-role.ts | 6 + src/hooks/use-current-user.ts | 7 + src/hooks/use-media-query.ts | 49 + src/hooks/use-mobile.tsx | 19 + src/hooks/use-mounted.ts | 11 + src/hooks/use-scroll.ts | 16 + src/hooks/use-toast.ts | 194 + src/lib/auth.ts | 14 + src/lib/constants.ts | 76 + src/lib/discord.ts | 84 + src/lib/image.ts | 56 + src/lib/mail.ts | 115 + src/lib/mdx.ts | 35 + src/lib/metadata.ts | 67 + src/lib/password.ts | 16 + src/lib/schemas.ts | 210 + src/lib/stripe.ts | 6 + src/lib/submission.ts | 90 + src/lib/toc.ts | 77 + src/lib/tokens.ts | 46 + src/lib/utils.ts | 189 + src/middleware.ts | 64 + src/routes.ts | 72 + .../components/custom-markdown-input.tsx | 59 + src/sanity/document-node.ts | 135 + src/sanity/lib/api.ts | 40 + src/sanity/lib/client.ts | 17 + src/sanity/lib/fetch.ts | 49 + src/sanity/lib/queries.ts | 394 + src/sanity/lib/token.ts | 36 + src/sanity/plugins/customDocumentActions.ts | 54 + src/sanity/plugins/singleton.ts | 32 + src/sanity/sanity-adapter.ts | 367 + src/sanity/schemas/documents/auth/account.ts | 108 + .../documents/auth/password-reset-token.ts | 36 + src/sanity/schemas/documents/auth/user.ts | 91 + .../documents/auth/verification-token.ts | 36 + src/sanity/schemas/documents/block-content.ts | 98 + .../schemas/documents/blog/blog-category.ts | 67 + .../schemas/documents/blog/blog-post.ts | 124 + .../schemas/documents/directory/category.ts | 74 + .../schemas/documents/directory/collection.ts | 85 + .../schemas/documents/directory/group.ts | 70 + .../schemas/documents/directory/item.ts | 379 + src/sanity/schemas/documents/directory/tag.ts | 53 + src/sanity/schemas/documents/order/order.ts | 69 + src/sanity/schemas/documents/page/page.ts | 67 + src/sanity/schemas/documents/settings.ts | 14 + src/sanity/schemas/index.ts | 44 + src/sanity/structure.tsx | 464 + src/styles/globals.css | 113 + src/styles/mde.css | 72 + src/styles/mdx.css | 64 + src/types/index.d.ts | 109 + src/types/next-auth.d.ts | 16 + src/types/user-role.ts | 4 + tailwind.config.ts | 156 + tsconfig.json | 31 + 422 files changed, 53384 insertions(+) create mode 100644 .cursor/rules/01-project-overview.mdc create mode 100644 .cursor/rules/02-tech-stack.mdc create mode 100644 .cursor/rules/03-app-structure.mdc create mode 100644 .cursor/rules/04-sanity-integration.mdc create mode 100644 .cursor/rules/05-ai-integration.mdc create mode 100644 .cursor/rules/06-development-guide.mdc create mode 100644 .cursor/rules/07-best-practices.mdc create mode 100644 .env.example create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 AGENTS.md create mode 100644 CLAUDE.md create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 biome.json create mode 100644 components.json create mode 100644 emails/approval-email.tsx create mode 100644 emails/email-formats.ts create mode 100644 emails/newsletter-welcome.tsx create mode 100644 emails/notify-submission-to-admin.tsx create mode 100644 emails/notify-submission-to-user.tsx create mode 100644 emails/payment-success.tsx create mode 100644 emails/rejection-email.tsx create mode 100644 emails/reset-password.tsx create mode 100644 emails/verify-email.tsx create mode 100644 next.config.docker.mjs create mode 100644 next.config.mjs create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 postcss.config.js create mode 100644 public/android-chrome-192x192.png create mode 100644 public/android-chrome-512x512.png create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon-16x16.png create mode 100644 public/favicon-32x32.png create mode 100644 public/favicon.ico create mode 100644 public/logo-dark.png create mode 100644 public/logo.png create mode 100644 public/logo_mkdirs.png create mode 100644 public/og.png create mode 100644 public/placeholder.svg create mode 100644 public/site.webmanifest create mode 100644 sanity-typegen.json create mode 100644 sanity.cli.ts create mode 100644 sanity.config.ts create mode 100644 sanity.types.ts create mode 100644 schema.json create mode 100644 scripts/batch-all.ts create mode 100644 scripts/batch-category.ts create mode 100644 scripts/batch-group.ts create mode 100644 scripts/batch-item-manual.ts create mode 100644 scripts/batch-item-microlink.ts create mode 100644 scripts/batch-item.ts create mode 100644 scripts/batch-tag.ts create mode 100644 scripts/explore-aisdk.ts create mode 100644 scripts/explore-microlink.ts create mode 100644 scripts/export-user-emails.ts create mode 100644 src/actions/admin.ts create mode 100644 src/actions/create-checkout-session.ts create mode 100644 src/actions/edit.ts create mode 100644 src/actions/fetch-website.ts create mode 100644 src/actions/get-banner-ad.ts create mode 100644 src/actions/login.ts create mode 100644 src/actions/logout.ts create mode 100644 src/actions/new-password.ts create mode 100644 src/actions/new-verification.ts create mode 100644 src/actions/open-customer-portal.ts create mode 100644 src/actions/publish.ts create mode 100644 src/actions/register.ts create mode 100644 src/actions/reset.ts create mode 100644 src/actions/settings.ts create mode 100644 src/actions/submit-to-review.ts create mode 100644 src/actions/submit.ts create mode 100644 src/actions/subscribe-to-newsletter.ts create mode 100644 src/actions/unpublish.ts create mode 100644 src/actions/unsubscribe-to-newsletter.ts create mode 100644 src/actions/update-link.ts create mode 100644 src/actions/update-name.ts create mode 100644 src/actions/update-password.ts create mode 100644 src/app/(sanity)/layout.tsx create mode 100644 src/app/(sanity)/studio/[[...index]]/page.tsx create mode 100644 src/app/(website)/(newsletter)/unsubscribe/page.tsx create mode 100644 src/app/(website)/(protected)/(submit)/payment/[id]/layout.tsx create mode 100644 src/app/(website)/(protected)/(submit)/payment/[id]/loading.tsx create mode 100644 src/app/(website)/(protected)/(submit)/payment/[id]/page.tsx create mode 100644 src/app/(website)/(protected)/(submit)/publish/[id]/layout.tsx create mode 100644 src/app/(website)/(protected)/(submit)/publish/[id]/loading.tsx create mode 100644 src/app/(website)/(protected)/(submit)/publish/[id]/page.tsx create mode 100644 src/app/(website)/(protected)/(submit)/submit/layout.tsx create mode 100644 src/app/(website)/(protected)/(submit)/submit/loading.tsx create mode 100644 src/app/(website)/(protected)/(submit)/submit/page.tsx create mode 100644 src/app/(website)/(protected)/dashboard/layout.tsx create mode 100644 src/app/(website)/(protected)/dashboard/loading.tsx create mode 100644 src/app/(website)/(protected)/dashboard/page.tsx create mode 100644 src/app/(website)/(protected)/edit/[id]/layout.tsx create mode 100644 src/app/(website)/(protected)/edit/[id]/loading.tsx create mode 100644 src/app/(website)/(protected)/edit/[id]/page.tsx create mode 100644 src/app/(website)/(protected)/layout.tsx create mode 100644 src/app/(website)/(protected)/settings/layout.tsx create mode 100644 src/app/(website)/(protected)/settings/loading.tsx create mode 100644 src/app/(website)/(protected)/settings/page.tsx create mode 100644 src/app/(website)/(public)/(home)/layout.tsx create mode 100644 src/app/(website)/(public)/(home)/loading.tsx create mode 100644 src/app/(website)/(public)/(home)/page.tsx create mode 100644 src/app/(website)/(public)/(test)/home2/layout.tsx create mode 100644 src/app/(website)/(public)/(test)/home2/loading.tsx create mode 100644 src/app/(website)/(public)/(test)/home2/page.tsx create mode 100644 src/app/(website)/(public)/(test)/home3/layout.tsx create mode 100644 src/app/(website)/(public)/(test)/home3/loading.tsx create mode 100644 src/app/(website)/(public)/(test)/home3/page.tsx create mode 100644 src/app/(website)/(public)/(test)/loading/page.tsx create mode 100644 src/app/(website)/(public)/[slug]/layout.tsx create mode 100644 src/app/(website)/(public)/[slug]/loading.tsx create mode 100644 src/app/(website)/(public)/[slug]/page.tsx create mode 100644 src/app/(website)/(public)/blog/(blog)/category/[slug]/loading.tsx create mode 100644 src/app/(website)/(public)/blog/(blog)/category/[slug]/page.tsx create mode 100644 src/app/(website)/(public)/blog/(blog)/layout.tsx create mode 100644 src/app/(website)/(public)/blog/(blog)/loading.tsx create mode 100644 src/app/(website)/(public)/blog/(blog)/page.tsx create mode 100644 src/app/(website)/(public)/blog/[slug]/layout.tsx create mode 100644 src/app/(website)/(public)/blog/[slug]/loading.tsx create mode 100644 src/app/(website)/(public)/blog/[slug]/page.tsx create mode 100644 src/app/(website)/(public)/category/[slug]/page.tsx create mode 100644 src/app/(website)/(public)/category/layout.tsx create mode 100644 src/app/(website)/(public)/category/loading.tsx create mode 100644 src/app/(website)/(public)/category/page.tsx create mode 100644 src/app/(website)/(public)/collection/[slug]/loading.tsx create mode 100644 src/app/(website)/(public)/collection/[slug]/page.tsx create mode 100644 src/app/(website)/(public)/collection/loading.tsx create mode 100644 src/app/(website)/(public)/collection/page.tsx create mode 100644 src/app/(website)/(public)/item/[slug]/layout.tsx create mode 100644 src/app/(website)/(public)/item/[slug]/loading.tsx create mode 100644 src/app/(website)/(public)/item/[slug]/page.tsx create mode 100644 src/app/(website)/(public)/layout.tsx create mode 100644 src/app/(website)/(public)/pricing/page.tsx create mode 100644 src/app/(website)/(public)/search/layout.tsx create mode 100644 src/app/(website)/(public)/search/loading.tsx create mode 100644 src/app/(website)/(public)/search/page.tsx create mode 100644 src/app/(website)/(public)/tag/[slug]/page.tsx create mode 100644 src/app/(website)/(public)/tag/layout.tsx create mode 100644 src/app/(website)/(public)/tag/loading.tsx create mode 100644 src/app/(website)/(public)/tag/page.tsx create mode 100644 src/app/(website)/auth/error/page.tsx create mode 100644 src/app/(website)/auth/layout.tsx create mode 100644 src/app/(website)/auth/loading.tsx create mode 100644 src/app/(website)/auth/login/page.tsx create mode 100644 src/app/(website)/auth/new-password/page.tsx create mode 100644 src/app/(website)/auth/new-verification/page.tsx create mode 100644 src/app/(website)/auth/register/page.tsx create mode 100644 src/app/(website)/auth/reset/page.tsx create mode 100644 src/app/(website)/error.tsx create mode 100644 src/app/(website)/layout.tsx create mode 100644 src/app/(website)/loading.tsx create mode 100644 src/app/(website)/not-found.tsx create mode 100644 src/app/api/auth/[...nextauth]/route.ts create mode 100644 src/app/api/disable-draft/route.ts create mode 100644 src/app/api/draft/route.tsx create mode 100644 src/app/api/og/route.tsx create mode 100644 src/app/api/send-email/route.ts create mode 100644 src/app/api/upload-image/route.ts create mode 100644 src/app/api/webhook/route.ts create mode 100644 src/app/robots.ts create mode 100644 src/app/sitemap.ts create mode 100644 src/assets/fonts/bricolage-grotesque-v7-latin-regular.woff2 create mode 100644 src/assets/fonts/index.ts create mode 100644 src/assets/fonts/source-sans-3-v15-latin-regular.woff2 create mode 100644 src/assets/fonts/source-serif-4-v8-latin-regular.woff2 create mode 100644 src/assets/fonts/work-sans-v19-latin-regular.woff2 create mode 100644 src/auth.config.ts create mode 100644 src/auth.ts create mode 100644 src/components/analytics/analytics.tsx create mode 100644 src/components/analytics/google-analytics.tsx create mode 100644 src/components/analytics/open-panel-analytics.tsx create mode 100644 src/components/analytics/plausible-analytics.tsx create mode 100644 src/components/analytics/umami-analytics.tsx create mode 100644 src/components/auth/auth-card.tsx create mode 100644 src/components/auth/bottom-button.tsx create mode 100644 src/components/auth/error-card.tsx create mode 100644 src/components/auth/login-button.tsx create mode 100644 src/components/auth/login-form.tsx create mode 100644 src/components/auth/new-password-form.tsx create mode 100644 src/components/auth/new-verification-form.tsx create mode 100644 src/components/auth/register-form.tsx create mode 100644 src/components/auth/reset-form.tsx create mode 100644 src/components/auth/role-gate.tsx create mode 100644 src/components/auth/social-login-button.tsx create mode 100644 src/components/blog/all-posts-button.tsx create mode 100644 src/components/blog/blog-card.tsx create mode 100644 src/components/blog/blog-category-filter.tsx create mode 100644 src/components/blog/blog-category-list-desktop.tsx create mode 100644 src/components/blog/blog-category-list-mobile.tsx create mode 100644 src/components/blog/blog-custom-mdx.tsx create mode 100644 src/components/blog/blog-grid.tsx create mode 100644 src/components/blog/blog-toc.tsx create mode 100644 src/components/category/category-filter.tsx create mode 100644 src/components/category/category-list-desktop.tsx create mode 100644 src/components/category/category-list-mobile.tsx create mode 100644 src/components/collection/collection-card.tsx create mode 100644 src/components/collection/collection-grid.tsx create mode 100644 src/components/container.tsx create mode 100644 src/components/dashboard/dashboard-button.tsx create mode 100644 src/components/dashboard/dashboard-header.tsx create mode 100644 src/components/dashboard/dashboard-submit-header.tsx create mode 100644 src/components/dashboard/pricing-plans.tsx create mode 100644 src/components/dashboard/publish-button.tsx create mode 100644 src/components/dashboard/submission-card-image.tsx create mode 100644 src/components/dashboard/submission-card.tsx create mode 100644 src/components/dashboard/submission-empty.tsx create mode 100644 src/components/dashboard/submission-list.tsx create mode 100644 src/components/dashboard/submission-status.tsx create mode 100644 src/components/dashboard/unpublish-button.tsx create mode 100644 src/components/edit/edit-form.tsx create mode 100644 src/components/home/home-category-list-client.tsx create mode 100644 src/components/home/home-category-list-item.tsx create mode 100644 src/components/home/home-category-list.tsx create mode 100644 src/components/home/home-content.tsx create mode 100644 src/components/home/home-group-list-client.tsx create mode 100644 src/components/home/home-hero.tsx create mode 100644 src/components/home/home-search-box.tsx create mode 100644 src/components/home/home-search-filter-client.tsx create mode 100644 src/components/home/home-search-filter.tsx create mode 100644 src/components/home2/home2-content.tsx create mode 100644 src/components/home2/home2-hero.tsx create mode 100644 src/components/home2/home2-search-box.tsx create mode 100644 src/components/home3/home3-hero-sponsor.tsx create mode 100644 src/components/home3/home3-search-box.tsx create mode 100644 src/components/home3/home3-search-filter-client.tsx create mode 100644 src/components/home3/home3-search-filter.tsx create mode 100644 src/components/icons/github.tsx create mode 100644 src/components/icons/google.tsx create mode 100644 src/components/icons/icons.tsx create mode 100644 src/components/icons/product-hunt.tsx create mode 100644 src/components/icons/twitter.tsx create mode 100644 src/components/icons/youtube.tsx create mode 100644 src/components/item/item-bread-crumb.tsx create mode 100644 src/components/item/item-card-2.tsx create mode 100644 src/components/item/item-card-sponsor.tsx create mode 100644 src/components/item/item-card.tsx create mode 100644 src/components/item/item-custom-mdx.tsx create mode 100644 src/components/item/item-grid-2.tsx create mode 100644 src/components/item/item-grid-client.tsx create mode 100644 src/components/item/item-grid.tsx create mode 100644 src/components/layout/banner-ad.tsx create mode 100644 src/components/layout/footer.tsx create mode 100644 src/components/layout/mode-toggle.tsx create mode 100644 src/components/layout/navbar.tsx create mode 100644 src/components/layout/user-button.tsx create mode 100644 src/components/logo.tsx create mode 100644 src/components/newsletter/newsletter-card.tsx create mode 100644 src/components/newsletter/newsletter-form.tsx create mode 100644 src/components/payment/free-plan-button.tsx create mode 100644 src/components/payment/pro-plan-button.tsx create mode 100644 src/components/payment/sponsor-plan-button.tsx create mode 100644 src/components/payment/submission-card-in-plan-page.tsx create mode 100644 src/components/pricing/pricing-faq.tsx create mode 100644 src/components/publish/publish-now-button.tsx create mode 100644 src/components/publish/submission-card-in-publish-page.tsx create mode 100644 src/components/search/search-box.tsx create mode 100644 src/components/search/search-filter-client.tsx create mode 100644 src/components/search/search-filter.tsx create mode 100644 src/components/settings/section-columns.tsx create mode 100644 src/components/settings/settings-form.tsx create mode 100644 src/components/settings/user-link-form.tsx create mode 100644 src/components/settings/user-name-form.tsx create mode 100644 src/components/settings/user-password-form.tsx create mode 100644 src/components/shared/back-button-small.tsx create mode 100644 src/components/shared/back-button.tsx create mode 100644 src/components/shared/blur-image.tsx create mode 100644 src/components/shared/built-with-button.tsx create mode 100644 src/components/shared/callout.tsx create mode 100644 src/components/shared/card-skeleton.tsx create mode 100644 src/components/shared/combobox.tsx create mode 100644 src/components/shared/confetti-effect.tsx create mode 100644 src/components/shared/copy-button.tsx create mode 100644 src/components/shared/custom-command.tsx create mode 100644 src/components/shared/custom-mde.tsx create mode 100644 src/components/shared/custom-mdx.tsx create mode 100644 src/components/shared/custom-switch.tsx create mode 100644 src/components/shared/empty-grid.tsx create mode 100644 src/components/shared/empty-placeholder.tsx create mode 100644 src/components/shared/filter-item-desktop.tsx create mode 100644 src/components/shared/filter-item-mobile.tsx create mode 100644 src/components/shared/form-error.tsx create mode 100644 src/components/shared/form-success.tsx create mode 100644 src/components/shared/header-section.tsx create mode 100644 src/components/shared/image-upload.tsx create mode 100644 src/components/shared/multi-select.tsx create mode 100644 src/components/shared/pagination.tsx create mode 100644 src/components/shared/sort-filter.tsx create mode 100644 src/components/shared/sort-list-desktop.tsx create mode 100644 src/components/shared/sort-list-mobile.tsx create mode 100644 src/components/shared/stepper.tsx create mode 100644 src/components/shared/user-avatar.tsx create mode 100644 src/components/submit/submit-form.tsx create mode 100644 src/components/submit/submit-stepper.tsx create mode 100644 src/components/tag/tag-filter.tsx create mode 100644 src/components/tag/tag-list-desktop.tsx create mode 100644 src/components/tag/tag-list-mobile.tsx create mode 100644 src/components/tailwind-indicator.tsx create mode 100644 src/components/ui/accordion.tsx create mode 100644 src/components/ui/alert-dialog.tsx create mode 100644 src/components/ui/alert.tsx create mode 100644 src/components/ui/aspect-ratio.tsx create mode 100644 src/components/ui/avatar.tsx create mode 100644 src/components/ui/badge.tsx create mode 100644 src/components/ui/breadcrumb.tsx create mode 100644 src/components/ui/button.tsx create mode 100644 src/components/ui/card.tsx create mode 100644 src/components/ui/checkbox.tsx create mode 100644 src/components/ui/collapsible.tsx create mode 100644 src/components/ui/command.tsx create mode 100644 src/components/ui/context-menu.tsx create mode 100644 src/components/ui/dialog.tsx create mode 100644 src/components/ui/drawer.tsx create mode 100644 src/components/ui/dropdown-menu.tsx create mode 100644 src/components/ui/form.tsx create mode 100644 src/components/ui/hover-card.tsx create mode 100644 src/components/ui/input.tsx create mode 100644 src/components/ui/label.tsx create mode 100644 src/components/ui/menubar.tsx create mode 100644 src/components/ui/navigation-menu.tsx create mode 100644 src/components/ui/pagination.tsx create mode 100644 src/components/ui/popover.tsx create mode 100644 src/components/ui/progress.tsx create mode 100644 src/components/ui/radio-group.tsx create mode 100644 src/components/ui/scroll-area.tsx create mode 100644 src/components/ui/select.tsx create mode 100644 src/components/ui/separator.tsx create mode 100644 src/components/ui/sheet.tsx create mode 100644 src/components/ui/sidebar.tsx create mode 100644 src/components/ui/skeleton.tsx create mode 100644 src/components/ui/slider.tsx create mode 100644 src/components/ui/sonner.tsx create mode 100644 src/components/ui/switch.tsx create mode 100644 src/components/ui/table.tsx create mode 100644 src/components/ui/tabs.tsx create mode 100644 src/components/ui/textarea.tsx create mode 100644 src/components/ui/toast.tsx create mode 100644 src/components/ui/toaster.tsx create mode 100644 src/components/ui/toggle-group.tsx create mode 100644 src/components/ui/toggle.tsx create mode 100644 src/components/ui/tooltip.tsx create mode 100644 src/config/dashboard.ts create mode 100644 src/config/faq.ts create mode 100644 src/config/footer.ts create mode 100644 src/config/hero.ts create mode 100644 src/config/marketing.ts create mode 100644 src/config/price.ts create mode 100644 src/config/site.ts create mode 100644 src/config/user-button.ts create mode 100644 src/data/account.ts create mode 100644 src/data/blog.ts create mode 100644 src/data/collection.ts create mode 100644 src/data/item.ts create mode 100644 src/data/order.ts create mode 100644 src/data/password-reset-token.ts create mode 100644 src/data/submission.ts create mode 100644 src/data/user.ts create mode 100644 src/data/verification-token.ts create mode 100644 src/hooks/use-current-role.ts create mode 100644 src/hooks/use-current-user.ts create mode 100644 src/hooks/use-media-query.ts create mode 100644 src/hooks/use-mobile.tsx create mode 100644 src/hooks/use-mounted.ts create mode 100644 src/hooks/use-scroll.ts create mode 100644 src/hooks/use-toast.ts create mode 100644 src/lib/auth.ts create mode 100644 src/lib/constants.ts create mode 100644 src/lib/discord.ts create mode 100644 src/lib/image.ts create mode 100644 src/lib/mail.ts create mode 100644 src/lib/mdx.ts create mode 100644 src/lib/metadata.ts create mode 100644 src/lib/password.ts create mode 100644 src/lib/schemas.ts create mode 100644 src/lib/stripe.ts create mode 100644 src/lib/submission.ts create mode 100644 src/lib/toc.ts create mode 100644 src/lib/tokens.ts create mode 100644 src/lib/utils.ts create mode 100644 src/middleware.ts create mode 100644 src/routes.ts create mode 100644 src/sanity/components/custom-markdown-input.tsx create mode 100644 src/sanity/document-node.ts create mode 100644 src/sanity/lib/api.ts create mode 100644 src/sanity/lib/client.ts create mode 100644 src/sanity/lib/fetch.ts create mode 100644 src/sanity/lib/queries.ts create mode 100644 src/sanity/lib/token.ts create mode 100644 src/sanity/plugins/customDocumentActions.ts create mode 100644 src/sanity/plugins/singleton.ts create mode 100644 src/sanity/sanity-adapter.ts create mode 100644 src/sanity/schemas/documents/auth/account.ts create mode 100644 src/sanity/schemas/documents/auth/password-reset-token.ts create mode 100644 src/sanity/schemas/documents/auth/user.ts create mode 100644 src/sanity/schemas/documents/auth/verification-token.ts create mode 100644 src/sanity/schemas/documents/block-content.ts create mode 100644 src/sanity/schemas/documents/blog/blog-category.ts create mode 100644 src/sanity/schemas/documents/blog/blog-post.ts create mode 100644 src/sanity/schemas/documents/directory/category.ts create mode 100644 src/sanity/schemas/documents/directory/collection.ts create mode 100644 src/sanity/schemas/documents/directory/group.ts create mode 100644 src/sanity/schemas/documents/directory/item.ts create mode 100644 src/sanity/schemas/documents/directory/tag.ts create mode 100644 src/sanity/schemas/documents/order/order.ts create mode 100644 src/sanity/schemas/documents/page/page.ts create mode 100644 src/sanity/schemas/documents/settings.ts create mode 100644 src/sanity/schemas/index.ts create mode 100644 src/sanity/structure.tsx create mode 100644 src/styles/globals.css create mode 100644 src/styles/mde.css create mode 100644 src/styles/mdx.css create mode 100644 src/types/index.d.ts create mode 100644 src/types/next-auth.d.ts create mode 100644 src/types/user-role.ts create mode 100644 tailwind.config.ts create mode 100644 tsconfig.json diff --git a/.cursor/rules/01-project-overview.mdc b/.cursor/rules/01-project-overview.mdc new file mode 100644 index 0000000..4577cf4 --- /dev/null +++ b/.cursor/rules/01-project-overview.mdc @@ -0,0 +1,33 @@ +# Project Overview + +Mkdirs is a directory website template that allows users to launch AI-powered directory websites in minutes. It comes packed with features like AI integration, listings, payment processing, submission forms, CMS, blog, authentication, newsletter, SEO optimization, and theming support. + +## Key Information + +- **Project Name**: Mkdirs Template +- **Website**: https://mkdirs.com +- **Documentation**: Available at https://docs.mkdirs.com +- **Tech Stack**: Next.js, Sanity CMS, TypeScript, Tailwind CSS + +## Main Features + +- AI-powered directory functionality +- Listing management +- Payment processing +- User authentication +- Content management system (Sanity) +- Blog functionality +- Newsletter integration +- SEO optimization +- Theming support + +## Project Structure + +The project follows a standard Next.js application structure with additional Sanity CMS integration: + +- `src/app`: Contains the application routes and pages +- `src/components`: Reusable React components +- `src/lib`: Utility functions and libraries +- `src/sanity`: Sanity CMS related configuration and schemas +- `src/actions`: Server actions (Next.js) +- `scripts`: Utility scripts for various operations diff --git a/.cursor/rules/02-tech-stack.mdc b/.cursor/rules/02-tech-stack.mdc new file mode 100644 index 0000000..2cab11d --- /dev/null +++ b/.cursor/rules/02-tech-stack.mdc @@ -0,0 +1,43 @@ +# Tech Stack and Architecture + +This document outlines the key technologies used in the Mkdirs template and how they work together. + +## Core Technologies + +- **Next.js**: The React framework used for building the application with server-side rendering, API routes, and server components +- **TypeScript**: Used for type-safe code across the entire codebase +- **Sanity CMS**: Headless CMS for managing content +- **Tailwind CSS**: Utility-first CSS framework for styling +- **Radix UI**: Unstyled, accessible UI components +- **NextAuth**: Authentication solution for Next.js applications +- **Stripe**: Payment processing +- **React Email**: For creating and sending emails +- **React Hook Form**: Form handling +- **Zod**: Data validation + +## File Structure + +- **package.json**: Contains all dependencies and scripts +- **next.config.mjs**: Next.js configuration +- **tailwind.config.ts**: Tailwind CSS configuration +- **sanity.config.ts**: Sanity CMS configuration +- **src/app**: Next.js app router pages and layouts +- **src/components**: Reusable UI components +- **src/lib**: Utility functions and shared code +- **src/sanity**: Sanity schema definitions and utilities + +## Key Architectural Patterns + +- **App Router**: Uses Next.js App Router for routing +- **Server Components**: Leverages React Server Components for better performance +- **Server Actions**: Uses Next.js Server Actions for server-side data mutations +- **Content Management**: Sanity CMS for structured content +- **Authentication**: Secure authentication with NextAuth +- **API Routes**: Backend functionality exposed through API routes +- **Responsive Design**: Mobile-first approach with Tailwind CSS + +## Build and Deployment + +- **Development**: `pnpm dev` for local development +- **Build**: `pnpm build` for production builds +- **Docker Support**: Includes Dockerfile for containerization diff --git a/.cursor/rules/03-app-structure.mdc b/.cursor/rules/03-app-structure.mdc new file mode 100644 index 0000000..059a9f2 --- /dev/null +++ b/.cursor/rules/03-app-structure.mdc @@ -0,0 +1,50 @@ +# Application Structure + +This document outlines the structure of the Next.js application and key entry points. + +## App Router Structure + +The application uses Next.js App Router with a split between website and Sanity Studio routes: + +- **src/app/(website)**: Public-facing website routes +- **src/app/(sanity)**: Sanity Studio admin routes +- **src/app/api**: API routes for various functionalities + +## Key Routes + +- **/**: Main landing page +- **/auth**: Authentication-related pages (sign-in, sign-up) +- **/[item|category|tag|collection]**: Directory listings pages +- **/blog**: Blog section +- **/dashboard**: User dashboard +- **/studio**: Sanity Studio CMS interface + +## Authentication + +Authentication is handled through NextAuth with various providers and credentials authentication: + +- **src/auth.ts**: Main authentication configuration +- **src/auth.config.ts**: Auth providers and callbacks + +## Components Organization + +Components are organized into several categories: + +- **UI Components**: Basic reusable UI elements +- **Layout Components**: Page layouts and structural components +- **Feature Components**: Components specific to certain features +- **Form Components**: Input and form-related components + +## Data Flow + +The application follows these data flow patterns: + +1. **Server Components**: Fetch data directly from the database/CMS +2. **Server Actions**: Handle data mutations and form submissions +3. **API Routes**: Provide data endpoints for client components +4. **Client Components**: Use hooks for client-side data fetching and state management + +## Middleware + +- **src/middleware.ts**: Handles authentication, redirects, and other middleware functionality +- **src/routes.ts**: Defines route configurations and access control diff --git a/.cursor/rules/04-sanity-integration.mdc b/.cursor/rules/04-sanity-integration.mdc new file mode 100644 index 0000000..8759d34 --- /dev/null +++ b/.cursor/rules/04-sanity-integration.mdc @@ -0,0 +1,63 @@ +# Sanity CMS Integration + +This document outlines how Sanity CMS is integrated into the Mkdirs template. + +## Configuration Files + +- **sanity.config.ts**: Main Sanity configuration file +- **sanity.cli.ts**: CLI configuration for Sanity +- **sanity-typegen.json**: Configuration for type generation +- **schema.json**: Generated Sanity schemas in JSON format +- **sanity.types.ts**: Generated TypeScript types for Sanity schemas + +## Schema Structure + +The Sanity schema is organized in the `src/sanity` directory: + +- **src/sanity/schemas**: Contains all content type definitions +- **src/sanity/lib**: Utility functions for working with Sanity +- **src/sanity/plugins**: Additional plugins for Sanity Studio +- **src/sanity/components**: Custom components in Sanity Studio + +## Content Types + +Key content types defined in the schema include: + +- **Item**: Directory listing entries +- **Category**: Listing categories +- **Tag**: Listing tags +- **Collection**: Listing collections +- **Group**: Listing category groups +- **Blog Posts**: Blog content +- **Authors**: Content creators +- **Pages**: Static page content +- **Settings**: Global site settings + +## Data Fetching + +Sanity data is fetched using GROQ queries through the following methods: + +1. **Client API**: Using the Sanity client to fetch data +2. **Next.js Data Fetching**: Server components that directly fetch Sanity data +3. **API Routes**: API endpoints that serve Sanity data + +## Preview Functionality + +The template includes a preview mode for content editing: + +- **Draft Preview**: See draft content before publishing + +## Studio Customization + +The Sanity Studio interface is customized for the Mkdirs use case: + +- **Custom Desk Structure**: Organized content editing interface +- **Custom Input Components**: Specialized input fields for directories +- **Sanity Plugins**: Additional functionality through Sanity plugins + +## Type Generation + +Types are automatically generated from Sanity schemas: + +- Run `pnpm typegen` to update TypeScript types after schema changes +- Generated types ensure type safety when working with Sanity content diff --git a/.cursor/rules/05-ai-integration.mdc b/.cursor/rules/05-ai-integration.mdc new file mode 100644 index 0000000..aca3d58 --- /dev/null +++ b/.cursor/rules/05-ai-integration.mdc @@ -0,0 +1,33 @@ +# AI Integration + +This document outlines the AI capabilities integrated into the Mkdirs template. + +## AI Providers + +The template supports multiple AI providers through AI SDK: + +- **OpenAI**: Via `@ai-sdk/openai` +- **Google AI**: Via `@ai-sdk/google` +- **DeepSeek**: Via `@ai-sdk/deepseek` + +## AI Features + +AI is integrated into various parts of the application: + +- **Content Generation**: Assist in creating listings information + +## AI Configuration + +AI providers can be configured in the application settings: + +- **API Keys**: Securely stored provider API keys +- **Model Selection**: Choose which models to use + +## Privacy and Ethics + +The AI implementation follows best practices: + +- **User Consent**: Clear disclosure of AI usage +- **Data Privacy**: No unnecessary data sharing with AI providers +- **Human Review**: Critical AI-generated content requires human approval +- **Transparency**: Clear indication of AI-generated content diff --git a/.cursor/rules/06-development-guide.mdc b/.cursor/rules/06-development-guide.mdc new file mode 100644 index 0000000..c61daac --- /dev/null +++ b/.cursor/rules/06-development-guide.mdc @@ -0,0 +1,53 @@ +# Development Guide + +This document provides guidelines for developing and contributing to the Mkdirs template. + +## Development Setup + +1. Clone the repository +2. Install dependencies with `pnpm install` +3. Set up environment variables (copy `.env.example` to `.env`) +4. Run the development server with `pnpm dev` + +## Environment Variables + +Key environment variables needed for development: + +- **NEXT_PUBLIC_SITE_URL**: Base URL of the site +- **NEXT_PUBLIC_SANITY_PROJECT_ID**: Sanity project ID +- **NEXT_PUBLIC_SANITY_DATASET**: Sanity dataset name +- **SANITY_API_TOKEN**: Sanity API token +- **NEXTAUTH_SECRET**: Secret for NextAuth +- **STRIPE_SECRET_KEY**: Stripe API secret key + +## Code Style and Linting + +The project uses Biome for code formatting and linting: + +- **biome.json**: Biome configuration +- Run `pnpm lint` to check for code style issues +- Run `pnpm format` to format the codebase + +## Scripts + +Utility scripts for common tasks: + +- **scripts**: Directory containing utility scripts +- **Batch Operations**: Scripts for batch operations on items +- **Email Export**: Tools for exporting user emails +- **Microlink Integration**: Scripts for working with microlink + +## Build and Deployment + +Steps for building and deploying the application: + +1. Run `pnpm build` to create a production build +2. Verify the build with `pnpm start` +3. Deploy to your hosting platform of choice + +### Docker Deployment + +For Docker-based deployment: + +- **Dockerfile**: Docker configuration +- **next.config.docker.mjs**: Next.js configuration for Docker diff --git a/.cursor/rules/07-best-practices.mdc b/.cursor/rules/07-best-practices.mdc new file mode 100644 index 0000000..bf9a49b --- /dev/null +++ b/.cursor/rules/07-best-practices.mdc @@ -0,0 +1,73 @@ +# Best Practices + +This document outlines best practices for working with the Mkdirs codebase. + +## Code Organization + +Follow these guidelines for code organization: + +- **Component Isolation**: Keep components focused on a single responsibility +- **Server vs. Client**: Clearly separate server and client components +- **Type Definitions**: Place shared types in the `src/types` directory +- **Utility Functions**: Extract reusable logic to the `src/lib` directory +- **Page Structure**: Maintain consistent page component structure + +## Performance Optimization + +Ensure optimal performance: + +- **Server Components**: Use React Server Components for data-fetching operations +- **Image Optimization**: Use Next.js Image component with proper sizing +- **Bundle Size**: Monitor and optimize bundle size +- **Lazy Loading**: Implement lazy loading for below-the-fold content +- **Caching Strategy**: Leverage Next.js caching capabilities + +## State Management + +Guidelines for state management: + +- **Local State**: Use React's useState for component-specific state +- **Form State**: Use React Hook Form for form state management +- **Server State**: Prefer server components over client-side data fetching +- **URL State**: Use URL parameters for shareable state +- **Context API**: Use sparingly for deeply nested shared state + +## Error Handling + +Implement robust error handling: + +- **Error Boundaries**: Use React Error Boundaries for client components +- **Form Validation**: Implement Zod validation for all forms +- **API Errors**: Handle API errors gracefully with fallbacks +- **Logging**: Log errors for debugging and monitoring +- **User Feedback**: Provide clear error messages to users + +## Accessibility + +Ensure accessibility compliance: + +- **Semantic HTML**: Use appropriate HTML elements +- **ARIA Attributes**: Add ARIA attributes where necessary +- **Keyboard Navigation**: Ensure all interactions work with keyboard +- **Color Contrast**: Maintain sufficient contrast ratios +- **Screen Readers**: Test with screen readers + +## Security Best Practices + +Follow these security guidelines: + +- **Input Validation**: Validate all user inputs server-side +- **Authentication**: Use NextAuth for secure authentication +- **Authorization**: Implement proper authorization checks +- **CSRF Protection**: Use proper CSRF tokens +- **XSS Prevention**: Sanitize user-generated content + +## Testing Strategy + +Approach to testing: + +- **Component Testing**: Test UI components in isolation +- **Integration Testing**: Test feature workflows +- **Mocking**: Mock external services in tests +- **Test Coverage**: Aim for good coverage of critical paths +- **E2E Testing**: Implement end-to-end tests for critical flows diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..73b4211 --- /dev/null +++ b/.env.example @@ -0,0 +1,114 @@ +# "http://localhost:3000" or "https://mkdirs.com" +NEXT_PUBLIC_APP_URL= + +# ----------------------------------------------------------------------------- +# Dataset & Storage (Sanity) +# ----------------------------------------------------------------------------- +# https://www.sanity.io/manage +NEXT_PUBLIC_SANITY_DATASET= +NEXT_PUBLIC_SANITY_PROJECT_ID= +SANITY_API_TOKEN= + +# ----------------------------------------------------------------------------- +# Email (Resend) +# ----------------------------------------------------------------------------- +# https://resend.com/api-keys +RESEND_API_KEY= +RESEND_EMAIL_FROM= +RESEND_EMAIL_ADMIN= +RESEND_AUDIENCE_ID= + +# ----------------------------------------------------------------------------- +# Payment (Stripe) +# ----------------------------------------------------------------------------- +STRIPE_API_KEY= +STRIPE_WEBHOOK_SECRET= +NEXT_PUBLIC_STRIPE_PRO_PRICE_ID= +NEXT_PUBLIC_STRIPE_SPONSOR_PRICE_ID= + +# ----------------------------------------------------------------------------- +# Authentication (NextAuth) +# ----------------------------------------------------------------------------- +# https://authjs.dev/getting-started/deployment#auth_secret +# Secret can be generated with `openssl rand -base64 32` +AUTH_SECRET= + +# https://authjs.dev/getting-started/authentication/oauth +# https://console.cloud.google.com/apis/credentials +AUTH_GOOGLE_ID= +AUTH_GOOGLE_SECRET= + +# https://authjs.dev/getting-started/authentication/oauth +# https://github.com/settings/developers +AUTH_GITHUB_ID= +AUTH_GITHUB_SECRET= + +# https://authjs.dev/getting-started/deployment#auth_trust_host +# In a Docker environment, make sure to set either trustHost: true in your Auth.js configuration +# or the AUTH_TRUST_HOST environment variable to true. +# AUTH_TRUST_HOST=true + +# https://authjs.dev/getting-started/deployment#auth_url +# This environment variable is mostly unnecessary with v5 as the host is inferred from the request headers. +# However, if you are using a different base path, you can set this environment variable as well. +# AUTH_URL=https://demo.mkdirs.com/api/auth + +# ----------------------------------------------------------------------------- +# Analytics (OpenPanel & Google) +# ----------------------------------------------------------------------------- +# OpenPanel Analytics (https://openpanel.dev) +NEXT_PUBLIC_OPENPANEL_CLIENT_ID= + +# Google Analytics (https://analytics.google.com) +NEXT_PUBLIC_GOOGLE_ANALYTICS_ID= + +# Umami Analytics (https://umami.is) +NEXT_PUBLIC_UMAMI_WEBSITE_ID="" +NEXT_PUBLIC_UMAMI_SCRIPT="https://cloud.umami.is/script.js" + +# Plausible Analytics (https://plausible.io) +NEXT_PUBLIC_PLAUSIBLE_DOMAIN="" +NEXT_PUBLIC_PLAUSIBLE_SCRIPT="https://plausible.io/js/script.js" + +# ----------------------------------------------------------------------------- +# Notifications (discord) +# ----------------------------------------------------------------------------- +DISCORD_WEBHOOK_URL="" + +# ----------------------------------------------------------------------------- +# AI SDK (https://sdk.vercel.ai) +# default ai provider: ``, available values: `google`, `deepseek`, `openai`, `xai`, `openrouter` +# google/deepseek/xai/openrouter are tested, openai is not tested yet +# ----------------------------------------------------------------------------- +DEFAULT_AI_PROVIDER= + +# ----------------------------------------------------------------------------- +# Google Generative AI (https://aistudio.google.com/apikey) +# NOTE: if you set `DEFAULT_AI_PROVIDER=google`, you should set this API_KEY +# ----------------------------------------------------------------------------- +GOOGLE_GENERATIVE_AI_API_KEY= + +# ----------------------------------------------------------------------------- +# DeepSeek (https://platform.deepseek.com/api_keys) +# NOTE: if you set `DEFAULT_AI_PROVIDER=deepseek`, you should set this API_KEY +# ----------------------------------------------------------------------------- +DEEPSEEK_API_KEY= + +# ----------------------------------------------------------------------------- +# OpenAI (https://platform.openai.com/settings/organization/api-keys) +# NOTE: if you set `DEFAULT_AI_PROVIDER=openai`, you should set this API_KEY +# ----------------------------------------------------------------------------- +OPENAI_API_KEY= + +# ----------------------------------------------------------------------------- +# XAI (https://console.x.ai/) +# NOTE: if you set `DEFAULT_AI_PROVIDER=xai`, you should set this API_KEY +# ----------------------------------------------------------------------------- +XAI_API_KEY= + +# ----------------------------------------------------------------------------- +# OpenRouter (https://openrouter.ai/settings/keys) +# NOTE: if you set `DEFAULT_AI_PROVIDER=openrouter`, you should set this API_KEY +# ----------------------------------------------------------------------------- +OPENROUTER_API_KEY= +OPENROUTER_MODEL= diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..bc81750 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "[BUG]" +labels: bug +assignees: javayhu + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..9f85240 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,11 @@ +blank_issues_enabled: false +contact_links: + - name: Mkdirs Community Support + url: https://github.com/MkdirsHQ/mkdirs/discussions + about: Please ask and answer questions here. + - name: Mkdirs Documentation + url: https://docs.mkdirs.com + about: Please check out the documentation here. + - name: Mkdirs Video Tutorials + url: https://www.youtube.com/@MkdirsHQ + about: Please check out the video tutorials here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..1feb04f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: "[feat]" +labels: enhancement +assignees: javayhu + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1aa3a62 --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem +/.docs/ + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local +.env + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# idea +/.idea/ diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..bf8f0fe --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "biomejs.biome", + "bradlc.vscode-tailwindcss", + "eamodio.gitlens" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..1361a29 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,22 @@ +{ + "editor.defaultFormatter": "biomejs.biome", + "[javascript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[typescript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "quickfix.biome": "explicit", + "source.organizeImports.biome": "explicit" + }, + "search.exclude": { + "**/node_modules": true, + ".next": true, + ".content-collections": true + } +} diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..b1098a2 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,79 @@ +# AGENTS.md + +This file provides guidance to Code Agents (Codex, Cursor, etc.) when working with code in this repository. + +## Project Overview + +Mkdirs is a Next.js 14 directory website template with Sanity CMS, enabling AI-powered directory sites with listings, payments, authentication, blog, and newsletter features. + +## Commands + +- **Dev server**: `pnpm dev` +- **Build**: `pnpm build` +- **Start production**: `pnpm start` +- **Lint**: `pnpm lint` (Biome - checks and auto-fixes) +- **Lint with unsafe fixes**: `pnpm lint:fix` +- **Format**: `pnpm format` (Biome) +- **Generate Sanity types**: `pnpm typegen` (run after schema changes) +- **Email preview**: `pnpm email` (starts email dev server on port 3333) +- **Batch item operations**: `pnpm item:import`, `pnpm item:fetch`, `pnpm item:update`, `pnpm item:remove` +- **Batch all**: `pnpm batch` (or `pnpm batch:import`, `pnpm batch:update`, `pnpm batch:remove`) + +## Architecture + +### Route Structure (Next.js App Router) + +The app uses two top-level route groups: + +- `src/app/(website)/` - Main website with nested groups: + - `(public)/` - Public pages: home, search, item, category, tag, collection, blog, pricing + - `(protected)/` - Auth-required pages: dashboard, settings, submit, edit + - `(newsletter)/` - Newsletter unsubscribe + - `auth/` - Login, register, reset password, email verification +- `src/app/(sanity)/` - Sanity Studio admin interface (accessible at `/studio`) +- `src/app/api/` - API routes: auth, webhook (Stripe), og images, draft mode, send-email, upload-image + +### Route Protection + +`src/routes.ts` defines public routes, auth routes, and API auth prefix. `src/middleware.ts` enforces access control. Authenticated users on auth routes redirect to `/dashboard`. + +### Data Layer + +- **Sanity CMS** is the primary content store. Schemas live in `src/sanity/schemas/documents/` organized by domain: `directory/` (item, category, tag, collection, group), `blog/` (post, author), `page/`, `order/`, `auth/`, and `settings.ts`. +- **`src/data/`** contains data access functions (item.ts, blog.ts, collection.ts, user.ts, account.ts, order.ts, submission.ts, etc.) used by server components and actions. +- **`src/sanity/lib/`** has Sanity client utilities and GROQ query helpers. +- **`sanity.types.ts`** contains auto-generated TypeScript types from Sanity schemas (regenerate with `pnpm typegen`). + +### Server Actions + +`src/actions/` contains all server actions for mutations: authentication (login, register, reset), item operations (submit, edit, publish, unpublish), payment (checkout sessions, customer portal), settings, newsletter subscription, and admin operations. + +### Key Integrations + +- **Auth**: NextAuth v5 (beta.18) configured in `src/auth.ts` and `src/auth.config.ts`. Supports credentials + OAuth providers. +- **Payments**: Stripe via `src/lib/stripe.ts`, with checkout session creation in actions and webhook handling in `src/app/api/webhook/route.ts`. +- **AI**: Vercel AI SDK with multiple providers (OpenAI, Google, DeepSeek, xAI, OpenRouter) for content generation assistance. +- **Email**: React Email templates in `emails/` sent via Resend (`src/lib/mail.ts`). +- **Analytics**: OpenPanel integration (`@openpanel/nextjs`). +- **Image metadata**: Microlink (`@microlink/mql`) for fetching website screenshots/metadata. + +### Components Organization + +`src/components/` is organized by feature domain: `auth/`, `blog/`, `item/`, `category/`, `collection/`, `tag/`, `dashboard/`, `payment/`, `pricing/`, `search/`, `submit/`, `edit/`, `publish/`, `newsletter/`, `settings/`, `home/` (+ `home2/`, `home3/` variants), `layout/`, `shared/`, `icons/`, and `ui/` (shadcn/ui primitives). + +### Configuration + +- `src/config/site.ts` - Site-wide settings (name, URL, description) +- `src/config/price.ts` - Pricing plans configuration +- `src/config/dashboard.ts` - Dashboard navigation +- `src/config/hero.ts`, `footer.ts`, `faq.ts`, `marketing.ts` - Landing page sections +- `src/lib/constants.ts` - Shared constants +- `src/lib/schemas.ts` - Zod validation schemas used across forms and actions + +### Styling + +Tailwind CSS with `tailwind.config.ts`. UI primitives are Radix UI-based shadcn/ui components in `src/components/ui/`. Biome ignores `src/components/ui/*.tsx` (generated code). + +### Environment + +Copy `.env.example` to `.env`. Key variables: `NEXT_PUBLIC_SITE_URL`, `NEXT_PUBLIC_SANITY_PROJECT_ID`, `NEXT_PUBLIC_SANITY_DATASET`, `SANITY_API_TOKEN`, `NEXTAUTH_SECRET`, `STRIPE_SECRET_KEY`, Resend API key, and AI provider keys. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..109a8b8 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,79 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +Mkdirs is a Next.js 14 directory website template with Sanity CMS, enabling AI-powered directory sites with listings, payments, authentication, blog, and newsletter features. + +## Commands + +- **Dev server**: `pnpm dev` +- **Build**: `pnpm build` +- **Start production**: `pnpm start` +- **Lint**: `pnpm lint` (Biome - checks and auto-fixes) +- **Lint with unsafe fixes**: `pnpm lint:fix` +- **Format**: `pnpm format` (Biome) +- **Generate Sanity types**: `pnpm typegen` (run after schema changes) +- **Email preview**: `pnpm email` (starts email dev server on port 3333) +- **Batch item operations**: `pnpm item:import`, `pnpm item:fetch`, `pnpm item:update`, `pnpm item:remove` +- **Batch all**: `pnpm batch` (or `pnpm batch:import`, `pnpm batch:update`, `pnpm batch:remove`) + +## Architecture + +### Route Structure (Next.js App Router) + +The app uses two top-level route groups: + +- `src/app/(website)/` - Main website with nested groups: + - `(public)/` - Public pages: home, search, item, category, tag, collection, blog, pricing + - `(protected)/` - Auth-required pages: dashboard, settings, submit, edit + - `(newsletter)/` - Newsletter unsubscribe + - `auth/` - Login, register, reset password, email verification +- `src/app/(sanity)/` - Sanity Studio admin interface (accessible at `/studio`) +- `src/app/api/` - API routes: auth, webhook (Stripe), og images, draft mode, send-email, upload-image + +### Route Protection + +`src/routes.ts` defines public routes, auth routes, and API auth prefix. `src/middleware.ts` enforces access control. Authenticated users on auth routes redirect to `/dashboard`. + +### Data Layer + +- **Sanity CMS** is the primary content store. Schemas live in `src/sanity/schemas/documents/` organized by domain: `directory/` (item, category, tag, collection, group), `blog/` (post, author), `page/`, `order/`, `auth/`, and `settings.ts`. +- **`src/data/`** contains data access functions (item.ts, blog.ts, collection.ts, user.ts, account.ts, order.ts, submission.ts, etc.) used by server components and actions. +- **`src/sanity/lib/`** has Sanity client utilities and GROQ query helpers. +- **`sanity.types.ts`** contains auto-generated TypeScript types from Sanity schemas (regenerate with `pnpm typegen`). + +### Server Actions + +`src/actions/` contains all server actions for mutations: authentication (login, register, reset), item operations (submit, edit, publish, unpublish), payment (checkout sessions, customer portal), settings, newsletter subscription, and admin operations. + +### Key Integrations + +- **Auth**: NextAuth v5 (beta.18) configured in `src/auth.ts` and `src/auth.config.ts`. Supports credentials + OAuth providers. +- **Payments**: Stripe via `src/lib/stripe.ts`, with checkout session creation in actions and webhook handling in `src/app/api/webhook/route.ts`. +- **AI**: Vercel AI SDK with multiple providers (OpenAI, Google, DeepSeek, xAI, OpenRouter) for content generation assistance. +- **Email**: React Email templates in `emails/` sent via Resend (`src/lib/mail.ts`). +- **Analytics**: OpenPanel integration (`@openpanel/nextjs`). +- **Image metadata**: Microlink (`@microlink/mql`) for fetching website screenshots/metadata. + +### Components Organization + +`src/components/` is organized by feature domain: `auth/`, `blog/`, `item/`, `category/`, `collection/`, `tag/`, `dashboard/`, `payment/`, `pricing/`, `search/`, `submit/`, `edit/`, `publish/`, `newsletter/`, `settings/`, `home/` (+ `home2/`, `home3/` variants), `layout/`, `shared/`, `icons/`, and `ui/` (shadcn/ui primitives). + +### Configuration + +- `src/config/site.ts` - Site-wide settings (name, URL, description) +- `src/config/price.ts` - Pricing plans configuration +- `src/config/dashboard.ts` - Dashboard navigation +- `src/config/hero.ts`, `footer.ts`, `faq.ts`, `marketing.ts` - Landing page sections +- `src/lib/constants.ts` - Shared constants +- `src/lib/schemas.ts` - Zod validation schemas used across forms and actions + +### Styling + +Tailwind CSS with `tailwind.config.ts`. UI primitives are Radix UI-based shadcn/ui components in `src/components/ui/`. Biome ignores `src/components/ui/*.tsx` (generated code). + +### Environment + +Copy `.env.example` to `.env`. Key variables: `NEXT_PUBLIC_SITE_URL`, `NEXT_PUBLIC_SANITY_PROJECT_ID`, `NEXT_PUBLIC_SANITY_DATASET`, `SANITY_API_TOKEN`, `NEXTAUTH_SECRET`, `STRIPE_SECRET_KEY`, Resend API key, and AI provider keys. diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e3f70e9 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,61 @@ +# https://github.com/nextauthjs/next-auth-example/blob/main/Dockerfile +# syntax=docker/dockerfile:1 +FROM node:20-alpine AS base + +# Install dependencies only when needed +FROM base AS deps +# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. +RUN apk add --no-cache libc6-compat +WORKDIR /app + +# Install dependencies +COPY package.json pnpm-lock.yaml* ./ +RUN npm install -g pnpm && pnpm i --frozen-lockfile + +# Rebuild the source code only when needed +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# Next.js collects completely anonymous telemetry data about general usage. +# Learn more here: https://nextjs.org/telemetry +# Uncomment the following line in case you want to disable telemetry during the build. +# ENV NEXT_TELEMETRY_DISABLED 1 + +RUN npm install -g pnpm \ + && mv next.config.docker.mjs next.config.mjs \ + && pnpm build + +# Production image, copy all the files and run next +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV production +# Uncomment the following line in case you want to disable telemetry during runtime. +# ENV NEXT_TELEMETRY_DISABLED 1 + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public + +# Set the correct permission for prerender cache +RUN mkdir .next +RUN chown nextjs:nodejs .next + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3000 + +ENV PORT 3000 +ENV HOSTNAME "0.0.0.0" + +# server.js is created by next build from the standalone output +# https://nextjs.org/docs/pages/api-reference/next-config-js/output +CMD ["node", "server.js"] \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..ab143ce --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +# Mkdirs + +Launch AI-powered directory websites in minutes + +[![GitHub stars](https://img.shields.io/github/stars/MkdirsHQ/mkdirs)](https://github.com/MkdirsHQ/mkdirs/stargazers) +[![License](https://img.shields.io/github/license/MkdirsHQ/mkdirs)](LICENSE) + +Mkdirs helps you launch a directory website with listings, AI-assisted +submissions, payments, authentication, CMS, blog, newsletter, SEO, themes, +and more. + +[Live Demo](https://demo.mkdirs.com) · [Documentation](https://docs.mkdirs.com) · [Installation Guide](https://docs.mkdirs.com/installation) · [Video Tutorials](https://www.youtube.com/@MkdirsHQ) · [Showcase](https://mkdirs.com/showcase) + +![Mkdirs directory website template](public/og.png) + +## Features + +- Directory listings, categories, collections, tags, and search +- AI-assisted website submission and content generation +- User authentication and dashboard +- Free, paid, and sponsored submissions with Stripe +- Sanity CMS and blog +- Email and newsletter integration with Resend +- SEO, analytics, themes, and responsive layouts +- Vercel and Docker deployment + +## Tech Stack + +Next.js, React, TypeScript, Tailwind CSS, Sanity, Auth.js, Stripe, and Resend. + +For installation, configuration, customization, deployment, and video +tutorials, visit the [Mkdirs documentation](https://docs.mkdirs.com). + +## Links + +- [Website](https://mkdirs.com) +- [Demo](https://demo.mkdirs.com) +- [Documentation](https://docs.mkdirs.com) +- [YouTube](https://www.youtube.com/@MkdirsHQ) +- [Discord](https://mksaas.link/discord) + +## License + +Licensed under the [Apache License 2.0](LICENSE). You may use, modify, and +distribute the code, including for commercial purposes, subject to the terms +of the license. + +The license does not grant permission to use the Mkdirs name, logo, or other +trademarks to identify or promote derived products. Reasonable use to describe +the origin of the software, such as “Built with Mkdirs,” is permitted. + +Copyright © Mkdirs. diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..6fdc08c --- /dev/null +++ b/biome.json @@ -0,0 +1,36 @@ +{ + "files": { + "ignore": [ + "src/components/ui/*.tsx" + ] + }, + "formatter": { + "enabled": true, + "formatWithErrors": false, + "ignore": [], + "attributePosition": "auto", + "indentStyle": "space", + "indentWidth": 2, + "lineWidth": 80, + "lineEnding": "lf" + }, + "javascript": { + "formatter": { + "arrowParentheses":"always", + "bracketSameLine": false, + "bracketSpacing": true, + "jsxQuoteStyle": "double", + "quoteProperties": "asNeeded", + "semicolons": "always", + "trailingCommas": "all" + } + }, + "json": { + "formatter": { + "trailingCommas": "none" + } + }, + "organizeImports": { + "enabled": true + } +} \ No newline at end of file diff --git a/components.json b/components.json new file mode 100644 index 0000000..15f2b02 --- /dev/null +++ b/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "app/globals.css", + "baseColor": "slate", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} \ No newline at end of file diff --git a/emails/approval-email.tsx b/emails/approval-email.tsx new file mode 100644 index 0000000..cb48c0f --- /dev/null +++ b/emails/approval-email.tsx @@ -0,0 +1,119 @@ +import { siteConfig } from "@/config/site"; +import { getBaseUrl } from "@/lib/utils"; +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Text, +} from "@react-email/components"; +import { + anchor, + box, + button, + container, + footer, + footerLeft, + footerRight, + hr, + main, + paragraph, +} from "./email-formats"; + +interface ApprovalEmailProps { + userName?: string; + itemLink?: string; +} + +/** + * https://demo.react.email/preview/welcome/stripe-welcome + */ +export const ApprovalEmail = ({ + userName, + itemLink, +}: ApprovalEmailProps) => { + const baseUrl = getBaseUrl(); + return ( + + + Your submission has been approved + + +
+ Logo +
+ Hi {userName}, + + Thanks for submitting your product to{" "} + + {siteConfig.name} + + . We're so excited to include your product in our directory! + + + Your product has been successfully added to our directory. You can + view your listing by clicking the button below: + + +
+ + We appreciate your support and contribution to our community. If + you have any questions, please don't hesitate to contact us. + + + Thank you again for choosing{" "} + + {siteConfig.name} + + . We look forward to helping more people discover your product! + + + Thanks,
+ The{" "} + + {siteConfig.name} + {" "} + team +
+
+ + + © {new Date().getFullYear()} +    All Rights Reserved. + + + + Twitter + +      + + GitHub + + + +
+
+ + + ); +}; + +ApprovalEmail.PreviewProps = { + userName: "Javayhu", + itemLink: "https://demo.mkdirs.com", +} as ApprovalEmailProps; + +export default ApprovalEmail; diff --git a/emails/email-formats.ts b/emails/email-formats.ts new file mode 100644 index 0000000..0f64e54 --- /dev/null +++ b/emails/email-formats.ts @@ -0,0 +1,62 @@ +export const main = { + // backgroundColor: "#f6f9fc", + // padding: "40px", + fontFamily: '-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Ubuntu,sans-serif', +}; + +export const container = { + // backgroundColor: "#ffffff", + // padding: "20px 0 20px", +}; + +export const box = { + padding: "8px", +}; + +export const hr = { + borderColor: "#e6ebf1", + margin: "20px 0", +}; + +export const paragraph = { + color: "#525f7f", + fontSize: "16px", + lineHeight: "24px", + textAlign: "left" as const, +}; + +export const anchor = { + color: "#556cd6", +}; + +export const button = { + backgroundColor: "#656ee8", + borderRadius: "5px", + color: "#fff", + fontSize: "16px", + fontWeight: "bold", + textDecoration: "none", + textAlign: "center" as const, + display: "block", + width: "100%", + padding: "10px", +}; + +export const footer = { + width: "100%", + color: "#8898aa", + fontSize: "12px", + lineHeight: "16px", + display: "table", + tableLayout: "fixed" as const, +}; + +export const footerLeft = { + display: "table-cell", + textAlign: "left" as const, +}; + +export const footerRight = { + display: "table-cell", + textAlign: "right" as const, +}; \ No newline at end of file diff --git a/emails/newsletter-welcome.tsx b/emails/newsletter-welcome.tsx new file mode 100644 index 0000000..a27de5a --- /dev/null +++ b/emails/newsletter-welcome.tsx @@ -0,0 +1,98 @@ +import { siteConfig } from "@/config/site"; +import { getBaseUrl } from "@/lib/utils"; +import { + Body, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Text, +} from "@react-email/components"; +import { + anchor, + box, + container, + footer, + footerLeft, + footerRight, + hr, + main, + paragraph, +} from "./email-formats"; + +export const NewsletterWelcomeEmail = ({ email }: { email: string }) => { + const baseUrl = getBaseUrl(); + const unsubscribeUrl = `${baseUrl}/unsubscribe?email=${encodeURIComponent(email)}`; + + return ( + + + Welcome to Mkdirs! + + +
+ Logo +
+ + Welcome to our community! We're thrilled to have you join us on + this journey of exploring cutting-edge websites and tools. + + + We value your participation and feedback. Please don't hesitate to + reach out to us if you have any questions or suggestions. + + + Thanks,
+ The{" "} + + {siteConfig.name} + {" "} + team +
+
+ + + © {new Date().getFullYear()} +   All Rights Reserved. + + + + + Twitter + +      + + GitHub + + + + + + If you wish to unsubscribe,{" "} + + click here + + . + + +
+
+ + + ); +}; + +export default NewsletterWelcomeEmail; + +NewsletterWelcomeEmail.PreviewProps = { + email: "support@mkdirs.com", +}; diff --git a/emails/notify-submission-to-admin.tsx b/emails/notify-submission-to-admin.tsx new file mode 100644 index 0000000..f4f2d91 --- /dev/null +++ b/emails/notify-submission-to-admin.tsx @@ -0,0 +1,99 @@ +import { siteConfig } from "@/config/site"; +import { getBaseUrl } from "@/lib/utils"; +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Text, +} from "@react-email/components"; +import { + anchor, + box, + button, + container, + footer, + footerLeft, + footerRight, + hr, + main, + paragraph, +} from "./email-formats"; + +interface NotifySubmissionEmailProps { + itemName?: string; + reviewLink?: string; +} + +/** + * https://demo.react.email/preview/welcome/stripe-welcome + */ +export const NotifySubmissionEmail = ({ + itemName, + reviewLink, +}: NotifySubmissionEmailProps) => { + const baseUrl = getBaseUrl(); + return ( + + + New submission + + +
+ Logo +
+ New submission + + A new submission named {itemName} is ready to be reviewed. + + + + Thanks,
+ The{" "} + + {siteConfig.name} + {" "} + team +
+
+ + + © {new Date().getFullYear()} +    All Rights Reserved. + + + + Twitter + +      + + GitHub + + + +
+
+ + + ); +}; + +NotifySubmissionEmail.PreviewProps = { + itemName: "Mkdirs", + reviewLink: "https://demo.mkdirs.com", +} as NotifySubmissionEmailProps; + +export default NotifySubmissionEmail; diff --git a/emails/notify-submission-to-user.tsx b/emails/notify-submission-to-user.tsx new file mode 100644 index 0000000..a1d78ca --- /dev/null +++ b/emails/notify-submission-to-user.tsx @@ -0,0 +1,119 @@ +import { siteConfig } from "@/config/site"; +import { getBaseUrl } from "@/lib/utils"; +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Text, +} from "@react-email/components"; +import { + anchor, + box, + button, + container, + footer, + footerLeft, + footerRight, + hr, + main, + paragraph, +} from "./email-formats"; + +interface NotifySubmissionToUserEmailProps { + userName?: string; + itemName?: string; + statusLink?: string; +} + +/** + * https://demo.react.email/preview/welcome/stripe-welcome + */ +export const NotifySubmissionToUserEmail = ({ + userName, + itemName, + statusLink, +}: NotifySubmissionToUserEmailProps) => { + const baseUrl = getBaseUrl(); + return ( + + + Thank you for your submission + + +
+ Logo +
+ Hi {userName}, + Thank you for your submission. + + Your product named {itemName} will be reviewed in the next + 48 hours before listing on our directory. + + + You can view your submission status by clicking the button below: + + +
+ + We appreciate your support and contribution to our community. If + you have any questions, please don't hesitate to contact us. + + + Thank you again for choosing{" "} + + {siteConfig.name} + + . We look forward to helping more people discover your product! + + + Thanks,
+ The{" "} + + {siteConfig.name} + {" "} + team +
+
+ + + © {new Date().getFullYear()} +    All Rights Reserved. + + + + Twitter + +      + + GitHub + + + +
+
+ + + ); +}; + +NotifySubmissionToUserEmail.PreviewProps = { + userName: "Javayhu", + itemName: "Mkdirs", + statusLink: "https://demo.mkdirs.com", +} as NotifySubmissionToUserEmailProps; + +export default NotifySubmissionToUserEmail; diff --git a/emails/payment-success.tsx b/emails/payment-success.tsx new file mode 100644 index 0000000..52cbc08 --- /dev/null +++ b/emails/payment-success.tsx @@ -0,0 +1,123 @@ +import { siteConfig } from "@/config/site"; +import { getBaseUrl } from "@/lib/utils"; +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Text, +} from "@react-email/components"; +import { + anchor, + box, + button, + container, + footer, + footerLeft, + footerRight, + hr, + main, + paragraph, +} from "./email-formats"; + +interface PaymentSuccessEmailProps { + userName?: string; + itemLink?: string; +} + +/** + * https://demo.react.email/preview/welcome/stripe-welcome + */ +export const PaymentSuccessEmail = ({ + userName, + itemLink, +}: PaymentSuccessEmailProps) => { + const baseUrl = getBaseUrl(); + return ( + + + Thanks for your submission + + +
+ Logo +
+ Hi {userName}, + + Thanks for submitting your product to{" "} + + {siteConfig.name} + + . We're so excited to include your product in our directory! + + + If you have purchased the sponsor plan, please reply to this email + to schedule when your product will be displayed. + + + Your product has been successfully added to our directory. You can + view your listing by clicking the button below: + + +
+ + We appreciate your support and contribution to our community. If + you have any questions, please don't hesitate to contact us. + + + Thank you again for choosing{" "} + + {siteConfig.name} + + . We look forward to helping more people discover your product! + + + Thanks,
+ The{" "} + + {siteConfig.name} + {" "} + team +
+
+ + + © {new Date().getFullYear()} +    All Rights Reserved. + + + + Twitter + +      + + GitHub + + + +
+
+ + + ); +}; + +PaymentSuccessEmail.PreviewProps = { + userName: "Javayhu", + itemLink: "https://demo.mkdirs.com", +} as PaymentSuccessEmailProps; + +export default PaymentSuccessEmail; diff --git a/emails/rejection-email.tsx b/emails/rejection-email.tsx new file mode 100644 index 0000000..3496049 --- /dev/null +++ b/emails/rejection-email.tsx @@ -0,0 +1,107 @@ +import { siteConfig } from "@/config/site"; +import { getBaseUrl } from "@/lib/utils"; +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Text, +} from "@react-email/components"; +import { + anchor, + box, + button, + container, + footer, + footerLeft, + footerRight, + hr, + main, + paragraph, +} from "./email-formats"; + +interface RejectionEmailProps { + userName?: string; + dashboardLink?: string; +} + +/** + * https://demo.react.email/preview/welcome/stripe-welcome + */ +export const RejectionEmail = ({ + userName, + dashboardLink, +}: RejectionEmailProps) => { + const baseUrl = getBaseUrl(); + return ( + + + Your submission has been rejected + + +
+ Logo +
+ Hi {userName}, + + Thanks for submitting your product to{" "} + + {siteConfig.name} + + . We're sorry to inform you that your product has been rejected. + + + Please check your submission and make the necessary changes. + + +
+ + Thanks,
+ The{" "} + + {siteConfig.name} + {" "} + team +
+
+ + + © {new Date().getFullYear()} +    All Rights Reserved. + + + + Twitter + +      + + GitHub + + + +
+
+ + + ); +}; + +RejectionEmail.PreviewProps = { + userName: "Javayhu", + itemLink: "https://demo.mkdirs.com", +} as RejectionEmailProps; + +export default RejectionEmail; diff --git a/emails/reset-password.tsx b/emails/reset-password.tsx new file mode 100644 index 0000000..9672db9 --- /dev/null +++ b/emails/reset-password.tsx @@ -0,0 +1,109 @@ +import { siteConfig } from "@/config/site"; +import { getBaseUrl } from "@/lib/utils"; +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Text, +} from "@react-email/components"; +import { + anchor, + box, + button, + container, + footer, + footerLeft, + footerRight, + hr, + main, + paragraph, +} from "./email-formats"; + +interface ResetPasswordEmailProps { + userName?: string; + resetLink?: string; +} + +/** + * https://demo.react.email/preview/welcome/stripe-welcome + */ +export const ResetPasswordEmail = ({ + userName, + resetLink, +}: ResetPasswordEmailProps) => { + const baseUrl = getBaseUrl(); + return ( + + + Reset your password + + +
+ Logo +
+ Hi {userName}, + + Someone recently requested a password change for your account. If + this was you, you can set a new password here: + + +
+ + If you don't want to change your password or didn't + request this, just ignore and delete this message. + + + To keep your account secure, please don't forward this email + to anyone. + + + Thanks,
+ The{" "} + + {siteConfig.name} + {" "} + team +
+
+ + + © {new Date().getFullYear()} +    All Rights Reserved. + + + + Twitter + +      + + GitHub + + + +
+
+ + + ); +}; + +ResetPasswordEmail.PreviewProps = { + userName: "Javayhu", + resetLink: "https://demo.mkdirs.com", +} as ResetPasswordEmailProps; + +export default ResetPasswordEmail; diff --git a/emails/verify-email.tsx b/emails/verify-email.tsx new file mode 100644 index 0000000..acc93c3 --- /dev/null +++ b/emails/verify-email.tsx @@ -0,0 +1,101 @@ +import { siteConfig } from "@/config/site"; +import { getBaseUrl } from "@/lib/utils"; +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Text, +} from "@react-email/components"; +import { + anchor, + box, + button, + container, + footer, + footerLeft, + footerRight, + hr, + main, + paragraph, +} from "./email-formats"; + +interface VerifyEmailProps { + confirmLink?: string; +} + +/** + * https://demo.react.email/preview/welcome/stripe-welcome + */ +export const VerifyEmail = ({ confirmLink }: VerifyEmailProps) => { + const baseUrl = getBaseUrl(); + return ( + + + Confirm your email address + + +
+ Logo +
+ Confirm your email address + + Thanks for starting the new account creation process. We want to + make sure it's really you. Please click the confirmation link to + continue. + + +
+ + If you don't want to create an account, you can ignore this + message. + + + Thanks,
+ The{" "} + + {siteConfig.name} + {" "} + team +
+
+ + + © {new Date().getFullYear()} +    All Rights Reserved. + + + + Twitter + +      + + GitHub + + + +
+
+ + + ); +}; + +VerifyEmail.PreviewProps = { + confirmLink: "https://demo.mkdirs.com", +} as VerifyEmailProps; + +export default VerifyEmail; diff --git a/next.config.docker.mjs b/next.config.docker.mjs new file mode 100644 index 0000000..9305238 --- /dev/null +++ b/next.config.docker.mjs @@ -0,0 +1,52 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + output: "standalone", + // Configure `pageExtensions` to include markdown and MDX files + // https://nextjs.org/docs/pages/building-your-application/configuring/mdx + // pageExtensions: ['js', 'jsx', 'md', 'mdx', 'ts', 'tsx'], + + // https://nextjs.org/docs/pages/api-reference/next-config-js/reactStrictMode + // if enabled, new-verification-form will trigger twice and seems buggy in dev mode, + // but it's not a problem in production, so you can try to comment it out and let it go. + // reactStrictMode: false, + + // https://nextjs.org/docs/architecture/nextjs-compiler#remove-console + // Remove all console.* calls in production only + compiler: { + removeConsole: process.env.NODE_ENV === "production", + }, + + images: { + // https://vercel.com/docs/image-optimization/managing-image-optimization-costs#minimizing-image-optimization-costs + // vercel has limits on image optimization, 1000 images per month + unoptimized: true, + // https://medium.com/@niniroula/nextjs-upgrade-next-image-and-dangerouslyallowsvg-c934060d79f8 + // The requested resource "https://cdn.sanity.io/images/58a2mkbj/preview/xxx.svg?fit=max&auto=format" has type "image/svg+xml" + // but dangerouslyAllowSVG is disabled + dangerouslyAllowSVG: true, + remotePatterns: [ + { + protocol: "https", + hostname: "avatars.githubusercontent.com", + }, + { + protocol: "https", + hostname: "lh3.googleusercontent.com", + }, + { + protocol: "https", + hostname: "randomuser.me", + }, + { + protocol: "https", + hostname: "cdn.sanity.io", // https://www.sanity.io/learn/course/day-one-with-sanity-studio/bringing-content-to-a-next-js-front-end + }, + { + protocol: "https", + hostname: "via.placeholder.com", // https://www.sanity.io/learn/course/day-one-with-sanity-studio/bringing-content-to-a-next-js-front-end + }, + ], + }, +}; + +export default nextConfig; diff --git a/next.config.mjs b/next.config.mjs new file mode 100644 index 0000000..9b5de68 --- /dev/null +++ b/next.config.mjs @@ -0,0 +1,51 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + // Configure `pageExtensions` to include markdown and MDX files + // https://nextjs.org/docs/pages/building-your-application/configuring/mdx + // pageExtensions: ['js', 'jsx', 'md', 'mdx', 'ts', 'tsx'], + + // https://nextjs.org/docs/pages/api-reference/next-config-js/reactStrictMode + // if enabled, new-verification-form will trigger twice and seems buggy in dev mode, + // but it's not a problem in production, so you can try to comment it out and let it go. + // reactStrictMode: false, + + // https://nextjs.org/docs/architecture/nextjs-compiler#remove-console + // Remove all console.* calls in production only + compiler: { + removeConsole: process.env.NODE_ENV === "production", + }, + + images: { + // https://vercel.com/docs/image-optimization/managing-image-optimization-costs#minimizing-image-optimization-costs + // vercel has limits on image optimization, 1000 images per month + unoptimized: true, + // https://medium.com/@niniroula/nextjs-upgrade-next-image-and-dangerouslyallowsvg-c934060d79f8 + // The requested resource "https://cdn.sanity.io/images/58a2mkbj/preview/xxx.svg?fit=max&auto=format" has type "image/svg+xml" + // but dangerouslyAllowSVG is disabled + dangerouslyAllowSVG: true, + remotePatterns: [ + { + protocol: "https", + hostname: "avatars.githubusercontent.com", + }, + { + protocol: "https", + hostname: "lh3.googleusercontent.com", + }, + { + protocol: "https", + hostname: "randomuser.me", + }, + { + protocol: "https", + hostname: "cdn.sanity.io", // https://www.sanity.io/learn/course/day-one-with-sanity-studio/bringing-content-to-a-next-js-front-end + }, + { + protocol: "https", + hostname: "via.placeholder.com", // https://www.sanity.io/learn/course/day-one-with-sanity-studio/bringing-content-to-a-next-js-front-end + }, + ], + }, +}; + +export default nextConfig; diff --git a/package.json b/package.json new file mode 100644 index 0000000..5e15dac --- /dev/null +++ b/package.json @@ -0,0 +1,159 @@ +{ + "name": "mkdirs", + "version": "1.0.0", + "private": true, + "description": "An open-source, AI-powered directory website template built with Next.js", + "license": "Apache-2.0", + "homepage": "https://mkdirs.com", + "repository": { + "type": "git", + "url": "https://github.com/MkdirsHQ/mkdirs.git" + }, + "author": { + "name": "Mkdirs", + "url": "https://github.com/MkdirsHQ" + }, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "biome check --write .", + "lint:fix": "biome check --fix --unsafe .", + "format": "biome format --write .", + "typegen": "sanity schema extract && sanity typegen generate", + "email": "email dev --dir emails --port 3333", + "export-user-emails": "tsx scripts/export-user-emails.ts", + "microlink:fetch": "tsx scripts/explore-microlink.ts fetch", + "microlink:insights": "tsx scripts/explore-microlink.ts insights", + "microlink:screenshot": "tsx scripts/explore-microlink.ts screenshot", + "microlink:fullpage": "tsx scripts/explore-microlink.ts fullpage", + "aisdk:fetch": "tsx scripts/explore-aisdk.ts fetch", + "aisdk:structure": "tsx scripts/explore-aisdk.ts structure", + "item:remove": "tsx scripts/batch-item.ts remove", + "item:import": "tsx scripts/batch-item.ts import", + "item:update": "tsx scripts/batch-item.ts update", + "item:fetch": "tsx scripts/batch-item.ts fetch", + "batch": "tsx scripts/batch-all.ts", + "batch:remove": "tsx scripts/batch-all.ts remove", + "batch:import": "tsx scripts/batch-all.ts import", + "batch:update": "tsx scripts/batch-all.ts update" + }, + "dependencies": { + "@ai-sdk/deepseek": "^0.1.0", + "@ai-sdk/google": "^1.0.15", + "@ai-sdk/openai": "^1.0.18", + "@ai-sdk/xai": "^1.2.16", + "@auth/core": "^0.34.2", + "@hookform/resolvers": "^3.9.0", + "@microlink/mql": "^0.13.12", + "@next/third-parties": "^15.0.3", + "@openpanel/nextjs": "^1.0.5", + "@openrouter/ai-sdk-provider": "^0.4.6", + "@opentelemetry/api": "1.8.0", + "@radix-ui/react-accessible-icon": "^1.1.0", + "@radix-ui/react-accordion": "^1.2.1", + "@radix-ui/react-alert-dialog": "^1.1.2", + "@radix-ui/react-aspect-ratio": "^1.1.0", + "@radix-ui/react-avatar": "^1.1.1", + "@radix-ui/react-checkbox": "^1.1.2", + "@radix-ui/react-collapsible": "^1.1.1", + "@radix-ui/react-context-menu": "^2.2.2", + "@radix-ui/react-dialog": "^1.1.2", + "@radix-ui/react-dropdown-menu": "^2.1.2", + "@radix-ui/react-hover-card": "^1.1.2", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-menubar": "^1.1.2", + "@radix-ui/react-navigation-menu": "^1.2.1", + "@radix-ui/react-popover": "^1.1.2", + "@radix-ui/react-progress": "^1.1.0", + "@radix-ui/react-radio-group": "^1.2.1", + "@radix-ui/react-scroll-area": "^1.2.0", + "@radix-ui/react-select": "^2.1.2", + "@radix-ui/react-separator": "^1.1.0", + "@radix-ui/react-slider": "^1.2.1", + "@radix-ui/react-slot": "^1.1.0", + "@radix-ui/react-switch": "^1.1.1", + "@radix-ui/react-tabs": "^1.1.1", + "@radix-ui/react-toast": "^1.2.2", + "@radix-ui/react-toggle": "^1.1.0", + "@radix-ui/react-toggle-group": "^1.1.0", + "@radix-ui/react-tooltip": "^1.1.3", + "@react-email/components": "0.0.25", + "@sanity/block-content-to-markdown": "^0.0.5", + "@sanity/client": "^6.21.3", + "@sanity/code-input": "^4.1.4", + "@sanity/dashboard": "^4.0.0", + "@sanity/icons": "^3.4.0", + "@sanity/image-url": "^1.0.2", + "@sanity/preview-url-secret": "^1.6.20", + "@sanity/uuid": "^3.0.2", + "@sanity/vision": "^3.57.2", + "@sanity/visual-editing": "^2.1.9", + "@tailwindcss/typography": "^0.5.15", + "ai": "^4.0.33", + "bcryptjs": "^2.4.3", + "canvas-confetti": "^1.9.3", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "cmdk": "1.0.0", + "date-fns": "^3.6.0", + "easymde": "^2.18.0", + "glob": "^11.0.0", + "groq": "^3.55.0", + "lucide-react": "^0.414.0", + "mdast-util-toc": "^7.1.0", + "next": "14.2.35", + "next-auth": "5.0.0-beta.18", + "next-mdx-remote-client": "^1.0.3", + "next-sanity": "^9.4.5", + "next-themes": "^0.3.0", + "node-fetch": "^3.3.2", + "react": "^18.3.1", + "react-day-picker": "^9.0.8", + "react-dom": "^18.3.1", + "react-dropzone": "^14.2.3", + "react-hook-form": "^7.53.0", + "react-iframe": "^1.8.5", + "react-simplemde-editor": "^5.2.0", + "resend": "^3.5.0", + "rimraf": "^6.0.1", + "sanity": "^3.57.2", + "sanity-plugin-asset-source-unsplash": "^3.0.1", + "sanity-plugin-iframe-pane": "^3.1.6", + "sanity-plugin-internationalized-array": "^2.1.0", + "sanity-plugin-markdown": "^5.0.0", + "sanity-plugin-media": "^2.3.2", + "sonner": "^1.5.0", + "stripe": "^15.12.0", + "styled-components": "^6", + "tailwind-merge": "^2.5.2", + "tailwindcss-animate": "^1.0.7", + "transliteration": "^2.3.5", + "use-debounce": "^10.0.3", + "vaul": "^0.9.9", + "zod": "^3.23.8" + }, + "devDependencies": { + "@biomejs/biome": "1.9.3", + "@types/bcryptjs": "^2.4.6", + "@types/node": "^22.9.0", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "autoprefixer": "^10.4.20", + "dotenv": "^16.4.7", + "html-loader": "^5.1.0", + "postcss": "^8.4.41", + "react-email": "3.0.1", + "rehype": "^13.0.1", + "rehype-autolink-headings": "^7.1.0", + "rehype-pretty-code": "^0.13.2", + "rehype-slug": "^6.0.0", + "remark": "^15.0.1", + "remark-gfm": "^4.0.0", + "tailwindcss": "^3.4.10", + "tsx": "^4.19.2", + "typescript": "^5.6.3", + "unist-util-visit": "^5.0.0" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..1dc21bb --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,16791 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@ai-sdk/deepseek': + specifier: ^0.1.0 + version: 0.1.0(zod@3.23.8) + '@ai-sdk/google': + specifier: ^1.0.15 + version: 1.0.15(zod@3.23.8) + '@ai-sdk/openai': + specifier: ^1.0.18 + version: 1.0.18(zod@3.23.8) + '@ai-sdk/xai': + specifier: ^1.2.16 + version: 1.2.16(zod@3.23.8) + '@auth/core': + specifier: ^0.34.2 + version: 0.34.2 + '@hookform/resolvers': + specifier: ^3.9.0 + version: 3.9.1(react-hook-form@7.53.1(react@18.3.1)) + '@microlink/mql': + specifier: ^0.13.12 + version: 0.13.12 + '@next/third-parties': + specifier: ^15.0.3 + version: 15.0.3(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@openpanel/nextjs': + specifier: ^1.0.5 + version: 1.0.5(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@openrouter/ai-sdk-provider': + specifier: ^0.4.6 + version: 0.4.6(zod@3.23.8) + '@opentelemetry/api': + specifier: 1.8.0 + version: 1.8.0 + '@radix-ui/react-accessible-icon': + specifier: ^1.1.0 + version: 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-accordion': + specifier: ^1.2.1 + version: 1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-alert-dialog': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-aspect-ratio': + specifier: ^1.1.0 + version: 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-avatar': + specifier: ^1.1.1 + version: 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-checkbox': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collapsible': + specifier: ^1.1.1 + version: 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-context-menu': + specifier: ^2.2.2 + version: 2.2.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dialog': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.2 + version: 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-hover-card': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-icons': + specifier: ^1.3.0 + version: 1.3.1(react@18.3.1) + '@radix-ui/react-label': + specifier: ^2.1.0 + version: 2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-menubar': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-navigation-menu': + specifier: ^1.2.1 + version: 1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popover': + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-progress': + specifier: ^1.1.0 + version: 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-radio-group': + specifier: ^1.2.1 + version: 1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-scroll-area': + specifier: ^1.2.0 + version: 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-select': + specifier: ^2.1.2 + version: 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-separator': + specifier: ^1.1.0 + version: 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slider': + specifier: ^1.2.1 + version: 1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': + specifier: ^1.1.0 + version: 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-switch': + specifier: ^1.1.1 + version: 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-tabs': + specifier: ^1.1.1 + version: 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toast': + specifier: ^1.2.2 + version: 1.2.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toggle': + specifier: ^1.1.0 + version: 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toggle-group': + specifier: ^1.1.0 + version: 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-tooltip': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-email/components': + specifier: 0.0.25 + version: 0.0.25(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/block-content-to-markdown': + specifier: ^0.0.5 + version: 0.0.5 + '@sanity/client': + specifier: ^6.21.3 + version: 6.22.3(debug@4.3.7) + '@sanity/code-input': + specifier: ^4.1.4 + version: 4.1.4(@babel/runtime@7.26.0)(@codemirror/lint@6.8.2)(@codemirror/theme-one-dark@6.1.2)(@lezer/common@1.2.3)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/dashboard': + specifier: ^4.0.0 + version: 4.1.0(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/icons': + specifier: ^3.4.0 + version: 3.4.0(react@18.3.1) + '@sanity/image-url': + specifier: ^1.0.2 + version: 1.1.0 + '@sanity/preview-url-secret': + specifier: ^1.6.20 + version: 1.6.21(@sanity/client@6.22.3) + '@sanity/uuid': + specifier: ^3.0.2 + version: 3.0.2 + '@sanity/vision': + specifier: ^3.57.2 + version: 3.63.0(@babel/runtime@7.26.0)(@codemirror/lint@6.8.2)(@codemirror/theme-one-dark@6.1.2)(@lezer/common@1.2.3)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/visual-editing': + specifier: ^2.1.9 + version: 2.4.4(@sanity/client@6.22.3)(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tailwindcss/typography': + specifier: ^0.5.15 + version: 0.5.15(tailwindcss@3.4.14) + ai: + specifier: ^4.0.33 + version: 4.0.33(react@18.3.1)(zod@3.23.8) + bcryptjs: + specifier: ^2.4.3 + version: 2.4.3 + canvas-confetti: + specifier: ^1.9.3 + version: 1.9.3 + class-variance-authority: + specifier: ^0.7.0 + version: 0.7.0 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + cmdk: + specifier: 1.0.0 + version: 1.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + date-fns: + specifier: ^3.6.0 + version: 3.6.0 + easymde: + specifier: ^2.18.0 + version: 2.18.0 + glob: + specifier: ^11.0.0 + version: 11.0.0 + groq: + specifier: ^3.55.0 + version: 3.63.0 + lucide-react: + specifier: ^0.414.0 + version: 0.414.0(react@18.3.1) + mdast-util-toc: + specifier: ^7.1.0 + version: 7.1.0 + next: + specifier: 14.2.35 + version: 14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-auth: + specifier: 5.0.0-beta.18 + version: 5.0.0-beta.18(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + next-mdx-remote-client: + specifier: ^1.0.3 + version: 1.0.3(@types/react@18.3.12)(acorn@8.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-sanity: + specifier: ^9.4.5 + version: 9.8.8(@sanity/client@6.22.3)(@sanity/icons@3.4.0(react@18.3.1))(@sanity/types@3.63.0)(@sanity/ui@2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + next-themes: + specifier: ^0.3.0 + version: 0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + node-fetch: + specifier: ^3.3.2 + version: 3.3.2 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-day-picker: + specifier: ^9.0.8 + version: 9.3.0(react@18.3.1) + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react-dropzone: + specifier: ^14.2.3 + version: 14.3.5(react@18.3.1) + react-hook-form: + specifier: ^7.53.0 + version: 7.53.1(react@18.3.1) + react-iframe: + specifier: ^1.8.5 + version: 1.8.5(react@18.3.1) + react-simplemde-editor: + specifier: ^5.2.0 + version: 5.2.0(easymde@2.18.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + resend: + specifier: ^3.5.0 + version: 3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rimraf: + specifier: ^6.0.1 + version: 6.0.1 + sanity: + specifier: ^3.57.2 + version: 3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0) + sanity-plugin-asset-source-unsplash: + specifier: ^3.0.1 + version: 3.0.1(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + sanity-plugin-iframe-pane: + specifier: ^3.1.6 + version: 3.1.6(@sanity/client@6.22.3)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + sanity-plugin-internationalized-array: + specifier: ^2.1.0 + version: 2.1.0(@sanity/ui@2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@sanity/util@3.63.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + sanity-plugin-markdown: + specifier: ^5.0.0 + version: 5.0.0(easymde@2.18.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + sanity-plugin-media: + specifier: ^2.3.2 + version: 2.3.2(@sanity/ui@2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + sonner: + specifier: ^1.5.0 + version: 1.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + stripe: + specifier: ^15.12.0 + version: 15.12.0 + styled-components: + specifier: ^6 + version: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tailwind-merge: + specifier: ^2.5.2 + version: 2.5.4 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.14) + transliteration: + specifier: ^2.3.5 + version: 2.3.5 + use-debounce: + specifier: ^10.0.3 + version: 10.0.4(react@18.3.1) + vaul: + specifier: ^0.9.9 + version: 0.9.9(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + zod: + specifier: ^3.23.8 + version: 3.23.8 + devDependencies: + '@biomejs/biome': + specifier: 1.9.3 + version: 1.9.3 + '@types/bcryptjs': + specifier: ^2.4.6 + version: 2.4.6 + '@types/node': + specifier: ^22.9.0 + version: 22.9.0 + '@types/react': + specifier: ^18.3.3 + version: 18.3.12 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.1 + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.47) + dotenv: + specifier: ^16.4.7 + version: 16.4.7 + html-loader: + specifier: ^5.1.0 + version: 5.1.0(webpack@5.96.1(esbuild@0.21.5)) + postcss: + specifier: ^8.4.41 + version: 8.4.47 + react-email: + specifier: 3.0.1 + version: 3.0.1(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rehype: + specifier: ^13.0.1 + version: 13.0.2 + rehype-autolink-headings: + specifier: ^7.1.0 + version: 7.1.0 + rehype-pretty-code: + specifier: ^0.13.2 + version: 0.13.2(shiki@1.22.2) + rehype-slug: + specifier: ^6.0.0 + version: 6.0.0 + remark: + specifier: ^15.0.1 + version: 15.0.1 + remark-gfm: + specifier: ^4.0.0 + version: 4.0.0 + tailwindcss: + specifier: ^3.4.10 + version: 3.4.14 + tsx: + specifier: ^4.19.2 + version: 4.19.2 + typescript: + specifier: ^5.6.3 + version: 5.6.3 + unist-util-visit: + specifier: ^5.0.0 + version: 5.0.0 + +packages: + + '@ai-sdk/deepseek@0.1.0': + resolution: {integrity: sha512-8ldXbIZOtBPNefL60Frcynr98FOrtI749/ipkAsUWfPUQ2OA4ujuGeu90wnONebkRLlxaveZS5+NFR/p3n6Tyg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/google@1.0.15': + resolution: {integrity: sha512-RiyxvjZ3h9WDj0V5OcmKU/aenP5tVtxut061tNb11KIzGANZKzryfOvp2TMx1T3bSfnjt15bsJAB8y8H6Tas3w==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/openai-compatible@0.1.0': + resolution: {integrity: sha512-sgk8oPdnTwImR77HT+esnjoZ7Uu4V5ptXJY+w06GGRCeM3PMJowAqC7gAdYhD5DBYUo+4Gs+wvKenaPBNV0WVg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/openai-compatible@0.2.14': + resolution: {integrity: sha512-icjObfMCHKSIbywijaoLdZ1nSnuRnWgMEMLgwoxPJgxsUHMx0aVORnsLUid4SPtdhHI3X2masrt6iaEQLvOSFw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/openai@1.0.18': + resolution: {integrity: sha512-bienqSVHbUqUcskm2FTIf2X+c481e85EASFfa78YogLqctZQtqPFKJuG5E7i59664Y5G91+LkzIh+1agS13BlA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/provider-utils@2.0.7': + resolution: {integrity: sha512-4sfPlKEALHPXLmMFcPlYksst3sWBJXmCDZpIBJisRrmwGG6Nn3mq0N1Zu/nZaGcrWZoOY+HT2Wbxla1oTElYHQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/provider-utils@2.1.0': + resolution: {integrity: sha512-rBUabNoyB25PBUjaiMSk86fHNSCqTngNZVvXxv8+6mvw47JX5OexW+ZHRsEw8XKTE8+hqvNFVzctaOrRZ2i9Zw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/provider-utils@2.1.10': + resolution: {integrity: sha512-4GZ8GHjOFxePFzkl3q42AU0DQOtTQ5w09vmaWUf/pKFXJPizlnzKSUkF0f+VkapIUfDugyMqPMT1ge8XQzVI7Q==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/provider-utils@2.2.8': + resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + + '@ai-sdk/provider@1.0.4': + resolution: {integrity: sha512-lJi5zwDosvvZER3e/pB8lj1MN3o3S7zJliQq56BRr4e9V3fcRyFtwP0JRxaRS5vHYX3OJ154VezVoQNrk0eaKw==} + engines: {node: '>=18'} + + '@ai-sdk/provider@1.0.9': + resolution: {integrity: sha512-jie6ZJT2ZR0uVOVCDc9R2xCX5I/Dum/wEK28lx21PJx6ZnFAN9EzD2WsPhcDWfCgGx3OAZZ0GyM3CEobXpa9LA==} + engines: {node: '>=18'} + + '@ai-sdk/provider@1.1.3': + resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==} + engines: {node: '>=18'} + + '@ai-sdk/react@1.0.9': + resolution: {integrity: sha512-7mtkgVCSzp8J4x3qk5Vtlk1FiZTH7vWIZvIrA6ISbFDy+7mwm45rIDIymzCiofzr3c/Wioy41H2Ki3Nth55bgg==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.0.0 + peerDependenciesMeta: + react: + optional: true + zod: + optional: true + + '@ai-sdk/ui-utils@1.0.8': + resolution: {integrity: sha512-7ya/t28oMaFauHxSj4WGQCEV/iicZj9qP+O+tCakMIDq7oDCZMUNBLCQomoWs16CcYY4l0wo1S9hA4PAdFcOvA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/xai@1.2.16': + resolution: {integrity: sha512-UOZT8td9PWwMi2dF9a0U44t/Oltmf6QmIJdSvrOcLG4mvpRc1UJn6YJaR0HtXs3YnW6SvY1zRdIDrW4GFpv4NA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@asamuzakjp/dom-selector@2.0.2': + resolution: {integrity: sha512-x1KXOatwofR6ZAYzXRBL5wrdV0vwNxlTCK9NCuLqAzQYARqGcvFwiJA6A1ERuh+dgeA4Dxm3JBYictIes+SqUQ==} + + '@auth/core@0.31.0': + resolution: {integrity: sha512-UKk3psvA1cRbk4/c9CkpWB8mdWrkKvzw0DmEYRsWolUQytQ2cRqx+hYuV6ZCsngw/xbj9hpmkZmAZEyq2g4fMg==} + peerDependencies: + '@simplewebauthn/browser': ^9.0.1 + '@simplewebauthn/server': ^9.0.2 + nodemailer: ^6.8.0 + peerDependenciesMeta: + '@simplewebauthn/browser': + optional: true + '@simplewebauthn/server': + optional: true + nodemailer: + optional: true + + '@auth/core@0.34.2': + resolution: {integrity: sha512-KywHKRgLiF3l7PLyL73fjLSIBe1YNcA6sMeew4yMP6cfCWGXZrkkXd32AjRi1hlJ9nvovUBGZHvbn+LijO6ZeQ==} + peerDependencies: + '@simplewebauthn/browser': ^9.0.1 + '@simplewebauthn/server': ^9.0.2 + nodemailer: ^6.8.0 + peerDependenciesMeta: + '@simplewebauthn/browser': + optional: true + '@simplewebauthn/server': + optional: true + nodemailer: + optional: true + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.2': + resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.5': + resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.2': + resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': + resolution: {integrity: sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.25.9': + resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.25.9': + resolution: {integrity: sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.2': + resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.25.9': + resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.25.9': + resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-simple-access@7.25.9': + resolution: {integrity: sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.25.9': + resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.5': + resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.26.2': + resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': + resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': + resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': + resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': + resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': + resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.26.0': + resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.26.0': + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.25.9': + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.25.9': + resolution: {integrity: sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.25.9': + resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.25.9': + resolution: {integrity: sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.25.9': + resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.25.9': + resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.26.0': + resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.25.9': + resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.25.9': + resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.25.9': + resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.25.9': + resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.25.9': + resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.25.9': + resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.25.9': + resolution: {integrity: sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.25.9': + resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.25.9': + resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.25.9': + resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.25.9': + resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.25.9': + resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.25.9': + resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.25.9': + resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.25.9': + resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.25.9': + resolution: {integrity: sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.25.9': + resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.25.9': + resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.25.9': + resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9': + resolution: {integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.25.9': + resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.25.9': + resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.25.9': + resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.25.9': + resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.25.9': + resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.25.9': + resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.25.9': + resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.25.9': + resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.25.9': + resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-display-name@7.25.9': + resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.25.9': + resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.25.9': + resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.25.9': + resolution: {integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.25.9': + resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.26.0': + resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.25.9': + resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.25.9': + resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.25.9': + resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.25.9': + resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.25.9': + resolution: {integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.25.9': + resolution: {integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.25.9': + resolution: {integrity: sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.25.9': + resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.25.9': + resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.25.9': + resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.25.9': + resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.26.0': + resolution: {integrity: sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-react@7.25.9': + resolution: {integrity: sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.26.0': + resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/register@7.25.9': + resolution: {integrity: sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.9': + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + engines: {node: '>=6.9.0'} + + '@biomejs/biome@1.9.3': + resolution: {integrity: sha512-POjAPz0APAmX33WOQFGQrwLvlu7WLV4CFJMlB12b6ZSg+2q6fYu9kZwLCOA+x83zXfcPd1RpuWOKJW0GbBwLIQ==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@1.9.3': + resolution: {integrity: sha512-QZzD2XrjJDUyIZK+aR2i5DDxCJfdwiYbUKu9GzkCUJpL78uSelAHAPy7m0GuPMVtF/Uo+OKv97W3P9nuWZangQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@1.9.3': + resolution: {integrity: sha512-vSCoIBJE0BN3SWDFuAY/tRavpUtNoqiceJ5PrU3xDfsLcm/U6N93JSM0M9OAiC/X7mPPfejtr6Yc9vSgWlEgVw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@1.9.3': + resolution: {integrity: sha512-VBzyhaqqqwP3bAkkBrhVq50i3Uj9+RWuj+pYmXrMDgjS5+SKYGE56BwNw4l8hR3SmYbLSbEo15GcV043CDSk+Q==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-arm64@1.9.3': + resolution: {integrity: sha512-vJkAimD2+sVviNTbaWOGqEBy31cW0ZB52KtpVIbkuma7PlfII3tsLhFa+cwbRAcRBkobBBhqZ06hXoZAN8NODQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-linux-x64-musl@1.9.3': + resolution: {integrity: sha512-TJmnOG2+NOGM72mlczEsNki9UT+XAsMFAOo8J0me/N47EJ/vkLXxf481evfHLlxMejTY6IN8SdRSiPVLv6AHlA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-x64@1.9.3': + resolution: {integrity: sha512-x220V4c+romd26Mu1ptU+EudMXVS4xmzKxPVb9mgnfYlN4Yx9vD5NZraSx/onJnd3Gh/y8iPUdU5CDZJKg9COA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-win32-arm64@1.9.3': + resolution: {integrity: sha512-lg/yZis2HdQGsycUvHWSzo9kOvnGgvtrYRgoCEwPBwwAL8/6crOp3+f47tPwI/LI1dZrhSji7PNsGKGHbwyAhw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@1.9.3': + resolution: {integrity: sha512-cQMy2zanBkVLpmmxXdK6YePzmZx0s5Z7KEnwmrW54rcXK3myCNbQa09SwGZ8i/8sLw0H9F3X7K4rxVNGU8/D4Q==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@codemirror/autocomplete@6.18.2': + resolution: {integrity: sha512-wJGylKtMFR/Ds6Gh01+OovXE/pncPiKZNNBKuC39pKnH+XK5d9+WsNqcrdxPjFPFTigRBqse0rfxw9UxrfyhPg==} + peerDependencies: + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@lezer/common': ^1.0.0 + + '@codemirror/commands@6.7.1': + resolution: {integrity: sha512-llTrboQYw5H4THfhN4U3qCnSZ1SOJ60ohhz+SzU0ADGtwlc533DtklQP0vSFaQuCPDn3BPpOd1GbbnUtwNjsrw==} + + '@codemirror/lang-css@6.3.0': + resolution: {integrity: sha512-CyR4rUNG9OYcXDZwMPvJdtb6PHbBDKUc/6Na2BIwZ6dKab1JQqKa4di+RNRY9Myn7JB81vayKwJeQ7jEdmNVDA==} + + '@codemirror/lang-html@6.4.9': + resolution: {integrity: sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==} + + '@codemirror/lang-java@6.0.1': + resolution: {integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==} + + '@codemirror/lang-javascript@6.2.2': + resolution: {integrity: sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==} + + '@codemirror/lang-json@6.0.1': + resolution: {integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==} + + '@codemirror/lang-markdown@6.3.1': + resolution: {integrity: sha512-y3sSPuQjBKZQbQwe3ZJKrSW6Silyl9PnrU/Mf0m2OQgIlPoSYTtOvEL7xs94SVMkb8f4x+SQFnzXPdX4Wk2lsg==} + + '@codemirror/lang-php@6.0.1': + resolution: {integrity: sha512-ublojMdw/PNWa7qdN5TMsjmqkNuTBD3k6ndZ4Z0S25SBAiweFGyY68AS3xNcIOlb6DDFDvKlinLQ40vSLqf8xA==} + + '@codemirror/lang-sql@6.8.0': + resolution: {integrity: sha512-aGLmY4OwGqN3TdSx3h6QeA1NrvaYtF7kkoWR/+W7/JzB0gQtJ+VJxewlnE3+VImhA4WVlhmkJr109PefOOhjLg==} + + '@codemirror/language@6.10.3': + resolution: {integrity: sha512-kDqEU5sCP55Oabl6E7m5N+vZRoc0iWqgDVhEKifcHzPzjqCegcO4amfrYVL9PmPZpl4G0yjkpTpUO/Ui8CzO8A==} + + '@codemirror/legacy-modes@6.4.2': + resolution: {integrity: sha512-HsvWu08gOIIk303eZQCal4H4t65O/qp1V4ul4zVa3MHK5FJ0gz3qz3O55FIkm+aQUcshUOjBx38t2hPiJwW5/g==} + + '@codemirror/lint@6.8.2': + resolution: {integrity: sha512-PDFG5DjHxSEjOXk9TQYYVjZDqlZTFaDBfhQixHnQOEVDDNHUbEh/hstAjcQJaA6FQdZTD1hquXTK0rVBLADR1g==} + + '@codemirror/search@6.5.7': + resolution: {integrity: sha512-6+iLsXvITWKHYlkgHPCs/qiX4dNzn8N78YfhOFvPtPYCkuXqZq10rAfsUMhOq7O/1VjJqdXRflyExlfVcu/9VQ==} + + '@codemirror/state@6.4.1': + resolution: {integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==} + + '@codemirror/theme-one-dark@6.1.2': + resolution: {integrity: sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==} + + '@codemirror/view@6.34.2': + resolution: {integrity: sha512-d6n0WFvL970A9Z+l9N2dO+Hk9ev4hDYQzIx+B9tCyBP0W5wPEszi1rhuyFesNSkLZzXbQE5FPH7F/z/TMJfoPA==} + + '@date-fns/tz@1.2.0': + resolution: {integrity: sha512-LBrd7MiJZ9McsOgxqWX7AaxrDjcFVjWH/tIKJd7pnR7McaslGYOP1QmmiBXdJH/H/yLCT+rcQ7FaPBUxRGUtrg==} + + '@dnd-kit/accessibility@3.1.0': + resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} + peerDependencies: + react: '>=16.8.0' + + '@dnd-kit/core@6.1.0': + resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@dnd-kit/modifiers@6.0.1': + resolution: {integrity: sha512-rbxcsg3HhzlcMHVHWDuh9LCjpOVAgqbV78wLGI8tziXY3+qcMQ61qVXIvNKQFuhj75dSfD+o+PYZQ/NUk2A23A==} + peerDependencies: + '@dnd-kit/core': ^6.0.6 + react: '>=16.8.0' + + '@dnd-kit/sortable@7.0.2': + resolution: {integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==} + peerDependencies: + '@dnd-kit/core': ^6.0.7 + react: '>=16.8.0' + + '@dnd-kit/utilities@3.2.2': + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/babel-plugin@11.12.0': + resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} + + '@emotion/cache@11.13.1': + resolution: {integrity: sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/is-prop-valid@0.8.8': + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + + '@emotion/is-prop-valid@1.2.2': + resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} + + '@emotion/memoize@0.7.4': + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + + '@emotion/memoize@0.8.1': + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/react@11.13.3': + resolution: {integrity: sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.3.2': + resolution: {integrity: sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==} + + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + + '@emotion/unitless@0.8.1': + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + + '@emotion/use-insertion-effect-with-fallbacks@1.1.0': + resolution: {integrity: sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.4.1': + resolution: {integrity: sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==} + + '@emotion/weak-memoize@0.4.0': + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + + '@esbuild/aix-ppc64@0.19.11': + resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.19.11': + resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.19.11': + resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.19.11': + resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.19.11': + resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.11': + resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.19.11': + resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.11': + resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.19.11': + resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.19.11': + resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.19.11': + resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.19.11': + resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.19.11': + resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.19.11': + resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.11': + resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.19.11': + resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.19.11': + resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.19.11': + resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.19.11': + resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.19.11': + resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.19.11': + resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.19.11': + resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.19.11': + resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@floating-ui/core@1.6.8': + resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} + + '@floating-ui/dom@1.6.12': + resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} + + '@floating-ui/react-dom@2.0.0': + resolution: {integrity: sha512-Ke0oU3SeuABC2C4OFu2mSAwHIP5WUiV98O9YWoHV4Q5aT6E9k06DV0Khi5uYspR8xmmBk08t8ZDcz3TR3ARkEg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.8': + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + + '@hookform/resolvers@3.9.1': + resolution: {integrity: sha512-ud2HqmGBM0P0IABqoskKWI6PEf6ZDDBZkFqe2Vnl+mTHCEHzr3ISjjZyCwTjC/qpL25JC9aIDkloQejvMeq0ug==} + peerDependencies: + react-hook-form: ^7.0.0 + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@juggle/resize-observer@3.4.0': + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + + '@lezer/common@1.2.3': + resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} + + '@lezer/css@1.1.9': + resolution: {integrity: sha512-TYwgljcDv+YrV0MZFFvYFQHCfGgbPMR6nuqLabBdmZoFH3EP1gvw8t0vae326Ne3PszQkbXfVBjCnf3ZVCr0bA==} + + '@lezer/highlight@1.2.1': + resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==} + + '@lezer/html@1.3.10': + resolution: {integrity: sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==} + + '@lezer/java@1.1.3': + resolution: {integrity: sha512-yHquUfujwg6Yu4Fd1GNHCvidIvJwi/1Xu2DaKl/pfWIA2c1oXkVvawH3NyXhCaFx4OdlYBVX5wvz2f7Aoa/4Xw==} + + '@lezer/javascript@1.4.19': + resolution: {integrity: sha512-j44kbR1QL26l6dMunZ1uhKBFteVGLVCBGNUD2sUaMnic+rbTviVuoK0CD1l9FTW31EueWvFFswCKMH7Z+M3JRA==} + + '@lezer/json@1.0.2': + resolution: {integrity: sha512-xHT2P4S5eeCYECyKNPhr4cbEL9tc8w83SPwRC373o9uEdrvGKTZoJVAGxpOsZckMlEh9W23Pc72ew918RWQOBQ==} + + '@lezer/lr@1.4.2': + resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} + + '@lezer/markdown@1.3.2': + resolution: {integrity: sha512-Wu7B6VnrKTbBEohqa63h5vxXjiC4pO5ZQJ/TDbhJxPQaaIoRD/6UVDhSDtVsCwVZV12vvN9KxuLL3ATMnlG0oQ==} + + '@lezer/php@1.0.2': + resolution: {integrity: sha512-GN7BnqtGRpFyeoKSEqxvGvhJQiI4zkgmYnDk/JIyc7H7Ifc1tkPnUn/R2R8meH3h/aBf5rzjvU8ZQoyiNDtDrA==} + + '@mdx-js/mdx@3.1.0': + resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} + + '@mdx-js/react@3.1.0': + resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + + '@microlink/mql@0.13.12': + resolution: {integrity: sha512-wPfxWngWE4Zvu6AiKjgkwToXR8xovVUmAKceAKZ8/9vFd2/pIm0Eq9BhZfKrWbLWcBFbe2rr9BoUS1SplkrPUg==} + engines: {node: '>= 18'} + + '@next/env@14.2.3': + resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} + + '@next/env@14.2.35': + resolution: {integrity: sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==} + + '@next/swc-darwin-arm64@14.2.3': + resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-arm64@14.2.33': + resolution: {integrity: sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@14.2.3': + resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-darwin-x64@14.2.33': + resolution: {integrity: sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@14.2.3': + resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@next/swc-linux-arm64-gnu@14.2.33': + resolution: {integrity: sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@next/swc-linux-arm64-musl@14.2.3': + resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@next/swc-linux-arm64-musl@14.2.33': + resolution: {integrity: sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@next/swc-linux-x64-gnu@14.2.3': + resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@next/swc-linux-x64-gnu@14.2.33': + resolution: {integrity: sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@next/swc-linux-x64-musl@14.2.3': + resolution: {integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@next/swc-linux-x64-musl@14.2.33': + resolution: {integrity: sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@next/swc-win32-arm64-msvc@14.2.3': + resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-arm64-msvc@14.2.33': + resolution: {integrity: sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-ia32-msvc@14.2.3': + resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-ia32-msvc@14.2.33': + resolution: {integrity: sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-x64-msvc@14.2.3': + resolution: {integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@next/swc-win32-x64-msvc@14.2.33': + resolution: {integrity: sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@next/third-parties@15.0.3': + resolution: {integrity: sha512-T2NkBXLcgRY0cmE7jb/dSMXNK9D+yv1k+n0uBxwMBS9SEtOhuMvxiUPQRj5x4cFnsei6JECloJg88koMprKw0A==} + peerDependencies: + next: ^13.0.0 || ^14.0.0 || ^15.0.0 + react: ^18.2.0 || 19.0.0-rc-66855b96-20241106 + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@openpanel/nextjs@1.0.5': + resolution: {integrity: sha512-+Zdrl5fC8Iczub/pVvX8Xp9q6mQvApNXGenCEkdiAZk9nT7xpaLfzkdHnwx7XHxp5H50zdwgqWDGiwLMqRWjKA==} + peerDependencies: + next: ^12.0.0 || ^13.0.0 || ^14.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@openpanel/sdk@1.0.0': + resolution: {integrity: sha512-FNmmfjdXoC/VHEjA+WkrQ4lyM5lxEmV7xDd57uj4E+lIS0sU3DLG2mV/dpS8AscnZbUvuMn3kPhiLCqYzuv/gg==} + + '@openpanel/web@1.0.1': + resolution: {integrity: sha512-cVZ7Kr9SicczJ/RDIfEtZs8+1iGDzwkabVA/j3NqSl8VSucsC8m1+LVbjmCDzCJNnK4yVn6tEcc9PJRi2rtllw==} + + '@openrouter/ai-sdk-provider@0.4.6': + resolution: {integrity: sha512-oUa8xtssyUhiKEU/aW662lsZ0HUvIUTRk8vVIF3Ha3KI/DnqX54zmVIuzYnaDpermqhy18CHqblAY4dDt1JW3g==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@opentelemetry/api@1.8.0': + resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@panva/hkdf@1.2.1': + resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@portabletext/editor@1.5.4': + resolution: {integrity: sha512-9RChHb7pAZI/iZuVrn8PW2eqRlVyJ4Wgioj/lODl6QWsrQsfJGxkDQsAd7iaHmRPnjjVaode9J3RG5y17CdW3w==} + engines: {node: '>=18'} + peerDependencies: + '@sanity/block-tools': ^3.62.3 + '@sanity/schema': ^3.62.3 + '@sanity/types': ^3.62.3 + '@sanity/util': ^3.62.3 + react: ^16.9 || ^17 || ^18 + rxjs: ^7.8.1 + styled-components: ^6.1.13 + + '@portabletext/patches@1.1.0': + resolution: {integrity: sha512-2qn4WaRc23m5qRwclT3sAyuHwTyjxCb4Lg0BQyhp7CABd83HtnPPYoP6hycREs6HRdWA48H3sU5gqUVPoxJxdg==} + + '@portabletext/react@3.1.0': + resolution: {integrity: sha512-ZGHlvS+NvId9RSqnflN8xF2KVZgAgD399dK1GaycurnGNZGZYTd5nZmc8by1yL76Ar8n/dbVtouUDJIkO4Tupw==} + engines: {node: ^14.13.1 || >=16.0.0} + peerDependencies: + react: ^17 || ^18 || >=19.0.0-rc + + '@portabletext/toolkit@2.0.16': + resolution: {integrity: sha512-aBvnD8MscoAlEIuZBn0Aksd+oCuoMGFOT3CtHIgRBaac0Vu4YnnMUF45xo/B/T5vmwWcnDXoJEJdn+SKDg1m+A==} + engines: {node: ^14.13.1 || >=16.0.0} + + '@portabletext/types@2.0.13': + resolution: {integrity: sha512-5xk5MSyQU9CrDho3Rsguj38jhijhD36Mk8S6mZo3huv6PM+t4M/5kJN2KFIxgvt4ONpvOEs1pVIZAV0cL0Vi+Q==} + engines: {node: ^14.13.1 || >=16.0.0 || >=18.0.0} + + '@radix-ui/number@1.1.0': + resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} + + '@radix-ui/primitive@1.0.1': + resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + + '@radix-ui/primitive@1.1.0': + resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} + + '@radix-ui/react-accessible-icon@1.1.0': + resolution: {integrity: sha512-i9Zg4NOSXlfUva0agzI2DjWrvFJm9uO4L6CMW7nmMa5CIOOX/Yin894W7WwjodFQWPwe5kmAJ4JF33R8slKI2g==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-accordion@1.2.1': + resolution: {integrity: sha512-bg/l7l5QzUjgsh8kjwDFommzAshnUsuVMV5NM56QVCm+7ZckYdd9P/ExR8xG/Oup0OajVxNLaHJ1tb8mXk+nzQ==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-alert-dialog@1.1.2': + resolution: {integrity: sha512-eGSlLzPhKO+TErxkiGcCZGuvbVMnLA1MTnyBksGOeGRGkxHiiJUujsjmNTdWTm4iHVSRaUao9/4Ur671auMghQ==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-arrow@1.1.0': + resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-aspect-ratio@1.1.0': + resolution: {integrity: sha512-dP87DM/Y7jFlPgUZTlhx6FF5CEzOiaxp2rBCKlaXlpH5Ip/9Fg5zZ9lDOQ5o/MOfUlf36eak14zoWYpgcgGoOg==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-avatar@1.1.1': + resolution: {integrity: sha512-eoOtThOmxeoizxpX6RiEsQZ2wj5r4+zoeqAwO0cBaFQGjJwIH3dIX0OCxNrCyrrdxG+vBweMETh3VziQG7c1kw==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-checkbox@1.1.2': + resolution: {integrity: sha512-/i0fl686zaJbDQLNKrkCbMyDm6FQMt4jg323k7HuqitoANm9sE23Ql8yOK3Wusk34HSLKDChhMux05FnP6KUkw==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collapsible@1.1.1': + resolution: {integrity: sha512-1///SnrfQHJEofLokyczERxQbWfCGQlQ2XsCZMucVs6it+lq9iw4vXy+uDn1edlb58cOZOWSldnfPAYcT4O/Yg==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.0': + resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.0.1': + resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-compose-refs@1.1.0': + resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context-menu@2.2.2': + resolution: {integrity: sha512-99EatSTpW+hRYHt7m8wdDlLtkmTovEe8Z/hnxUPV+SKuuNL5HWNhQI4QSdjZqNSgXHay2z4M3Dym73j9p2Gx5Q==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-context@1.0.1': + resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.0': + resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.1': + resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.0.5': + resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dialog@1.1.2': + resolution: {integrity: sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.1.0': + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.0.5': + resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.1': + resolution: {integrity: sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.2': + resolution: {integrity: sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.0.1': + resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-guards@1.1.1': + resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.0.4': + resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-scope@1.1.0': + resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-hover-card@1.1.2': + resolution: {integrity: sha512-Y5w0qGhysvmqsIy6nQxaPa6mXNKznfoGjOfBgzOjocLxr2XlSjqBMYQQL+FfyogsMuX+m8cZyQGYhJxvxUzO4w==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-icons@1.3.1': + resolution: {integrity: sha512-QvYompk0X+8Yjlo/Fv4McrzxohDdM5GgLHyQcPpcsPvlOSXCGFjdbuyGL5dzRbg0GpknAjQJJZzdiRK7iWVuFQ==} + peerDependencies: + react: ^16.x || ^17.x || ^18.x || ^19.x + + '@radix-ui/react-id@1.0.1': + resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-id@1.1.0': + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-label@2.1.0': + resolution: {integrity: sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-menu@2.1.2': + resolution: {integrity: sha512-lZ0R4qR2Al6fZ4yCCZzu/ReTFrylHFxIqy7OezIpWF4bL0o9biKo0pFIvkaew3TyZ9Fy5gYVrR5zCGZBVbO1zg==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-menubar@1.1.2': + resolution: {integrity: sha512-cKmj5Gte7LVyuz+8gXinxZAZECQU+N7aq5pw7kUPpx3xjnDXDbsdzHtCCD2W72bwzy74AvrqdYnKYS42ueskUQ==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-navigation-menu@1.2.1': + resolution: {integrity: sha512-egDo0yJD2IK8L17gC82vptkvW1jLeni1VuqCyzY727dSJdk5cDjINomouLoNk8RVF7g2aNIfENKWL4UzeU9c8Q==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popover@1.1.2': + resolution: {integrity: sha512-u2HRUyWW+lOiA2g0Le0tMmT55FGOEWHwPFt1EPfbLly7uXQExFo5duNKqG2DzmFXIdqOeNd+TpE8baHWJCyP9w==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.0': + resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.0.4': + resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.2': + resolution: {integrity: sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.0.1': + resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.1': + resolution: {integrity: sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@1.0.3': + resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.0.0': + resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-progress@1.1.0': + resolution: {integrity: sha512-aSzvnYpP725CROcxAOEBVZZSIQVQdHgBr2QQFKySsaD14u8dNT0batuXI+AAGDdAHfXH8rbnHmjYFqVJ21KkRg==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-radio-group@1.2.1': + resolution: {integrity: sha512-kdbv54g4vfRjja9DNWPMxKvXblzqbpEC8kspEkZ6dVP7kQksGCn+iZHkcCz2nb00+lPdRvxrqy4WrvvV1cNqrQ==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.0': + resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-scroll-area@1.2.0': + resolution: {integrity: sha512-q2jMBdsJ9zB7QG6ngQNzNwlvxLQqONyL58QbEGwuyRZZb/ARQwk3uQVbCF7GvQVOtV6EU/pDxAw3zRzJZI3rpQ==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.1.2': + resolution: {integrity: sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-separator@1.1.0': + resolution: {integrity: sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slider@1.2.1': + resolution: {integrity: sha512-bEzQoDW0XP+h/oGbutF5VMWJPAl/UU8IJjr7h02SOHDIIIxq+cep8nItVNoBV+OMmahCdqdF38FTpmXoqQUGvw==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.0.2': + resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-slot@1.1.0': + resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-switch@1.1.1': + resolution: {integrity: sha512-diPqDDoBcZPSicYoMWdWx+bCPuTRH4QSp9J+65IvtdS0Kuzt67bI6n32vCj8q6NZmYW/ah+2orOtMwcX5eQwIg==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tabs@1.1.1': + resolution: {integrity: sha512-3GBUDmP2DvzmtYLMsHmpA1GtR46ZDZ+OreXM/N+kkQJOPIgytFWWTfDQmBQKBvaFS0Vno0FktdbVzN28KGrMdw==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toast@1.2.2': + resolution: {integrity: sha512-Z6pqSzmAP/bFJoqMAston4eSNa+ud44NSZTiZUmUen+IOZ5nBY8kzuU5WDBVyFXPtcW6yUalOHsxM/BP6Sv8ww==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toggle-group@1.1.0': + resolution: {integrity: sha512-PpTJV68dZU2oqqgq75Uzto5o/XfOVgkrJ9rulVmfTKxWp3HfUjHE6CP/WLRR4AzPX9HWxw7vFow2me85Yu+Naw==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toggle@1.1.0': + resolution: {integrity: sha512-gwoxaKZ0oJ4vIgzsfESBuSgJNdc0rv12VhHgcqN0TEJmmZixXG/2XpsLK8kzNWYcnaoRIEEQc0bEi3dIvdUpjw==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tooltip@1.1.3': + resolution: {integrity: sha512-Z4w1FIS0BqVFI2c1jZvb/uDVJijJjJ2ZMuPV81oVgTZ7g3BZxobplnMVvXtFWgtozdvYJ+MFWtwkM5S2HnAong==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.0.1': + resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.0': + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.0.1': + resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.0.3': + resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.0': + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.0.1': + resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.0': + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.0': + resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.0': + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.0': + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.1.0': + resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==} + 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 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.0': + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + + '@react-email/body@0.0.10': + resolution: {integrity: sha512-dMJyL9aU25ieatdPtVjCyQ/WHZYHwNc+Hy/XpF8Cc18gu21cUynVEeYQzFSeigDRMeBQ3PGAyjVDPIob7YlGwA==} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/button@0.0.17': + resolution: {integrity: sha512-ioHdsk+BpGS/PqjU6JS7tUrVy9yvbUx92Z+Cem2+MbYp55oEwQ9VHf7u4f5NoM0gdhfKSehBwRdYlHt/frEMcg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/code-block@0.0.9': + resolution: {integrity: sha512-Zrhc71VYrSC1fVXJuaViKoB/dBjxLw6nbE53Bm/eUuZPdnnZ1+ZUIh8jfaRKC5MzMjgnLGQTweGXVnfIrhyxtQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/code-inline@0.0.4': + resolution: {integrity: sha512-zj3oMQiiUCZbddSNt3k0zNfIBFK0ZNDIzzDyBaJKy6ZASTtWfB+1WFX0cpTX8q0gUiYK+A94rk5Qp68L6YXjXQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/column@0.0.12': + resolution: {integrity: sha512-Rsl7iSdDaeHZO938xb+0wR5ud0Z3MVfdtPbNKJNojZi2hApwLAQXmDrnn/AcPDM5Lpl331ZljJS8vHTWxxkvKw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/components@0.0.25': + resolution: {integrity: sha512-lnfVVrThEcET5NPoeaXvrz9UxtWpGRcut2a07dLbyKgNbP7vj/cXTI5TuHtanCvhCddFpMDnElNRghDOfPzwUg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/container@0.0.14': + resolution: {integrity: sha512-NgoaJJd9tTtsrveL86Ocr/AYLkGyN3prdXKd/zm5fQpfDhy/NXezyT3iF6VlwAOEUIu64ErHpAJd+P6ygR+vjg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/font@0.0.8': + resolution: {integrity: sha512-fSBEqYyVPAyyACBBHcs3wEYzNknpHMuwcSAAKE8fOoDfGqURr/vSxKPdh4tOa9z7G4hlcEfgGrCYEa2iPT22cw==} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/head@0.0.11': + resolution: {integrity: sha512-skw5FUgyamIMK+LN+fZQ5WIKQYf0dPiRAvsUAUR2eYoZp9oRsfkIpFHr0GWPkKAYjFEj+uJjaxQ/0VzQH7svVg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/heading@0.0.14': + resolution: {integrity: sha512-jZM7IVuZOXa0G110ES8OkxajPTypIKlzlO1K1RIe1auk76ukQRiCg1IRV4HZlWk1GGUbec5hNxsvZa2kU8cb9w==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/hr@0.0.10': + resolution: {integrity: sha512-3AA4Yjgl3zEid/KVx6uf6TuLJHVZvUc2cG9Wm9ZpWeAX4ODA+8g9HyuC0tfnjbRsVMhMcCGiECuWWXINi+60vA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/html@0.0.10': + resolution: {integrity: sha512-06uiuSKJBWQJfhCKv4MPupELei4Lepyz9Sth7Yq7Fq29CAeB1ejLgKkGqn1I+FZ72hQxPLdYF4iq4yloKv3JCg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/img@0.0.10': + resolution: {integrity: sha512-pJ8glJjDNaJ53qoM95pvX9SK05yh0bNQY/oyBKmxlBDdUII6ixuMc3SCwYXPMl+tgkQUyDgwEBpSTrLAnjL3hA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/link@0.0.10': + resolution: {integrity: sha512-tva3wvAWSR10lMJa9fVA09yRn7pbEki0ZZpHE6GD1jKbFhmzt38VgLO9B797/prqoDZdAr4rVK7LJFcdPx3GwA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/markdown@0.0.12': + resolution: {integrity: sha512-wsuvj1XAb6O63aizCLNEeqVgKR3oFjAwt9vjfg2y2oh4G1dZeo8zonZM2x1fmkEkBZhzwSHraNi70jSXhA3A9w==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/preview@0.0.11': + resolution: {integrity: sha512-7O/CT4b16YlSGrj18htTPx3Vbhu2suCGv/cSe5c+fuSrIM/nMiBSZ3Js16Vj0XJbAmmmlVmYFZw9L20wXJ+LjQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/render@0.0.16': + resolution: {integrity: sha512-wDaMy27xAq1cJHtSFptp0DTKPuV2GYhloqia95ub/DH9Dea1aWYsbdM918MOc/b/HvVS3w1z8DWzfAk13bGStQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + + '@react-email/render@1.0.1': + resolution: {integrity: sha512-W3gTrcmLOVYnG80QuUp22ReIT/xfLsVJ+n7ghSlG2BITB8evNABn1AO2rGQoXuK84zKtDAlxCdm3hRyIpZdGSA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/row@0.0.10': + resolution: {integrity: sha512-jPyEhG3gsLX+Eb9U+A30fh0gK6hXJwF4ghJ+ZtFQtlKAKqHX+eCpWlqB3Xschd/ARJLod8WAswg0FB+JD9d0/A==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/section@0.0.14': + resolution: {integrity: sha512-+fYWLb4tPU1A/+GE5J1+SEMA7/wR3V30lQ+OR9t2kAJqNrARDbMx0bLnYnR1QL5TiFRz0pCF05SQUobk6gHEDQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/tailwind@0.1.0': + resolution: {integrity: sha512-qysVUEY+M3SKUvu35XDpzn7yokhqFOT3tPU6Mj/pgc62TL5tQFj6msEbBtwoKs2qO3WZvai0DIHdLhaOxBQSow==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/text@0.0.10': + resolution: {integrity: sha512-wNAnxeEAiFs6N+SxS0y6wTJWfewEzUETuyS2aZmT00xk50VijwyFRuhm4sYSjusMyshevomFwz5jNISCxRsGWw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@reduxjs/toolkit@1.9.7': + resolution: {integrity: sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 + react-redux: ^7.2.1 || ^8.0.2 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + + '@rexxars/react-json-inspector@8.0.1': + resolution: {integrity: sha512-XAsgQwqG8fbDGpWnsvOesRMgPfvwuU7Cx3/cUf/fNIRmGP8lj2YYIf5La/4ayvZLWlSw4tTb4BPCKdmK9D8RuQ==} + peerDependencies: + react: ^15 || ^16 || ^17 || ^18 + + '@rexxars/react-split-pane@0.1.93': + resolution: {integrity: sha512-Pok8zATwd5ZpWnccJeSA/JM2MPmi3D04duYtrbMNRgzeAU2ANtq3r4w7ldbjpGyfJqggqn0wDNjRqaevXqSxQg==} + peerDependencies: + react: ^18 + react-dom: ^18 + + '@sanity/asset-utils@2.1.0': + resolution: {integrity: sha512-++d7UEnu72eKpBBozXAFwBgsGs/AEB4uc3a3BDin9l/aomdTtI2vJQJhcriQQvUeqJnTTF3Cxa5zl/V1vau/PA==} + engines: {node: '>=18'} + + '@sanity/bifur-client@0.4.1': + resolution: {integrity: sha512-mHM8WR7pujbIw2qxuV0lzinS1izOoyLza/ejWV6quITTLpBhUoPIQGPER3Ar0SON5JV0VEEqkJGa1kjiYYgx2w==} + + '@sanity/block-content-to-hyperscript@2.0.10': + resolution: {integrity: sha512-xT3iEmZkK0fvO5PDFpn9GMWGfvOopvbrRCBU48XxpFoTxRrfsHhxbRy8J0eND1HGXHUENkIKv5jbohtGd1MiVg==} + + '@sanity/block-content-to-markdown@0.0.5': + resolution: {integrity: sha512-wnBfusG67TU2+MXcDSNDtEdE5MMYXQ9t5hHtU+0dQ2MUHPbF6FfX0nfX0IvjfNWGpMEniCOtmJR0k71maO9zYA==} + + '@sanity/block-tools@3.63.0': + resolution: {integrity: sha512-aKi2KYMKeHTDcgeifIrnLfQmp/h2k4XKG+rLwp7hLy5inaUU5U/DCPrp5o7fQaRrrIUSXoRnE6E0KNPU2CD+RQ==} + + '@sanity/cli@3.63.0': + resolution: {integrity: sha512-Q2iuJl0xVEup49sSJsbFst0NNGG7nGYE9Cw592NZSotmzoPVppYfgYEuih04TT7WMl0IlYs7pWL2DHtDJnsX5A==} + engines: {node: '>=18'} + hasBin: true + + '@sanity/client@6.22.3': + resolution: {integrity: sha512-CJDUXPdw4q6VtdUmKbkH8D4iRqYIfIPNQ4U2Y1jzjez7NORnflX1vfgfMLSkNMc9xoK0xji4qhQgvcQHUNh4Lw==} + engines: {node: '>=14.18'} + + '@sanity/code-input@4.1.4': + resolution: {integrity: sha512-MQfZ6r0SdEtYiuhfMtFe54D+4pVIQzDa67nFQhM1D4hQJVt7yL+OBukGbcOK9Kx1PjKkb4Gog//AMoN7a90b9g==} + engines: {node: '>=14'} + peerDependencies: + react: ^18 + react-dom: ^18 + sanity: ^3 + styled-components: ^5.2 || ^6 + + '@sanity/codegen@3.63.0': + resolution: {integrity: sha512-Cf+S+uIcDmcoisgOANzjT4er1NvBnk0gD1FjPKewkixCNX4kp4Pciea4zMGCXMj/BPvviuclL83thNIYnMZqlw==} + engines: {node: '>=18'} + + '@sanity/color@2.2.5': + resolution: {integrity: sha512-tTi22KoKuER3sldXYl4c1Dq2zU7tMLDkljFiaUKVkBbu4PBvRGCFw75kXZnD2b4Bsp6vin+7sI+AKdCKRhfRuw==} + + '@sanity/color@3.0.6': + resolution: {integrity: sha512-2TjYEvOftD0v7ukx3Csdh9QIu44P2z7NDJtlC3qITJRYV36J7R6Vfd3trVhFnN77/7CZrGjqngrtohv8VqO5nw==} + engines: {node: '>=18.0.0'} + + '@sanity/comlink@1.1.1': + resolution: {integrity: sha512-hmjL8X9/muInbO4Fko6rn9WOZhZWMPKz5n3FHttb/KurKaHbkhcon/jIkZ8DowxW75wkUDp8m/nkBZznJ58HIA==} + engines: {node: '>=18'} + + '@sanity/dashboard@4.1.0': + resolution: {integrity: sha512-0II6Ay/RB31Uneg12PvER2wdq20laxjBpZxQ3wRFwjGC98F8zBfPLUTl/Z8CzanZX7i+IaiepzVPRvSwflPzHg==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 + sanity: ^3 + styled-components: ^6.1 + + '@sanity/diff-match-patch@3.1.1': + resolution: {integrity: sha512-dSZqGeYjHKGIkqAzGqLcG92LZyJGX+nYbs/FWawhBbTBDWi21kvQ0hsL3DJThuFVWtZMWTQijN3z6Cnd44Pf2g==} + engines: {node: '>=14.18'} + + '@sanity/diff@3.63.0': + resolution: {integrity: sha512-C2l6D1fvle6YaxuJLjGBLq3K9U8dQPu9zVjJcoMZ/QeIDu6Wv+ZNfwuilCZeY5H4yv4UbG4YE2wNo/JAWvflaw==} + engines: {node: '>=18'} + + '@sanity/eventsource@5.0.2': + resolution: {integrity: sha512-/B9PMkUvAlUrpRq0y+NzXgRv5lYCLxZNsBJD2WXVnqZYOfByL9oQBV7KiTaARuObp5hcQYuPfOAVjgXe3hrixA==} + + '@sanity/export@3.41.0': + resolution: {integrity: sha512-mqb6HvzjNGh3J4zjT4hOPh4ZTPOVwYsS5DJ3v24S5uETlIodMmDlY/DBmudlZmQxqoWqqX/hsVxKC0WskuPsYg==} + engines: {node: '>=18'} + + '@sanity/generate-help-url@0.140.0': + resolution: {integrity: sha512-H/G/WA9S22TXcXST52CIiTsHx3S2hH0gvK7LnI5w76vfKS0obnDPh8jrPg4xeNRYGPuV9MHYRlyERGpRGoo4Qw==} + + '@sanity/generate-help-url@3.0.0': + resolution: {integrity: sha512-wtMYcV5GIDIhVyF/jjmdwq1GdlK07dRL40XMns73VbrFI7FteRltxv48bhYVZPcLkRXb0SHjpDS/icj9/yzbVA==} + + '@sanity/icons@1.3.10': + resolution: {integrity: sha512-5wVG/vIiGuGrSmq+Bl3PY7XDgQrGv0fyHdJI64FSulnr2wH3NMqZ6C59UFxnrZ93sr7kOt0zQFoNv2lkPBi0Cg==} + peerDependencies: + react: ^16.9 || ^17 || ^18 + + '@sanity/icons@2.11.8': + resolution: {integrity: sha512-C4ViXtk6eyiNTQ5OmxpfmcK6Jw+LLTi9zg9XBUD15DzC4xTHaGW9SVfUa43YtPGs3WC3M0t0K59r0GDjh52HIg==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: ^18 + + '@sanity/icons@3.4.0': + resolution: {integrity: sha512-X8BMM68w3y5cuCLpPwV7jGhVNGgAL/FA3UI6JaRCsyVOahA6aBOeKdjFs5MHtKi8cmrKwq1a98h/HbrK56kszA==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: ^18.3 || >=19.0.0-rc + + '@sanity/image-url@0.140.22': + resolution: {integrity: sha512-CAmQZnj+KM7FSEYiWlIGDit072syicYuAw0w7R2ctMzHiZ4p9mE/g6dBnYqrqFUrw2J+GpJgPt+RVspKP8vdqA==} + engines: {node: '>=10.0.0'} + + '@sanity/image-url@1.1.0': + resolution: {integrity: sha512-JHumVRxzzaZAJyOimntdukA9TjjzsJiaiq/uUBdTknMLCNvtM6KQ5OCp6W5fIdY78uyFxtQjz+MPXwK8WBIxWg==} + engines: {node: '>=10.0.0'} + + '@sanity/import@3.37.8': + resolution: {integrity: sha512-YsVhGaHNXJWv2L3ukRjJ9r5kM4VPG0cYtAvu0eellFPOZ5BeeuUFWOjFI1tPhG9nhTUVHWuL0nc6EHgt7k/LbQ==} + engines: {node: '>=18'} + hasBin: true + + '@sanity/incompatible-plugin@1.0.4': + resolution: {integrity: sha512-2z39G9PTM8MXOF4fJNx3TG4tH0RrTjtH6dVLW93DSjCPbIS7FgCY5yWjZfQ+HVkwhLsF7ATDAGLA/jp65pFjAg==} + peerDependencies: + react: ^16.9 || ^17 || ^18 + react-dom: ^16.9 || ^17 || ^18 + + '@sanity/insert-menu@1.0.10': + resolution: {integrity: sha512-tFfjP7IA9QjD5flSwILUNjQKh4Vrq+E1Z5e0gBtPCRFHTde0VRrfiiX/qTr0IPYREo3MOhIBZbriJScBeGuMfg==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@sanity/types': ^3.62.2 + react: ^18.3 || >=19.0.0-rc + react-dom: ^18.3 || >=19.0.0-rc + react-is: ^18.3 || >=19.0.0-rc + + '@sanity/language-filter@4.0.2': + resolution: {integrity: sha512-guL7vZv/QwDdbzVbCA8YqY8G0tH6KW2obyp5UCbFvFy9NqlmfuaHtle/VIO+UwqbCXck2Xpz0WihFeQHHjhCcw==} + engines: {node: '>=14'} + peerDependencies: + '@sanity/ui': ^2.1.0 + '@sanity/util': ^3.36.4 + react: ^18 + react-dom: ^18 + sanity: ^3.36.4 + styled-components: ^6.1 + + '@sanity/logos@2.1.13': + resolution: {integrity: sha512-PKAbPbM4zn+6wHYjCVwuhmlZnFqyZ9lT/O7OT3BVd2SGAqXoZTimfBOHrVPifytuazdoQ1T2M5eYJTtW/VXLyA==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@sanity/color': ^2.0 || ^3.0 || ^3.0.0-beta + react: ^18.3 || >=19.0.0-rc + + '@sanity/migrate@3.63.0': + resolution: {integrity: sha512-my20wlhw89LX1fkAgwvF/+XyoqnbMX/31NFCWVmqlHfkO/oU3XwGWLsLgJBXL6FMvGUoDJUiXFV9/sjsGLiaHg==} + engines: {node: '>=18'} + + '@sanity/mutate@0.10.1': + resolution: {integrity: sha512-yjRBoscacw4hl4c3UF/BhOCTUOjGDRP2u7biF/ALsgAOnMhUDlLA1OtDz3op7oyz4Yp30QydnlrtR3ha/Una5g==} + engines: {node: '>=18'} + + '@sanity/mutate@0.10.1-canary.5': + resolution: {integrity: sha512-ce5xQJhqvbFnYejUEUlpR8VNq9RqMYYnasVdtZPBoD2gJpHpwSMXhpvWHcZM3gtNDcQEkHT/ttPDluMghbF8aw==} + engines: {node: '>=18'} + peerDependencies: + xstate: ^5.18.2 + peerDependenciesMeta: + xstate: + optional: true + + '@sanity/mutator@3.63.0': + resolution: {integrity: sha512-eF9JBlqWuXEXJAsC/7AvhAINgNrMHld1I1JCAaOtLoL7jAJSyWqB5ObtBjLADEkvE+z6KPJUDiaC0JKx6YjO3A==} + + '@sanity/next-loader@1.1.0': + resolution: {integrity: sha512-3Mx0shumgM+oS0o4xmEk7JEv72rskefkhDHQtwhpvsklWVDPy95fNKMo5PC/ndSGQ5SctlZGpPPvnDOm511P0A==} + engines: {node: '>=18.18'} + peerDependencies: + '@sanity/client': ^6.22.2 + next: ^14.1 || ^15.0.0-0 + react: ^18.3 || ^19.0.0-0 + + '@sanity/presentation@1.17.8': + resolution: {integrity: sha512-vMwXSLa7W4rvXMPNq47yBsEdszuH1Jyhd0pRUTvAd+BnpsO72ThYfSsv+qwieB2IePSooXn0Fkbb8mWunv39Sg==} + engines: {node: '>=16.14'} + peerDependencies: + '@sanity/client': ^6.22.2 + + '@sanity/preview-kit-compat@1.5.14': + resolution: {integrity: sha512-6Fzi/Srp5fgW9C1/ifbATIm0o8kOX2irPoftcrvNy5UP1J6kXdePFwpXoo+wCjyOFMPTzPzykWuoaymnXp2dKA==} + engines: {node: '>=18'} + peerDependencies: + '@sanity/client': ^6.22.2 + react: ^18.3 || >=19.0.0-rc + + '@sanity/preview-kit@5.1.10': + resolution: {integrity: sha512-tFl9K5LnCo9RWBR7nz2vac6wacOg4jckMUcm32gDa486hN65I0jTWT6sWvwhtAYL/ny82sHsLKjHfx7ct4qxHw==} + engines: {node: '>=18'} + peerDependencies: + '@sanity/client': ^6.22.2 + react: ^18.0.0 || >=19.0.0-rc + peerDependenciesMeta: + react: + optional: true + + '@sanity/preview-url-secret@1.6.21': + resolution: {integrity: sha512-ZAIT4I5Nrsax+RBQVhSBY4PnnHgaI+eybSd5aHhjZi97+ziMTtTLnL1Hsg+ViLtPqJWwX0GiB0l8nSfGAt7+QA==} + engines: {node: '>=18'} + peerDependencies: + '@sanity/client': ^6.21.3 + + '@sanity/preview-url-secret@2.0.0': + resolution: {integrity: sha512-JfStdSb8KT0RzePtGbUIZewNNHNNbvYHwsW4WzYEmgPTfgZnPAIMFYUFSHAKKFyKQ3tqzARRQm3uURpoSTyIkA==} + engines: {node: '>=18'} + peerDependencies: + '@sanity/client': ^6.22.2 + + '@sanity/schema@3.63.0': + resolution: {integrity: sha512-Hvnk3NQWuEoms3xBUXQkiL5GSRWtCetZO7t0pKyoPMyKNkAhEfR8KuwISxEM1sLwlwR24ogYVPh4xJymBn7aaw==} + + '@sanity/telemetry@0.7.9': + resolution: {integrity: sha512-TBBRK2SUwiNND+ZJPwdWSu8tbEjdIz7UjagmCCBBWcfXtDKXXlWawC/DOEWuI4Q+WcA5OWLDjboxZT4ApWjVbw==} + engines: {node: '>=16.0.0'} + peerDependencies: + react: ^18.2 || >=19.0.0-rc + + '@sanity/types@3.37.2': + resolution: {integrity: sha512-1EfKkNlJ86wIDtc7oFHb79JI8lKDOxKDYrkmwhvuHgJY83GpSABc1kFdbwAtWZfrWVWyqVXUv/KlNwA3b99y/g==} + + '@sanity/types@3.63.0': + resolution: {integrity: sha512-d7Qbd07mzbvI6bEfb4j7LnDH5dAf5nwEyYPj+e8tHjlPYzyoutKQ5wmTU8rNqTmg4PiuvNYyDo6zWcEVrUW8Vw==} + + '@sanity/ui@1.9.3': + resolution: {integrity: sha512-AdWEVFaK0Snk6xxP0lGPVP3QQYKwzkfGFpFZnL9d6UtWt8yeuS8BMLVAzmXzg14hrqH50ex9nvNl3eq6a0MWiw==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: ^18 + react-dom: ^18 + react-is: ^18 + styled-components: ^5.2 || ^6 + + '@sanity/ui@2.8.19': + resolution: {integrity: sha512-3o5yQJXzTtXSRCptinYqPP8ME2+vatN7q42bSB96T45viX1tVHETGR3s2KCQCLFskdCHSwC3gsPLl8RbTZQmDw==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: ^18 || >=19.0.0-0 + react-dom: ^18 || >=19.0.0-0 + react-is: ^18 || >=19.0.0-0 + styled-components: ^5.2 || ^6 + + '@sanity/util@3.37.2': + resolution: {integrity: sha512-hq0eLjyV2iaOm9ivtPw12YTQ4QsE3jnV/Ui0zhclEhu8Go5JiaEhFt2+WM2lLGRH6qcSA414QbsCNCcyhJL6rA==} + engines: {node: '>=18'} + + '@sanity/util@3.63.0': + resolution: {integrity: sha512-AZLrGMMhNUFRKohEjTWkWFgUVHcokBC+NXxGsJl2NKU9iabwb1OFrnaOskjskLpF8SQ4cs34YoH3ydB+k4zZ2g==} + engines: {node: '>=18'} + + '@sanity/uuid@3.0.2': + resolution: {integrity: sha512-vzdhqOrX7JGbMyK40KuIwwyXHm7GMLOGuYgn3xlC09e4ZVNofUO5mgezQqnRv0JAMthIRhofqs9f6ufUjMKOvw==} + + '@sanity/vision@3.63.0': + resolution: {integrity: sha512-mDd3HcgYlP9g9dmTHLkc/kwHhLJ2yGksVTYne3f9mse7cE2Dp6ImAIANmkNVI6LR+X08PRjGtAeVL+ua465yEA==} + peerDependencies: + react: ^18 + styled-components: ^6.1 + + '@sanity/visual-editing@2.4.2': + resolution: {integrity: sha512-HyvDmc33U27jMm/b7AUxShtdbJaXtE2FzSh3DAC4bbWq59iGoSbHTHRWq7xIZpWVH76xgkLh+RgVsyr8lI/+8g==} + engines: {node: '>=18'} + peerDependencies: + '@remix-run/react': '>= 2' + '@sanity/client': ^6.22.2 + '@sveltejs/kit': '>= 2' + next: '>= 13 || >=14.3.0-canary.0 <14.3.0 || >=15.0.0-rc' + react: ^18.3 || >=19.0.0-rc + react-dom: ^18.3 || >=19.0.0-rc + svelte: '>= 4' + peerDependenciesMeta: + '@remix-run/react': + optional: true + '@sanity/client': + optional: true + '@sveltejs/kit': + optional: true + next: + optional: true + svelte: + optional: true + + '@sanity/visual-editing@2.4.4': + resolution: {integrity: sha512-pNR63Q7Zc7eaASr3zocfZUYRErmmE129t1V6ybKpxiqIcMIkSUIgYA66mEcYTRJuiAtv+bPJ8Izg3Cni7I80rQ==} + engines: {node: '>=18'} + peerDependencies: + '@remix-run/react': '>= 2' + '@sanity/client': ^6.22.2 + '@sveltejs/kit': '>= 2' + next: '>= 13 || >=14.3.0-canary.0 <14.3.0 || >=15.0.0-rc' + react: ^18.3 || >=19.0.0-rc + react-dom: ^18.3 || >=19.0.0-rc + svelte: '>= 4' + peerDependenciesMeta: + '@remix-run/react': + optional: true + '@sanity/client': + optional: true + '@sveltejs/kit': + optional: true + next: + optional: true + svelte: + optional: true + + '@selderee/plugin-htmlparser2@0.11.0': + resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} + + '@sentry-internal/browser-utils@8.37.1': + resolution: {integrity: sha512-OSR/V5GCsSCG7iapWtXCT/y22uo3HlawdEgfM1NIKk1mkP15UyGQtGEzZDdih2H+SNuX1mp9jQLTjr5FFp1A5w==} + engines: {node: '>=14.18'} + + '@sentry-internal/feedback@8.37.1': + resolution: {integrity: sha512-Se25NXbSapgS2S+JssR5YZ48b3OY4UGmAuBOafgnMW91LXMxRNWRbehZuNUmjjHwuywABMxjgu+Yp5uJDATX+g==} + engines: {node: '>=14.18'} + + '@sentry-internal/replay-canvas@8.37.1': + resolution: {integrity: sha512-1JLAaPtn1VL5vblB0BMELFV0D+KUm/iMGsrl4/JpRm0Ws5ESzQl33DhXVv1IX/ZAbx9i14EjR7MG9+Hj70tieQ==} + engines: {node: '>=14.18'} + + '@sentry-internal/replay@8.37.1': + resolution: {integrity: sha512-E/Plhisk/pXJjOdOU12sg8m/APTXTA21iEniidP6jW3/+O0tD/H/UovEqa4odNTqxPMa798xHQSQNt5loYiaLA==} + engines: {node: '>=14.18'} + + '@sentry/browser@8.37.1': + resolution: {integrity: sha512-5ym+iGiIpjIKKpMWi9S3/tXh9xneS+jqxwRTJqed3cb8i4ydfMAAP8sM3U8xMCWWABpWyIUW+fpewC0tkhE1aQ==} + engines: {node: '>=14.18'} + + '@sentry/core@8.37.1': + resolution: {integrity: sha512-82csXby589iDupM3VgCHJeWZagUyEEaDnbFcoZ/Z91QX2Sjq8FcF5OsforoXjw09i0XTFqlkFAnQVpDBmMXcpQ==} + engines: {node: '>=14.18'} + + '@sentry/react@8.37.1': + resolution: {integrity: sha512-HanDqBFTgIUhUsYztAHhSti+sEhQ8YopAymXgnpqkJ7j1PLHXZgQAre6M4Uvixu28WS5MDHC1onnAIBDgYRDYw==} + engines: {node: '>=14.18'} + peerDependencies: + react: ^16.14.0 || 17.x || 18.x || 19.x + + '@sentry/types@8.37.1': + resolution: {integrity: sha512-ryMOTROLSLINKFEbHWvi7GigNrsQhsaScw2NddybJGztJQ5UhxIGESnxGxWCufBmWFDwd7+5u0jDPCVUJybp7w==} + engines: {node: '>=14.18'} + + '@sentry/utils@8.37.1': + resolution: {integrity: sha512-Qtn2IfpII12K17txG/ZtTci35XYjYi4CxbQ3j7nXY7toGv/+MqPXwV5q2i9g94XaSXlE5Wy9/hoCZoZpZs/djA==} + engines: {node: '>=14.18'} + + '@shikijs/core@1.22.2': + resolution: {integrity: sha512-bvIQcd8BEeR1yFvOYv6HDiyta2FFVePbzeowf5pPS1avczrPK+cjmaxxh0nx5QzbON7+Sv0sQfQVciO7bN72sg==} + + '@shikijs/engine-javascript@1.22.2': + resolution: {integrity: sha512-iOvql09ql6m+3d1vtvP8fLCVCK7BQD1pJFmHIECsujB0V32BJ0Ab6hxk1ewVSMFA58FI0pR2Had9BKZdyQrxTw==} + + '@shikijs/engine-oniguruma@1.22.2': + resolution: {integrity: sha512-GIZPAGzQOy56mGvWMoZRPggn0dTlBf1gutV5TdceLCZlFNqWmuc7u+CzD0Gd9vQUTgLbrt0KLzz6FNprqYAxlA==} + + '@shikijs/types@1.22.2': + resolution: {integrity: sha512-NCWDa6LGZqTuzjsGfXOBWfjS/fDIbDdmVDug+7ykVe1IKT4c1gakrvlfFYp5NhAXH/lyqLM8wsAPo5wNy73Feg==} + + '@shikijs/vscode-textmate@9.3.0': + resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.5': + resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@tailwindcss/typography@0.5.15': + resolution: {integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20' + + '@tanem/react-nprogress@5.0.52': + resolution: {integrity: sha512-ncDcnDS/vm79sqPmBmeslA5TeA3+7VMmLgo6SPkjmRivHmImV/5DqzcbCltopkpadZ5/mSyCCPoQEi1bvU/VMQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@tanstack/react-table@8.20.5': + resolution: {integrity: sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==} + engines: {node: '>=12'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + '@tanstack/react-virtual@3.0.0-beta.54': + resolution: {integrity: sha512-D1mDMf4UPbrtHRZZriCly5bXTBMhylslm4dhcHqTtDJ6brQcgGmk8YD9JdWBGWfGSWPKoh2x1H3e7eh+hgPXtQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@tanstack/table-core@8.20.5': + resolution: {integrity: sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==} + engines: {node: '>=12'} + + '@tanstack/virtual-core@3.0.0-beta.54': + resolution: {integrity: sha512-jtkwqdP2rY2iCCDVAFuaNBH3fiEi29aTn2RhtIoky8DTTiCdc48plpHHreLwmv1PICJ4AJUUESaq3xa8fZH8+g==} + + '@types/acorn@4.0.6': + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/bcryptjs@2.4.6': + resolution: {integrity: sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/codemirror@5.60.15': + resolution: {integrity: sha512-dTOvwEQ+ouKJ/rE9LT1Ue2hmP6H1mZv5+CCnNWu2qtiOe2LQa9lCprEY20HxiDmV/Bxh+dXjywmy5aKvoGjULA==} + + '@types/cookie@0.4.1': + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/cors@2.8.17': + resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/diff-match-patch@1.0.36': + resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/event-source-polyfill@1.0.5': + resolution: {integrity: sha512-iaiDuDI2aIFft7XkcwMzDWLqo7LVDixd2sR6B4wxJut9xcp/Ev9bO4EFg4rm6S9QxATLBj5OPxdeocgmhjwKaw==} + + '@types/eventsource@1.1.15': + resolution: {integrity: sha512-XQmGcbnxUNa06HR3VBVkc9+A2Vpi9ZyLJcdS5dwaQQ/4ZMWFO+5c90FnMUpbtMZwB/FChoYHwuVg8TvkECacTA==} + + '@types/follow-redirects@1.14.4': + resolution: {integrity: sha512-GWXfsD0Jc1RWiFmMuMFCpXMzi9L7oPDVwxUnZdg89kDNnqsRfUKXEtUYtA98A6lig1WXH/CYY/fvPW9HuN5fTA==} + + '@types/glob@7.2.0': + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/hoist-non-react-statics@3.3.5': + resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/lodash.isequal@4.5.8': + resolution: {integrity: sha512-uput6pg4E/tj2LGxCZo9+y27JNyB2OZuuI/T5F+ylVDYuqICLG2/ktjxx0v6GvVntAf8TvEzeQLcV0ffRirXuA==} + + '@types/lodash@4.17.13': + resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} + + '@types/marked@4.3.2': + resolution: {integrity: sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node@22.9.0': + resolution: {integrity: sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/progress-stream@2.0.5': + resolution: {integrity: sha512-5YNriuEZkHlFHHepLIaxzq3atGeav1qCTGzB74HKWpo66qjfostF+rHc785YYYHeBytve8ZG3ejg42jEIfXNiQ==} + + '@types/prop-types@15.7.13': + resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} + + '@types/react-copy-to-clipboard@5.0.7': + resolution: {integrity: sha512-Gft19D+as4M+9Whq1oglhmK49vqPhcLzk8WfvfLvaYMIPYanyfLy0+CwFucMJfdKoSFyySPmkkWn8/E6voQXjQ==} + + '@types/react-dom@18.3.1': + resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} + + '@types/react-is@18.3.0': + resolution: {integrity: sha512-KZJpHUkAdzyKj/kUHJDc6N7KyidftICufJfOFpiG6haL/BDQNQt5i4n1XDUL/nDZAtGLHDSWRYpLzKTAKSvX6w==} + + '@types/react-redux@7.1.34': + resolution: {integrity: sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==} + + '@types/react-transition-group@4.4.11': + resolution: {integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==} + + '@types/react@18.3.12': + resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/shallow-equals@1.0.3': + resolution: {integrity: sha512-xZx/hZsf1p9J5lGN/nGTsuW/chJCdlyGxilwg1TS78rygBCU5bpY50zZiFcIimlnl0p41kAyaASsy0bqU7WyBA==} + + '@types/speakingurl@13.0.6': + resolution: {integrity: sha512-ywkRHNHBwq0mFs/2HRgW6TEBAzH66G8f2Txzh1aGR0UC9ZoAUHfHxLZGDhwMpck4BpSnB61eNFIFmlV+TJ+KUA==} + + '@types/stylis@4.2.5': + resolution: {integrity: sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==} + + '@types/tar-stream@3.1.3': + resolution: {integrity: sha512-Zbnx4wpkWBMBSu5CytMbrT5ZpMiF55qgM+EpHzR4yIDu7mv52cej8hTkOc6K+LzpkOAbxwn/m7j3iO+/l42YkQ==} + + '@types/tern@0.23.9': + resolution: {integrity: sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==} + + '@types/ungap__structured-clone@1.2.0': + resolution: {integrity: sha512-ZoaihZNLeZSxESbk9PUAPZOlSpcKx81I1+4emtULDVmBLkYutTcMlCj2K9VNlf9EWODxdO6gkAqEaLorXwZQVA==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/use-sync-external-store@0.0.6': + resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + + '@types/uuid@8.3.4': + resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + + '@uiw/codemirror-extensions-basic-setup@4.23.6': + resolution: {integrity: sha512-bvtq8IOvdkLJMhoJBRGPEzU51fMpPDwEhcAHp9xCR05MtbIokQgsnLXrmD1aZm6e7s/3q47H+qdSfAAkR5MkLA==} + peerDependencies: + '@codemirror/autocomplete': '>=6.0.0' + '@codemirror/commands': '>=6.0.0' + '@codemirror/language': '>=6.0.0' + '@codemirror/lint': '>=6.0.0' + '@codemirror/search': '>=6.0.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + + '@uiw/codemirror-themes@4.23.6': + resolution: {integrity: sha512-0dpuLQW+V6zrKvfvor/eo71V3tpr2L2Hsu8QZAdtSzksjWABxTOzH3ShaBRxCEsrz6sU9sa9o7ShwBMMDz59bQ==} + peerDependencies: + '@codemirror/language': '>=6.0.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + + '@uiw/react-codemirror@4.23.6': + resolution: {integrity: sha512-caYKGV6TfGLRV1HHD3p0G3FiVzKL1go7wes5XT2nWjB0+dTdyzyb81MKRSacptgZcotujfNO6QXn65uhETRAMw==} + peerDependencies: + '@babel/runtime': '>=7.11.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/theme-one-dark': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + codemirror: '>=6.0.0' + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vercel/stega@0.1.2': + resolution: {integrity: sha512-P7mafQXjkrsoyTRppnt0N21udKS9wUmLXHRyP9saLXLHw32j/FgUJ3FscSWgvSqRs4cj7wKZtwqJEvWJ2jbGmA==} + + '@vitejs/plugin-react@4.3.3': + resolution: {integrity: sha512-NooDe9GpHGqNns1i8XDERg0Vsg5SSYRhRxxyTGogUdkdNt47jal+fbuYi+Yfq6pzRCKXyoPcWisfxE6RIM3GKA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + + '@xstate/react@4.1.3': + resolution: {integrity: sha512-zhE+ZfrcCR87bu71Rkh5Z5ruZBivR/7uD/dkelzJqjQdI45IZc9DqTI8lL4Cg5+VN2p5k86KxDsusqW1kW11Tg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + xstate: ^5.18.2 + peerDependenciesMeta: + xstate: + optional: true + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + + ai@4.0.33: + resolution: {integrity: sha512-mOvhPyVchGZvZuPn8Zj4J+93fZOlaBH1BtunvGmQ/8yFc5hGmid3c0XIdw5UNt3++0sXawKE3j7JUL5ZmiQdKg==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.0.0 + peerDependenciesMeta: + react: + optional: true + zod: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + + async-mutex@0.4.1: + resolution: {integrity: sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + attr-accept@2.2.4: + resolution: {integrity: sha512-2pA6xFIbdTUDCAwjN8nQwI+842VwzbDUXO2IYlpPXQIORgKnavorcr4Ce3rwh+zsNg9zK7QPsdvDj3Lum4WX4w==} + engines: {node: '>=4'} + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + babel-plugin-polyfill-corejs2@0.4.11: + resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.10.6: + resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.2: + resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bare-events@2.5.0: + resolution: {integrity: sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + + bcryptjs@2.4.3: + resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==} + + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@1.2.3: + resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browser-split@0.0.0: + resolution: {integrity: sha512-CNXO3AXAS1H/kOGQkPjucm1161/XoF3aVkMfujqwk85XN/D/MkQMvoB81lXyX/2rerZS+hPAYYRR3mAW05awjQ==} + + browserify-zlib@0.1.4: + resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} + + browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-alloc-unsafe@1.1.0: + resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} + + buffer-alloc@1.2.0: + resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + + buffer-fill@1.0.0: + resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + builtins@1.0.3: + resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + + caniuse-lite@1.0.30001677: + resolution: {integrity: sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==} + + canvas-confetti@1.9.3: + resolution: {integrity: sha512-rFfTURMvmVEX1gyXFgn5QMn81bYk70qa0HLzcIOSVEyl57n6o9ItHeBtUSWdvKAPY0xlvBHno4/v3QPrT83q9g==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + class-list@0.1.1: + resolution: {integrity: sha512-zqR0uW+VsLtyQhixBhkdQ+z6B8+Y8HTh28kdSVjJ4zTTKM7Xz2asAQSya9VI6m/34F6N6Ktm0mrchKB+E5a8Xw==} + + class-variance-authority@0.7.0: + resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + + clean-stack@3.0.1: + resolution: {integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==} + engines: {node: '>=10'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + cmdk@1.0.0: + resolution: {integrity: sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + codemirror-spell-checker@1.1.2: + resolution: {integrity: sha512-2Tl6n0v+GJRsC9K3MLCdLaMOmvWL0uukajNJseorZJsslaxZyZMgENocPU8R0DyoTAiKsyqiemSOZo7kjGV0LQ==} + + codemirror@5.65.18: + resolution: {integrity: sha512-Gaz4gHnkbHMGgahNt3CA5HBk5lLQBqmD/pBgeB4kQU6OedZmqMBjlRF0LSrp2tJ4wlLNPm2FfaUd1pDy0mdlpA==} + + codemirror@6.0.1: + resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color2k@2.0.3: + resolution: {integrity: sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog==} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@1.0.8: + resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + + compute-scroll-into-view@3.1.0: + resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + configstore@5.0.1: + resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} + engines: {node: '>=8'} + + connect-history-api-fallback@1.6.0: + resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} + engines: {node: '>=0.8'} + + console-table-printer@2.12.1: + resolution: {integrity: sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ==} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + + core-js-compat@3.39.0: + resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + + create-react-class@15.7.0: + resolution: {integrity: sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==} + + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + + cross-spawn@6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssstyle@4.1.0: + resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==} + engines: {node: '>=18'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + cyclist@1.0.2: + resolution: {integrity: sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==} + + data-uri-to-buffer@1.2.0: + resolution: {integrity: sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + dataloader@2.2.2: + resolution: {integrity: sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==} + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + date-fns@3.6.0: + resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + date-now@1.0.1: + resolution: {integrity: sha512-yiizelQCqYLUEVT4zqYihOW6Ird7Qyc6fD3Pv5xGxk4+Jz0rsB1dMN2KyNV6jgOHYh5K+sPGCSOknQN4Upa3pg==} + + debounce@1.0.0: + resolution: {integrity: sha512-4FCfBL8uZFIh3BShn4AlxH4O9F5v+CVriJfiwW8Me/MhO7NqBE5JO5WO48NasbsY9Lww/KYflB79MejA3eKhxw==} + + debounce@2.0.0: + resolution: {integrity: sha512-xRetU6gL1VJbs85Mc4FoEGSjQxzpdxRyFhe3lmWFyy2EzydIcD4xzUvRJMD+NPDfMwKNhxa3PvsIOU32luIWeA==} + engines: {node: '>=18'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + decompress-response@7.0.0: + resolution: {integrity: sha512-6IvPrADQyyPGLpMnUh6kfKiqy7SrbXbjoUuZ90WMBJKErzv2pCiwlGEXjRX9/54OnTq+XFVnkOnOMzclLI5aEA==} + engines: {node: '>=10'} + + decompress-tar@4.1.1: + resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} + engines: {node: '>=4'} + + decompress-tarbz2@4.1.1: + resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==} + engines: {node: '>=4'} + + decompress-targz@4.1.1: + resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==} + engines: {node: '>=4'} + + decompress-unzip@4.0.1: + resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==} + engines: {node: '>=4'} + + decompress@4.2.1: + resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==} + engines: {node: '>=4'} + + deeks@3.1.0: + resolution: {integrity: sha512-e7oWH1LzIdv/prMQ7pmlDlaVoL64glqzvNgkgQNgyec9ORPHrT2jaOqMtRyqJuwWjtfb6v+2rk9pmaHj+F137A==} + engines: {node: '>= 16'} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diff-match-patch@1.0.5: + resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + direction@1.0.4: + resolution: {integrity: sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==} + hasBin: true + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + doc-path@4.1.1: + resolution: {integrity: sha512-h1ErTglQAVv2gCnOpD3sFS6uolDbOKHDU1BZq+Kl3npPqroU3dYL42lUgMfd5UimlwtRgp7C9dLGwqQ5D2HYgQ==} + engines: {node: '>=16'} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + dom-walk@0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + + duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + easymde@2.18.0: + resolution: {integrity: sha512-IxVVUxNWIoXLeqtBU4BLc+eS/ScYhT1Dcb6yF5Wchoj1iXAV+TIIDWx+NCaZhY7RcSHqDPKllbYq7nwGKILnoA==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + electron-to-chromium@1.5.52: + resolution: {integrity: sha512-xtoijJTZ+qeucLBDNztDOuQBE1ksqjvNjvqFoST3nGC7fSpqJ+X6BdTBaY5BHG+IhWWmpc6b/KfpeuEDupEPOQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + engine.io@6.5.5: + resolution: {integrity: sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==} + engines: {node: '>=10.2.0'} + + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.19.11: + resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-source-polyfill@1.0.31: + resolution: {integrity: sha512-4IJSItgS/41IxN5UVAVuAyczwZF7ZIEsM1XAoUzIHA6A+xzusEZUutdXz2Nr+MQPLxfTiCvqE79/C8HT8fKFvA==} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + eventsource-parser@3.0.0: + resolution: {integrity: sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==} + engines: {node: '>=18.0.0'} + + eventsource@2.0.2: + resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==} + engines: {node: '>=12.0.0'} + + execa@2.1.0: + resolution: {integrity: sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==} + engines: {node: ^8.12.0 || >=9.7.0} + + exif-component@1.0.1: + resolution: {integrity: sha512-FXnmK9yJYTa3V3G7DE9BRjUJ0pwXMICAxfbsAuKPTuSlFzMZhQbcvvwx0I8ofNJHxz3tfjze+whxcGpfklAWOQ==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fdir@6.4.2: + resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + file-selector@0.4.0: + resolution: {integrity: sha512-iACCiXeMYOvZqlF1kTiYINzgepRBymz1wwjiuup9u9nayhb6g4fSwiyJ/6adli+EPwrWtpgQAh2PoS7HukEGEg==} + engines: {node: '>= 10'} + + file-selector@2.1.0: + resolution: {integrity: sha512-ZuXAqGePcSPz4JuerOY06Dzzq0hrmQ6VGoXVzGyFI1npeOfBgqGIKKpznfYWRkSLJlXutkqVC5WvGZtkFVhu9Q==} + engines: {node: '>= 12'} + + file-type@3.9.0: + resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} + engines: {node: '>=0.10.0'} + + file-type@5.2.0: + resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==} + engines: {node: '>=4'} + + file-type@6.2.0: + resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==} + engines: {node: '>=4'} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + file-url@2.0.2: + resolution: {integrity: sha512-x3989K8a1jM6vulMigE8VngH7C5nci0Ks5d9kVjUXmNF28gmiZUNujk5HjwaS8dAzN2QmUfX56riJKgN00dNRw==} + engines: {node: '>=4'} + + filesize@9.0.11: + resolution: {integrity: sha512-gTAiTtI0STpKa5xesyTA9hA3LX4ga8sm2nWRcffEa1L/5vQwb4mj2MdzMkoHoGv4QzfDshQZuYscQSf8c4TKOA==} + engines: {node: '>= 0.4.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-cache-dir@2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + + flush-write-stream@2.0.0: + resolution: {integrity: sha512-uXClqPxT4xW0lcdSBheb2ObVU+kuqUk3Jk64EwieirEXZx9XUrVwp/JuBfKAWaM4T5Td/VL7QLDWPXp/MvGm/g==} + + focus-lock@1.3.5: + resolution: {integrity: sha512-QFaHbhv9WPUeLYBDe/PAuLKJ4Dd9OPvKs9xZBr3yLXnUrDNaVXKu2baDBXe3naPY30hgHYSsf2JW4jzas2mDEQ==} + engines: {node: '>=10'} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + framer-motion@10.18.0: + resolution: {integrity: sha512-oGlDh1Q1XqYPksuTD/usb0I70hq95OUzmL9+6Zd+Hs4XV0oaISBa/UUMSjYiq6m8EUF32132mOJ8xVZS+I0S6w==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + framer-motion@11.0.8: + resolution: {integrity: sha512-1KSGNuqe1qZkS/SWQlDnqK2VCVzRVEoval379j0FiUBJAZoqgwyvqFkfvJbgW2IPFo4wX16K+M0k5jO23lCIjA==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + ftp@0.3.10: + resolution: {integrity: sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==} + engines: {node: '>=0.8.0'} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-it@8.6.5: + resolution: {integrity: sha512-o1hjPwrb/icm3WJbCweTSq8mKuDfJlqwbFauI+Pdgid99at/BFaBXFBJZE+uqvHyOVARE4z680S44vrDm8SsCw==} + engines: {node: '>=14.0.0'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-random-values-esm@1.0.2: + resolution: {integrity: sha512-HMSDTgj1HPFAuZG0FqxzHbYt5JeEGDUeT9r1RLXhS6RZQS8rLRjokgjZ0Pd28CN0lhXlRwfH6eviZqZEJ2kIoA==} + + get-random-values@1.2.2: + resolution: {integrity: sha512-lMyPjQyl0cNNdDf2oR+IQ/fM3itDvpoHy45Ymo2r0L1EjazeSl13SfbKZs7KtZ/3MDCeueiaJiuOEfKqRTsSgA==} + engines: {node: 10 || 12 || >=14} + + get-stream@2.3.1: + resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==} + engines: {node: '>=0.10.0'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + + get-uri@2.0.4: + resolution: {integrity: sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q==} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.3.4: + resolution: {integrity: sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@11.0.0: + resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + engines: {node: 20 || >=22} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global@4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@10.0.2: + resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} + engines: {node: '>=8'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + groq-js@1.14.0: + resolution: {integrity: sha512-nrrEswAovzFcG2nXWHCwbXq0ciavKSq8ZvuqT93zxIHWGX3FYCN+MkvHyYRTVuM4SuQAjU7FXkcN3DBt4BHTxA==} + engines: {node: '>= 14'} + + groq@3.63.0: + resolution: {integrity: sha512-9YzXsNTXqRFput/5HoRS7HJKl5J6of21qpc89ZnzDC/LcQPI1UzpRSuJ6AHYPzj1Re9nGRYtr88uwJsBjS4aLw==} + engines: {node: '>=18'} + + gunzip-maybe@1.4.2: + resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} + hasBin: true + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + + hast-util-heading-rank@3.0.0: + resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@2.2.5: + resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-to-estree@3.1.0: + resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + + hast-util-to-html@9.0.3: + resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} + + hast-util-to-jsx-runtime@2.3.2: + resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==} + + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@6.0.0: + resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} + + hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + history@5.3.0: + resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + hotscript@1.0.13: + resolution: {integrity: sha512-C++tTF1GqkGYecL+2S1wJTfoH6APGAsbb7PAWQ3iVIwgG/EFseAfEVOKFgAFq4yK3+6j1EjUD4UQ9dRJHX/sSQ==} + + html-element@2.3.1: + resolution: {integrity: sha512-xnFt2ZkbFcjc+JoAtg3Hl89VeEZDjododu4VCPkRvFmBTHHA9U1Nt6hLUWfW2O+6Sl/rT1hHK/PivleX3PdBJQ==} + engines: {node: '>=4.2'} + + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + html-loader@5.1.0: + resolution: {integrity: sha512-Jb3xwDbsm0W3qlXrCZwcYqYGnYz55hb6aoKQTlzyZPXsPpi6tHXzAfqalecglMQgNvtEfxrCQPaKT90Irt5XDA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.0.0 + + html-minifier-terser@7.2.0: + resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + + html-parse-stringify@3.0.1: + resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + + html-to-text@9.0.5: + resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} + engines: {node: '>=14'} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + engines: {node: '>= 14'} + + humanize-list@1.0.1: + resolution: {integrity: sha512-4+p3fCRF21oUqxhK0yZ6yaSP/H5/wZumc7q1fH99RkW7Q13aAxDeP78BKjoR+6y+kaHqKF/JWuQhsNuuI2NKtA==} + + hyperscript@2.0.2: + resolution: {integrity: sha512-uggBAYfHFC5WyZQXlJ61BNZbPmJbschcvfYNhYdZWCp+0J8KYb5Du8nQuk8Ru+ThoCNb01B0tPtnTRqnrFBkVg==} + + i18next@23.16.4: + resolution: {integrity: sha512-9NIYBVy9cs4wIqzurf7nLXPyf3R78xYbxExVqHLK9od3038rjpyOEzW+XB130kZ1N4PZ9inTtJ471CRJ4Ituyg==} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + immer@10.1.1: + resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} + + immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + indexof@0.0.1: + resolution: {integrity: sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-deflate@1.0.0: + resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-gzip@1.0.0: + resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-hotkey-esm@1.0.0: + resolution: {integrity: sha512-eTXNmLCPXpKEZUERK6rmFsqmL66+5iNB998JMO+/61fSxBZFuUR1qHyFyx7ocBl5Vs8qjFzRAJLACpYfhS5g5w==} + + is-hotkey@0.2.0: + resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-natural-number@4.0.1: + resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-retry-allowed@2.2.0: + resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} + engines: {node: '>=10'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-tar@1.0.0: + resolution: {integrity: sha512-8sR603bS6APKxcdkQ1e5rAC9JDCxM3OlbGJDWv5ajhHqIh6cTaqcpeOTch1iIeHYY4nHEFTgmCiGSLfvmODH4w==} + engines: {node: '>=0.10.0'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jackspeak@4.0.2: + resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} + engines: {node: 20 || >=22} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + + jose@5.9.6: + resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} + + js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsdom-global@3.0.2: + resolution: {integrity: sha512-t1KMcBkz/pT5JrvcJbpUR2u/w1kO9jXctaaGJ0vZDzwFnIvGWw9IDSRciT83kIs8Bnw4qpOl8bQK08V01YgMPg==} + peerDependencies: + jsdom: '>=10.0.0' + + jsdom@23.2.0: + resolution: {integrity: sha512-L88oL7D/8ufIES+Zjz7v0aes+oBMh2Xnh3ygWvL0OaICOomKEPKuPnIfBJekiXr+BHbbMjrWn/xqrDQuxFTeyA==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + json-2-csv@5.5.6: + resolution: {integrity: sha512-N673XbJgHwUq9JreKpk530jSywPF/rEAQ08dV99QQpkluP/4HTwshpoP9hmDz26iSFqu7eNAPgyJfu/77HvPGA==} + engines: {node: '>= 16'} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-lexer@1.2.0: + resolution: {integrity: sha512-7otpx5UPFeSELoF8nkZPHCfywg86wOsJV0WNOaysuO7mfWj1QFp2vlqESRRCeJKBXr+tqDgHh4HgqUFKTLcifQ==} + + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-reduce@3.0.0: + resolution: {integrity: sha512-zvnhEvwhqTOxBIcXnxvHvhqtubdwFRp+FascmCaL56BT9jdttRU8IFc+Ilh2HPJ0AtioF8mFPxmReuJKLW0Iyw==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsondiffpatch@0.6.0: + resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + leac@0.6.0: + resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@2.2.0: + resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} + engines: {node: '>=4'} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.0.2: + resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lucide-react@0.414.0: + resolution: {integrity: sha512-Krr/MHg9AWoJc52qx8hyJ64X9++JNfS1wjaJviLM1EP/68VNB7Tv0VMldLCB1aUe6Ka9QxURPhQm/eB6cqOM3A==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + make-dir@1.3.0: + resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} + engines: {node: '>=4'} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + marked@4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} + hasBin: true + + marked@7.0.4: + resolution: {integrity: sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==} + engines: {node: '>= 16'} + hasBin: true + + md-to-react-email@5.0.2: + resolution: {integrity: sha512-x6kkpdzIzUhecda/yahltfEl53mH26QdWu4abUF9+S0Jgam8P//Ciro8cdhyMHnT5MQUJYrIbO6ORM2UxPiNNA==} + peerDependencies: + react: 18.x + + md5-o-matic@0.1.1: + resolution: {integrity: sha512-QBJSFpsedXUl/Lgs4ySdB2XCzUEcJ3ujpbagdZCkRaYIaC0kFnID8jhc84KEiVv6dNFtIrmW7bqow0lDxgJi6A==} + + mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.1.3: + resolution: {integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdast-util-toc@7.1.0: + resolution: {integrity: sha512-2TVKotOQzqdY7THOdn2gGzS9d1Sdd66bvxUyw3aNpWfcPXCLYSJCCgfPy30sEtuzkDraJgqF35dzgmz6xlvH/w==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + mendoza@3.0.7: + resolution: {integrity: sha512-KtLgsCl5dFjRPUVSVV9KxpUr2BfZgLv8uqxg/hCsI7JIWsesHABSbl0MQwxNHAg24KtzSQ6vrPsgeNnoq4UImg==} + engines: {node: '>=14.18'} + + meow@9.0.0: + resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} + engines: {node: '>=10'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.1: + resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.0: + resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + + micromark-extension-mdx-jsx@3.0.1: + resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + + micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + + micromark-factory-mdx-expression@2.0.2: + resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==} + + micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + + micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + + micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + + micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + + micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + + micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + + micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + + micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + + micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + + micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + + micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + + micromark-util-subtokenize@2.0.1: + resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@3.1.0: + resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} + engines: {node: '>=8'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + min-document@2.19.0: + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.0.1: + resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} + engines: {node: '>= 18'} + + mississippi@4.0.0: + resolution: {integrity: sha512-7PujJ3Te6GGg9lG1nfw5jYCPV6/BsoAT0nCQwb6w+ROuromXYxI6jc/CQSlD82Z/OUMSBX1SoaqhTE+vXiLQzQ==} + engines: {node: '>=4.0.0'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + mnemonist@0.39.8: + resolution: {integrity: sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==} + + module-alias@2.2.3: + resolution: {integrity: sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==} + + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nano-pubsub@3.0.0: + resolution: {integrity: sha512-zoTNyBafxG0+F5PP3T3j1PKMr7gedriSdYRhLFLRFCz0OnQfQ6BkVk9peXVF30hz633Bw0Zh5McleOrXPjWYCQ==} + engines: {node: '>=18'} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.0.8: + resolution: {integrity: sha512-TcJPw+9RV9dibz1hHUzlLVy8N4X9TnwirAjrU08Juo6BNKggzVfP2ZJ/3ZUSq15Xl5i85i+Z89XBO90pB2PghQ==} + engines: {node: ^18 || >=20} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + next-auth@5.0.0-beta.18: + resolution: {integrity: sha512-x55L8wZb8PcPGCYA3e/l9tdpd7YL3FDuhas4W8pxq3PjrWJ9OoDxNN0otK9axJamJBbBgjfzTJjVQB6hXoe0ZQ==} + peerDependencies: + '@simplewebauthn/browser': ^9.0.1 + '@simplewebauthn/server': ^9.0.2 + next: ^14 + nodemailer: ^6.6.5 + react: ^18.2.0 + peerDependenciesMeta: + '@simplewebauthn/browser': + optional: true + '@simplewebauthn/server': + optional: true + nodemailer: + optional: true + + next-mdx-remote-client@1.0.3: + resolution: {integrity: sha512-svPnAFB4VIEZEJabcJUU8uRDCCo1aUQOR71C0yWKeIqn08KnqWdKCDVtpu4Lazy0ORZsFn/xuZWxXanryLLvmw==} + engines: {node: '>=18.17.0'} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + + next-sanity@9.8.8: + resolution: {integrity: sha512-37exA0W6VDHp66m72B934Sd7rwcVvch9VI/x4mgpHzbHUrReDknrGdWzTaKBe5iTQUHvZr8TE+GhyONO8MK5lQ==} + engines: {node: '>=18.18'} + peerDependencies: + '@sanity/client': ^6.22.2 + '@sanity/icons': ^3.4.0 + '@sanity/types': ^3.62.0 + '@sanity/ui': ^2.8.10 + next: ^14.2 || ^15.0.0-0 + react: ^18.3 || ^19.0.0-0 + react-dom: ^18.3 || ^19.0.0-0 + sanity: ^3.62.0 + styled-components: ^6.1 + + next-themes@0.3.0: + resolution: {integrity: sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==} + peerDependencies: + react: ^16.8 || ^17 || ^18 + react-dom: ^16.8 || ^17 || ^18 + + next@14.2.3: + resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==} + engines: {node: '>=18.17.0'} + deprecated: This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details. + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + sass: + optional: true + + next@14.2.35: + resolution: {integrity: sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + sass: + optional: true + + nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-html-parser@6.1.13: + resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + npm-run-all@4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} + hasBin: true + + npm-run-path@3.1.0: + resolution: {integrity: sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==} + engines: {node: '>=8'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + oauth4webapi@2.17.0: + resolution: {integrity: sha512-lbC0Z7uzAFNFyzEYRIC+pkSVvDHJTbEW+dYlSBAlCYDe6RxUkJ26bClhk8ocBZip1wfI9uKTe0fm4Ib4RHn6uQ==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + + observable-callback@1.0.3: + resolution: {integrity: sha512-VlS275UyPnwdMtzxDgr/lCiOUyq9uXNll3vdwzDcJ6PB/LuO7gLmxAQopcCA3JoFwwujBwyA7/tP5TXZwWSXew==} + engines: {node: '>=16'} + peerDependencies: + rxjs: ^6.5 || ^7 + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + oneline@1.0.3: + resolution: {integrity: sha512-KWLrLloG/ShWvvWuvmOL2jw17++ufGdbkKC2buI2Aa6AaM4AkjCtpeJZg60EK34NQVo2qu1mlPrC2uhvQgCrhQ==} + engines: {node: '>=6.0.0'} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + oniguruma-to-js@0.4.3: + resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} + deprecated: use oniguruma-to-es instead + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-finally@2.0.1: + resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@1.2.0: + resolution: {integrity: sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==} + engines: {node: '>=4'} + + p-map@7.0.2: + resolution: {integrity: sha512-z4cYYMMdKHzw4O5UkWJImbZynVIo0lSGTXc7bzB1e/rrDqkgGUNysK/o4bTr+0+xKvvLoTyGqYC4Fgljy9qe1Q==} + engines: {node: '>=18'} + + p-queue@2.4.2: + resolution: {integrity: sha512-n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng==} + engines: {node: '>=4'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + + parallel-transform@1.2.0: + resolution: {integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + + parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} + engines: {node: '>=6'} + + parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + + parseley@0.12.1: + resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + peberminta@0.9.0: + resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} + + peek-stream@1.1.3: + resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pidtree@0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} + hasBin: true + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + + pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + + pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + + pluralize-esm@9.0.5: + resolution: {integrity: sha512-Kb2dcpMsIutFw2hYrN0EhsAXOUJTd6FVMIxvNAkZCMQLVt9NGZqQczvGpYDxNWCZeCWLHUPxQIBudWzt1h7VVA==} + engines: {node: '>=14.0.0'} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + polished@4.3.1: + resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} + engines: {node: '>=10'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.47: + resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + engines: {node: ^10 || ^12 || >=14} + + preact-render-to-string@5.2.3: + resolution: {integrity: sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==} + peerDependencies: + preact: '>=10' + + preact@10.11.3: + resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==} + + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@3.8.0: + resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} + + pretty-ms@7.0.1: + resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} + engines: {node: '>=10'} + + prismjs@1.27.0: + resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} + engines: {node: '>=6'} + + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + progress-stream@2.0.0: + resolution: {integrity: sha512-xJwOWR46jcXUq6EH9yYyqp+I52skPySOeHfkxOZ2IY1AiBi/sFJhbhAKHoV3OTw/omQ45KTio9215dRJ2Yxd3Q==} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@5.6.0: + resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + raf@3.4.1: + resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + react-clientside-effect@1.2.6: + resolution: {integrity: sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==} + peerDependencies: + react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + + react-compiler-runtime@19.0.0-beta-9ee70a1-20241017: + resolution: {integrity: sha512-hVrlYbVacwEdZi08RUxSwIzZR2/+WxUsWRa7mjViRhqcqUYK+7u8UEVZoJrF5/gsCHMU9PhJRvolygSCaaE0nA==} + peerDependencies: + react: ^18.2.0 || ^19.0.0 + + react-copy-to-clipboard@5.1.0: + resolution: {integrity: sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==} + peerDependencies: + react: ^15.3.0 || 16 || 17 || 18 + + react-day-picker@9.3.0: + resolution: {integrity: sha512-xXgZISTXlwQ1Igt4cBttXF+aK1Xvd00azcGVY74PNCAe8PxtULFVWGT1UfdavFiVScF04dyV8QcybKZAw570QQ==} + engines: {node: '>=18'} + peerDependencies: + react: '>=16.8.0' + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-dropzone@11.7.1: + resolution: {integrity: sha512-zxCMwhfPy1olUEbw3FLNPLhAm/HnaYH5aELIEglRbqabizKAdHs0h+WuyOpmA+v1JXn0++fpQDdNfUagWt5hJQ==} + engines: {node: '>= 10.13'} + peerDependencies: + react: '>= 16.8' + + react-dropzone@14.3.5: + resolution: {integrity: sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ==} + engines: {node: '>= 10.13'} + peerDependencies: + react: '>= 16.8 || 18.0.0' + + react-email@3.0.1: + resolution: {integrity: sha512-G4Bkx2ULIScy/0Z8nnWywHt0W1iTkaYCdh9rWNuQ3eVZ6B3ttTUDE9uUy3VNQ8dtQbmG0cpt8+XmImw7mMBW6Q==} + engines: {node: '>=18.0.0'} + hasBin: true + + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + react-file-icon@1.5.0: + resolution: {integrity: sha512-6K2/nAI69CS838HOS+4S95MLXwf1neWywek1FgqcTFPTYjnM8XT7aBLz4gkjoqQKY9qPhu3A2tu+lvxhmZYY9w==} + peerDependencies: + react: ^18.0.0 || ^17.0.0 || ^16.2.0 + react-dom: ^18.0.0 || ^17.0.0 || ^16.2.0 + + react-focus-lock@2.13.2: + resolution: {integrity: sha512-T/7bsofxYqnod2xadvuwjGKHOoL5GH7/EIPI5UyEvaU/c2CcphvGI371opFtuY/SYdbMsNiuF4HsHQ50nA/TKQ==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-hook-form@7.53.1: + resolution: {integrity: sha512-6aiQeBda4zjcuaugWvim9WsGqisoUk+etmFEsSUMm451/Ic8L/UAb7sRtMj3V+Hdzm6mMjU1VhiSzYUZeBm0Vg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + + react-i18next@14.0.2: + resolution: {integrity: sha512-YOB/H1IgXveEWeTsCHez18QjDXImzVZOcF9/JroSbjYoN1LOfCoARFJUQQ8VNow0TnGOtHq9SwTmismm78CTTA==} + peerDependencies: + i18next: '>= 23.2.3' + react: '>= 16.8.0' + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + react-iframe@1.8.5: + resolution: {integrity: sha512-F4cQJGs3ydaG6fJWfuz9yLwOU0Trzl6kttXuUG+vYwosH8enOOFxZWEDQCSbNVO8ayjfYZeqLxEvdvcsSy4GvA==} + peerDependencies: + react: '>=16.x.x' + + react-infinite-scroll-component@6.1.0: + resolution: {integrity: sha512-SQu5nCqy8DxQWpnUVLx7V7b7LcA37aM7tvoWjTLZp1dk6EJibM5/4EJKzOnl07/BsM1Y40sKLuqjCwwH/xV0TQ==} + peerDependencies: + react: '>=16.0.0' + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-lifecycles-compat@3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + + react-photo-album@2.3.1: + resolution: {integrity: sha512-c7ofDx2DAbQa9AW9wUWOBX9zUKf/QjvdQK+fPNKEiKprks/n8t4c2viyBZ6EWpQLFLU0ad3yVBTgFvxEZ46/Iw==} + engines: {node: '>=12'} + peerDependencies: + react: '>=16.8.0' + + react-promise-suspense@0.3.4: + resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==} + + react-redux@7.2.9: + resolution: {integrity: sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==} + peerDependencies: + react: ^16.8.3 || ^17 || ^18 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + react-refractor@2.2.0: + resolution: {integrity: sha512-UvWkBVqH/2b9nkkkt4UNFtU3aY1orQfd4plPjx5rxbefy6vGajNHU9n+tv8CbykFyVirr3vEBfN2JTxyK0d36g==} + peerDependencies: + react: '>=15.0.0' + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react-remove-scroll-bar@2.3.6: + resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.5.5: + resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.6.0: + resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-rx@4.1.3: + resolution: {integrity: sha512-v0PTUnxpKJgA4j2DYLoENm4c9N/ivNI8yGZlix7BWa2/EL0JhR7HXkJxK0LiePobnq1Uhq9kItGKS91Q1PWuHw==} + peerDependencies: + react: ^18.3 || >=19.0.0-0 + rxjs: ^7 + + react-select@5.8.2: + resolution: {integrity: sha512-a/LkOckoI62710gGPQSQqUp7A10fGbH/ya3/IR49qaq3XoBvwymgD5mJgtiHxBDsutyEQfdKNycWVh8Cg8UCjw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + react-simplemde-editor@5.2.0: + resolution: {integrity: sha512-GkTg1MlQHVK2Rks++7sjuQr/GVS/xm6y+HchZ4GPBWrhcgLieh4CjK04GTKbsfYorSRYKa0n37rtNSJmOzEDkQ==} + peerDependencies: + easymde: '>= 2.0.0 < 3.0.0' + react: '>=16.8.2' + react-dom: '>=16.8.2' + + react-style-proptype@3.2.2: + resolution: {integrity: sha512-ywYLSjNkxKHiZOqNlso9PZByNEY+FTyh3C+7uuziK0xFXu9xzdyfHwg4S9iyiRRoPCR4k2LqaBBsWVmSBwCWYQ==} + + react-style-singleton@2.2.1: + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + + react-virtuoso@4.12.0: + resolution: {integrity: sha512-oHrKlU7xHsrnBQ89ecZoMPAK0tHnI9s1hsFW3KKg5ZGeZ5SWvbGhg/QFJFY4XETAzoCUeu+Xaxn1OUb/PGtPlA==} + engines: {node: '>=10'} + peerDependencies: + react: '>=16 || >=17 || >= 18' + react-dom: '>=16 || >=17 || >= 18' + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.0: + resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==} + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + redux-observable@2.0.0: + resolution: {integrity: sha512-FJz4rLXX+VmDDwZS/LpvQsKnSanDOe8UVjiLryx1g3seZiS69iLpMrcvXD5oFO7rtkPyRdo/FmTqldnT3X3m+w==} + peerDependencies: + redux: '>=4 <5' + + redux-thunk@2.4.2: + resolution: {integrity: sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==} + peerDependencies: + redux: ^4 + + redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + + refractor@3.6.0: + resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} + + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + + regex@4.4.0: + resolution: {integrity: sha512-uCUSuobNVeqUupowbdZub6ggI5/JZkYyJdDogddJr60L764oxC2pMZov1fQ3wM9bdyzUILDG+Sqx6NAKAz9rKQ==} + + regexp.prototype.flags@1.5.3: + resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} + engines: {node: '>= 0.4'} + + regexpu-core@6.1.1: + resolution: {integrity: sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.11.2: + resolution: {integrity: sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==} + hasBin: true + + rehype-autolink-headings@7.1.0: + resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-pretty-code@0.13.2: + resolution: {integrity: sha512-F+PaFMscfJOcSHcR2b//+hk/0jT56hmGDqXcVD6VC9j0CUSGiqv8YxaWUyhR7qEIRRSbzAVxx+0uxzk+akXs+w==} + engines: {node: '>=18'} + peerDependencies: + shiki: ^1.3.0 + + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + rehype-slug@6.0.0: + resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + + rehype@13.0.2: + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} + + relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + + remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + + remark-mdx-remove-esm@1.1.0: + resolution: {integrity: sha512-oN3F9QRuPKSdzZi+wvEodBVjKwya63sl403pWzJvm0+c503iUjCDR+JAnP3Ho/4205IWbQ2NujPQi/B9kU6ZrA==} + + remark-mdx@3.1.0: + resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.1: + resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + reselect@4.1.8: + resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} + + resend@3.5.0: + resolution: {integrity: sha512-bKu4LhXSecP6krvhfDzyDESApYdNfjirD5kykkT1xO0Cj9TKSiGh5Void4pGTs3Am+inSnp4dg0B5XzdwHBJOQ==} + engines: {node: '>=18'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + + rimraf@6.0.1: + resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} + engines: {node: 20 || >=22} + hasBin: true + + rollup@3.29.5: + resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + rrweb-cssom@0.6.0: + resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + + rrweb-cssom@0.7.1: + resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs-exhaustmap-with-trailing@2.1.1: + resolution: {integrity: sha512-gK7nsKyPFsbjDeJ0NYTcZYGW5TbTFjT3iACa28Pwp3fIf9wT/JUR8vdlKYCjUOZKXYnXEk8eRZ4zcQyEURosIA==} + peerDependencies: + rxjs: 7.x + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sanity-diff-patch@4.0.0: + resolution: {integrity: sha512-1OOTx/Uw0J3rwNkI4J/4XJfTGb2Rze/gl5jJGRw+M2hRGkp1QEu2wFHiC9adj83ABYthOczBCBpTHHeZluctdw==} + engines: {node: '>=18.2'} + + sanity-plugin-asset-source-unsplash@3.0.1: + resolution: {integrity: sha512-xlwmtoZPbfbXcoEkeH67AnWoUvUWBICNvShFgkB1TlZAWZ2hKRFUm968aHa1kkjsbHnrBBkSqkhKcYFM/giC5Q==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 + sanity: ^3 + styled-components: ^6.1 + + sanity-plugin-iframe-pane@3.1.6: + resolution: {integrity: sha512-D+aEs+rIuVprcPSuqNNRiEr7OHZoc+zqhWU5cdaxUDe5XNtM4mJXwdofVLMibbp2g6rrAAWGSE9zY7l+R9swhA==} + engines: {node: '>=14'} + peerDependencies: + react: ^18.2.0 + sanity: ^3.20.0 + styled-components: ^5.2 || ^6.0.0 + + sanity-plugin-internationalized-array@2.1.0: + resolution: {integrity: sha512-YpG8O3wdNbewsPNhSHZ13MYTPDqsf0Iz8eC6fB5hhDwttxcM6ftD40R1qXT73Ccl68X4DrbHi3bQzXC60E7D7g==} + engines: {node: '>=14'} + peerDependencies: + '@sanity/ui': ^2.1.0 + react: ^18 + react-dom: ^18 + sanity: ^3.36.4 + styled-components: ^6.1 + + sanity-plugin-markdown@5.0.0: + resolution: {integrity: sha512-EzyJ6f/TcQevIZushOG5HKGIu9aUggktbH5th16EwTlHtGWjxO1aEuarMv362FmVaVYPh7YOHe9JuBkkGBE0KQ==} + engines: {node: '>=18'} + peerDependencies: + easymde: ^2.18 + react: ^18.3 + sanity: ^3.23 + styled-components: ^6.1 + + sanity-plugin-media@2.3.2: + resolution: {integrity: sha512-5RZJyKuN2SuatWjUEr9x+DOZOPg6+ga/6RD+pc8RK3PgviP+945M+E8k93XwnIzSGNFtix8jf0mUbdbCO7HpjA==} + engines: {node: '>=14'} + peerDependencies: + '@sanity/ui': ^1.0 || ^2.0 + react: ^18 + react-dom: ^18 + sanity: ^3.0.0 + styled-components: ^5.0 || ^6.0 + + sanity@3.63.0: + resolution: {integrity: sha512-JKIJPbtL88YoQgVzKtoVei18zlJFnbw7MBDQYMCvp+WteLrHyISGmKAr6QQFdsaCZvIdJbOFMuhZw+GACt3xhA==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + react: ^18 + react-dom: ^18 + styled-components: ^6.1 + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + + seek-bzip@1.0.6: + resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} + hasBin: true + + selderee@0.11.0: + resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + serialize-error@11.0.3: + resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==} + engines: {node: '>=14.16'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shallow-equals@1.0.0: + resolution: {integrity: sha512-xd/FKcdmfmMbyYCca3QTVEJtqUOGuajNzvAX6nt8dXILwjAIEkfHc4hI8/JMGApAmb7VeULO0Q30NTxnbH/15g==} + + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + + shiki@1.22.2: + resolution: {integrity: sha512-3IZau0NdGKXhH2bBlUk4w1IHNxPh6A5B2sUpyY+8utLu2j/h1QpFkAaUA1bAMxOWWGtTWcAh531vnS4NJKS/lA==} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + silver-fleece@1.1.0: + resolution: {integrity: sha512-V3vShUiLRVPMu9aSWpU5kLDoU/HO7muJKE236EO663po3YxivAkMLbRg+amV/FhbIfF5bWXX5TVX+VYmRaOBFA==} + + simple-wcswidth@1.0.1: + resolution: {integrity: sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slate-dom@0.111.0: + resolution: {integrity: sha512-VjeBh2xIRvP6ToEhrO1TPahc5fPezxbeSUhsRTppBPtHfidEdyp/MTI9TjUrZnlznJiVZ7QKrORXilFq8hsbtQ==} + peerDependencies: + slate: '>=0.99.0' + + slate-react@0.111.0: + resolution: {integrity: sha512-DiiVSYn+dilx0j40FjaaHiG2KbaX4lZfTdEnYvUJMnpc+d9evcuO2nV6KCDQOtS6xr4w0sBzQMxrpGlA5alKww==} + peerDependencies: + react: '>=18.2.0' + react-dom: '>=18.2.0' + slate: '>=0.99.0' + slate-dom: '>=0.110.2' + + slate@0.110.2: + resolution: {integrity: sha512-4xGULnyMCiEQ0Ml7JAC1A6HVE6MNpPJU7Eq4cXh1LxlrR0dFXC3XC+rNfQtUJ7chHoPkws57x7DDiWiZAt+PBA==} + + socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + socket.io@4.7.5: + resolution: {integrity: sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==} + engines: {node: '>=10.2.0'} + + sonner@1.7.0: + resolution: {integrity: sha512-W6dH7m5MujEPyug3lpI2l3TC3Pp1+LTgK0Efg+IHDrBbtEjyCmCHHo6yfNBOsf1tFZ6zf+jceWwB38baC8yO9g==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + space-separated-tokens@1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.20: + resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + speedometer@1.0.0: + resolution: {integrity: sha512-lgxErLl/7A5+vgIIXsh9MbeukOaCb2axgQ+bKCdIE+ibNT4XNYGNCR1qFEGq6F+YDASXK3Fh/c5FgtZchFolxw==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + stream-each@1.2.3: + resolution: {integrity: sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + streamx@2.20.1: + resolution: {integrity: sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string.prototype.padend@3.1.6: + resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-dirs@2.1.0: + resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + stripe@15.12.0: + resolution: {integrity: sha512-slTbYS1WhRJXVB8YXU8fgHizkUrM9KJyrw4Dd8pLEwzKHYyQTIE46EePC2MVbSDZdE24o1GdNtzmJV4PrPpmJA==} + engines: {node: '>=12.*'} + + style-mod@4.1.2: + resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} + + style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + + style-to-object@1.0.8: + resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + + styled-components@6.1.13: + resolution: {integrity: sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw==} + engines: {node: '>= 16'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + + styled-jsx@5.1.1: + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + stylis@4.3.2: + resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + suspend-react@0.1.3: + resolution: {integrity: sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==} + peerDependencies: + react: '>=17.0' + + swr@2.3.0: + resolution: {integrity: sha512-NyZ76wA4yElZWBHzSgEJc28a0u6QZvhb6w0azeL2k7+Q1gAzVK+IqQYXhVOC/mzi+HZIozrZvBVeSeOZNR2bqA==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tailwind-merge@2.5.4: + resolution: {integrity: sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==} + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + + tailwindcss@3.4.14: + resolution: {integrity: sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==} + engines: {node: '>=14.0.0'} + hasBin: true + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-stream@1.6.2: + resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} + engines: {node: '>= 0.8.0'} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.36.0: + resolution: {integrity: sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==} + engines: {node: '>=10'} + hasBin: true + + text-decoder@1.2.1: + resolution: {integrity: sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + third-party-capital@1.0.20: + resolution: {integrity: sha512-oB7yIimd8SuGptespDAZnNkzIz+NWaJCu2RMsbs4Wmp9zSDUM8Nhi3s2OOcqYuv3mN4hitXc8DVx+LyUmbUDiA==} + + throttle-debounce@2.3.0: + resolution: {integrity: sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==} + engines: {node: '>=8'} + + throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through2@3.0.2: + resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tiny-invariant@1.3.1: + resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + + tinyglobby@0.2.10: + resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + engines: {node: '>=12.0.0'} + + to-buffer@1.1.1: + resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + + tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} + + transliteration@2.3.5: + resolution: {integrity: sha512-HAGI4Lq4Q9dZ3Utu2phaWgtm3vB6PkLUFqWAScg/UW+1eZ/Tg6Exo4oC0/3VUol/w4BlefLhUUSVBr/9/ZGQOw==} + engines: {node: '>=6.0.0'} + hasBin: true + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + + tslib@2.1.0: + resolution: {integrity: sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.19.2: + resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} + engines: {node: '>=18.0.0'} + hasBin: true + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typeid-js@0.3.0: + resolution: {integrity: sha512-A1EmvIWG6xwYRfHuYUjPltHqteZ1EiDG+HOmbIYXeHUVztmnGrPIfU9KIK1QC30x59ko0r4JsMlwzsALCyiB3Q==} + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + typo-js@1.2.4: + resolution: {integrity: sha512-Oy/k+tFle5NAA3J/yrrYGfvEnPVrDZ8s8/WCwjUE75k331QyKIsFss7byQ/PzBmXLY6h1moRnZbnaxWBe3I3CA==} + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + + unist-util-filter@2.0.3: + resolution: {integrity: sha512-8k6Jl/KLFqIRTHydJlHh6+uFgqYHq66pV75pZgr1JwfyFSjbWb12yfb0yitW/0TbHXjr9U4G9BQpOvMANB+ExA==} + + unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove@4.0.0: + resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + use-callback-ref@1.3.2: + resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-debounce@10.0.4: + resolution: {integrity: sha512-6Cf7Yr7Wk7Kdv77nnJMf6de4HuDE4dTxKij+RqE9rufDsI6zsbjyAxcH5y2ueJCQAnfgKbzXbZHYlkFwmBlWkw==} + engines: {node: '>= 16.0.0'} + peerDependencies: + react: '*' + + use-device-pixel-ratio@1.1.2: + resolution: {integrity: sha512-nFxV0HwLdRUt20kvIgqHYZe6PK/v4mU1X8/eLsT1ti5ck0l2ob0HDRziaJPx+YWzBo6dMm4cTac3mcyk68Gh+A==} + peerDependencies: + react: '>=16.8.0' + + use-effect-event@1.0.2: + resolution: {integrity: sha512-9c8AAmtQja4LwJXI0EQPhQCip6dmrcSe0FMcTUZBeGh/XTCOLgw3Qbt0JdUT8Rcrm/ZH+Web7MIcMdqgQKdXJg==} + peerDependencies: + react: ^18.3 || ^19.0.0-0 + + use-hot-module-reload@2.0.0: + resolution: {integrity: sha512-RbL/OY1HjHNf5BYSFV3yDtQhIGKjCx9ntEjnUBYsOGc9fTo94nyFTcjtD42/twJkPgMljWpszUIpTGD3LuwHSg==} + peerDependencies: + react: '>=17.0.0' + + use-isomorphic-layout-effect@1.1.2: + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.2: + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.2.2: + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + use-sync-external-store@1.4.0: + resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + usehooks-ts@3.0.1: + resolution: {integrity: sha512-bgJ8S9w/SnQyACd3RvWp3CGncROxEENGqQLCsdaoyTb0zTENIna7MIV3OW6ywCfPaYYD2OPokw7oLPmSLLWP4w==} + engines: {node: '>=16.15.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuidv7@0.4.4: + resolution: {integrity: sha512-jjRGChg03uGp9f6wQYSO8qXkweJwRbA5WRuEQE8xLIiehIzIIi23qZSzsyvZPCPoFqkeLtZuz7Plt1LGukAInA==} + hasBin: true + + valibot@0.31.1: + resolution: {integrity: sha512-2YYIhPrnVSz/gfT2/iXVTrSj92HwchCt9Cga/6hX4B26iCz9zkIsGTS0HjDYTZfTi1Un0X6aRvhBi1cfqs/i0Q==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@3.0.0: + resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vaul@0.9.9: + resolution: {integrity: sha512-7afKg48srluhZwIkaU+lgGtFCUsYBSGOl8vcc8N/M3YQlZFlynHD15AE+pwrYdc826o7nrIND4lL9Y6b9WWZZQ==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-matter@5.0.0: + resolution: {integrity: sha512-jhPSqlj8hTSkTXOqyxbUeZAFFVq/iwu/jukcApEqc/7DOidaAth6rDc0Zgg0vWpzUnWkwFP7aK28l6nBmxMqdQ==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@4.5.5: + resolution: {integrity: sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + watchpack@2.4.2: + resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + engines: {node: '>=10.13.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.96.1: + resolution: {integrity: sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.0.0: + resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} + engines: {node: '>=18'} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + whoops@4.1.7: + resolution: {integrity: sha512-weRPO7XE2Oko2/KQkddqvj6uAjLDOoiJdrXiE2ymgiV5Ugefi0/GJZPkeNr6OUUMfcqGAwUUPIZrG6UdSuBk2g==} + engines: {node: '>= 8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xdg-basedir@4.0.0: + resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} + engines: {node: '>=8'} + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + xregexp@2.0.0: + resolution: {integrity: sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==} + + xstate@5.18.2: + resolution: {integrity: sha512-hab5VOe29D0agy8/7dH1lGw+7kilRQyXwpaChoMu4fe6rDP+nsHYhDYKfS2O4iXE7myA98TW6qMEudj/8NXEkA==} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.6.0: + resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + + zod-to-json-schema@3.24.1: + resolution: {integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==} + peerDependencies: + zod: ^3.24.1 + + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@ai-sdk/deepseek@0.1.0(zod@3.23.8)': + dependencies: + '@ai-sdk/openai-compatible': 0.1.0(zod@3.23.8) + '@ai-sdk/provider': 1.0.4 + '@ai-sdk/provider-utils': 2.1.0(zod@3.23.8) + zod: 3.23.8 + + '@ai-sdk/google@1.0.15(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 1.0.4 + '@ai-sdk/provider-utils': 2.0.7(zod@3.23.8) + zod: 3.23.8 + + '@ai-sdk/openai-compatible@0.1.0(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 1.0.4 + '@ai-sdk/provider-utils': 2.1.0(zod@3.23.8) + zod: 3.23.8 + + '@ai-sdk/openai-compatible@0.2.14(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.23.8) + zod: 3.23.8 + + '@ai-sdk/openai@1.0.18(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 1.0.4 + '@ai-sdk/provider-utils': 2.0.7(zod@3.23.8) + zod: 3.23.8 + + '@ai-sdk/provider-utils@2.0.7(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 1.0.4 + eventsource-parser: 3.0.0 + nanoid: 3.3.8 + secure-json-parse: 2.7.0 + optionalDependencies: + zod: 3.23.8 + + '@ai-sdk/provider-utils@2.1.0(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 1.0.4 + eventsource-parser: 3.0.0 + nanoid: 3.3.8 + secure-json-parse: 2.7.0 + optionalDependencies: + zod: 3.23.8 + + '@ai-sdk/provider-utils@2.1.10(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 1.0.9 + eventsource-parser: 3.0.0 + nanoid: 3.3.8 + secure-json-parse: 2.7.0 + optionalDependencies: + zod: 3.23.8 + + '@ai-sdk/provider-utils@2.2.8(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 1.1.3 + nanoid: 3.3.8 + secure-json-parse: 2.7.0 + zod: 3.23.8 + + '@ai-sdk/provider@1.0.4': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@1.0.9': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@1.1.3': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/react@1.0.9(react@18.3.1)(zod@3.23.8)': + dependencies: + '@ai-sdk/provider-utils': 2.0.7(zod@3.23.8) + '@ai-sdk/ui-utils': 1.0.8(zod@3.23.8) + swr: 2.3.0(react@18.3.1) + throttleit: 2.1.0 + optionalDependencies: + react: 18.3.1 + zod: 3.23.8 + + '@ai-sdk/ui-utils@1.0.8(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 1.0.4 + '@ai-sdk/provider-utils': 2.0.7(zod@3.23.8) + zod-to-json-schema: 3.24.1(zod@3.23.8) + optionalDependencies: + zod: 3.23.8 + + '@ai-sdk/xai@1.2.16(zod@3.23.8)': + dependencies: + '@ai-sdk/openai-compatible': 0.2.14(zod@3.23.8) + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.23.8) + zod: 3.23.8 + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@asamuzakjp/dom-selector@2.0.2': + dependencies: + bidi-js: 1.0.3 + css-tree: 2.3.1 + is-potential-custom-element-name: 1.0.1 + + '@auth/core@0.31.0': + dependencies: + '@panva/hkdf': 1.2.1 + '@types/cookie': 0.6.0 + cookie: 0.6.0 + jose: 5.9.6 + oauth4webapi: 2.17.0 + preact: 10.11.3 + preact-render-to-string: 5.2.3(preact@10.11.3) + + '@auth/core@0.34.2': + dependencies: + '@panva/hkdf': 1.2.1 + '@types/cookie': 0.6.0 + cookie: 0.6.0 + jose: 5.9.6 + oauth4webapi: 2.17.0 + preact: 10.11.3 + preact-render-to-string: 5.2.3(preact@10.11.3) + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.2': {} + + '@babel/core@7.24.5': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.24.5) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.24.5 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + convert-source-map: 2.0.0 + debug: 4.3.7 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.26.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + convert-source-map: 2.0.0 + debug: 4.3.7 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.2': + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 + + '@babel/helper-annotate-as-pure@7.25.9': + dependencies: + '@babel/types': 7.26.0 + + '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-compilation-targets@7.25.9': + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.25.9 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + regexpu-core: 6.1.1 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + debug: 4.3.7 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.25.9': + dependencies: + '@babel/types': 7.26.0 + + '@babel/helper-plugin-utils@7.25.9': {} + + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-wrap-function': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-simple-access@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helper-wrap-function@7.25.9': + dependencies: + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.26.0': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + + '@babel/parser@7.24.5': + dependencies: + '@babel/types': 7.26.0 + + '@babel/parser@7.26.2': + dependencies: + '@babel/types': 7.26.0 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.25.9 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/template': 7.25.9 + + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-exponentiation-operator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-simple-access': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + + '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-pure-annotations@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + regenerator-transform: 0.15.2 + + '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-typescript@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/preset-env@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0) + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-exponentiation-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.0) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.26.0) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.26.0) + core-js-compat: 3.39.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/types': 7.26.0 + esutils: 2.0.3 + + '@babel/preset-react@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-pure-annotations': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-typescript': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/register@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.6 + source-map-support: 0.5.21 + + '@babel/runtime@7.26.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + + '@babel/traverse@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + debug: 4.3.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@biomejs/biome@1.9.3': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.9.3 + '@biomejs/cli-darwin-x64': 1.9.3 + '@biomejs/cli-linux-arm64': 1.9.3 + '@biomejs/cli-linux-arm64-musl': 1.9.3 + '@biomejs/cli-linux-x64': 1.9.3 + '@biomejs/cli-linux-x64-musl': 1.9.3 + '@biomejs/cli-win32-arm64': 1.9.3 + '@biomejs/cli-win32-x64': 1.9.3 + + '@biomejs/cli-darwin-arm64@1.9.3': + optional: true + + '@biomejs/cli-darwin-x64@1.9.3': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.9.3': + optional: true + + '@biomejs/cli-linux-arm64@1.9.3': + optional: true + + '@biomejs/cli-linux-x64-musl@1.9.3': + optional: true + + '@biomejs/cli-linux-x64@1.9.3': + optional: true + + '@biomejs/cli-win32-arm64@1.9.3': + optional: true + + '@biomejs/cli-win32-x64@1.9.3': + optional: true + + '@codemirror/autocomplete@6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3)': + dependencies: + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/common': 1.2.3 + + '@codemirror/commands@6.7.1': + dependencies: + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/common': 1.2.3 + + '@codemirror/lang-css@6.3.0(@codemirror/view@6.34.2)': + dependencies: + '@codemirror/autocomplete': 6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@lezer/common': 1.2.3 + '@lezer/css': 1.1.9 + transitivePeerDependencies: + - '@codemirror/view' + + '@codemirror/lang-html@6.4.9': + dependencies: + '@codemirror/autocomplete': 6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/lang-css': 6.3.0(@codemirror/view@6.34.2) + '@codemirror/lang-javascript': 6.2.2 + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/common': 1.2.3 + '@lezer/css': 1.1.9 + '@lezer/html': 1.3.10 + + '@codemirror/lang-java@6.0.1': + dependencies: + '@codemirror/language': 6.10.3 + '@lezer/java': 1.1.3 + + '@codemirror/lang-javascript@6.2.2': + dependencies: + '@codemirror/autocomplete': 6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/language': 6.10.3 + '@codemirror/lint': 6.8.2 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/common': 1.2.3 + '@lezer/javascript': 1.4.19 + + '@codemirror/lang-json@6.0.1': + dependencies: + '@codemirror/language': 6.10.3 + '@lezer/json': 1.0.2 + + '@codemirror/lang-markdown@6.3.1': + dependencies: + '@codemirror/autocomplete': 6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/lang-html': 6.4.9 + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/common': 1.2.3 + '@lezer/markdown': 1.3.2 + + '@codemirror/lang-php@6.0.1': + dependencies: + '@codemirror/lang-html': 6.4.9 + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@lezer/common': 1.2.3 + '@lezer/php': 1.0.2 + + '@codemirror/lang-sql@6.8.0(@codemirror/view@6.34.2)': + dependencies: + '@codemirror/autocomplete': 6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + transitivePeerDependencies: + - '@codemirror/view' + + '@codemirror/language@6.10.3': + dependencies: + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + style-mod: 4.1.2 + + '@codemirror/legacy-modes@6.4.2': + dependencies: + '@codemirror/language': 6.10.3 + + '@codemirror/lint@6.8.2': + dependencies: + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + crelt: 1.0.6 + + '@codemirror/search@6.5.7': + dependencies: + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + crelt: 1.0.6 + + '@codemirror/state@6.4.1': {} + + '@codemirror/theme-one-dark@6.1.2': + dependencies: + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@lezer/highlight': 1.2.1 + + '@codemirror/view@6.34.2': + dependencies: + '@codemirror/state': 6.4.1 + style-mod: 4.1.2 + w3c-keyname: 2.2.8 + + '@date-fns/tz@1.2.0': {} + + '@dnd-kit/accessibility@3.1.0(react@18.3.1)': + dependencies: + react: 18.3.1 + tslib: 2.8.1 + + '@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@dnd-kit/accessibility': 3.1.0(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.8.1 + + '@dnd-kit/modifiers@6.0.1(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + dependencies: + '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + react: 18.3.1 + tslib: 2.8.1 + + '@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + dependencies: + '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + react: 18.3.1 + tslib: 2.8.1 + + '@dnd-kit/utilities@3.2.2(react@18.3.1)': + dependencies: + react: 18.3.1 + tslib: 2.8.1 + + '@emotion/babel-plugin@11.12.0': + dependencies: + '@babel/helper-module-imports': 7.25.9 + '@babel/runtime': 7.26.0 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.2 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.13.1': + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.1 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + + '@emotion/hash@0.9.2': {} + + '@emotion/is-prop-valid@0.8.8': + dependencies: + '@emotion/memoize': 0.7.4 + optional: true + + '@emotion/is-prop-valid@1.2.2': + dependencies: + '@emotion/memoize': 0.8.1 + + '@emotion/memoize@0.7.4': + optional: true + + '@emotion/memoize@0.8.1': {} + + '@emotion/memoize@0.9.0': {} + + '@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@emotion/babel-plugin': 11.12.0 + '@emotion/cache': 11.13.1 + '@emotion/serialize': 1.3.2 + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) + '@emotion/utils': 1.4.1 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + transitivePeerDependencies: + - supports-color + + '@emotion/serialize@1.3.2': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.1 + csstype: 3.1.3 + + '@emotion/sheet@1.4.0': {} + + '@emotion/unitless@0.10.0': {} + + '@emotion/unitless@0.8.1': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@emotion/utils@1.4.1': {} + + '@emotion/weak-memoize@0.4.0': {} + + '@esbuild/aix-ppc64@0.19.11': + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.23.1': + optional: true + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.19.11': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.23.1': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.19.11': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.23.1': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.19.11': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.23.1': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.19.11': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.23.1': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.19.11': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.23.1': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.19.11': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.23.1': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.19.11': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.23.1': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.19.11': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.23.1': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.19.11': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.23.1': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.19.11': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.23.1': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.19.11': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.23.1': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.19.11': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.23.1': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.19.11': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.23.1': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.19.11': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.23.1': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.19.11': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.23.1': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.19.11': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.23.1': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.19.11': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.19.11': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.23.1': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.19.11': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.23.1': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.19.11': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.23.1': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.19.11': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.23.1': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.19.11': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.23.1': + optional: true + + '@floating-ui/core@1.6.8': + dependencies: + '@floating-ui/utils': 0.2.8 + + '@floating-ui/dom@1.6.12': + dependencies: + '@floating-ui/core': 1.6.8 + '@floating-ui/utils': 0.2.8 + + '@floating-ui/react-dom@2.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.12 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.12 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/utils@0.2.8': {} + + '@hookform/resolvers@3.9.1(react-hook-form@7.53.1(react@18.3.1))': + dependencies: + react-hook-form: 7.53.1(react@18.3.1) + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@juggle/resize-observer@3.4.0': {} + + '@lezer/common@1.2.3': {} + + '@lezer/css@1.1.9': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/highlight@1.2.1': + dependencies: + '@lezer/common': 1.2.3 + + '@lezer/html@1.3.10': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/java@1.1.3': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/javascript@1.4.19': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/json@1.0.2': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@lezer/lr@1.4.2': + dependencies: + '@lezer/common': 1.2.3 + + '@lezer/markdown@1.3.2': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + + '@lezer/php@1.0.2': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@mdx-js/mdx@3.1.0(acorn@8.14.0)': + dependencies: + '@types/estree': 1.0.6 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.2 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.0(acorn@8.14.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.1 + source-map: 0.7.4 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - acorn + - supports-color + + '@mdx-js/react@3.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 18.3.12 + react: 18.3.1 + + '@microlink/mql@0.13.12': + dependencies: + flattie: 1.1.1 + got: 11.8.6 + whoops: 4.1.7 + + '@next/env@14.2.3': {} + + '@next/env@14.2.35': {} + + '@next/swc-darwin-arm64@14.2.3': + optional: true + + '@next/swc-darwin-arm64@14.2.33': + optional: true + + '@next/swc-darwin-x64@14.2.3': + optional: true + + '@next/swc-darwin-x64@14.2.33': + optional: true + + '@next/swc-linux-arm64-gnu@14.2.3': + optional: true + + '@next/swc-linux-arm64-gnu@14.2.33': + optional: true + + '@next/swc-linux-arm64-musl@14.2.3': + optional: true + + '@next/swc-linux-arm64-musl@14.2.33': + optional: true + + '@next/swc-linux-x64-gnu@14.2.3': + optional: true + + '@next/swc-linux-x64-gnu@14.2.33': + optional: true + + '@next/swc-linux-x64-musl@14.2.3': + optional: true + + '@next/swc-linux-x64-musl@14.2.33': + optional: true + + '@next/swc-win32-arm64-msvc@14.2.3': + optional: true + + '@next/swc-win32-arm64-msvc@14.2.33': + optional: true + + '@next/swc-win32-ia32-msvc@14.2.3': + optional: true + + '@next/swc-win32-ia32-msvc@14.2.33': + optional: true + + '@next/swc-win32-x64-msvc@14.2.3': + optional: true + + '@next/swc-win32-x64-msvc@14.2.33': + optional: true + + '@next/third-parties@15.0.3(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + dependencies: + next: 14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + third-party-capital: 1.0.20 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@one-ini/wasm@0.1.1': {} + + '@openpanel/nextjs@1.0.5(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@openpanel/web': 1.0.1 + next: 14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@openpanel/sdk@1.0.0': {} + + '@openpanel/web@1.0.1': + dependencies: + '@openpanel/sdk': 1.0.0 + + '@openrouter/ai-sdk-provider@0.4.6(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 1.0.9 + '@ai-sdk/provider-utils': 2.1.10(zod@3.23.8) + zod: 3.23.8 + + '@opentelemetry/api@1.8.0': {} + + '@opentelemetry/api@1.9.0': {} + + '@panva/hkdf@1.2.1': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@portabletext/editor@1.5.4(@sanity/block-tools@3.63.0(debug@4.3.7))(@sanity/schema@3.63.0(debug@4.3.7))(@sanity/types@3.63.0)(@sanity/util@3.63.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@portabletext/patches': 1.1.0 + '@sanity/block-tools': 3.63.0(debug@4.3.7) + '@sanity/schema': 3.63.0(debug@4.3.7) + '@sanity/types': 3.63.0(debug@4.3.7) + '@sanity/util': 3.63.0(debug@4.3.7) + '@xstate/react': 4.1.3(@types/react@18.3.12)(react@18.3.1)(xstate@5.18.2) + debug: 4.3.7 + is-hotkey-esm: 1.0.0 + lodash: 4.17.21 + lodash.startcase: 4.4.0 + react: 18.3.1 + react-compiler-runtime: 19.0.0-beta-9ee70a1-20241017(react@18.3.1) + rxjs: 7.8.1 + slate: 0.110.2 + slate-dom: 0.111.0(slate@0.110.2) + slate-react: 0.111.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate-dom@0.111.0(slate@0.110.2))(slate@0.110.2) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + use-effect-event: 1.0.2(react@18.3.1) + xstate: 5.18.2 + transitivePeerDependencies: + - '@types/react' + - react-dom + - supports-color + + '@portabletext/patches@1.1.0': + dependencies: + '@sanity/diff-match-patch': 3.1.1 + lodash: 4.17.21 + + '@portabletext/react@3.1.0(react@18.3.1)': + dependencies: + '@portabletext/toolkit': 2.0.16 + '@portabletext/types': 2.0.13 + react: 18.3.1 + + '@portabletext/toolkit@2.0.16': + dependencies: + '@portabletext/types': 2.0.13 + + '@portabletext/types@2.0.13': {} + + '@radix-ui/number@1.1.0': {} + + '@radix-ui/primitive@1.0.1': + dependencies: + '@babel/runtime': 7.26.0 + + '@radix-ui/primitive@1.1.0': {} + + '@radix-ui/react-accessible-icon@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-accordion@1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collapsible': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-alert-dialog@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dialog': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-aspect-ratio@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-avatar@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-checkbox@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-collapsible@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-context-menu@2.2.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-menu': 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-context@1.0.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-context@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-context@1.1.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-dialog@1.0.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.12)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-dialog@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-direction@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-dismissable-layer@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-dropdown-menu@2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-menu': 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-hover-card@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-icons@1.3.1(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@radix-ui/react-id@1.0.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-id@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-label@2.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-menu@2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-menubar@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-menu': 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-navigation-menu@1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-popover@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-portal@1.0.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-portal@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-presence@1.0.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-presence@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-progress@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-radio-group@1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-scroll-area@1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-select@2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.0(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-separator@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-slider@1.2.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-slot@1.0.2(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-slot@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-switch@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-tabs@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-toast@1.2.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-toggle-group@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-context': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toggle': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-toggle@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-tooltip@1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-size@1.1.0(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/rect@1.1.0': {} + + '@react-email/body@0.0.10(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/button@0.0.17(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/code-block@0.0.9(react@18.3.1)': + dependencies: + prismjs: 1.29.0 + react: 18.3.1 + + '@react-email/code-inline@0.0.4(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/column@0.0.12(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/components@0.0.25(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-email/body': 0.0.10(react@18.3.1) + '@react-email/button': 0.0.17(react@18.3.1) + '@react-email/code-block': 0.0.9(react@18.3.1) + '@react-email/code-inline': 0.0.4(react@18.3.1) + '@react-email/column': 0.0.12(react@18.3.1) + '@react-email/container': 0.0.14(react@18.3.1) + '@react-email/font': 0.0.8(react@18.3.1) + '@react-email/head': 0.0.11(react@18.3.1) + '@react-email/heading': 0.0.14(react@18.3.1) + '@react-email/hr': 0.0.10(react@18.3.1) + '@react-email/html': 0.0.10(react@18.3.1) + '@react-email/img': 0.0.10(react@18.3.1) + '@react-email/link': 0.0.10(react@18.3.1) + '@react-email/markdown': 0.0.12(react@18.3.1) + '@react-email/preview': 0.0.11(react@18.3.1) + '@react-email/render': 1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-email/row': 0.0.10(react@18.3.1) + '@react-email/section': 0.0.14(react@18.3.1) + '@react-email/tailwind': 0.1.0(react@18.3.1) + '@react-email/text': 0.0.10(react@18.3.1) + react: 18.3.1 + transitivePeerDependencies: + - react-dom + + '@react-email/container@0.0.14(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/font@0.0.8(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/head@0.0.11(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/heading@0.0.14(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/hr@0.0.10(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/html@0.0.10(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/img@0.0.10(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/link@0.0.10(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/markdown@0.0.12(react@18.3.1)': + dependencies: + md-to-react-email: 5.0.2(react@18.3.1) + react: 18.3.1 + + '@react-email/preview@0.0.11(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/render@0.0.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + html-to-text: 9.0.5 + js-beautify: 1.15.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-promise-suspense: 0.3.4 + + '@react-email/render@1.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + html-to-text: 9.0.5 + js-beautify: 1.15.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-promise-suspense: 0.3.4 + + '@react-email/row@0.0.10(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/section@0.0.14(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/tailwind@0.1.0(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/text@0.0.10(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@reduxjs/toolkit@1.9.7(react-redux@7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + dependencies: + immer: 9.0.21 + redux: 4.2.1 + redux-thunk: 2.4.2(redux@4.2.1) + reselect: 4.1.8 + optionalDependencies: + react: 18.3.1 + react-redux: 7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + '@rexxars/react-json-inspector@8.0.1(react@18.3.1)': + dependencies: + create-react-class: 15.7.0 + debounce: 1.0.0 + md5-o-matic: 0.1.1 + react: 18.3.1 + + '@rexxars/react-split-pane@0.1.93(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-lifecycles-compat: 3.0.4 + react-style-proptype: 3.2.2 + + '@sanity/asset-utils@2.1.0': {} + + '@sanity/bifur-client@0.4.1': + dependencies: + nanoid: 3.3.8 + rxjs: 7.8.1 + + '@sanity/block-content-to-hyperscript@2.0.10': + dependencies: + '@sanity/generate-help-url': 0.140.0 + '@sanity/image-url': 0.140.22 + hyperscript: 2.0.2 + object-assign: 4.1.1 + + '@sanity/block-content-to-markdown@0.0.5': + dependencies: + '@sanity/block-content-to-hyperscript': 2.0.10 + + '@sanity/block-tools@3.63.0(debug@4.3.7)': + dependencies: + '@sanity/types': 3.63.0(debug@4.3.7) + '@types/react': 18.3.12 + get-random-values-esm: 1.0.2 + lodash: 4.17.21 + transitivePeerDependencies: + - debug + + '@sanity/cli@3.63.0(react@18.3.1)': + dependencies: + '@babel/traverse': 7.25.9 + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/codegen': 3.63.0 + '@sanity/telemetry': 0.7.9(react@18.3.1) + '@sanity/util': 3.63.0(debug@4.3.7) + chalk: 4.1.2 + debug: 4.3.7 + decompress: 4.2.1 + esbuild: 0.21.5 + esbuild-register: 3.6.0(esbuild@0.21.5) + get-it: 8.6.5(debug@4.3.7) + groq-js: 1.14.0 + pkg-dir: 5.0.0 + prettier: 3.3.3 + semver: 7.6.3 + silver-fleece: 1.1.0 + validate-npm-package-name: 3.0.0 + transitivePeerDependencies: + - react + - supports-color + + '@sanity/client@6.22.3(debug@4.3.7)': + dependencies: + '@sanity/eventsource': 5.0.2 + get-it: 8.6.5(debug@4.3.7) + rxjs: 7.8.1 + transitivePeerDependencies: + - debug + + '@sanity/code-input@4.1.4(@babel/runtime@7.26.0)(@codemirror/lint@6.8.2)(@codemirror/theme-one-dark@6.1.2)(@lezer/common@1.2.3)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@codemirror/autocomplete': 6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/commands': 6.7.1 + '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-java': 6.0.1 + '@codemirror/lang-javascript': 6.2.2 + '@codemirror/lang-json': 6.0.1 + '@codemirror/lang-markdown': 6.3.1 + '@codemirror/lang-php': 6.0.1 + '@codemirror/lang-sql': 6.8.0(@codemirror/view@6.34.2) + '@codemirror/language': 6.10.3 + '@codemirror/legacy-modes': 6.4.2 + '@codemirror/search': 6.5.7 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@juggle/resize-observer': 3.4.0 + '@lezer/highlight': 1.2.1 + '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/ui': 1.9.3(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@uiw/codemirror-themes': 4.23.6(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2) + '@uiw/react-codemirror': 4.23.6(@babel/runtime@7.26.0)(@codemirror/autocomplete@6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3))(@codemirror/language@6.10.3)(@codemirror/lint@6.8.2)(@codemirror/search@6.5.7)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.34.2)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + sanity: 3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - '@babel/runtime' + - '@codemirror/lint' + - '@codemirror/theme-one-dark' + - '@lezer/common' + - codemirror + - react-is + + '@sanity/codegen@3.63.0': + dependencies: + '@babel/core': 7.26.0 + '@babel/generator': 7.26.2 + '@babel/preset-env': 7.26.0(@babel/core@7.26.0) + '@babel/preset-react': 7.25.9(@babel/core@7.26.0) + '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) + '@babel/register': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + debug: 4.3.7 + globby: 10.0.2 + groq: 3.63.0 + groq-js: 1.14.0 + json5: 2.2.3 + tsconfig-paths: 4.2.0 + zod: 3.23.8 + transitivePeerDependencies: + - supports-color + + '@sanity/color@2.2.5': {} + + '@sanity/color@3.0.6': {} + + '@sanity/comlink@1.1.1': + dependencies: + rxjs: 7.8.1 + uuid: 10.0.0 + xstate: 5.18.2 + + '@sanity/dashboard@4.1.0(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@sanity/icons': 3.4.0(react@18.3.1) + '@sanity/image-url': 1.1.0 + '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + lodash: 4.17.21 + react: 18.3.1 + rxjs: 7.8.1 + sanity: 3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - react-dom + - react-is + + '@sanity/diff-match-patch@3.1.1': {} + + '@sanity/diff@3.63.0': + dependencies: + '@sanity/diff-match-patch': 3.1.1 + + '@sanity/eventsource@5.0.2': + dependencies: + '@types/event-source-polyfill': 1.0.5 + '@types/eventsource': 1.1.15 + event-source-polyfill: 1.0.31 + eventsource: 2.0.2 + + '@sanity/export@3.41.0': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/util': 3.37.2(debug@4.3.7) + archiver: 7.0.1 + debug: 4.3.7 + get-it: 8.6.5(debug@4.3.7) + lodash: 4.17.21 + mississippi: 4.0.0 + p-queue: 2.4.2 + rimraf: 3.0.2 + split2: 4.2.0 + tar: 7.4.3 + yaml: 2.6.0 + transitivePeerDependencies: + - supports-color + + '@sanity/generate-help-url@0.140.0': {} + + '@sanity/generate-help-url@3.0.0': {} + + '@sanity/icons@1.3.10(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@sanity/icons@2.11.8(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@sanity/icons@3.4.0(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@sanity/image-url@0.140.22': {} + + '@sanity/image-url@1.1.0': {} + + '@sanity/import@3.37.8': + dependencies: + '@sanity/asset-utils': 2.1.0 + '@sanity/generate-help-url': 3.0.0 + '@sanity/mutator': 3.63.0 + '@sanity/uuid': 3.0.2 + debug: 4.3.7 + file-url: 2.0.2 + get-it: 8.6.5(debug@4.3.7) + get-uri: 2.0.4 + gunzip-maybe: 1.4.2 + is-tar: 1.0.0 + lodash: 4.17.21 + meow: 9.0.0 + mississippi: 4.0.0 + ora: 5.4.1 + p-map: 1.2.0 + peek-stream: 1.1.3 + pretty-ms: 7.0.1 + rimraf: 3.0.2 + split2: 4.2.0 + tar-fs: 2.1.1 + tinyglobby: 0.2.10 + transitivePeerDependencies: + - supports-color + + '@sanity/incompatible-plugin@1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@sanity/icons': 1.3.10(react@18.3.1) + react: 18.3.1 + react-copy-to-clipboard: 5.1.0(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) + + '@sanity/insert-menu@1.0.10(@sanity/types@3.63.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@sanity/icons': 3.4.0(react@18.3.1) + '@sanity/types': 3.63.0(debug@4.3.7) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + lodash.startcase: 4.4.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + transitivePeerDependencies: + - styled-components + + '@sanity/language-filter@4.0.2(@sanity/ui@2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@sanity/util@3.63.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@sanity/icons': 2.11.8(react@18.3.1) + '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/util': 3.63.0(debug@4.3.7) + lodash: 4.17.21 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + sanity: 3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + '@sanity/logos@2.1.13(@sanity/color@3.0.6)(react@18.3.1)': + dependencies: + '@sanity/color': 3.0.6 + react: 18.3.1 + + '@sanity/migrate@3.63.0': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/mutate': 0.10.1(debug@4.3.7) + '@sanity/types': 3.63.0(debug@4.3.7) + '@sanity/util': 3.63.0(debug@4.3.7) + arrify: 2.0.1 + debug: 4.3.7 + fast-fifo: 1.3.2 + groq-js: 1.14.0 + p-map: 7.0.2 + transitivePeerDependencies: + - supports-color + + '@sanity/mutate@0.10.1(debug@4.3.7)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/diff-match-patch': 3.1.1 + hotscript: 1.0.13 + lodash: 4.17.21 + mendoza: 3.0.7 + nanoid: 5.0.8 + rxjs: 7.8.1 + transitivePeerDependencies: + - debug + + '@sanity/mutate@0.10.1-canary.5(xstate@5.18.2)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/diff-match-patch': 3.1.1 + hotscript: 1.0.13 + mendoza: 3.0.7 + nanoid: 5.0.8 + rxjs: 7.8.1 + optionalDependencies: + xstate: 5.18.2 + transitivePeerDependencies: + - debug + + '@sanity/mutator@3.63.0': + dependencies: + '@sanity/diff-match-patch': 3.1.1 + '@sanity/types': 3.63.0(debug@4.3.7) + '@sanity/uuid': 3.0.2 + debug: 4.3.7 + lodash: 4.17.21 + transitivePeerDependencies: + - supports-color + + '@sanity/next-loader@1.1.0(@sanity/client@6.22.3)(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/comlink': 1.1.1 + next: 14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + use-effect-event: 1.0.2(react@18.3.1) + + '@sanity/presentation@1.17.8(@sanity/client@6.22.3)(@sanity/color@3.0.6)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/comlink': 1.1.1 + '@sanity/icons': 3.4.0(react@18.3.1) + '@sanity/logos': 2.1.13(@sanity/color@3.0.6)(react@18.3.1) + '@sanity/preview-url-secret': 2.0.0(@sanity/client@6.22.3) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/uuid': 3.0.2 + '@types/lodash.isequal': 4.5.8 + fast-deep-equal: 3.1.3 + framer-motion: 11.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + lodash.get: 4.4.2 + lodash.isequal: 4.5.0 + mendoza: 3.0.7 + mnemonist: 0.39.8 + path-to-regexp: 6.3.0 + rxjs: 7.8.1 + suspend-react: 0.1.3(react@18.3.1) + use-effect-event: 1.0.2(react@18.3.1) + transitivePeerDependencies: + - '@sanity/color' + - react + - react-dom + - react-is + - styled-components + + '@sanity/preview-kit-compat@1.5.14(@sanity/client@6.22.3)(react@18.3.1)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/comlink': 1.1.1 + react: 18.3.1 + + '@sanity/preview-kit@5.1.10(@sanity/client@6.22.3)(react@18.3.1)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/preview-kit-compat': 1.5.14(@sanity/client@6.22.3)(react@18.3.1) + mendoza: 3.0.7 + optionalDependencies: + react: 18.3.1 + + '@sanity/preview-url-secret@1.6.21(@sanity/client@6.22.3)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/uuid': 3.0.2 + + '@sanity/preview-url-secret@2.0.0(@sanity/client@6.22.3)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/uuid': 3.0.2 + + '@sanity/schema@3.63.0(debug@4.3.7)': + dependencies: + '@sanity/generate-help-url': 3.0.0 + '@sanity/types': 3.63.0(debug@4.3.7) + arrify: 1.0.1 + groq-js: 1.14.0 + humanize-list: 1.0.1 + leven: 3.1.0 + lodash: 4.17.21 + object-inspect: 1.13.2 + transitivePeerDependencies: + - debug + - supports-color + + '@sanity/telemetry@0.7.9(react@18.3.1)': + dependencies: + lodash: 4.17.21 + react: 18.3.1 + rxjs: 7.8.1 + typeid-js: 0.3.0 + + '@sanity/types@3.37.2(debug@4.3.7)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@types/react': 18.3.12 + transitivePeerDependencies: + - debug + + '@sanity/types@3.63.0(debug@4.3.7)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@types/react': 18.3.12 + transitivePeerDependencies: + - debug + + '@sanity/ui@1.9.3(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@floating-ui/react-dom': 2.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/color': 2.2.5 + '@sanity/icons': 2.11.8(react@18.3.1) + csstype: 3.1.3 + framer-motion: 10.18.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + react-refractor: 2.2.0(react@18.3.1) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + '@sanity/ui@2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/color': 3.0.6 + '@sanity/icons': 3.4.0(react@18.3.1) + csstype: 3.1.3 + framer-motion: 11.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-compiler-runtime: 19.0.0-beta-9ee70a1-20241017(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + react-refractor: 2.2.0(react@18.3.1) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + use-effect-event: 1.0.2(react@18.3.1) + + '@sanity/util@3.37.2(debug@4.3.7)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/types': 3.37.2(debug@4.3.7) + get-random-values-esm: 1.0.2 + moment: 2.30.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - debug + + '@sanity/util@3.63.0(debug@4.3.7)': + dependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/types': 3.63.0(debug@4.3.7) + get-random-values-esm: 1.0.2 + moment: 2.30.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - debug + + '@sanity/uuid@3.0.2': + dependencies: + '@types/uuid': 8.3.4 + uuid: 8.3.2 + + '@sanity/vision@3.63.0(@babel/runtime@7.26.0)(@codemirror/lint@6.8.2)(@codemirror/theme-one-dark@6.1.2)(@lezer/common@1.2.3)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + dependencies: + '@codemirror/autocomplete': 6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/commands': 6.7.1 + '@codemirror/lang-javascript': 6.2.2 + '@codemirror/language': 6.10.3 + '@codemirror/search': 6.5.7 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + '@juggle/resize-observer': 3.4.0 + '@lezer/highlight': 1.2.1 + '@rexxars/react-json-inspector': 8.0.1(react@18.3.1) + '@rexxars/react-split-pane': 0.1.93(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/color': 3.0.6 + '@sanity/icons': 3.4.0(react@18.3.1) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@uiw/react-codemirror': 4.23.6(@babel/runtime@7.26.0)(@codemirror/autocomplete@6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3))(@codemirror/language@6.10.3)(@codemirror/lint@6.8.2)(@codemirror/search@6.5.7)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.34.2)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + is-hotkey-esm: 1.0.0 + json-2-csv: 5.5.6 + json5: 2.2.3 + lodash: 4.17.21 + quick-lru: 5.1.1 + react: 18.3.1 + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - '@babel/runtime' + - '@codemirror/lint' + - '@codemirror/theme-one-dark' + - '@lezer/common' + - codemirror + - react-dom + - react-is + + '@sanity/visual-editing@2.4.2(@sanity/client@6.22.3)(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@sanity/comlink': 1.1.1 + '@sanity/mutate': 0.10.1-canary.5(xstate@5.18.2) + '@sanity/preview-url-secret': 2.0.0(@sanity/client@6.22.3) + '@vercel/stega': 0.1.2 + get-random-values-esm: 1.0.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.1 + scroll-into-view-if-needed: 3.1.0 + use-effect-event: 1.0.2(react@18.3.1) + valibot: 0.31.1 + xstate: 5.18.2 + optionalDependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + next: 14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - debug + + '@sanity/visual-editing@2.4.4(@sanity/client@6.22.3)(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@sanity/comlink': 1.1.1 + '@sanity/mutate': 0.10.1-canary.5(xstate@5.18.2) + '@sanity/preview-url-secret': 2.0.0(@sanity/client@6.22.3) + '@vercel/stega': 0.1.2 + get-random-values-esm: 1.0.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rxjs: 7.8.1 + scroll-into-view-if-needed: 3.1.0 + use-effect-event: 1.0.2(react@18.3.1) + valibot: 0.31.1 + xstate: 5.18.2 + optionalDependencies: + '@sanity/client': 6.22.3(debug@4.3.7) + next: 14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - debug + + '@selderee/plugin-htmlparser2@0.11.0': + dependencies: + domhandler: 5.0.3 + selderee: 0.11.0 + + '@sentry-internal/browser-utils@8.37.1': + dependencies: + '@sentry/core': 8.37.1 + '@sentry/types': 8.37.1 + '@sentry/utils': 8.37.1 + + '@sentry-internal/feedback@8.37.1': + dependencies: + '@sentry/core': 8.37.1 + '@sentry/types': 8.37.1 + '@sentry/utils': 8.37.1 + + '@sentry-internal/replay-canvas@8.37.1': + dependencies: + '@sentry-internal/replay': 8.37.1 + '@sentry/core': 8.37.1 + '@sentry/types': 8.37.1 + '@sentry/utils': 8.37.1 + + '@sentry-internal/replay@8.37.1': + dependencies: + '@sentry-internal/browser-utils': 8.37.1 + '@sentry/core': 8.37.1 + '@sentry/types': 8.37.1 + '@sentry/utils': 8.37.1 + + '@sentry/browser@8.37.1': + dependencies: + '@sentry-internal/browser-utils': 8.37.1 + '@sentry-internal/feedback': 8.37.1 + '@sentry-internal/replay': 8.37.1 + '@sentry-internal/replay-canvas': 8.37.1 + '@sentry/core': 8.37.1 + '@sentry/types': 8.37.1 + '@sentry/utils': 8.37.1 + + '@sentry/core@8.37.1': + dependencies: + '@sentry/types': 8.37.1 + '@sentry/utils': 8.37.1 + + '@sentry/react@8.37.1(react@18.3.1)': + dependencies: + '@sentry/browser': 8.37.1 + '@sentry/core': 8.37.1 + '@sentry/types': 8.37.1 + '@sentry/utils': 8.37.1 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + + '@sentry/types@8.37.1': {} + + '@sentry/utils@8.37.1': + dependencies: + '@sentry/types': 8.37.1 + + '@shikijs/core@1.22.2': + dependencies: + '@shikijs/engine-javascript': 1.22.2 + '@shikijs/engine-oniguruma': 1.22.2 + '@shikijs/types': 1.22.2 + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.3 + + '@shikijs/engine-javascript@1.22.2': + dependencies: + '@shikijs/types': 1.22.2 + '@shikijs/vscode-textmate': 9.3.0 + oniguruma-to-js: 0.4.3 + + '@shikijs/engine-oniguruma@1.22.2': + dependencies: + '@shikijs/types': 1.22.2 + '@shikijs/vscode-textmate': 9.3.0 + + '@shikijs/types@1.22.2': + dependencies: + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@9.3.0': {} + + '@sindresorhus/is@4.6.0': {} + + '@socket.io/component-emitter@3.1.2': {} + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.5': + dependencies: + '@swc/counter': 0.1.3 + tslib: 2.8.1 + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@tailwindcss/typography@0.5.15(tailwindcss@3.4.14)': + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.14 + + '@tanem/react-nprogress@5.0.52(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@tanstack/react-table@8.20.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tanstack/table-core': 8.20.5 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@tanstack/react-virtual@3.0.0-beta.54(react@18.3.1)': + dependencies: + '@tanstack/virtual-core': 3.0.0-beta.54 + react: 18.3.1 + + '@tanstack/table-core@8.20.5': {} + + '@tanstack/virtual-core@3.0.0-beta.54': {} + + '@types/acorn@4.0.6': + dependencies: + '@types/estree': 1.0.6 + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.26.0 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.26.0 + + '@types/bcryptjs@2.4.6': {} + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 22.9.0 + '@types/responselike': 1.0.3 + + '@types/codemirror@5.60.15': + dependencies: + '@types/tern': 0.23.9 + + '@types/cookie@0.4.1': {} + + '@types/cookie@0.6.0': {} + + '@types/cors@2.8.17': + dependencies: + '@types/node': 22.9.0 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/diff-match-patch@1.0.36': {} + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.6 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.6 + + '@types/estree@1.0.6': {} + + '@types/event-source-polyfill@1.0.5': {} + + '@types/eventsource@1.1.15': {} + + '@types/follow-redirects@1.14.4': + dependencies: + '@types/node': 22.9.0 + + '@types/glob@7.2.0': + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 22.9.0 + + '@types/hast@2.3.10': + dependencies: + '@types/unist': 2.0.11 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/hoist-non-react-statics@3.3.5': + dependencies: + '@types/react': 18.3.12 + hoist-non-react-statics: 3.3.2 + + '@types/http-cache-semantics@4.0.4': {} + + '@types/json-schema@7.0.15': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 22.9.0 + + '@types/lodash.isequal@4.5.8': + dependencies: + '@types/lodash': 4.17.13 + + '@types/lodash@4.17.13': {} + + '@types/marked@4.3.2': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdx@2.0.13': {} + + '@types/minimatch@5.1.2': {} + + '@types/minimist@1.2.5': {} + + '@types/ms@0.7.34': {} + + '@types/node@22.9.0': + dependencies: + undici-types: 6.19.8 + + '@types/normalize-package-data@2.4.4': {} + + '@types/parse-json@4.0.2': {} + + '@types/progress-stream@2.0.5': + dependencies: + '@types/node': 22.9.0 + + '@types/prop-types@15.7.13': {} + + '@types/react-copy-to-clipboard@5.0.7': + dependencies: + '@types/react': 18.3.12 + + '@types/react-dom@18.3.1': + dependencies: + '@types/react': 18.3.12 + + '@types/react-is@18.3.0': + dependencies: + '@types/react': 18.3.12 + + '@types/react-redux@7.1.34': + dependencies: + '@types/hoist-non-react-statics': 3.3.5 + '@types/react': 18.3.12 + hoist-non-react-statics: 3.3.2 + redux: 4.2.1 + + '@types/react-transition-group@4.4.11': + dependencies: + '@types/react': 18.3.12 + + '@types/react@18.3.12': + dependencies: + '@types/prop-types': 15.7.13 + csstype: 3.1.3 + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 22.9.0 + + '@types/shallow-equals@1.0.3': {} + + '@types/speakingurl@13.0.6': {} + + '@types/stylis@4.2.5': {} + + '@types/tar-stream@3.1.3': + dependencies: + '@types/node': 22.9.0 + + '@types/tern@0.23.9': + dependencies: + '@types/estree': 1.0.6 + + '@types/ungap__structured-clone@1.2.0': {} + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@types/use-sync-external-store@0.0.6': {} + + '@types/uuid@8.3.4': {} + + '@uiw/codemirror-extensions-basic-setup@4.23.6(@codemirror/autocomplete@6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3))(@codemirror/commands@6.7.1)(@codemirror/language@6.10.3)(@codemirror/lint@6.8.2)(@codemirror/search@6.5.7)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)': + dependencies: + '@codemirror/autocomplete': 6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/commands': 6.7.1 + '@codemirror/language': 6.10.3 + '@codemirror/lint': 6.8.2 + '@codemirror/search': 6.5.7 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + + '@uiw/codemirror-themes@4.23.6(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)': + dependencies: + '@codemirror/language': 6.10.3 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + + '@uiw/react-codemirror@4.23.6(@babel/runtime@7.26.0)(@codemirror/autocomplete@6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3))(@codemirror/language@6.10.3)(@codemirror/lint@6.8.2)(@codemirror/search@6.5.7)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.34.2)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@codemirror/commands': 6.7.1 + '@codemirror/state': 6.4.1 + '@codemirror/theme-one-dark': 6.1.2 + '@codemirror/view': 6.34.2 + '@uiw/codemirror-extensions-basic-setup': 4.23.6(@codemirror/autocomplete@6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3))(@codemirror/commands@6.7.1)(@codemirror/language@6.10.3)(@codemirror/lint@6.8.2)(@codemirror/search@6.5.7)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2) + codemirror: 6.0.1(@lezer/common@1.2.3) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@codemirror/autocomplete' + - '@codemirror/language' + - '@codemirror/lint' + - '@codemirror/search' + + '@ungap/structured-clone@1.2.0': {} + + '@vercel/stega@0.1.2': {} + + '@vitejs/plugin-react@4.3.3(vite@4.5.5(@types/node@22.9.0)(terser@5.36.0))': + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 4.5.5(@types/node@22.9.0)(terser@5.36.0) + transitivePeerDependencies: + - supports-color + + '@webassemblyjs/ast@1.12.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} + + '@webassemblyjs/helper-api-error@1.11.6': {} + + '@webassemblyjs/helper-buffer@1.12.1': {} + + '@webassemblyjs/helper-numbers@1.11.6': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} + + '@webassemblyjs/helper-wasm-section@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 + + '@webassemblyjs/ieee754@1.11.6': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.11.6': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.11.6': {} + + '@webassemblyjs/wasm-edit@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 + + '@webassemblyjs/wasm-gen@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wasm-opt@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + + '@webassemblyjs/wasm-parser@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wast-printer@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 + + '@xstate/react@4.1.3(@types/react@18.3.12)(react@18.3.1)(xstate@5.18.2)': + dependencies: + react: 18.3.1 + use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.12)(react@18.3.1) + use-sync-external-store: 1.2.2(react@18.3.1) + optionalDependencies: + xstate: 5.18.2 + transitivePeerDependencies: + - '@types/react' + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + abbrev@2.0.0: {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + agent-base@7.1.1: + dependencies: + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + ai@4.0.33(react@18.3.1)(zod@3.23.8): + dependencies: + '@ai-sdk/provider': 1.0.4 + '@ai-sdk/provider-utils': 2.0.7(zod@3.23.8) + '@ai-sdk/react': 1.0.9(react@18.3.1)(zod@3.23.8) + '@ai-sdk/ui-utils': 1.0.8(zod@3.23.8) + '@opentelemetry/api': 1.9.0 + jsondiffpatch: 0.6.0 + zod-to-json-schema: 3.24.1(zod@3.23.8) + optionalDependencies: + react: 18.3.1 + zod: 3.23.8 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + archiver-utils@5.0.2: + dependencies: + glob: 10.4.5 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.17.21 + normalize-path: 3.0.0 + readable-stream: 4.5.2 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.5.2 + readdir-glob: 1.1.3 + tar-stream: 3.1.7 + zip-stream: 6.0.1 + + arg@5.0.2: {} + + aria-hidden@1.2.4: + dependencies: + tslib: 2.8.1 + + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + + array-union@2.1.0: {} + + arraybuffer.prototype.slice@1.0.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + + arrify@1.0.1: {} + + arrify@2.0.1: {} + + astring@1.9.0: {} + + async-mutex@0.4.1: + dependencies: + tslib: 2.8.1 + + async@3.2.6: {} + + asynckit@0.4.0: {} + + attr-accept@2.2.4: {} + + autoprefixer@10.4.20(postcss@8.4.47): + dependencies: + browserslist: 4.24.2 + caniuse-lite: 1.0.30001677 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + b4a@1.6.7: {} + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.26.0 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + + babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.26.0): + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + core-js-compat: 3.39.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + bare-events@2.5.0: + optional: true + + base64-js@1.5.1: {} + + base64id@2.0.0: {} + + bcryptjs@2.4.3: {} + + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + + binary-extensions@2.3.0: {} + + bl@1.2.3: + dependencies: + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + boolbase@1.0.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browser-split@0.0.0: {} + + browserify-zlib@0.1.4: + dependencies: + pako: 0.2.9 + + browserslist@4.24.2: + dependencies: + caniuse-lite: 1.0.30001677 + electron-to-chromium: 1.5.52 + node-releases: 2.0.18 + update-browserslist-db: 1.1.1(browserslist@4.24.2) + + buffer-alloc-unsafe@1.1.0: {} + + buffer-alloc@1.2.0: + dependencies: + buffer-alloc-unsafe: 1.1.0 + buffer-fill: 1.0.0 + + buffer-crc32@0.2.13: {} + + buffer-crc32@1.0.0: {} + + buffer-fill@1.0.0: {} + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + builtins@1.0.3: {} + + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + + cacheable-lookup@5.0.4: {} + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + callsites@3.1.0: {} + + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.8.1 + + camelcase-css@2.0.1: {} + + camelcase-keys@6.2.2: + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + + camelcase@5.3.1: {} + + camelize@1.0.1: {} + + caniuse-lite@1.0.30001677: {} + + canvas-confetti@1.9.3: {} + + ccount@2.0.1: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.4.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@1.1.4: {} + + character-entities-legacy@3.0.0: {} + + character-entities@1.2.4: {} + + character-entities@2.0.2: {} + + character-reference-invalid@1.1.4: {} + + character-reference-invalid@2.0.1: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@1.1.4: {} + + chownr@3.0.0: {} + + chrome-trace-event@1.0.4: {} + + class-list@0.1.1: + dependencies: + indexof: 0.0.1 + + class-variance-authority@0.7.0: + dependencies: + clsx: 2.0.0 + + classnames@2.5.1: {} + + clean-css@5.3.3: + dependencies: + source-map: 0.6.1 + + clean-stack@3.0.1: + dependencies: + escape-string-regexp: 4.0.0 + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-spinners@2.9.2: {} + + client-only@0.0.1: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + clone@1.0.4: {} + + clsx@2.0.0: {} + + clsx@2.1.1: {} + + cmdk@1.0.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + codemirror-spell-checker@1.1.2: + dependencies: + typo-js: 1.2.4 + + codemirror@5.65.18: {} + + codemirror@6.0.1(@lezer/common@1.2.3): + dependencies: + '@codemirror/autocomplete': 6.18.2(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.2)(@lezer/common@1.2.3) + '@codemirror/commands': 6.7.1 + '@codemirror/language': 6.10.3 + '@codemirror/lint': 6.8.2 + '@codemirror/search': 6.5.7 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.34.2 + transitivePeerDependencies: + - '@lezer/common' + + collapse-white-space@2.1.0: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + color2k@2.0.3: {} + + colord@2.9.3: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@1.0.8: {} + + comma-separated-tokens@2.0.3: {} + + commander@10.0.1: {} + + commander@11.1.0: {} + + commander@2.20.3: {} + + commander@4.1.1: {} + + commondir@1.0.1: {} + + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.5.2 + + compute-scroll-into-view@3.1.0: {} + + concat-map@0.0.1: {} + + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + configstore@5.0.1: + dependencies: + dot-prop: 5.3.0 + graceful-fs: 4.2.11 + make-dir: 3.1.0 + unique-string: 2.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 4.0.0 + + connect-history-api-fallback@1.6.0: {} + + console-table-printer@2.12.1: + dependencies: + simple-wcswidth: 1.0.1 + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} + + cookie@0.4.2: {} + + cookie@0.6.0: {} + + copy-to-clipboard@3.3.3: + dependencies: + toggle-selection: 1.0.6 + + core-js-compat@3.39.0: + dependencies: + browserslist: 4.24.2 + + core-util-is@1.0.3: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.5.2 + + create-react-class@15.7.0: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + + crelt@1.0.6: {} + + cross-spawn@6.0.5: + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-random-string@2.0.0: {} + + css-color-keywords@1.0.0: {} + + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + + css-to-react-native@3.2.0: + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + + css-what@6.1.0: {} + + cssesc@3.0.0: {} + + cssstyle@4.1.0: + dependencies: + rrweb-cssom: 0.7.1 + + csstype@3.1.3: {} + + cyclist@1.0.2: {} + + data-uri-to-buffer@1.2.0: {} + + data-uri-to-buffer@4.0.1: {} + + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + + data-view-buffer@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-offset@1.0.0: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + dataloader@2.2.2: {} + + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.26.0 + + date-fns@3.6.0: {} + + date-fns@4.1.0: {} + + date-now@1.0.1: {} + + debounce@1.0.0: + dependencies: + date-now: 1.0.1 + + debounce@2.0.0: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + decamelize-keys@1.1.1: + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + + decamelize@1.2.0: {} + + decimal.js@10.4.3: {} + + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + decompress-response@7.0.0: + dependencies: + mimic-response: 3.1.0 + + decompress-tar@4.1.1: + dependencies: + file-type: 5.2.0 + is-stream: 1.1.0 + tar-stream: 1.6.2 + + decompress-tarbz2@4.1.1: + dependencies: + decompress-tar: 4.1.1 + file-type: 6.2.0 + is-stream: 1.1.0 + seek-bzip: 1.0.6 + unbzip2-stream: 1.4.3 + + decompress-targz@4.1.1: + dependencies: + decompress-tar: 4.1.1 + file-type: 5.2.0 + is-stream: 1.1.0 + + decompress-unzip@4.0.1: + dependencies: + file-type: 3.9.0 + get-stream: 2.3.1 + pify: 2.3.0 + yauzl: 2.10.0 + + decompress@4.2.1: + dependencies: + decompress-tar: 4.1.1 + decompress-tarbz2: 4.1.1 + decompress-targz: 4.1.1 + decompress-unzip: 4.0.1 + graceful-fs: 4.2.11 + make-dir: 1.3.0 + pify: 2.3.0 + strip-dirs: 2.1.0 + + deeks@3.1.0: {} + + deepmerge@4.3.1: {} + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-lazy-prop@2.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delayed-stream@1.0.0: {} + + dequal@2.0.3: {} + + detect-node-es@1.1.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + didyoumean@1.2.2: {} + + diff-match-patch@1.0.5: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + direction@1.0.4: {} + + dlv@1.1.3: {} + + doc-path@4.1.1: {} + + dom-helpers@5.2.1: + dependencies: + '@babel/runtime': 7.26.0 + csstype: 3.1.3 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + dom-walk@0.1.2: {} + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + + dotenv@16.4.7: {} + + duplexify@3.7.1: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.3 + + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + + eastasianwidth@0.2.0: {} + + easymde@2.18.0: + dependencies: + '@types/codemirror': 5.60.15 + '@types/marked': 4.3.2 + codemirror: 5.65.18 + codemirror-spell-checker: 1.1.2 + marked: 4.3.0 + + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.6.3 + + electron-to-chromium@1.5.52: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + engine.io-parser@5.2.3: {} + + engine.io@6.5.5: + dependencies: + '@types/cookie': 0.4.1 + '@types/cors': 2.8.17 + '@types/node': 22.9.0 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.4.2 + cors: 2.8.5 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + enhanced-resolve@5.17.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + entities@4.5.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.23.3: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.2 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.3 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-module-lexer@1.5.4: {} + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.14.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.2 + + esbuild-register@3.6.0(esbuild@0.21.5): + dependencies: + debug: 4.3.7 + esbuild: 0.21.5 + transitivePeerDependencies: + - supports-color + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + esbuild@0.19.11: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.11 + '@esbuild/android-arm': 0.19.11 + '@esbuild/android-arm64': 0.19.11 + '@esbuild/android-x64': 0.19.11 + '@esbuild/darwin-arm64': 0.19.11 + '@esbuild/darwin-x64': 0.19.11 + '@esbuild/freebsd-arm64': 0.19.11 + '@esbuild/freebsd-x64': 0.19.11 + '@esbuild/linux-arm': 0.19.11 + '@esbuild/linux-arm64': 0.19.11 + '@esbuild/linux-ia32': 0.19.11 + '@esbuild/linux-loong64': 0.19.11 + '@esbuild/linux-mips64el': 0.19.11 + '@esbuild/linux-ppc64': 0.19.11 + '@esbuild/linux-riscv64': 0.19.11 + '@esbuild/linux-s390x': 0.19.11 + '@esbuild/linux-x64': 0.19.11 + '@esbuild/netbsd-x64': 0.19.11 + '@esbuild/openbsd-x64': 0.19.11 + '@esbuild/sunos-x64': 0.19.11 + '@esbuild/win32-arm64': 0.19.11 + '@esbuild/win32-ia32': 0.19.11 + '@esbuild/win32-x64': 0.19.11 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + + escalade@3.2.0: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.6 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.4 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + + esutils@2.0.3: {} + + event-source-polyfill@1.0.31: {} + + event-target-shim@5.0.1: {} + + events@3.3.0: {} + + eventsource-parser@3.0.0: {} + + eventsource@2.0.2: {} + + execa@2.1.0: + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 3.1.0 + onetime: 5.1.2 + p-finally: 2.0.1 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + exif-component@1.0.1: {} + + extend@3.0.2: {} + + fast-deep-equal@2.0.1: {} + + fast-deep-equal@3.1.3: {} + + fast-fifo@1.3.2: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fdir@6.4.2(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + file-selector@0.4.0: + dependencies: + tslib: 2.8.1 + + file-selector@2.1.0: + dependencies: + tslib: 2.8.1 + + file-type@3.9.0: {} + + file-type@5.2.0: {} + + file-type@6.2.0: {} + + file-uri-to-path@1.0.0: {} + + file-url@2.0.2: {} + + filesize@9.0.11: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-cache-dir@2.1.0: + dependencies: + commondir: 1.0.1 + make-dir: 2.1.0 + pkg-dir: 3.0.0 + + find-root@1.1.0: {} + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flattie@1.1.1: {} + + flush-write-stream@2.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + + focus-lock@1.3.5: + dependencies: + tslib: 2.8.1 + + follow-redirects@1.15.9(debug@4.3.7): + optionalDependencies: + debug: 4.3.7 + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + form-data@4.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + fraction.js@4.3.7: {} + + framer-motion@10.18.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + tslib: 2.8.1 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + framer-motion@11.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + tslib: 2.8.1 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + from2@2.3.0: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + + fs-constants@1.0.0: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + ftp@0.3.10: + dependencies: + readable-stream: 1.1.14 + xregexp: 2.0.0 + + function-bind@1.1.2: {} + + function.prototype.name@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + + functions-have-names@1.2.3: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-it@8.6.5(debug@4.3.7): + dependencies: + '@types/follow-redirects': 1.14.4 + '@types/progress-stream': 2.0.5 + decompress-response: 7.0.0 + follow-redirects: 1.15.9(debug@4.3.7) + is-retry-allowed: 2.2.0 + progress-stream: 2.0.0 + tunnel-agent: 0.6.0 + transitivePeerDependencies: + - debug + + get-nonce@1.0.1: {} + + get-random-values-esm@1.0.2: + dependencies: + get-random-values: 1.2.2 + + get-random-values@1.2.2: + dependencies: + global: 4.4.0 + + get-stream@2.3.1: + dependencies: + object-assign: 4.1.1 + pinkie-promise: 2.0.1 + + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + + get-symbol-description@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + + get-tsconfig@4.8.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + get-uri@2.0.4: + dependencies: + data-uri-to-buffer: 1.2.0 + debug: 2.6.9 + extend: 3.0.2 + file-uri-to-path: 1.0.0 + ftp: 0.3.10 + readable-stream: 2.3.8 + transitivePeerDependencies: + - supports-color + + github-slugger@2.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + glob@10.3.4: + dependencies: + foreground-child: 3.3.0 + jackspeak: 2.3.6 + minimatch: 9.0.5 + minipass: 7.1.2 + path-scurry: 1.11.1 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@11.0.0: + dependencies: + foreground-child: 3.3.0 + jackspeak: 4.0.2 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global@4.4.0: + dependencies: + min-document: 2.19.0 + process: 0.11.10 + + globals@11.12.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.0.1 + + globby@10.0.2: + dependencies: + '@types/glob': 7.2.0 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + glob: 7.2.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + graceful-fs@4.2.11: {} + + groq-js@1.14.0: + dependencies: + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + groq@3.63.0: {} + + gunzip-maybe@1.4.2: + dependencies: + browserify-zlib: 0.1.4 + is-deflate: 1.0.0 + is-gzip: 1.0.0 + peek-stream: 1.1.3 + pumpify: 1.5.1 + through2: 2.0.5 + + hard-rejection@2.1.0: {} + + has-bigints@1.0.2: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.1 + parse5: 7.2.1 + vfile: 6.0.3 + vfile-message: 4.0.2 + + hast-util-from-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 8.0.0 + property-information: 6.5.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-heading-rank@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@2.2.5: {} + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-to-estree@3.1.0: + dependencies: + '@types/estree': 1.0.6 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.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.1 + mdast-util-mdx-jsx: 3.1.3 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.2: + dependencies: + '@types/estree': 1.0.6 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.1.3 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.8 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@6.0.0: + dependencies: + '@types/hast': 2.3.10 + comma-separated-tokens: 1.0.8 + hast-util-parse-selector: 2.2.5 + property-information: 5.6.0 + space-separated-tokens: 1.1.5 + + hastscript@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + + he@1.2.0: {} + + history@5.3.0: + dependencies: + '@babel/runtime': 7.26.0 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + hosted-git-info@2.8.9: {} + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + + hotscript@1.0.13: {} + + html-element@2.3.1: + dependencies: + class-list: 0.1.1 + + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + + html-loader@5.1.0(webpack@5.96.1(esbuild@0.21.5)): + dependencies: + html-minifier-terser: 7.2.0 + parse5: 7.2.1 + webpack: 5.96.1(esbuild@0.21.5) + + html-minifier-terser@7.2.0: + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 10.0.1 + entities: 4.5.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.36.0 + + html-parse-stringify@3.0.1: + dependencies: + void-elements: 3.1.0 + + html-to-text@9.0.5: + dependencies: + '@selderee/plugin-htmlparser2': 0.11.0 + deepmerge: 4.3.1 + dom-serializer: 2.0.0 + htmlparser2: 8.0.2 + selderee: 0.11.0 + + html-void-elements@3.0.0: {} + + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + + http-cache-semantics@4.1.1: {} + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.1 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@7.0.5: + dependencies: + agent-base: 7.1.1 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + humanize-list@1.0.1: {} + + hyperscript@2.0.2: + dependencies: + browser-split: 0.0.0 + class-list: 0.1.1 + html-element: 2.3.1 + + i18next@23.16.4: + dependencies: + '@babel/runtime': 7.26.0 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + immer@10.1.1: {} + + immer@9.0.21: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + indexof@0.0.1: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + inline-style-parser@0.1.1: {} + + inline-style-parser@0.2.4: {} + + internal-slot@1.0.7: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + is-alphabetical@1.0.4: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@1.0.4: + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-array-buffer@3.0.4: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-arrayish@0.2.1: {} + + is-bigint@1.0.4: + dependencies: + has-bigints: 1.0.2 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.1.2: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.15.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.1: + dependencies: + is-typed-array: 1.1.13 + + is-date-object@1.0.5: + dependencies: + has-tostringtag: 1.0.2 + + is-decimal@1.0.4: {} + + is-decimal@2.0.1: {} + + is-deflate@1.0.0: {} + + is-docker@2.2.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-gzip@1.0.0: {} + + is-hexadecimal@1.0.4: {} + + is-hexadecimal@2.0.1: {} + + is-hotkey-esm@1.0.0: {} + + is-hotkey@0.2.0: {} + + is-interactive@1.0.0: {} + + is-natural-number@4.0.1: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-obj@2.0.0: {} + + is-plain-obj@1.1.0: {} + + is-plain-obj@4.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-plain-object@5.0.0: {} + + is-potential-custom-element-name@1.0.1: {} + + is-regex@1.1.4: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-retry-allowed@2.2.0: {} + + is-shared-array-buffer@1.0.3: + dependencies: + call-bind: 1.0.7 + + is-stream@1.1.0: {} + + is-stream@2.0.1: {} + + is-string@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-symbol@1.0.4: + dependencies: + has-symbols: 1.0.3 + + is-tar@1.0.0: {} + + is-typed-array@1.1.13: + dependencies: + which-typed-array: 1.1.15 + + is-typedarray@1.0.0: {} + + is-unicode-supported@0.1.0: {} + + is-weakref@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isarray@0.0.1: {} + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + jackspeak@2.3.6: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@4.0.2: + dependencies: + '@isaacs/cliui': 8.0.2 + + jest-worker@27.5.1: + dependencies: + '@types/node': 22.9.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jiti@1.21.6: {} + + jose@5.9.6: {} + + js-beautify@1.15.1: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + + js-cookie@3.0.5: {} + + js-tokens@4.0.0: {} + + jsdom-global@3.0.2(jsdom@23.2.0): + dependencies: + jsdom: 23.2.0 + + jsdom@23.2.0: + dependencies: + '@asamuzakjp/dom-selector': 2.0.2 + cssstyle: 4.1.0 + data-urls: 5.0.0 + decimal.js: 10.4.3 + form-data: 4.0.1 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + is-potential-custom-element-name: 1.0.1 + parse5: 7.2.1 + rrweb-cssom: 0.6.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.4 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + ws: 8.18.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jsesc@3.0.2: {} + + json-2-csv@5.5.6: + dependencies: + deeks: 3.1.0 + doc-path: 4.1.1 + + json-buffer@3.0.1: {} + + json-lexer@1.2.0: {} + + json-parse-better-errors@1.0.2: {} + + json-parse-even-better-errors@2.3.1: {} + + json-reduce@3.0.0: {} + + json-schema-traverse@0.4.1: {} + + json-schema@0.4.0: {} + + json5@2.2.3: {} + + jsondiffpatch@0.6.0: + dependencies: + '@types/diff-match-patch': 1.0.36 + chalk: 5.4.1 + diff-match-patch: 1.0.5 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@6.0.3: {} + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + + leac@0.6.0: {} + + leven@3.1.0: {} + + lilconfig@2.1.0: {} + + lilconfig@3.1.2: {} + + lines-and-columns@1.2.4: {} + + load-json-file@4.0.0: + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + + loader-runner@4.3.0: {} + + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.castarray@4.4.0: {} + + lodash.debounce@4.0.8: {} + + lodash.get@4.4.2: {} + + lodash.isequal@4.5.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.merge@4.6.2: {} + + lodash.startcase@4.4.0: {} + + lodash@4.17.21: {} + + log-symbols@2.2.0: + dependencies: + chalk: 2.4.2 + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lowercase-keys@2.0.0: {} + + lru-cache@10.4.3: {} + + lru-cache@11.0.2: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + lucide-react@0.414.0(react@18.3.1): + dependencies: + react: 18.3.1 + + make-dir@1.3.0: + dependencies: + pify: 3.0.0 + + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + map-obj@1.0.1: {} + + map-obj@4.3.0: {} + + markdown-extensions@2.0.0: {} + + markdown-table@3.0.4: {} + + marked@4.3.0: {} + + marked@7.0.4: {} + + md-to-react-email@5.0.2(react@18.3.1): + dependencies: + marked: 7.0.4 + react: 18.3.1 + + md5-o-matic@0.1.1: {} + + mdast-util-find-and-replace@3.0.1: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + 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 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.1.0 + + mdast-util-gfm-footnote@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + 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.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.1.3: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.1 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.1.3 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.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.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdast-util-toc@7.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/ungap__structured-clone': 1.2.0 + '@ungap/structured-clone': 1.2.0 + github-slugger: 2.0.0 + mdast-util-to-string: 4.0.0 + unist-util-is: 6.0.0 + unist-util-visit: 5.0.0 + + mdn-data@2.0.30: {} + + memoize-one@6.0.0: {} + + memorystream@0.3.1: {} + + mendoza@3.0.7: {} + + meow@9.0.0: + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize: 1.2.0 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.1: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.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.1.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.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.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 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.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 + + micromark-extension-gfm-table@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-mdx-expression@3.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.2 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-mdx-jsx@3.0.1: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.6 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.2 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + micromark-extension-mdx-expression: 3.0.0 + micromark-extension-mdx-jsx: 3.0.1 + 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 + + micromark-factory-destination@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-label@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-mdx-expression@2.0.2: + dependencies: + '@types/estree': 1.0.6 + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-factory-space@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-types: 2.0.0 + + micromark-factory-title@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-whitespace@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-character@2.1.0: + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-chunked@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-classify-character@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-combine-extensions@2.0.0: + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-decode-numeric-character-reference@2.0.1: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-decode-string@2.0.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + + micromark-util-encode@2.0.0: {} + + micromark-util-events-to-acorn@2.0.2: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.6 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + + micromark-util-html-tag-name@2.0.0: {} + + micromark-util-normalize-identifier@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-resolve-all@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-util-sanitize-uri@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + + micromark-util-subtokenize@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-symbol@2.0.0: {} + + micromark-util-types@2.0.0: {} + + micromark@4.0.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.7 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + 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.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@2.1.0: {} + + mimic-fn@3.1.0: {} + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + min-document@2.19.0: + dependencies: + dom-walk: 0.1.2 + + min-indent@1.0.1: {} + + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist-options@4.1.0: + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + minizlib@3.0.1: + dependencies: + minipass: 7.1.2 + rimraf: 5.0.10 + + mississippi@4.0.0: + dependencies: + concat-stream: 2.0.0 + duplexify: 4.1.3 + end-of-stream: 1.4.4 + flush-write-stream: 2.0.0 + from2: 2.3.0 + parallel-transform: 1.2.0 + pump: 3.0.2 + pumpify: 1.5.1 + stream-each: 1.2.3 + through2: 3.0.2 + + mkdirp-classic@0.5.3: {} + + mkdirp@3.0.1: {} + + mnemonist@0.39.8: + dependencies: + obliterator: 2.0.4 + + module-alias@2.2.3: {} + + moment@2.30.1: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nano-pubsub@3.0.0: {} + + nanoid@3.3.7: {} + + nanoid@3.3.8: {} + + nanoid@5.0.8: {} + + negotiator@0.6.3: {} + + neo-async@2.6.2: {} + + next-auth@5.0.0-beta.18(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + dependencies: + '@auth/core': 0.31.0 + next: 14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + + next-mdx-remote-client@1.0.3(@types/react@18.3.12)(acorn@8.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/code-frame': 7.26.2 + '@mdx-js/mdx': 3.1.0(acorn@8.14.0) + '@mdx-js/react': 3.1.0(@types/react@18.3.12)(react@18.3.1) + '@types/mdx': 2.0.13 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + remark-mdx-remove-esm: 1.1.0 + serialize-error: 11.0.3 + vfile: 6.0.3 + vfile-matter: 5.0.0 + transitivePeerDependencies: + - '@types/react' + - acorn + - supports-color + + next-sanity@9.8.8(@sanity/client@6.22.3)(@sanity/icons@3.4.0(react@18.3.1))(@sanity/types@3.63.0)(@sanity/ui@2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + dependencies: + '@portabletext/react': 3.1.0(react@18.3.1) + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/icons': 3.4.0(react@18.3.1) + '@sanity/next-loader': 1.1.0(@sanity/client@6.22.3)(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@sanity/preview-kit': 5.1.10(@sanity/client@6.22.3)(react@18.3.1) + '@sanity/preview-url-secret': 2.0.0(@sanity/client@6.22.3) + '@sanity/types': 3.63.0(debug@4.3.7) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/visual-editing': 2.4.2(@sanity/client@6.22.3)(next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + groq: 3.63.0 + history: 5.3.0 + next: 14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + sanity: 3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - '@remix-run/react' + - '@sveltejs/kit' + - debug + - svelte + + next-themes@0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + next@14.2.3(@babel/core@7.24.5)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@next/env': 14.2.3 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001677 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.24.5)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.3 + '@next/swc-darwin-x64': 14.2.3 + '@next/swc-linux-arm64-gnu': 14.2.3 + '@next/swc-linux-arm64-musl': 14.2.3 + '@next/swc-linux-x64-gnu': 14.2.3 + '@next/swc-linux-x64-musl': 14.2.3 + '@next/swc-win32-arm64-msvc': 14.2.3 + '@next/swc-win32-ia32-msvc': 14.2.3 + '@next/swc-win32-x64-msvc': 14.2.3 + '@opentelemetry/api': 1.8.0 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + next@14.2.35(@babel/core@7.26.0)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@next/env': 14.2.35 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001677 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.26.0)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.33 + '@next/swc-darwin-x64': 14.2.33 + '@next/swc-linux-arm64-gnu': 14.2.33 + '@next/swc-linux-arm64-musl': 14.2.33 + '@next/swc-linux-x64-gnu': 14.2.33 + '@next/swc-linux-x64-musl': 14.2.33 + '@next/swc-win32-arm64-msvc': 14.2.33 + '@next/swc-win32-ia32-msvc': 14.2.33 + '@next/swc-win32-x64-msvc': 14.2.33 + '@opentelemetry/api': 1.8.0 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + nice-try@1.0.5: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-domexception@1.0.0: {} + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-html-parser@6.1.13: + dependencies: + css-select: 5.1.0 + he: 1.2.0 + + node-releases@2.0.18: {} + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-package-data@3.0.3: + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.15.1 + semver: 7.6.3 + validate-npm-package-license: 3.0.4 + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + normalize-url@6.1.0: {} + + npm-run-all@4.1.5: + dependencies: + ansi-styles: 3.2.1 + chalk: 2.4.2 + cross-spawn: 6.0.5 + memorystream: 0.3.1 + minimatch: 3.1.2 + pidtree: 0.3.1 + read-pkg: 3.0.0 + shell-quote: 1.8.1 + string.prototype.padend: 3.1.6 + + npm-run-path@3.1.0: + dependencies: + path-key: 3.1.1 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + oauth4webapi@2.17.0: {} + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + object-inspect@1.13.2: {} + + object-keys@1.1.1: {} + + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + obliterator@2.0.4: {} + + observable-callback@1.0.3(rxjs@7.8.1): + dependencies: + rxjs: 7.8.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + oneline@1.0.3: {} + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + oniguruma-to-js@0.4.3: + dependencies: + regex: 4.4.0 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + p-cancelable@2.1.1: {} + + p-finally@2.0.1: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@1.2.0: {} + + p-map@7.0.2: {} + + p-queue@2.4.2: {} + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + pako@0.2.9: {} + + parallel-transform@1.2.0: + dependencies: + cyclist: 1.0.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@2.0.0: + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + + parse-entities@4.0.1: + dependencies: + '@types/unist': 2.0.11 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-json@4.0.0: + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-ms@2.1.0: {} + + parse-numeric-range@1.3.0: {} + + parse5@7.2.1: + dependencies: + entities: 4.5.0 + + parseley@0.12.1: + dependencies: + leac: 0.6.0 + peberminta: 0.9.0 + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + path-exists@3.0.0: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@2.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-scurry@2.0.0: + dependencies: + lru-cache: 11.0.2 + minipass: 7.1.2 + + path-to-regexp@6.3.0: {} + + path-type@3.0.0: + dependencies: + pify: 3.0.0 + + path-type@4.0.0: {} + + peberminta@0.9.0: {} + + peek-stream@1.1.3: + dependencies: + buffer-from: 1.1.2 + duplexify: 3.7.1 + through2: 2.0.5 + + pend@1.2.0: {} + + performance-now@2.1.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pidtree@0.3.1: {} + + pify@2.3.0: {} + + pify@3.0.0: {} + + pify@4.0.1: {} + + pinkie-promise@2.0.1: + dependencies: + pinkie: 2.0.4 + + pinkie@2.0.4: {} + + pirates@4.0.6: {} + + pkg-dir@3.0.0: + dependencies: + find-up: 3.0.0 + + pkg-dir@5.0.0: + dependencies: + find-up: 5.0.0 + + pluralize-esm@9.0.5: {} + + pluralize@8.0.0: {} + + polished@4.3.1: + dependencies: + '@babel/runtime': 7.26.0 + + possible-typed-array-names@1.0.0: {} + + postcss-import@15.1.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + postcss-js@4.0.1(postcss@8.4.47): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.47 + + postcss-load-config@4.0.2(postcss@8.4.47): + dependencies: + lilconfig: 3.1.2 + yaml: 2.6.0 + optionalDependencies: + postcss: 8.4.47 + + postcss-nested@6.2.0(postcss@8.4.47): + dependencies: + postcss: 8.4.47 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.4.47: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + preact-render-to-string@5.2.3(preact@10.11.3): + dependencies: + preact: 10.11.3 + pretty-format: 3.8.0 + + preact@10.11.3: {} + + prettier@3.3.3: {} + + pretty-format@3.8.0: {} + + pretty-ms@7.0.1: + dependencies: + parse-ms: 2.1.0 + + prismjs@1.27.0: {} + + prismjs@1.29.0: {} + + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + + progress-stream@2.0.0: + dependencies: + speedometer: 1.0.0 + through2: 2.0.5 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + property-information@5.6.0: + dependencies: + xtend: 4.0.2 + + property-information@6.5.0: {} + + proto-list@1.2.4: {} + + psl@1.9.0: {} + + pump@2.0.1: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + pumpify@1.5.1: + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + + punycode@2.3.1: {} + + qs@6.13.0: + dependencies: + side-channel: 1.0.6 + + querystringify@2.2.0: {} + + queue-microtask@1.2.3: {} + + queue-tick@1.0.1: {} + + quick-lru@4.0.1: {} + + quick-lru@5.1.1: {} + + raf@3.4.1: + dependencies: + performance-now: 2.1.0 + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + react-clientside-effect@1.2.6(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + react: 18.3.1 + + react-compiler-runtime@19.0.0-beta-9ee70a1-20241017(react@18.3.1): + dependencies: + react: 18.3.1 + + react-copy-to-clipboard@5.1.0(react@18.3.1): + dependencies: + copy-to-clipboard: 3.3.3 + prop-types: 15.8.1 + react: 18.3.1 + + react-day-picker@9.3.0(react@18.3.1): + dependencies: + '@date-fns/tz': 1.2.0 + date-fns: 4.1.0 + react: 18.3.1 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-dropzone@11.7.1(react@18.3.1): + dependencies: + attr-accept: 2.2.4 + file-selector: 0.4.0 + prop-types: 15.8.1 + react: 18.3.1 + + react-dropzone@14.3.5(react@18.3.1): + dependencies: + attr-accept: 2.2.4 + file-selector: 2.1.0 + prop-types: 15.8.1 + react: 18.3.1 + + react-email@3.0.1(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/core': 7.24.5 + '@babel/parser': 7.24.5 + chalk: 4.1.2 + chokidar: 3.6.0 + commander: 11.1.0 + debounce: 2.0.0 + esbuild: 0.19.11 + glob: 10.3.4 + log-symbols: 4.1.0 + mime-types: 2.1.35 + next: 14.2.3(@babel/core@7.24.5)(@opentelemetry/api@1.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + normalize-path: 3.0.0 + ora: 5.4.1 + socket.io: 4.7.5 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@playwright/test' + - babel-plugin-macros + - bufferutil + - react + - react-dom + - sass + - supports-color + - utf-8-validate + + react-fast-compare@3.2.2: {} + + react-file-icon@1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + colord: 2.9.3 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-focus-lock@2.13.2(@types/react@18.3.12)(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + focus-lock: 1.3.5 + prop-types: 15.8.1 + react: 18.3.1 + react-clientside-effect: 1.2.6(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.3.12)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + react-hook-form@7.53.1(react@18.3.1): + dependencies: + react: 18.3.1 + + react-i18next@14.0.2(i18next@23.16.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + html-parse-stringify: 3.0.1 + i18next: 23.16.4 + react: 18.3.1 + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + + react-iframe@1.8.5(react@18.3.1): + dependencies: + object-assign: 4.1.1 + react: 18.3.1 + + react-infinite-scroll-component@6.1.0(react@18.3.1): + dependencies: + react: 18.3.1 + throttle-debounce: 2.3.0 + + react-is@16.13.1: {} + + react-is@17.0.2: {} + + react-is@18.3.1: {} + + react-lifecycles-compat@3.0.4: {} + + react-photo-album@2.3.1(react@18.3.1): + dependencies: + react: 18.3.1 + + react-promise-suspense@0.3.4: + dependencies: + fast-deep-equal: 2.0.1 + + react-redux@7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + '@types/react-redux': 7.1.34 + hoist-non-react-statics: 3.3.2 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.3.1 + react-is: 17.0.2 + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + + react-refractor@2.2.0(react@18.3.1): + dependencies: + react: 18.3.1 + refractor: 3.6.0 + unist-util-filter: 2.0.3 + unist-util-visit-parents: 3.1.1 + + react-refresh@0.14.2: {} + + react-remove-scroll-bar@2.3.6(@types/react@18.3.12)(react@18.3.1): + dependencies: + react: 18.3.1 + react-style-singleton: 2.2.1(@types/react@18.3.12)(react@18.3.1) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.12 + + react-remove-scroll@2.5.5(@types/react@18.3.12)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.12)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.12)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.2(@types/react@18.3.12)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + react-remove-scroll@2.6.0(@types/react@18.3.12)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.12)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.12)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.2(@types/react@18.3.12)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.12)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + + react-rx@4.1.3(react@18.3.1)(rxjs@7.8.1): + dependencies: + observable-callback: 1.0.3(rxjs@7.8.1) + react: 18.3.1 + react-compiler-runtime: 19.0.0-beta-9ee70a1-20241017(react@18.3.1) + rxjs: 7.8.1 + use-effect-event: 1.0.2(react@18.3.1) + + react-select@5.8.2(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + '@emotion/cache': 11.13.1 + '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) + '@floating-ui/dom': 1.6.12 + '@types/react-transition-group': 4.4.11 + memoize-one: 6.0.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.12)(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - supports-color + + react-simplemde-editor@5.2.0(easymde@2.18.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@types/codemirror': 5.60.15 + easymde: 2.18.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-style-proptype@3.2.2: + dependencies: + prop-types: 15.8.1 + + react-style-singleton@2.2.1(@types/react@18.3.12)(react@18.3.1): + dependencies: + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.12 + + react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.26.0 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-virtuoso@4.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + read-pkg@3.0.0: + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + + readable-stream@1.1.14: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.5.2: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.6 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.6 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.0(acorn@8.14.0): + dependencies: + acorn-jsx: 5.3.2(acorn@8.14.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - acorn + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.6 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.6 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + + redux-observable@2.0.0(redux@4.2.1): + dependencies: + redux: 4.2.1 + rxjs: 7.8.1 + tslib: 2.1.0 + + redux-thunk@2.4.2(redux@4.2.1): + dependencies: + redux: 4.2.1 + + redux@4.2.1: + dependencies: + '@babel/runtime': 7.26.0 + + refractor@3.6.0: + dependencies: + hastscript: 6.0.0 + parse-entities: 2.0.0 + prismjs: 1.27.0 + + regenerate-unicode-properties@10.2.0: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regenerator-runtime@0.14.1: {} + + regenerator-transform@0.15.2: + dependencies: + '@babel/runtime': 7.26.0 + + regex@4.4.0: {} + + regexp.prototype.flags@1.5.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + regexpu-core@6.1.1: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.11.2 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.0 + + regjsgen@0.8.0: {} + + regjsparser@0.11.2: + dependencies: + jsesc: 3.0.2 + + rehype-autolink-headings@7.1.0: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.2.0 + hast-util-heading-rank: 3.0.0 + hast-util-is-element: 3.0.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-pretty-code@0.13.2(shiki@1.22.2): + dependencies: + '@types/hast': 3.0.4 + hast-util-to-string: 3.0.1 + parse-numeric-range: 1.3.0 + rehype-parse: 9.0.1 + shiki: 1.22.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.6 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.0 + transitivePeerDependencies: + - supports-color + + rehype-slug@6.0.0: + dependencies: + '@types/hast': 3.0.4 + github-slugger: 2.0.0 + hast-util-heading-rank: 3.0.0 + hast-util-to-string: 3.0.1 + unist-util-visit: 5.0.0 + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.3 + unified: 11.0.5 + + rehype@13.0.2: + dependencies: + '@types/hast': 3.0.4 + rehype-parse: 9.0.1 + rehype-stringify: 10.0.1 + unified: 11.0.5 + + relateurl@0.2.7: {} + + remark-gfm@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + 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.5 + transitivePeerDependencies: + - supports-color + + remark-mdx-remove-esm@1.1.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-mdxjs-esm: 2.0.1 + unist-util-remove: 4.0.0 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.1.0: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + remark@15.0.1: + dependencies: + '@types/mdast': 4.0.4 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + requires-port@1.0.0: {} + + reselect@4.1.8: {} + + resend@3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@react-email/render': 0.0.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - react + - react-dom + + resolve-alpn@1.2.1: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve.exports@2.0.2: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + reusify@1.0.4: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rimraf@5.0.10: + dependencies: + glob: 10.4.5 + + rimraf@6.0.1: + dependencies: + glob: 11.0.0 + package-json-from-dist: 1.0.1 + + rollup@3.29.5: + optionalDependencies: + fsevents: 2.3.3 + + rrweb-cssom@0.6.0: {} + + rrweb-cssom@0.7.1: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs-exhaustmap-with-trailing@2.1.1(rxjs@7.8.1): + dependencies: + rxjs: 7.8.1 + + rxjs@7.8.1: + dependencies: + tslib: 2.8.1 + + safe-array-concat@1.1.2: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-regex-test@1.0.3: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + + safer-buffer@2.1.2: {} + + sanity-diff-patch@4.0.0: + dependencies: + '@sanity/diff-match-patch': 3.1.1 + + sanity-plugin-asset-source-unsplash@3.0.1(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + dependencies: + '@sanity/icons': 2.11.8(react@18.3.1) + '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + react: 18.3.1 + react-infinite-scroll-component: 6.1.0(react@18.3.1) + react-photo-album: 2.3.1(react@18.3.1) + rxjs: 7.8.1 + sanity: 3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - react-dom + - react-is + + sanity-plugin-iframe-pane@3.1.6(@sanity/client@6.22.3)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + dependencies: + '@sanity/icons': 2.11.8(react@18.3.1) + '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/preview-url-secret': 1.6.21(@sanity/client@6.22.3) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + framer-motion: 11.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + sanity: 3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + suspend-react: 0.1.3(react@18.3.1) + usehooks-ts: 3.0.1(react@18.3.1) + transitivePeerDependencies: + - '@sanity/client' + - react-dom + - react-is + + sanity-plugin-internationalized-array@2.1.0(@sanity/ui@2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@sanity/util@3.63.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + dependencies: + '@sanity/icons': 2.11.8(react@18.3.1) + '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/language-filter': 4.0.2(@sanity/ui@2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@sanity/util@3.63.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + fast-deep-equal: 3.1.3 + lodash: 4.17.21 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + sanity: 3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + suspend-react: 0.1.3(react@18.3.1) + transitivePeerDependencies: + - '@sanity/util' + + sanity-plugin-markdown@5.0.0(easymde@2.18.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + dependencies: + '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + easymde: 2.18.0 + react: 18.3.1 + react-simplemde-editor: 5.2.0(easymde@2.18.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + sanity: 3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - react-dom + - react-is + + sanity-plugin-media@2.3.2(@sanity/ui@2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0))(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + dependencies: + '@hookform/resolvers': 3.9.1(react-hook-form@7.53.1(react@18.3.1)) + '@reduxjs/toolkit': 1.9.7(react-redux@7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@sanity/incompatible-plugin': 1.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/uuid': 3.0.2 + '@tanem/react-nprogress': 5.0.52(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + copy-to-clipboard: 3.3.3 + date-fns: 2.30.0 + filesize: 9.0.11 + groq: 3.63.0 + is-hotkey: 0.2.0 + nanoid: 3.3.7 + npm-run-all: 4.1.5 + pluralize: 8.0.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-dropzone: 11.7.1(react@18.3.1) + react-file-icon: 1.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-hook-form: 7.53.1(react@18.3.1) + react-redux: 7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-select: 5.8.2(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-virtuoso: 4.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + redux: 4.2.1 + redux-observable: 2.0.0(redux@4.2.1) + rxjs: 7.8.1 + sanity: 3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0) + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + zod: 3.23.8 + transitivePeerDependencies: + - '@types/react' + - react-native + - supports-color + + sanity@3.63.0(@types/node@22.9.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.36.0): + dependencies: + '@dnd-kit/core': 6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dnd-kit/modifiers': 6.0.1(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + '@juggle/resize-observer': 3.4.0 + '@portabletext/editor': 1.5.4(@sanity/block-tools@3.63.0(debug@4.3.7))(@sanity/schema@3.63.0(debug@4.3.7))(@sanity/types@3.63.0)(@sanity/util@3.63.0)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@portabletext/react': 3.1.0(react@18.3.1) + '@rexxars/react-json-inspector': 8.0.1(react@18.3.1) + '@sanity/asset-utils': 2.1.0 + '@sanity/bifur-client': 0.4.1 + '@sanity/block-tools': 3.63.0(debug@4.3.7) + '@sanity/cli': 3.63.0(react@18.3.1) + '@sanity/client': 6.22.3(debug@4.3.7) + '@sanity/color': 3.0.6 + '@sanity/diff': 3.63.0 + '@sanity/diff-match-patch': 3.1.1 + '@sanity/eventsource': 5.0.2 + '@sanity/export': 3.41.0 + '@sanity/icons': 3.4.0(react@18.3.1) + '@sanity/image-url': 1.1.0 + '@sanity/import': 3.37.8 + '@sanity/insert-menu': 1.0.10(@sanity/types@3.63.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/logos': 2.1.13(@sanity/color@3.0.6)(react@18.3.1) + '@sanity/migrate': 3.63.0 + '@sanity/mutator': 3.63.0 + '@sanity/presentation': 1.17.8(@sanity/client@6.22.3)(@sanity/color@3.0.6)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/schema': 3.63.0(debug@4.3.7) + '@sanity/telemetry': 0.7.9(react@18.3.1) + '@sanity/types': 3.63.0(debug@4.3.7) + '@sanity/ui': 2.8.19(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@sanity/util': 3.63.0(debug@4.3.7) + '@sanity/uuid': 3.0.2 + '@sentry/react': 8.37.1(react@18.3.1) + '@tanstack/react-table': 8.20.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-virtual': 3.0.0-beta.54(react@18.3.1) + '@types/react-copy-to-clipboard': 5.0.7 + '@types/react-is': 18.3.0 + '@types/shallow-equals': 1.0.3 + '@types/speakingurl': 13.0.6 + '@types/tar-stream': 3.1.3 + '@types/use-sync-external-store': 0.0.6 + '@vitejs/plugin-react': 4.3.3(vite@4.5.5(@types/node@22.9.0)(terser@5.36.0)) + archiver: 7.0.1 + arrify: 1.0.1 + async-mutex: 0.4.1 + chalk: 4.1.2 + chokidar: 3.6.0 + classnames: 2.5.1 + color2k: 2.0.3 + configstore: 5.0.1 + connect-history-api-fallback: 1.6.0 + console-table-printer: 2.12.1 + dataloader: 2.2.2 + date-fns: 2.30.0 + debug: 4.3.7 + esbuild: 0.21.5 + esbuild-register: 3.6.0(esbuild@0.21.5) + execa: 2.1.0 + exif-component: 1.0.1 + form-data: 4.0.1 + framer-motion: 11.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + get-it: 8.6.5(debug@4.3.7) + get-random-values-esm: 1.0.2 + groq-js: 1.14.0 + history: 5.3.0 + i18next: 23.16.4 + import-fresh: 3.3.0 + is-hotkey-esm: 1.0.0 + jsdom: 23.2.0 + jsdom-global: 3.0.2(jsdom@23.2.0) + json-lexer: 1.2.0 + json-reduce: 3.0.0 + json5: 2.2.3 + lodash: 4.17.21 + log-symbols: 2.2.0 + mendoza: 3.0.7 + module-alias: 2.2.3 + nano-pubsub: 3.0.0 + nanoid: 3.3.7 + node-html-parser: 6.1.13 + observable-callback: 1.0.3(rxjs@7.8.1) + oneline: 1.0.3 + open: 8.4.2 + p-map: 7.0.2 + pirates: 4.0.6 + pluralize-esm: 9.0.5 + polished: 4.3.1 + pretty-ms: 7.0.1 + quick-lru: 5.1.1 + raf: 3.4.1 + react: 18.3.1 + react-copy-to-clipboard: 5.1.0(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) + react-fast-compare: 3.2.2 + react-focus-lock: 2.13.2(@types/react@18.3.12)(react@18.3.1) + react-i18next: 14.0.2(i18next@23.16.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-is: 18.3.1 + react-refractor: 2.2.0(react@18.3.1) + react-rx: 4.1.3(react@18.3.1)(rxjs@7.8.1) + read-pkg-up: 7.0.1 + refractor: 3.6.0 + resolve-from: 5.0.0 + resolve.exports: 2.0.2 + rimraf: 3.0.2 + rxjs: 7.8.1 + rxjs-exhaustmap-with-trailing: 2.1.1(rxjs@7.8.1) + sanity-diff-patch: 4.0.0 + scroll-into-view-if-needed: 3.1.0 + semver: 7.6.3 + shallow-equals: 1.0.0 + speakingurl: 14.0.1 + styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tar-fs: 2.1.1 + tar-stream: 3.1.7 + use-device-pixel-ratio: 1.1.2(react@18.3.1) + use-hot-module-reload: 2.0.0(react@18.3.1) + use-sync-external-store: 1.2.2(react@18.3.1) + vite: 4.5.5(@types/node@22.9.0)(terser@5.36.0) + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - '@types/react' + - bufferutil + - canvas + - less + - lightningcss + - react-native + - sass + - stylus + - sugarss + - supports-color + - terser + - utf-8-validate + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + scroll-into-view-if-needed@3.1.0: + dependencies: + compute-scroll-into-view: 3.1.0 + + secure-json-parse@2.7.0: {} + + seek-bzip@1.0.6: + dependencies: + commander: 2.20.3 + + selderee@0.11.0: + dependencies: + parseley: 0.12.1 + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.6.3: {} + + serialize-error@11.0.3: + dependencies: + type-fest: 2.19.0 + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + + shallow-equals@1.0.0: {} + + shallowequal@1.1.0: {} + + shebang-command@1.2.0: + dependencies: + shebang-regex: 1.0.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@1.0.0: {} + + shebang-regex@3.0.0: {} + + shell-quote@1.8.1: {} + + shiki@1.22.2: + dependencies: + '@shikijs/core': 1.22.2 + '@shikijs/engine-javascript': 1.22.2 + '@shikijs/engine-oniguruma': 1.22.2 + '@shikijs/types': 1.22.2 + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + silver-fleece@1.1.0: {} + + simple-wcswidth@1.0.1: {} + + slash@3.0.0: {} + + slate-dom@0.111.0(slate@0.110.2): + dependencies: + '@juggle/resize-observer': 3.4.0 + direction: 1.0.4 + is-hotkey: 0.2.0 + is-plain-object: 5.0.0 + lodash: 4.17.21 + scroll-into-view-if-needed: 3.1.0 + slate: 0.110.2 + tiny-invariant: 1.3.1 + + slate-react@0.111.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(slate-dom@0.111.0(slate@0.110.2))(slate@0.110.2): + dependencies: + '@juggle/resize-observer': 3.4.0 + direction: 1.0.4 + is-hotkey: 0.2.0 + is-plain-object: 5.0.0 + lodash: 4.17.21 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + scroll-into-view-if-needed: 3.1.0 + slate: 0.110.2 + slate-dom: 0.111.0(slate@0.110.2) + tiny-invariant: 1.3.1 + + slate@0.110.2: + dependencies: + immer: 10.1.1 + is-plain-object: 5.0.0 + tiny-warning: 1.0.3 + + socket.io-adapter@2.5.5: + dependencies: + debug: 4.3.7 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + socket.io@4.7.5: + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.7 + engine.io: 6.5.5 + socket.io-adapter: 2.5.5 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + sonner@1.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + space-separated-tokens@1.1.5: {} + + space-separated-tokens@2.0.2: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.20 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.20 + + spdx-license-ids@3.0.20: {} + + speakingurl@14.0.1: {} + + speedometer@1.0.0: {} + + split2@4.2.0: {} + + stream-each@1.2.3: + dependencies: + end-of-stream: 1.4.4 + stream-shift: 1.0.3 + + stream-shift@1.0.3: {} + + streamsearch@1.1.0: {} + + streamx@2.20.1: + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + text-decoder: 1.2.1 + optionalDependencies: + bare-events: 2.5.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string.prototype.padend@3.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + string.prototype.trim@1.2.9: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + string.prototype.trimend@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string_decoder@0.10.31: {} + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom@3.0.0: {} + + strip-dirs@2.1.0: + dependencies: + is-natural-number: 4.0.1 + + strip-final-newline@2.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + stripe@15.12.0: + dependencies: + '@types/node': 22.9.0 + qs: 6.13.0 + + style-mod@4.1.2: {} + + style-to-object@0.4.4: + dependencies: + inline-style-parser: 0.1.1 + + style-to-object@1.0.8: + dependencies: + inline-style-parser: 0.2.4 + + styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@emotion/is-prop-valid': 1.2.2 + '@emotion/unitless': 0.8.1 + '@types/stylis': 4.2.5 + css-to-react-native: 3.2.0 + csstype: 3.1.3 + postcss: 8.4.38 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + shallowequal: 1.1.0 + stylis: 4.3.2 + tslib: 2.6.2 + + styled-jsx@5.1.1(@babel/core@7.24.5)(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + optionalDependencies: + '@babel/core': 7.24.5 + + styled-jsx@5.1.1(@babel/core@7.26.0)(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + optionalDependencies: + '@babel/core': 7.26.0 + + stylis@4.2.0: {} + + stylis@4.3.2: {} + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + suspend-react@0.1.3(react@18.3.1): + dependencies: + react: 18.3.1 + + swr@2.3.0(react@18.3.1): + dependencies: + dequal: 2.0.3 + react: 18.3.1 + use-sync-external-store: 1.4.0(react@18.3.1) + + symbol-tree@3.2.4: {} + + tailwind-merge@2.5.4: {} + + tailwindcss-animate@1.0.7(tailwindcss@3.4.14): + dependencies: + tailwindcss: 3.4.14 + + tailwindcss@3.4.14: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.4.47 + postcss-import: 15.1.0(postcss@8.4.47) + postcss-js: 4.0.1(postcss@8.4.47) + postcss-load-config: 4.0.2(postcss@8.4.47) + postcss-nested: 6.2.0(postcss@8.4.47) + postcss-selector-parser: 6.1.2 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + tapable@2.2.1: {} + + tar-fs@2.1.1: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.2 + tar-stream: 2.2.0 + + tar-stream@1.6.2: + dependencies: + bl: 1.2.3 + buffer-alloc: 1.2.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + readable-stream: 2.3.8 + to-buffer: 1.1.1 + xtend: 4.0.2 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar-stream@3.1.7: + dependencies: + b4a: 1.6.7 + fast-fifo: 1.3.2 + streamx: 2.20.1 + + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.1 + mkdirp: 3.0.1 + yallist: 5.0.0 + + terser-webpack-plugin@5.3.10(esbuild@0.21.5)(webpack@5.96.1(esbuild@0.21.5)): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.36.0 + webpack: 5.96.1(esbuild@0.21.5) + optionalDependencies: + esbuild: 0.21.5 + + terser@5.36.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-decoder@1.2.1: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + third-party-capital@1.0.20: {} + + throttle-debounce@2.3.0: {} + + throttleit@2.1.0: {} + + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + through2@3.0.2: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + + through@2.3.8: {} + + tiny-invariant@1.3.1: {} + + tiny-warning@1.0.3: {} + + tinyglobby@0.2.10: + dependencies: + fdir: 6.4.2(picomatch@4.0.2) + picomatch: 4.0.2 + + to-buffer@1.1.1: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toggle-selection@1.0.6: {} + + tough-cookie@4.1.4: + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + + tr46@5.0.0: + dependencies: + punycode: 2.3.1 + + transliteration@2.3.5: + dependencies: + yargs: 17.7.2 + + trim-lines@3.0.1: {} + + trim-newlines@3.0.1: {} + + trough@2.2.0: {} + + ts-interface-checker@0.1.13: {} + + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@2.1.0: {} + + tslib@2.6.2: {} + + tslib@2.8.1: {} + + tsx@4.19.2: + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.8.1 + optionalDependencies: + fsevents: 2.3.3 + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + type-fest@0.18.1: {} + + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + + type-fest@2.19.0: {} + + typed-array-buffer@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + + typed-array-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-byte-offset@1.0.2: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-length@1.0.6: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + + typedarray@0.0.6: {} + + typeid-js@0.3.0: + dependencies: + uuidv7: 0.4.4 + + typescript@5.6.3: {} + + typo-js@1.2.4: {} + + unbox-primitive@1.0.2: + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + unbzip2-stream@1.4.3: + dependencies: + buffer: 5.7.1 + through: 2.3.8 + + undici-types@6.19.8: {} + + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.1.0 + + unicode-match-property-value-ecmascript@2.2.0: {} + + unicode-property-aliases-ecmascript@2.1.0: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unique-string@2.0.0: + dependencies: + crypto-random-string: 2.0.0 + + unist-util-filter@2.0.3: + dependencies: + unist-util-is: 4.1.0 + + unist-util-is@4.1.0: {} + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove@4.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@3.1.1: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 4.1.0 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + universalify@0.2.0: {} + + update-browserslist-db@1.1.1(browserslist@4.24.2): + dependencies: + browserslist: 4.24.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + + use-callback-ref@1.3.2(@types/react@18.3.12)(react@18.3.1): + dependencies: + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.12 + + use-debounce@10.0.4(react@18.3.1): + dependencies: + react: 18.3.1 + + use-device-pixel-ratio@1.1.2(react@18.3.1): + dependencies: + react: 18.3.1 + + use-effect-event@1.0.2(react@18.3.1): + dependencies: + react: 18.3.1 + + use-hot-module-reload@2.0.0(react@18.3.1): + dependencies: + react: 18.3.1 + + use-isomorphic-layout-effect@1.1.2(@types/react@18.3.12)(react@18.3.1): + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + use-sidecar@1.1.2(@types/react@18.3.12)(react@18.3.1): + dependencies: + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.12 + + use-sync-external-store@1.2.2(react@18.3.1): + dependencies: + react: 18.3.1 + + use-sync-external-store@1.4.0(react@18.3.1): + dependencies: + react: 18.3.1 + + usehooks-ts@3.0.1(react@18.3.1): + dependencies: + lodash.debounce: 4.0.8 + react: 18.3.1 + + util-deprecate@1.0.2: {} + + uuid@10.0.0: {} + + uuid@8.3.2: {} + + uuidv7@0.4.4: {} + + valibot@0.31.1: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + validate-npm-package-name@3.0.0: + dependencies: + builtins: 1.0.3 + + vary@1.1.2: {} + + vaul@0.9.9(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@radix-ui/react-dialog': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-matter@5.0.0: + dependencies: + vfile: 6.0.3 + yaml: 2.6.0 + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + + vite@4.5.5(@types/node@22.9.0)(terser@5.36.0): + dependencies: + esbuild: 0.18.20 + postcss: 8.4.47 + rollup: 3.29.5 + optionalDependencies: + '@types/node': 22.9.0 + fsevents: 2.3.3 + terser: 5.36.0 + + void-elements@3.1.0: {} + + w3c-keyname@2.2.8: {} + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + watchpack@2.4.2: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + web-namespaces@2.0.1: {} + + web-streams-polyfill@3.3.3: {} + + webidl-conversions@7.0.0: {} + + webpack-sources@3.2.3: {} + + webpack@5.96.1(esbuild@0.21.5): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.14.0 + browserslist: 4.24.2 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(esbuild@0.21.5)(webpack@5.96.1(esbuild@0.21.5)) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.0.0: + dependencies: + tr46: 5.0.0 + webidl-conversions: 7.0.0 + + which-boxed-primitive@1.0.2: + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + which-typed-array@1.1.15: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + whoops@4.1.7: + dependencies: + clean-stack: 3.0.1 + mimic-fn: 3.1.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@3.0.3: + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + + ws@8.17.1: {} + + ws@8.18.0: {} + + xdg-basedir@4.0.0: {} + + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + + xregexp@2.0.0: {} + + xstate@5.18.2: {} + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yallist@5.0.0: {} + + yaml@1.10.2: {} + + yaml@2.6.0: {} + + yargs-parser@20.2.9: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yocto-queue@0.1.0: {} + + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.5.2 + + zod-to-json-schema@3.24.1(zod@3.23.8): + dependencies: + zod: 3.23.8 + + zod@3.23.8: {} + + zwitch@2.0.4: {} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..12a703d --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..47f1ecf64131c4da3c3c71b599f975c531acc624 GIT binary patch literal 15248 zcmWk#Ra6|y7VR0_-GjRY2oM|wm*6fzgIt2U!{8nuXmEmCaCZsr4#C~s_3=KstG{aX zI#zq1vnyO#Q5p@I7#RQnG+7x5)%UgY{|_Sk`&)I{8sU8bIjKsE0e{9m8~^|XAS)rN z?rw0BfsjtBannEE%6ib2tbj;KiFtseFOx${!^IdN^I#RrM4=BCN5@1F0fmN%;!1cT zl7a)mf(-H`5NXottv$Qx(pGrhUdB#WmNPOu)K*8*?p)Viyl-n_GaUDpuLSO{tz=%K zRk043s8%HNLc>tWIZS#}u&AY?@Z(q|O)=lvJ#P-t&pO_G&z6>!)L(r9WIQ~YtgHUw zPc_&XGBPvA|NQy0bDB#*?X%4i&Cy(WJX^=Js%E(^?XzBHbZuA}W?VE?b>qPuJ=JA> zm^UNUm85BTSQ%EF3zcfJ(iP98=_fO)>cFrltT<9h)4Z@Kyf|a3sT{wz*UM--@7%xY zJk|>oc5OFF=K_YI#)MNj;s^(mxuG}H<$62^3st!{cDA{H{wRL`{@wKD@dkgZLZ_zh zQMPcSCg20`%|FbWfhsF}K!ED9Dy)^6D(&a%?>rEDoM|;f zW#})$4j9NFj>?Ib+`guxPI|-OiU1HL{)ly?u#)atNHms{iV0uE`tSkd9&atqXR3z*xr1&?1PD(0Ar}z%x#;boD zSM{r&Rz#m*aZIkX+dS)9-(H_o_4G&>MI$g!6hVSteIBo|U^V9d=%=;mKMRPU;&nhb z9_)awB@GP?9g#*~PSlA&UFWK>WfJd@Q#T1DXggXLx}d;bn2eFonoWdEoWoY1Y@s46 zd6V;j>ce)tQY!721PMmr;WTigecb80*W>+R5Og`vSIUoGf|9h#w5z(2Z_D*t=9Xx` z!ZSQXhb_}k9i!^R6amoq*PnD47;(!3QfI4eX2%OvbFL-u*xNPZ!trn@VHLR2e;7M; zJFf!~FzPpnRL}^?DOe0z7a}}cilp5m4Q$ze_)$?g)%dvK0-c?08WJ)ZVa^mP^~;W5 zh(23uqa1Y4g+B%otAA+92bjj{|Jhm{Jjk_$d%~BU{iOX;MoQUZd#)mW_?MCDQttEF zI6M%x{UW)2TfkuZ`O3bPpw1$c)U`6K9HU-#iXy=n?;$c0!&(xQLh531y+6t7`i)+d zvPp-;mpLQr$Q@oxL9(Z9pw)3l?%{e`iS^qeEkcAK_43hps7rDP9HbvU*EA&TD;?GT zYZWT}Rx&}`-Kv+Weunn7V3OVFUTAkC&Fx0mgoesfy0N;e87%HwG|iqg2V2zmORr0_ z+nFuV$n)5>eAG7x^!qj#Ot=wIkRrO?TgeVUF0+`ZwBW;c;q})+F!0)X3Qhf#va~Bogp4Q%UgFgPa zX9VKA)2XF@IGg%jU+oMh55K+MiGW}iQC$N#zV+40VXKc{$Gr?ILR5EfM0c?e0USE{ zg_i2-%hQLey_oaBO9~v7`D)hRj{w-G@}=v(QJ9lZ%Gf}swLchK1|s9ltBr5w^n3Nz zskhcKy;f@hl_aUX^lBOUm=%i?bxM`3!(vee99!MPcWw{HJGhLMm6ra4=fNW<=cc|r zoE+i-i46lRmQtn2nfHDx-CymO=qN#CkA;27oj*SHz5{vA-H0m|6yyt z?|vLSH<&7mxjUk|frBF9(4orbtGe-c_^@~y1#L!3i(FxijWwF=2Y6p=>e-kb1mAXD zi3)czzncPj7`Phq_>H`X%C6(3UTgbvsjRtbTkPvu>(vh};^!WPkE%*a;cS3>rr^W( zX|C|g`UR9;nEDQ4Pcn6n)LqSy9WzMcxFNf8*QTDuMEZPc6K5h>u<_ z`pNY?{gz=?mHQfA^i4rVDCUGgKmAs+d7l@oGBW`NMn*o@d40FGns_0CoP$AY$s+n= zM0wOND^_~yl+J{PJ3n|8a0iuYlc6$SKZg?dFa2AKYkxmoVmEq18_qkc3d&#(rRxRS z4O7A3YUs(N`K}l@1(SA&=u&S(+9AqUwkvSw94@`{>9WVd=YQ7U9<19gg%+rgj4G+u zvA?k!r(}|&GK-9F7|@6S19)98ALaGh(Zz9B)@(zoGKM@eK0oO>Y@9G=*f>C1Pxtc9P z2>YqZZaxN7hF?Bp0Z5LQlv5dfpxV?{ibVnvScPXWzY-Q1pdx$S9$Na~1icD3XjTp@0apB^(6oUr{nu>K#R}_vJoa;gkLI*vrt%@1 zm4+cI`_(8ltd@!29tJ>?!mTs?ARh(G=v0S5Ld`-snH>0FL^ z|65xeSK$1Oo?ByCLhE3{R=cQD1b1uR)_U`*fA5c=r>qZU03NptIpPG*s(X)}6W0uR zlri>h>c8Vf&_qqK+Ptx>&wm$fgDSusy}zsv=6)|sg7XJ>8}O3^`G4p|79ix@N-Np; z|9)&Qf-057r%MV?u-3Md^6q!Ps&*m)?%V8K@s~jHS$};xuY(D*V=VC*7UuLBrA=z+ zMB_ZMDs6T|3j`$6DSSUkK%FGJ$_$}vTXO*eV}{ta|0(NzAj4JG z$682D+(XI0l`Ym1#lxmVQGg4mrv#t^RwQPqM*^L2RF|brz!wU{ARB3GB!_0_z1P2+;Bkpi63h-O)pF^i)bk~#}fWk)=MKjsgo7+ zb~nuqo`dU~jy^qsO(!HpxPq2S455by7qCa0{8#Ampv00DzlITfaS(t>Q+;w5Y2@u1 z;BmF_XD_q>lgV4`NIkRlz?ks=fQu7@GlfGJb0;>vkkpJH!O^%6VtPd zpik_DR1d+tW*Yh*yVK}RHbaOmuH)D>=tOpMfJ!?2$22_*(7WQK(Dv-~;^T24+$un$ zr;@ST_sq_K3VEQnRh)eoIe?k*FcKsUFpnw^MYSHEFzl&U61fQ!HChRUEYu}hs zL&)`s7y}rH&rJLqhl-6gB`Ummt7t72F>KX1=9U>n`x-huWR>#pLr1@J82_1a8;ehoRs>?QI zPS*7_cGU}aUT#A%((tQuG#X|BjF1eUy_~*8s+hcJll|&{wk>?F!QX!1=6R(bVn+zH z5`W8yph}^_#&iP!bdm*u8EcelI(72zh8a{XGQQR1Tj=V>UfJe=M2l~vR#>p2CnjMJ zwdolK>=g*SOK6sCyBfGHt>ElPoE-sfMGWq_0@huk{PV&yhVOE(YARg=x#p+lZ3w{L z512kT-+x4UA_BjQ2%z{}dg~2p(R@q<21P8(nTjm8h5)1@GKqd-=O>BN^T!mjT?E)i z$XmgY&L06K9QPjds!}n+-iHY^4B4pWkkQRussb(*Zmx+fDuXY>x)e7a^=UJEM8ZqC zUTs4sXORFf>SiLaO?5o7*&MTuyV7?&MQ$kg&+3m5d!vj>@bMv`d~k21_&Bj?n!0> zgfhgQBMZ`Dt(P)I`GREbA%C`z0783UgD&n?>fu!nAa^i)GeT9 zuLM%?A|s|$8QfZCBu$qq9Dr(gZR6AV)fpdgdR2&F%d~m5_)GyGj$B1?^g>6*PlGa4 z*U~K!J_CqSN`>PSZi4l00Rw!m`<0Ia$r1FkcT!qz6S*+gZAe2-ar!X|*<&7%w(U2K zrlLQ4rPmHFQA|-kGL_aj2oCU04B&?LQngxDZ`*lT2wQNZC{W?Hvhla$6|y<;M#dDO zy1jN(tG6F~AqoMMBBm+3OGoAiqAg1xUf0AZd7pK&aLyCTu#~^TqU8YUvF1qf6|Oze zrJamC4QxWiaPK&XG zVYUvzv+q$a>_$`bwP2u`F48}X0LhdMl^zRe1+9$>@})ViW7<=M(#I<&RBer<{Vm;T zEDi=E@0Wcg$j7$*!TgtySG}D+X{z5lKyJuun*P;lzzN~rTt#7PowyTd%Um>gwIvKO zHYqb|`!+ZY4-3=BELT`>Ov4~T$ju_rPW<1j+#=2?`Fj~D8PO!yAq*p0nK5ayeN@V}6`{YHm>QyW-GRP?b^ z_8DlM*#eqifdKf7w-~?YT(k2KQpD`5agjB!tuRVXNqR_MiEsM z5^>m@dHNOa8?6>;^Qu^jXIM-8zQf^ojPEsd)8k<&Cta|I53_s>n#09kf_~ld9qt&h zrxp&&sk{Lve{ED}t4nPYc~fLbE3Y*Yjb;B1ec7>hQZ4eJp`}ktpzj>VRyTc;`%9n& zu^xqs4c!md9uA7ExnGxcjC-HUF>|ivb@G95FsR|8j-K>fdAm|NP@|qoAAUv@r3t?C zokP=!JPaxc*06B0GOqbQI(5MjNa%3v#6%+Bm*4|X*~u+gsqQr6GoRe%Ov*YVY)7k! z(vuY!XV2_!YApV82^h_cR|VryL;5OC-5CQ-H4_xc03V3K$CxKpKXJE*g94LSbkB8Pl{fL%VFWl$%cW7i9w>bz&;|L^Iy!Mp#${>~zV1 z5g7uxcjZ^7QSKiZRL`HVnfBfxJDZZwUq;B^jbw1&{$#GgOoH`|)F%A>f-JW^QwjhZ zbbhsQ?Y8u$;#aa)0|Tp0v5P3t7NZgevV5@dou_nOC;CueR?st0D<9InpkHE(^ z%obC7a1^D^WG0oL)pKvkJvBU8Ji^+yGzN+66|@X4Y9ZAqppsmj+3G_Bz){EACv6e{W>wUBakv}_*d!tX86~E&yFx-X$wI1f3N_uX7&rk7Z>@20xAfV8o89*dhdlrADB))B_w#|Cl1fE}jB;pWg$=uZl)U z5k%9WcSZt{Mg<#VTJ$U~S85oyN}jnB2mrCrnGGtC%R#a_{pSW+a8aYwWJ3)II3(>V zdWRx2jtI;*Qf*q3kYW*22W*-V1W{$eB#8 z(Fz?!K1CE70N6HezeXgZ)&lrxQpzydHg?xRRm**Um!aroaxh)BQm1Z z>@^2|vP<9t*!`uUod_R)gXmK3D1+!W$7uzg!Mk>X=Y=47K>6c{w+Op{BAqk|g&tr$ z;JGo_?bPQ!~lgc&Ur@>mwY18f?B>ZV{ zNCzVfJ1KTZ=OlHEpvl4BFLc*+AHwQhZ~(e%4Rb}S>S@y+*_Y}I7=~6zD75ivOh9jz z<;h261aBsGSK0bI)-pO`Z3l@|u;^l48~jD$w-}*0UCv_>5wrStennFe2-iJ^(l&sne6g+$X>>8HUP9-q0p zM8O)~BrTNd=$zSB6G;IGq|UK$>Rw8!4R=@Gu#+Nh4@&cl)q$iAy;z#TB%ZDXb9=X; z6oNm5AOG`szUc3X?VJ}nhDf~44ln}B{>RebChh`BlMnWtpd@KHOY9qpP5y6vsJ}QZ z6iaLDRHVoFk64;+m#kp+_Pz4O8hxbo0N{23!}lEKVR77d*Gp^iz~7$#y>5Ne@IM}% zbVLT6*__#ZctL=227(o24U*xqa-RE|(yc7GeRNq#Djs77D zRo?ZznKTQ78r4XVD+GqP)HlA|{?lt}4xB*O!)$)4;s_Ab>iEn7WNR9A9>T!)e#u2u z%^N5#%=~^3nz66(|CI+%Hg?HT!ZwlY92hJUF?7v>b_zfg5s(}>>%V7YaxA)k!DnJq) zFnr!5&^!^V51hd~q}UWB<;3D)IK*foDB^AwNta>$BSV8A(R)6s4wuO4-*#$2QYcMd z*EK?ffm<&Vt0Dt*uG3h}R^);#F#z7SDOGY*apiD!?;iMb=cVp@^`5^TGQ5g}t#P9d zI!!Xc(9R<4{d;8Kd3V4IJ)np8^}Ri4n<0?6O`-b5hSdQKFS+aYIGqJnC{_j_bTn&n zWAQIxnhhBBFo5w*+S+r0Mvw?*S8b$27$(P$npT{y`lr(to|cAhTK?{oT`c@k`%_u= z{C((_V853m!=0ksAD5(yH{wRCaGWLH6!=7U>4~8K&KJi5^`TAdu1l8mrRH6By}!IJ zNr5ti5Fze<#7yQtjoofas(}4FF4Pl%4i!t=jLr}Yjq4U$DVP6;B_2gLmP68A1p^TQ zt0Mq?bU_k#^pcb^y%W*A&>M7h-YS<^#vCZ6$r3Tx~E)_XJ1fRHl zmV75)X<-;ZYDaH|2&vaB00456=UCa9kOFB?uuH?gQ&<=E^x=m&RsQ*pMzh2-oe6W~ zZ={i6#>2xIhVXsoRGnSZ4*r+3G1ql5YWrYC0lU@KC`-hJ5BvW2Z%F_CP1pLpUS;Va zC|3TBPcd^_Gf%Z@2LrqGa1f6L?Lc-wxfpW-UNjI5bJqQ4R*O~1XgM^n<`vPvdP*Av zK@Kc|od!Wnh*g7HQ6D!$NBvZSq)pO2c7I*=;waV1Sq;?k?swG+iy|LVbdH98M21W{ z1k(K7p$3e6XG7pTi7LOlm6KO`U$mi%Ad)@l5->Jf>fv0fetIme4<5>jUcfaxvVM zrBGX|Y>U8VBsSO&^#le&sw)m+=LU0x1$%AVMp)NVbzp1Au0InASGfSgxV?~*D7yqQ zprID&Q2cZ?8(Izb`?1q#|F_@Mzctghmpcqjzaz4xFihTXF^iykiJZj%N_3}Qiruv1 zy*#`KG@$Ze!1yd^)U(nFjJn+F8$a(1D03>LHn)$li@1W2LJ;|)6x_QEa1?-q`?A%Di?88E{2!c2lD9;-ZM(b40B;_XB zPUiINqN9WfTN-bUEszjAMB9&nG7ulXr*1g5M1r|$sQ)>V8V0mVuB7o46yUZmufUEo z8|tr)V0w#cwA(iZIZf2cQN~;fZJOgJ2WWoA_SFZOp0~jH`(B%em7&kqCC<>N9EZ%k;me^` zQY7KOFmCk{)-GU5#Y*!X88Ev4-w zJ)JW8E{fvs#fbSH#_=S$oNe>F&PZOeU`UJBfA&yKWO0N(*d3?nzpEPSZ;wN5$AQ_Pmz!{lx84jT7p& z4v(TID&dPBwAbc<`n5?tEbbTK|F;IanpPdk7dTcNlOA`gydHYgOBniW6^uk_P=gX(Q?ehQST*sV5ZqA!=1o_1PfJFHJS^(iG znacU$nY9C)2sVBe08w+p34IB1=U&?I5;l%?-9Vlh-V4s2cjR%Z{+aQjY#o}2Z?Ba za$!+1MY+(xx{;WdDWOtq1Q~*dChj~P7@)yDATV}=KAm+KD)Mf?DvgV4gR5Ya3p)h@ ze&lIne+2;`cxXTpn@QG!-fFD?u>Kq7!Z_Lptg*l60H<6D3WF({8la#UkOtPDq}LZt z>a1O%1cu&|hg(F~>rREF(ChGQ2y!*uuRjW=2%S4}V+}$gy=T%YVWI~g^t@91(T7?< z6yH;XnxliLnq@-+{%^(w8$g}nYqZKgz5e^QJ3@J4S|4A@CW56@C1f;nuy*-WDOp6sUq15xdv>0GO)5lgh$$p2BVZv)7S6fkTD? z_7y0jh34{*^8%*$BaU!D01iDs@d=JYzJ-^Za_mi&VHzQTm=izt!94qM z;z!JwjqSs>jCUU8ZHS4f{?yS~9Sjs89L)@n`s-mn1+2G#pw$&KJVs87Lad7mfH43G zXMy|l2sJoXG$_V3zV96u3I{>q8%;4oh#IdLcD9^x=(UQNz|uP^mZP@=MI^xeo#ET# zyk^W0`@7B9EeI9xx{J=};LjhADjM$dzJehdg(~FP80yB>(4rd8mp}R@Kqs{Mto`YE ztY+3loqTdqbR5B?O2thEej1IHepmXi^uNzc0aI^CQyb=JB)RXUsPh>L&G8f9CARtz(pg@D@hFoZ64pB+fJlh2i_5jMkwsZiM2PRrhgf(-GUIpH6=(m6O~NZ zo=@F6YJPVt$EZ_@z#T|__g|B1d@u0Vq7>PV3oT9%nB@T)>|GNCBOa-N#oSkRp+2@2 zho96OK&R;p+_XN0wFF`Jq|#4c;gTs?w>QdzIM@A@Ur{VHI2k+aB`Sje+G2LCOkNId zf63#C0qEN#tN-U{Q5rqu( zgMnni=!EXP4+|?P>F`Q16g0w7p>C9Fe+eNu=fU_4$p)U5k=X<#7zRw2`r5tO0Q5nn zFd%)E?ER#|LLK0#q~3p5&`b_5`oECHZnz{Mc23 zL;%mGk8B?&W_|4##okIaGrW0{V+H;>UVH^ZnlriOVW16E*2I-=-!*16zN@$52D~eV zdSYPSKe^*bL+|(`Cpp|zd@h3@%6Vl~9e|7`K4*U^E#t^-PLO1snW_Kt@u&TB8tW<) z_VU5(3iu!~5u7!byAv6hkEbIpijsVy!Cz2E`*veW}xK#!-OmkoEC?>YN{EgS)xitHai5IslF~9< z``fk0P1_(GkiZ{gMIa~Oxu(#p>_vVD;fjn6=WEmotVBmXXpO4Hxn-0;! z%BWLk@)0>#Mx6rB9EJM#fgRk|@-XdtrWV=tlkuK5Zk3rg7)Ke=1N)5h$EfNa#aE!; zUrQOX5_y32+=bMGyKoDJd5TUmSzN-vuWsXJC_o+smJ*u)#XJCA6&**KBO13s0M1LM z-BlUKM1h}LfYByRjWGshKI(KD=Rp6F6!Bh=!+PL~%`aBq9=@8rZHOlxfP5~-3Q%W)Ml>_Ms3Qg0m_>1_wz~0KhW-nj;C&^lblH zO}zt@h~-)Q>c7+TY@USV5@1DC+0{$f zm@wPzBOE@Vol;lkk$)!$(of0FI-AUr^@J5DGvq(KQ|%u{PaVCe6>VqxV-+1oEuBjE zpZ3LrZEvT1-l+)<&cFswzTbBC`Pl;Ub`GX<7m5G2Sx%U)D&`Mdctiu?2YjiY#*Mr6 zysXIbW=crs-(as;gnkn{cl9)WSk%{`KhHkvX+z1l%CKl{FMS9i-0ABMMd4_pN;bgw zadgH$zfkq9{DJa98&Ic0RhS`~y_2r9oge3ov{F25g2p_1?X+uPsXk3gIE?4sd%Gbs zOw?$qgX(#ykj$x!U=YLBX?4nuZ;{yX(CTpGi*3ObTnpSjb1zAjg>F7;z@Jf`ZeDSg)4X`di@Lv%HD0Bg@>O_;rLcIC8z&JUq?0Ao_vCZ$lk&KKDW!k zM*A)K0s2$ab`GO&Iy{W*3;mimgEg=L1=#mL^0_i1Z#pIVq4!WfI1HEMKss%M+)8*I z#X;^MeGxSjlCSIkaUBo+hsp|cc2}XOtE+3%+A4bDyt=r88*tX0u8O0DotATk2 zyPcc(9bhT2S?i?>vGA{1kcrcW@Lradykc)*rB|9CDQOrLyIW*gWEM?-#2Jwl5SJ|x z;FAF3m?ctEk&!O%YMFmL75SGhrE??>N2@bz6F#GZAymL#A#Qa!hY9vt;JP^iJfJ8> zV$5Z?DmWZccU5M^1dCzDypi*+slxQ+Kg+`Dfez+V!b6X8| z2&Nwzv~?7SXJ#a>ySb~z=aoDTKr}Ab6>ZKCPv;;&>_Y&GByRngdO`iNXJBuxQ)wYB zX@6ilKKx*om;*780RyJ~=QLw-D~?;47DztU4Zp&r5D<*OUssY(tXGmP z7~ST4_-s(m1QgL9@#0i1n7A$&hidAfMg?mzXptq$JN5q8&z#pFtt9}uyI4Dhhb>5{ zSmW#2m+^!Jdgol^+g=dH@8WM3$x=RPt%X6TSo?g*U^B^@FCP|yr-5~5tb;VmDHi@y z+IpX--!&`rF1`6aWA3IC!!7~)6ziU0J&F*)z;Y}k5MgQ?IK&u~k%93-cD}XdCg3bC z6raH^r@^cxuU>TK!0El{AuDu8gjo&`(3IG@nzSgx#vptT(LXbrR0+PMoWW2@u#k!Y z4!b_xcwox;i_^|r@MMD4A5M~(%1}V{y6xna@fchT>LKX-b}b}dSCod((NpCuME^U} zg$0Ch<80dK0JUuRMHF#%t_9nG?FFwk=6@aHA7(K%C1FkkL>Jr`cC`@fj7;%3g?dyu zpM8$UJdfONXf{RM-@Jb`0qcBNzmE6dFZJ2OZa`b#5bhk>#rn0e*AiFetXYq-ob!N*Q#t;n zn8Q7s-RL2DTeDE?@xj~$ZCq?B_p;cjFCsIO0ypYb_lJIUi?9xXV+A-$0Mz;LA^PZ! z&cGUjSD7c4EyTXyj3P2Y{~bDZXg#*C&M7UzmK>snV|3QI+g-MsbrX_`WC9${#I)_^gOMpW$;E$xf&W8y5p?Z<}0-Du^H8;a@5}NQ@=ooz&%&+mzEn6 z$gq}Y-%Ie-)Nm>fOW%8%+YFXO#ubM9L%!HC{ny>!bfLOGhKJUL*|}W_i&QPwRuoRwj1&Zzc-#}hcp&|Jw#K;rNFqrj%lhy#=l+>q!xw3j38eX z(2)kJw4aMr_c)|hi?X%J0REm?b>Oo1e*IS^+_qB~Sg6$iKyo<*pV$fr`x`ti^QKkX zofGqF*E4i!9TT)Wh!Fb9wi|a_K5?QLrC0E4#OkLVN`u=ni z>s;ulgq>Wj%}jgrS$p2*a8cv1#qGO`QmEwc-~S?13xBDa!iJ0iN#w*`@v1C`^ zu*EfjwooDNMxcI#UEXGy=EY(xj*QJ`V)HldtKw){Vb{>DI!`FC z935KcWkVgA20(kyUe99k-&UMx>e}O~=1)FNnY=#Qmb-;h0lF+{c+Zc&=X=cu=N&t^ z*pxKXPh3mFJTk&+3(P^BZNe_nK$y&E3T5^F@qy}Eo72_K%I;WvSBFKg?9;3tJM{bZuWotq}HauJxwgP6^7b;+i$qGAP9TZer`=tq-RanAl#EX3$Sh zin0PH1?+d-%8KNI_JLEYTLazR?+KFe9(kUbOND;H=ofEt80J& z*l54|NkGbVZTc?0)A?E|e~$ zf8h9KTTj)%vMGl16kvZfy1v#pV&%5jpp_mBVSOCT{+AW^$7xUJu42`#Og)2la5k~z z3^=A}R8u1%p06;UG1BqAbuK=d{p)1;OxRUQXU8`DY9}&ofwu`4GN39RMcw{^eP>Pa z$_9kTYT@g_)p}_XuHEZh z`wA&zF-)f~s0z7NgSjB)?rX3s8X$g%rgpmUUs8I9^}7EN3HwzR;5bR<|FhNkZ@J zZrW2-0tK_wAj73fE~1th4xP`GYQhd_e&%r4f$j%ep)(`IIZNKI^ae!sPvco|u`RP`O z#F9kWG7?~DCnWK>a#wxr`Dnv|CO%S){Y7>DW}hl@Jj3>2g?j7`9>Ci2ZxGq~`!u)a z(f@3iwY}dn4}zxETn6;et~3SK)l~LWPG=)y=@|Gf*e0ROTh^)p)|le9+6#V%O0D?a z1OPl+=4?Y=UeK#(sFzSB=Ibde^k$84E}&_~&6<#JV(QIUQv@J%{rfU?fYYoHVf|rA zIw{@59z{uE@bE^}VH9T6v_$wjTcrOiTQ(^Yxdb}!~R!@{!2 zuY(qC!2_+I@w8UhcD{Tr6jIM%SJ5PEjK6U)02oSjY4tLn3P(qLwlk9sO~`xLUaXv! zK_tdqJ8QN(XpWJvS7kp8eQ5*jyyb^Vh+$0Lon8YuOfcQ+N33`B9}|-JUeEOWm7*s$ zW+cI3v%6hw_t98(4OlnsDa}erP#j({@#LAlxw_2z;{XF(5!ugQO~4 zypCUXJ%J!=Pj9q7WG_lv7Wt^Z-iC2V1NCXDZ?YZ&T!^qge7irY>d}p*#sL~D_tNjo zIy1(@4`Bi(4P2Im%hf4G-lyr3ru=FWe8qLhw+2q_#(7HG6Mm1(zGo<~01B*zlA=P| zu6#w(p)Y-GuZz2@=eV!9jFUNLQ8()##S}{5r|+THNr?zta(?h5`pv&50sWT#IZd)3 z!k!`*AqlKj2}6Wav(m?>MVdwwcbP8*J9LRZ6UtUx)JrWkl1{E=zs-A}|y5Gu^hnb9~kt0CxcTM97O{f0`{S?0CtExu(J26&4b z0mqkpHfDxs<-D_8+e7u4pGkva|61YXcYg0l`0}Lj@i|bfmS=hd3mN zDxgfpyHt$b|A}Wvh6h)IruIi>*135r5(|ffISd@746HvK!w!d_Wm%`(G=veBM zf4f`8fpZv)27V_H7GCRDt}kZ)GOXpAoD!$-cNosEapWd{!GM9hkf=0un@?McR^9B-ClT0>1~{2ub;m^F{Jq({Q4iaP z=Z&mYcMEGk8K*~ISD(XLN_V6tZH)T%yW({#$IL{KGax1e9U0 zD}0O8V7o0^Q*UWYIjBLCJu^I(B%Ytb?{hksWu%HB4sj6IKM8@03~6mpjT&}xWiqw} z8R^AOMq1pwH0NEL_Hbd~_sG@I#h1FvNE@HqF6jJJXw;N!He0l~y)aWNTawf-pkzhyja`yfu!a z=$I!A;`5I$58wP+`cdBdh>sumYK|i{rnt@KTq^!)uPMkyV-@J|e4VO}C+wRukwFkQ zt+Y%9avQ>`n&K>`W~`IXcvQ4B2}7z>rmA&OzlEpl?iIwn&d3mv7ar{lUtV6$TIM>B o;tQFrME3QLG%fNKY`no3HPq^96Z&?&4*&pJNyYbDlSTpm18zXe$N&HU literal 0 HcmV?d00001 diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..4931226378dd29a16bb7b94ab25218b71d642b17 GIT binary patch literal 34614 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�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 literal 0 HcmV?d00001 diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0693b05d6feafcc2f9de9c667614ec1d153372dd GIT binary patch literal 15406 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 WI%QgvnEwZX{9c;? literal 0 HcmV?d00001 diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ebee732645aadbf973f2de2bab11bab47f7211da GIT binary patch literal 8843 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 WI%QgvnEwZX{9c;? literal 0 HcmV?d00001 diff --git a/public/logo_mkdirs.png b/public/logo_mkdirs.png new file mode 100644 index 0000000000000000000000000000000000000000..ebee732645aadbf973f2de2bab11bab47f7211da GIT binary patch literal 8843 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 WI%QgvnEwZX{9c;? literal 0 HcmV?d00001 diff --git a/public/og.png b/public/og.png new file mode 100644 index 0000000000000000000000000000000000000000..2cd3075a88c73b6c1cce4dc87bc19384cb1b87ca GIT binary patch literal 246035 zcmXt9by!s2^Twi)F6r)Ay1PRJ>F#c%5mY(^>0J;I>6AvKyA}}X2GK=YTq!~Lo%Qqm zJ&%vvd+xdW$2&9c%$av?{FBG3c-W7y(a_NF)YX*q(9rJJp`qOkz`O@mg7OnR!Jqq1 z^4jufX!R*L*ESEp{T)9&RRy%#N$Op2-SI?AU-|a-R!~BXS6H4?K$ekHOhiVLja%aK z&lR7T3Jb3!6So*0i_pFMciH%5ICy0QrPR6kl+T4P&oI(m5{1T#4 znmi&(Ol)F8V(NT?N>YkXR34itY8vy4%0D)=lUFm)HE~qewa|QOEu*5RZ|?E{>w$oT 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

EG3toA+m|WEG z1-2!_rh%;*h&2&d)mm|dlhm@T;Gkc%)zW01kq2fG~E~p%X z4JX4F`eCt-Gli&nXwZRFEFnGonaGjIkzgjo$zSl_+ZXGAP?(}Be8tr1KTEya{=PjEVM=`i)eT|(b<1FNn9tEm16J>QraM#m$TdwK%mvLjENZ|k#R>8E)+Civ!Kkz$wgr`YgC5qh>o8cd{a&X>kVJ26 z!>wXZ8G;1YZP;h<-fL8$4?Tl3GDn@J6KgIyqwCJxo?RtY^_h4Tv9y)jyKoy=f$p$_ zyO=2!>y{DR1^*%K3V+kquju;&-j{vaw^po;5((VMW+ny`kP$4l5oS0Hm;eC}t57@8 z&`}u4qoGR_q>$`y-aYqcLK^L5TSl6QP#}Te!@2jKdk&%1{O0D#Ld~bv$0z$WAyx@v zhSloP%pI;+tJPz0>Q+MfM4I)YTLV3+?a_J|`}ui-PBJm{q~A$N_2B1dS}?41UlNFQ zx?aa(lJ3=YY`xGE$KpZ61DdcU5TT`q(i(_G9P3t&%C`cq;2=W`%Y_TSoHq4Jfb>sa zpq0?Hw+XQ3ENy4J;<&KQ!{*_EJ~vZ$h`$>BSrG{x%w|FF_IAjS1zYB@bUmh$9-VnE zVg-##ssQ053>2bq*rF&2WT(dupTuv(w$BDLg4pv?@r5ZN{2^ikTgK!Cp?OT*_Zw)y9ifsk0c3zMn11=Z(haLAP7$ zc9~%<8=LQhSOX!CjVGx1tXN;r-$Lho$%Zt`k=sQDdFd&jSm^7+JVqX#O(C1lw901= zeqd{Y*m$Sh#EKAmW-(l0zes!!xPmh~(JvU`B#Z>rg@lt?wLrgVN>eogpe$WS2YZB| zOXh&HR(6t7ZF*eUWHKZ4V5(e*MR`uEMh}nG|HsoEp!I=EJ@6uys0+C$%MyqQF%G@q z;bBB92?DSfZ`de{73`3{Bho9vq0lhvdn-0_-Z7Pm2z$TK;BTJ^*eebEh!?mzAqk-s z;goSc)gfts+qVn!3b5EeHgwNOG!1T1L9{?`$u6-gn9Iz+*-E@^*fKr&l5L!%6KPmt zwNcENI{Zp=PWp|*wKAJogjV&7-bKBbtJW(*F>!QyVxHto%bVYL0oYYQ5Ot3e=Xiyd?7K=(&?!3o zeYG_j6=#Ll=wrYA)3de0-)2~rdAO?spY?AJlJSJ+MWZSJ>p(aiA4t6lOB0vhvAH2Ynk(3*~>%_go8!vxRQyBYz!W{VS^44InZ$e3<#|VA0|zW z=@k|T;iRlV-T>7B)rjs@ZPY1cGUp?ISw1Uw{KjYh>U`;6b-UdG_xc*YE|)H*oHBF^ z@vf=peF0d+zKD^X`vhQ@*VkYBeV2(6m4sL^Jf9FkrBcMMoP4?EG$)SDimWmWvw%@J z0k2@smDd=!Y)$YlK1*;*kgT8*goF&&rV@`XPT|24wc<2JNz$5&v(BP}AZRs(pNx%c zSx6@&^c7z#92M%$w_k*v@81fGWR_&@hxHj#HPN=pAuTm`YE`(I#qP*RAtbmu75NdN=R2nlp7Ox(v_e;=YH&vIR_s%CSRulO z%S0Ms?u72vtGHj>KE1Z??>{kSVXyffAAm1N6;`{p71OLRH+8j*PyO3=Ciu8qxWlWP z7pH{j-TvJ1kE4B%l!VdN@s_BH>>NJw+x;k;1L48VdMg7FF*YkF&Q z7bU@dF~rCqYY|58*ojKB8CFyW`Eotz38KlZ6@$tX#BGy3rkF(1j7045K_81r>2Iz+ zzdR-6IA`v+$K^1niH)JyY$d~ZrRjM+uayX~N<@3m-6^*^EsXlHe%R`CT2Q`UHGH2A zb=P0|nXD&q4cH$L#S(z^*GA(P-`7!$L7S1y_WP#UBZ#VfuKB;zYJQCf>s9xXowmNt z(RNRrEt+vv|JF1zc2;Xtr+W=9$VNkcd}LM%Ct|JmJSxN;xGA2(va_QO#ru1sM52hV|N#kk@HM z8%p>W?{V5GuMh4=cuojymS|g{(xZ#u*S;rG!G1!eM|k!|7`^je50j|(yqW{S=-xXv zLk8X27kq6`w8wZV`N|#^#%pkN*A+TkET!#E$MoW}EYqs%mO}5m1WHu@!AW;Gw1?Bl z)PO;WF{fM1u{ju=Lz*q6kD_ryYTF6|S*T8I>x!HR0%K_9loO;3R>|C zC+S!KmN>+*AJ{jTI?a0Hv2jq4L9wnadZq~*sJi7a=1>V0wy+*x#<$tbY=KQViqTLw==5c4HeRNzko>Sb@$*)pX=fU;6#Iva5r){AveRvHwNZfL?S~tl=RE zBgxVxIf=X`NSaJhY&lMeNKF&AGI_SZLOIBibet)bT;re1&we7S8dMC9sIF_&8iU%% z2Vh-Yo;M)Qy0{t`1yzZw!mOsOr0KO-AJqKMS3oQ}{bSH`HKI0}VW@>gbkzgjrDCmQ47{xU<7FlP{Ig+10V zZ0Cg-2#P&I0xfPs{R9(Hp>$`rn0LbbY71R|!0pi<6N-lj)^_%w<=W><-oBP$5i=d-P^$?&2 z&^p-y7EvsW80pmO)n^qf5cVslxm+4@Q$aB3pbhBX*ZceaeL&nQ;G*!;z2H~^wN|TL z9k_b_ji>^DfUJ)@Tde=k!+N6cer|7maFC{F_3$q+joNu#9mI@bfeI$I-5bx0!I%t7N!bj` zLjV?Z4u^l-|3HA{6@HM6J_ZNH{;gfZOSyzu^xG9B12s6Frqu+6vNKt2GAXyd zO&lbl!aA@NLRKlyi4`Gu5p+5Hd){Cfu~kYXU@&o=*Bq9n5@x9cRnBC3wm|YmoSy7V ztAn*12kO&Q_FtS`-BTKQ7R}qf%*#CNgq6mD&`cWv{=?-kt&MwMS6h_t~EIoxD z6^8C>>wGg#5ur$B&FTx4?nWCba>pKxEH$Z^PpC96=G7qzey(0 zV#5-y=w5B4co?)jE7#@ung zZ)xR9rj^^qU@wz`?aL>^mi-e^6bcI(hAmv)6v#!_v?#AO*E+O8#T)*5;-=|EU%lkX(`0GYMz1-wqu~rZn%ze z22^TO@n@qhrAz zIcFk-r^(01a5Y&HtgA`zNM=r-UQNV8dR}!nTjbo6ZGUO`|4k zL#a-9pja-3uZCV%^N!A5sd_00=0SZ!n}56gCQSK=WDRZ!b^3%?u;v3!eWbS|aWG)9 zS>M^H-#;4-(RXjRUG&ut5wQbo;z8g%5c@P#^%?NyZ$p7KpEskwcq zE{R~ZJ>63eiMbUtdbyy7w#>ndnoOTSkkveDUeaqow^K8At@G3A^n6;Z_F;%Ru8n=7 zI%R0sp;Sm!Dy_Xwm=l6x@p`mCEb)#>Av=}A4Yh)E0#wWiP%LJ$5`j+^ZMgjt5p6ac zwubZz!TJw2HT2_AE!axwDwo7M4;zuGif{fxh82m1##gHlpD)`>EKi1|KlqGBcq+Ia6^0Pp9*eNm%*z;75wY)H z$ySJA}*AdR7EHb z(WxX)3q_$wz*Vn;e$j0qUO__2^lD0A)m!+B>0;5F0HgfxVGHzX0?e9(m^Ha4R!hXX zmpNQLF~Ry4s@n&*J>T!&_HG9q2COAo3B(d64bZuNh14Bz1rdtd#z2Dp&$ffW zn+L&vmTh#+M9-X1Y&35aZ*Fd^n;U4Wem4t<%h4sVMTFXq*atB}ed#Lmi{G|%SzBE{ zJwHF+Dm+;ve9)sUL+u}Xss0GCG78>uvMG$qB?K~YY-$dA%v359ss?t-J7p@!cxQ&- zYICo`uAF+0YC_ZQU_uKd=bkc)BxA*0G`ZZNHL=?90=2t(GI=w{JBBCiRNc$bh_)M`Y;tFAyeiry9B zlVDTWBV^pe^bnWs1HmB9ioBFz<*j-N(>w*$6_p_+qB+E)4B}mul{aj|Hsc1dFe>&; z-L&(T2O}g^F~ouaFGVTVxNZ5qM-MN>(k`w;001BWNklQE0X4Az(V~aXVQX z69A&PLAS~wf<;uRicASsU%?nAFE*GkR z1cFG`=^cV!@!Mj0H@%xICJQ?5!D@nwlO@HPJUTshyuW%{4lX zt)-U+!futH|7q;AB+@|;{5MXQG{tJycK>J)mhe^@d}e@Ggjm5>5G*>~-a}S@(1WAs z16qCffYXtf6ZU$aA!%o~hBnJX2@GAvE`S$(OI<;wMXv=!D4@im!rHxIS%uJGYm#B9 zoR&y%Wv0`KxAYsRmbIa)xx@y$=x8;tFKKIw@aj04csvu_c+MR;b}uU3*!U4(fwSb` z&mwW2mn6S2#n@0`K_<%v%H>Tg!|c#=w~WgK7$@L9Wi+)?`zPR7ZmrYxyO-0>HB<`S z**n7U*{s{_931oxroHR724N=svIu8Z46Eu|SeTJzw*!XN{P2ztiohy+?!6H+!QurIY(Xgx``iD?3(A^?o1do8I=rYruP2lk*Q3*yO@W{g6 z;tNxA{`ODeIKJhvQqwVQ+qLYtouo%BK|<0*WHU_k2&j@C{9i;TC}w2hwvz$iqVdFK$C4i5_c)R1h9xI7Ua0-ad3YM@Ngv$Hl`D(yPT4 zO2aEUUtlsgVTv_bwy!3W$@hqLKP`OXlKgXq_0;$&6n#TKi3qO7t2u?8%N;bheB6?2m#3q zffR-$CP_(B?I>x~5%VwaJ@+%vnb}m`tV4I?v`6Ccnn8 zH0Zuz(2!+6F3$7=y;2lN8Zu~El}nLrA7t*CjF*SG9`PE4SJ01|9LN=(j=Mo{d~$Ns zBd#?0aj}>zChy)&7Vqwk?{03!{kEq2c})KNyP?>wrXe)KHO>CT%^hd$z<~yhtYO%L zbc?o&#%X8NqGE7rTlsJxYpKr2Bf!e#b3TDp=W5z)mVBaHKBE(%iXZW)(q?0rV&xda z7|a(ezmzMDGB^Mqhvel;@G=dn=O|abW>Ys56?4>@0v~rdpMlH^$nN_uEeW@|@x(!a zLX992a=??egjkeWkudsWw26yR9i-;KaTIJy%npiV3Nd{M{w4bJuyzo`I)#5}B%lX%*2NgTFD;D@1%@7!YFj z{d%`cfOUP{z3v8xrWXNuLQWd_!$-dEH3;Q{ahI3tgYh_64(T?V&5oBS3>mGWJ?`8u ze_b+Q-7n{>I&cM4vp@2!ja%}!0oG=f@V^2UJB=1ni4|a}-O64f3AJ*KcuVcKM+{xU zw?(Hj2Efvz)Ogi+g!X*;aL%d*R*qtb@FUL)5@ZE}VZ8@p0kBR$v3N9x0qu4I<31?o z4C9Saw2KT_thBOiJQ1C9CKqpB{}X&BTUe#!z@n>ddm2`vI9x)ZYM(w?3Kb=g0tu4E zrh`-v_I_{+8+RG0swWfADzNw*e2rlVVkP|TF$Vs3lZ6f{mdZp>eDuNhv1W!gRvFpQ ztM zEf!&IQ?(}wK^8c$4vWo9W3OW|5os^X-QzFxbhnLx+qRuFysPNq;)PTZxb1ctKA)y3 znW~YNZQ{x8Lwbl3x{3?mJ|b0)X{u?nNcYY>$y8LCZKzx|C8?4N;kzPNjREY*+O|sN zW`z)`xbN2Y(K)ZdZO=hTN8c8Ul{&Ok`=Tan5L^WWRsyrSy-ThOoyK9M(%47GjRT@l zJl3cl45%2qUQ?{$Fc{BgTn;X~%hTnrYnp}qy|~Sn_cQd|=d<~`Km>5j=J)fB^!@&i z{q}ENCHxa&F{envKMEeA0AdpP^<+rtP`eKU|6u0p?_o!_IbRfSOi%`8?|4g&_eH>Bc64-9swM( zh4r*^Qn3fP01;xX04td&xY+{2;pMz;X{#CTM8YD5b@8+IMR;mfXE57)=9Iv1=PQ8q zgDa;*?>m)6NRvzF2_7@57|mlPLrKiupmo)0!9HQ+mtj(c3{?Uw4CxSJQDr=Y^TLo& zhus=DQgtyN-UU4({d)hVhY>#6(#Fk$Q3@0Fpmde;yIVeTg_Yt zl6Jf7v3P?hlvRQ~Y7=}YA|&Ak7+hb5}KI3feNc8hPbx)UxlF=3m` zQ_XR%{J0mtz0Gb7@omiYu>CQJ6}tE_AreKmo%{J{cfEf7W(VR3?#XY(Bg}dk!;)R~ z%#{>FGR?GBwFkG;Ge>I=sNAaw%TL4$_6>uriU*#pNUC8PnnCo+QPiSlo+5@cR{ky38|CwREilXP)R+!h-lA`;QhRTU9n9|dy?4JDa>4}O% zsgO(&#p;U=lLpUG5vpbAj{{aBoJ9nS@oGV3;m6?P1X_j_UM=1;!-BVrXmm|(Id~$( zdM;a{qV*najmyi2#zTEzdrBcC2Az{Df9HfITsS;Wx8y=0avDsqJ2HKGG%XdSd(oCs z<2!xBO0Mksgy+nw=MwA_B3$Qrz}o%m_uq@z6A3X4rVRHAOV%_O-Khhf#Nq53pAlk2 zjK(jOnB+BPj>VwW@}s6Z zFAW|DxDvsMD*%hySeUp;v3R#m0i92Qo(dO=y2r+Q4)AB7kPW16unD*o1-N%I}3!!g633@%l z?$NmjGx>uY57V%TXo~;=HAa^Tz@s6QqX4bpVnRg9t{AFXy*WLbOsyPjT|Bn&%V7Qw z#xR*2)(PpkuckoHk&m`JYp@~-7Q++W2zC$3V!;s4?4uopWFCYm`hGc|D_c3wN?F7s z>EK4?999wO`9ea%W^;(%10}{g{l%H>xIeBbRkWl9v!j8YT?9gg7M2p8;opVG&CxG=0!y18M4L_WJXtL-I zenk^uv$<-XGh%&SLUW%1ub^Rh*pKe+!;LkWOy2FkBZk$ztVU=m-eQ*p*Lxx#g6^k} zdw|Vo#il#PeW@E8B`(p?bswR3!~sh&mcg>|14i}odmAm675*5o-Z~y!49JN_xV=S~ z%}!F=@HqgXh{i&rV%XfXYP5}jtpqd%B3ULxrhCu{d@Os9N8{%1{s`0HIjSZ&Pv-1w zH5t_AwVI=)TDsAN5Jl5&X%Yf`XK=Ku#$R<0l@Vnx7T2{1xzY-E@ASgle9DIyWO4B)fAz>Pk?b2(X~8!^IBa9h|G4DRX!qTvj+K1YEtVwzdhQs&s>T zeNZKs>Yohztp*K&<^GT>QybNOKc-i3c=I(R_XQzVf>6nUVGLXg@xBGr_m8h{ZxPuC zfWjv&1l3yHZ5Q5&?#cCIH7q{=x6&K;fEAaGX4$mx_3JhET(cVF<*gD_tX#w!H4Zy+ zWvfn4mKd@Abx*LEWD&oj|CnOMs{79F?mc3ip`C6$^O2hAWXrAzY~oVMvl-$6Fp#I&%j)Ia2mkA+Us#YB0JrgT7?*5X*LW)wr1Q5 z@D;d61HIqBoqUI~MS8*!VQ)~<3Nbwo$Tq2x? zzUEro8kR~ui_H#?V_25!OjK8iXfDK9=2^&T@d{qrGz;5%nREt+gI31v>aI(#c3IU_ zB}8IM61`x{neLuHLmskD00+5+zL4(|UP-P@NM-5>p^N5Sm0pz`6&7lqhVp2s8*SSun4gFLjhOxe{)yZ zy>|(+7DIxp#fV_(cp(PC#XZMj?7C&J`hsBOkN9{-|6dJ@ z^G6Yb{Gc)>i9X-RdK{pBd7VjfJ^}sQh+^r!?u#TV2VN}Dtc)aI1KV!mP#K6Z0<3WL z;lqjmYllTFnhBALvWh9z=g-){>0X&)(T4$RjQwXsjaIvt5fU^aUzWDAn874bJk8jH zCLAQ_*{V)x_xF^E;K2u43QYJS(w9m7R1N!jUUJ)Sy3iKv_O&_f-VzB=v_785FgR>!zN zz!JF)w_oUO!76-$Q;R#u`ogOF?RUn8|Ak@k(#kJM=B7Avd+_9qMJ)cf#DMknx-R4S zqgtw5%BmnXtTA;7@v)pDN$FRwK3!j5Uf$eH?im(g7W1nQ=S^lq&Z#VxY zqpb`V&c~!#kRAZOs)+){mvQ~Z#`nFczkK?%@t`tqp0-A zlq4J{62rpwUndCL4!-RE!1Sv9!SE0}IcU{+Ka3oDmG+43O6uOARWpfUEtj){u+lz2 z#3)gy3wTEfK3GyC3Uu0O^D!Z|4n?_Zhzhc>(%Wx$=Bp!QWYO(?-SAAqrk<4@bvm$HX%h$A2B~ zV$5TNO7Q9nW7uLb=1{-aw{Kn_FK**8QQ*`aT*0e#%k(Qr#Cn5Rt)I8%JP?&P5dPNrk zte9XybtkxDNuKeFLm946=AsZ@b!+?m3C)8T2C?S8eN~PcG%?cOtz}E4q|OKOdr4GP z$(kzb*u44k_s!oliDp8ZZ4S6?c5lzo^V!%4k+>X$lU*D)#*FIv>-DEk51na01*~}` zKKi#ci2ySX0ZXwJ<`ZBeIr;?w2Mh!4c4x`!dttFc5CZX?CcMy|_eT35-mBI4XuLY& zQ^MxX+0JT$36EHmE=z6rA;N%e-yz`H_i_47uN98jdjEdNQ4KJSj{1FwR|MYX-k|^I zpj(r&>H#59JHYfwAQfB`FE|#N9b!dnHJ)~QG`vC|=c4EwT^-Sn8bOdB&|Dj~ZBA&QuSV!)tC}3-wd{0xpihJR!9m+#ot|#<*i3is z85G+!qU{D2(x+luaBV%dH4ww%5O%uJ3$c9o0){HEsV6M7Zwiw3xx zw9s{5)cD%x-@NDC&!F}t+t-NIBFfMzb2#_jbI)Q**3_U z9gBf`*(1+Gy@(g6d&#Gm`pNr#zCq{Fe2F&4#IhtM?=mn#|BW!A)?@#T@|F&VBqCJqRP>`YEwmc(oD0dbRaqED|%=WmnK<1ty7>s5RpEq4mnu zK0;xhE>nYq>=fQc9~;kn3$RAvaLxB^`ZfS+<=jo-hTg9|3fnWetX~FHaKb#veaqKo1#+VGeYXY@ueWvavT_DAnkn3@KgByP7`-8`@8cLeaN&}ZQeV&7+$;) z>x(`St6u}$qfRvR>e0nTw>G!pd#eeG!Ff|$uIO%qLUd6P^M!1Mjtz@h#pl$J6Uz!% z;8G#gQYD0~I;yXwyc~SC4uQkj&;r>qvZ+e544%~j9+6Q}^kANJ65gcKK`A<4oHQr% znb*mpFnp>-GWn9|qCkzPT&EmeZRk)1Ds|jHmE-%SL`3u2I&hU}^cQKq|0I-bLq>{X zO|z+lUHlq#5`tp%22^uMR-l4vPfpFTT}|U=GacHrz$9WQ%TIbJP&=wQ1T3)OwvOTt z1d4$lt}gkzPQx`l-Nv)sZVyHi$EL^~RNIb3a9pl}S$KC1x2CuA#KCk#fQgY3r9z%! z28QBDj6_jV3Ax=IiLe!aRIe7RjVg`)`rT?5G^;_2QPMwl+;N0r^=LRe?<-RkQFzPS z6xXKHQ>h3Q#bQJ2>})&@+gW$-1hB#uS2#WlFAweaJ5j}dd0<%b=X)5|_Oq`6YaJ!? z09a|YbthlC-M_uX&(id69M43pk>1l#K#Tt;N;#8=r8cJNO&S7L*l-s^cakhHD(PYI zatMO;cDcr@OD3h_IH1Nf1?>r9)nq%dgd0GwuG{Spu+nQ~6(1`?n@?%D8#$0`>*5!% ztoJYf@z)=s>p9=H+YaUgb%mBJKnH?=a4Sk1z^_m*4hP4h;TTomSSEv)!mxnj zbeE9nf~k8(HUqRm?N#y18Ozm}N~&44n$vyr=9q4X1g!pXEx;4p)p4fu2w2v5pv}jl z763~qALn)1W`~&B$!4fcppCac*j!xrNcS97GjBoje}DbF_vM1m|E zAy<+v`sRijCn_`&3MEPN4H9)J#|B7|mD(9i?;ll!UvsRuf`+iag&%Y}vTvXe z4Dho|#NuM)H<*2xP1+8XjD{AG2t!6--ze8Up;yb}%l^mDANw*TJh&ITza_(3DkT;! zzkddwy1_}xMFhv`HEPv1mGl;Mq(#uH>uWa4Lcj`ZIpz#%Hp3n$x=MgxI2XXH_pdg8 zR1WiT;EywROigJZp6zJy?d^LcL$Sy>c@l5-HE|5eOrPCuKX$YDCSb`94o>8pCPH*} z+&NhDO}41%FXPJsG%Bavibxt3)L-F~3V|!tN@WJe!(niIco?d$mMS9WaLle;jCT2^ zr+KDj8eUGz?BZW&bLE8^3dak2gYKZ+J;0Nze=r^dt~B^GTkmx*-dqgF14EmEU8Vdv zem@zB$N{_CRZS`pU{#u{Sx4vDynG%i*cB_1Wt=U6 zF%I>%1c0P%r50;wh^1r=R66{m?n~Tb>;5I1@=E_8-FY!^Aojgf5()8i54WM8#;|le zv)qVl*+8JA(zgE~H6a&`^T{2OEZqXEX<8aL#_WQj$6U?j`k7TNxWS-p6=HfYX$J#_ zK-=8WaV&?^Ehf1z$$s9}^#U^n>Dew6OX@&E7S&g>2E^!Qabr-utz_|{`iVAI-A1um z?;f$aRX^fru>_z3Y_X#3_b-50fT&M6T@QGwUXf!RpI%+PzPh@ahHWebTdWCD4~9Mt zBF>WAg=9@n&;EG9&HoW>3sb(nh`IasFf8R&5Pc~7{s>r{6UL+WzN33F6k4|F1i_7E z#3J!M%?a8JgaD9mH--vQlxuhivCW&>==1neHK@4%EIO>?k2D~spdl;>Q4*@};TF&D zzkO&EunaK-0>|nFMYX8oilq$eLota7J6QLC#W5Wy4j22tM~+k%OXwG;1_otX8oOEB z@;_42GB9xfUtEP-r(w-ezvO%R{qn7yl|QZg(r4-YQ|vBo+o3EeVHFXiXBnL#9~lruT*bxOV> z$4X*QUpwv}4{Nm=>PK;E)~p`$4Ey8Jz|w>dIZeExq%scZ9qiEmbAmu?g6f2Eqt9gL+qxde!n-=v8H@GB0$ z;%kTBnw^Nibpp}-R>5_PU`Up@Gf-zhUxd7D z(Ik_s16|#wA}eO%w{2PYg=$(71)|xjIkmP))-^Is$8^1sSD-Prt7~jw;WR`oX(ufZ zv}7`LS&&AS9K9$gRggA(A^ErP%iv%8C48i@_IVY=sw6AXk`&FRe6`-F^Pco8?czlc zh;^V0p=2usfBpOCx6{`$5}bZgpmcUmwH`}I@1}3Vo7RHTyXpFxP_GcNzI<876TW+Q z_nk_2)q{QvSlj;(u(qQ(8Il56j%!EKiFnL(+O@%G1d1i5?5q{RdDBVVy=g1Jl1u-y zyj@C7EW!r<3)HKCM*_|@tK`gc;-;1r!=K#Lj6^6K1B{BZr-6QvIxQdAme-hJpAJ`hqUpp##_YEM ziwQRDTk-L6BvTFkQ6uK49@v#=8d)q(5vyp?fKy+VU3M$k3JusZ$K%>?c&LaKa7thc zf5wjC7$8<2*pZ=&Tz@ZD-p%GDKg_0RRCjcSAiC}TY2U%qTFJq3hIK@K^$9PMZKt=I z_`ctqnV#cOyFgyY{yQMZFN5z9JXbz9YXD%2lhLX(8jUzIT!9@;n)tY+RJBrBw90F9 zETLM>lo8v@WGfZafjOT+hZ2a`EN8htILAF^C<|x!Fqs(5nH0lMRl3WrjMA;E_S4q$ z|B-fePif>?G*9!i5Bsu}hpkGM)s)$7TerK5=BtH;l5_(ry$B^%0fT@wP#^?GB0-d? z?3S9uapqs%bMB81XQnora@8nmmqDaYpL_4Q=ZJs9O9fNP!D>U{mb9i+V%IA%4GlbF zaTnN9V@1)ozm$mR05zgYTpHLB=Y~!3t5G5K0pgyd6h6_dfq{0(NGfF76UTMHT>jwx z9;mVBYAK1_3MFGEFFOR2nBkh>P{|r#>(p`V*tpZNJsa%I1KQy_RGVZODTlu~uT=&R zOE+~5pN14*xngN0#U{f~Q-B?zSE-Dv;A~H$g0z?`lvAZbyA5guHbqJNj6O1%REW7= zB`Qvt_|<6lxk1>KQ6Y!WT`7tF&hwVj!tQRj?f~-5+(Ew_x z++D5LzhAVchCr*!%gcLEtfNI2k0LB^E#Os`Q^aFA5KJvY)u`Cjn2Kg~IvobO$$}y~ zT9k-t%bq(|XCh3$hy=OAN6%o(wqtKjJqdMvz4r|uH498iKLX|TuO0-Mi?NT)o`4Zq zX6wk-p|$-r27ZY+D?#Nt8k8LOL^L5iX-T0$ZFs;I*8yrM7K13g*g3+<9QE0B$FW&d zguU+3@oF1KZXACY4h`|?LqS-{+BQ>KgNB)q4QLt#vPAG=r?!QseJnPcWrEDuKso&e zHAP`|G9UghYxO(TG0v9>>a%Pz-(zuCIiRRD9?knNQ1W~;#teCWJffD9@l*% zIO3$?sU;yd`d(4R$#p<+VNeW9x=>qU>HcR4vKJe^z!I#8IFz+-KBH;-*3QC988-v8 zT$b0smXfsdlR#hx$L#Fvhz=gdZ&Bq=t?JVlmU(ESD0FhQ>>)wrdC_&BlLh632+2rK zb7Z|)!>Od3L5*HlCIBnOj#aGVB{`2b9YzyM0I{YkfOELC%H19uwnQsMucR(4N+La5 z?$k3-p%r4}L@w3t&KOId$+XHxvqFYatz3gveoQWO%Z*Hq{rW|Og4Q`xw&)XDcabc&cdhh3}6`iIcVei+h>iw@e@Z6mKQI&!~te?IJSdVpB zYGkIw-y(BYy2|xgtpMwHs}tFffO-!^HUe_1rwtn=VNWHYj+wm0?iL=<6d2awfQWT} z-v?j;t?=5u62xjQIhI&BU3ZTbF{}3~-q{niFPEvkWT93n)C#r3i;K^n$3!gAJ?NV9 zxZ<7P-NQZEi-0DjQ4az`aSxMkPX8Sq<5;saQCE?w-IeEze8*ai z3cqA8lMwp@8JR^bezX&u;R98|tOgIFVvf!+oK%56>M`JyEae>>R4It+wfjTLJ}FjP zV3ts<>tT$k^uXUNUJa_u=u}9j7;XWXj!XkRMsa#EuhlL^XrTM%`*-hVX0mm1(rBE_ z8tqQCk_^@=8NjmljPE6dUPJ@>N1Q+C|X2L50U)as4rqv7y+FdFsp z6Z$Am&nVmyLuX%t$tG02SEIpnly(q!6sUJgqs~sJ4LlHfb`l+vSosw^OD3b~*?j&) zrTYd@WQPLwz!pDlthDZ13Vb$p~F!kTVgYo~a(!D+yTL+*D03DJ3@oi?~%u zEffuw@~hdTIARfg_|zVj<#ZT=hq5gx9rx$OKe}S)C*39KD&g9$>Eiea+|o45iaEM9 zVISUhEekZ-C4qA2uN-5~D(O0w?xN(!aomH(i9)}vVv)`;k}(K?asgOH)w@d3md|xa zy+TyC1DG<6a-m$fDHk$06bO|om2xHUD^0^KSN#4`sY2^*gKGEgTUn`R8wbE8#!$_h z<_)!2pjh4W1u(7X(^8>z{)lV+VoLZ3vQ$m@oqGH3$FE^nD@_v5Sbi2U)&YJisn+iL z%-!7uVBxY4+}9XQ1LhL14d@j*#;X8VEy*DUIBBi}#A3kLpbvsYw7R^KCYIopFsuc| zLQ$wF)_uQmSQZVcF7DN)mnoHQYlSlL>OwIr0jv=1k|nhW_d=Rxdzv_M>L|+uQ@zvg zPd&?dc=*h65J!Fdxc#`^1u@&(e!X3M|DtJbW>55^$}Uf54aeuYrg>S-WCI@6p%W7~S)i0135ke-w(z)OiKrTtpx#NE z9?Hp>g}=SwYRi^;QK1wSqmtR|=18)nSWKmI1uo}+VO_RBsY*F8u5zYOa4C5Y5$$le zTg(x!a+D*}0t@5{@bp$73q<1v?CPe;20W7)&iU3<{r5*Lc!f>;%8kOTA#1~x4nkpD zSE(BmVkzMI0>fH{EG$k{W=`x8u(nYaFN(s|$-5ShzE119h_DzkBsQKABeff>4f-@U z?n!2|Xx_Po;BeHzY7yV-lU|WwUCA=xswM=>I#!M-#~+TV(z;hJ$s7dIwAFCjT;{HH zdwY1R@M=M@OnRP@SkYKiKuZ7%U}Z@FH4rN;aT>XY4-Z*ZdfT5K9)A9~DtPHg5s`lU zdWZ72+c_)9{&GoZ1rrhacuM?ULI(TsxCoc15$6EW-}l*XKjTymP$d>I2jTiYj*eC) zJrZwmXizJJ|5V#d*Vp}CQqm5C+*ZWz7Nb>QG7|B)WlhlXOzRZSTNk&yS-aiJ#9A{N zx)ZZby4_iS)@bw(@#mU~-inQ=kslR*n1sv(q%^Fsw>F+vMq&1=rlUGAW;_X3CX?P| zgmSf#%xCkJiHKaM)Y{9B0$Bu%o#lN$kDKu-oqW=X^e%H#>4_1Hn(5t2g8yl?nlOws z?(nESdZKVNu-K>B2&k+GfRl3Blic~2VrnJfUc#Jc-uF@_i4vcKl2F=QTZAg<-pipJ zIBsl+_th(5T`%NENGD6FCBU)-9-rzssyU~f4z4Hw9>B*pp+8YCrKP~K{;Dd(kcy4h zSTLfX&?CSuz!WgbPMSK)7)Q@A)zC4MmS<8g7&GLnvJj1Olc`|J;aIexgemITUAZNj zg&|gidu*haa+w17RJ+xfl}imE*HM8PhPjLgw8S4-z$#ZHsx@Y9;#8Ly_3b}yzNM-` z$Q5bU-=s7IR`FevsMTFGwAOn&91u3o*Db9_+AZ8@u7-s_F~UO3;r}s=hy?z|%Z2D;&-=(YljK2muK-xw($Q2#Ja-BKtCnmWeSUbjO|a7Y_yEBA`O~876`@0FdZE{Nw1M+q zeOSLZCDhY8%AjCyL9e0<<){RFElja0IL)VL)%|_HT0da2R+Z;FGqC({r`H`0kCex# zdXJA(yUz!cBu9Sy7c~Jfb{xMO3c!Mgs{xnz4HK6ReAg(vE6+}TXfu3*Z?iU@ZFrdt z+rtL_BrV{}s6O{A2l=r7AI`4sDUCdf=4oE?v`_nH%2HQrnzpOEm!^RRrrBg@nzbpw z5vv-4f>ls_1quy*B+R6y6g8XVU*3D}ZA?--$;_$-G^P@ru}`0Se&?RUaSgd#RH1`4 zXrfCvyd1WeT`i`I@$__1od-SNcIRQ>+dk32kS%0rqQ5{K{gByO2>lC3ouSPuikJ*} z4=N6iR#FQtrbNlYtVTB<`ow8t`dHC@Q*!sDGXk_{dsEhv*O9>|Nyn^_Z?am>R(3A# z+J3f%)f^zzuGmHi>0oPMP}+=^6Irnrz*}E~UrP*KJX7K{@=;&)zsIK@B4Fr7o<|EH zjctGD3603rQ^-yEg!IN64&8u(Mwz4n!-CVa%&LQRUHSl)9vrWDx`H4;G}f!g#KJBb zIF{RVB;S}#4II$UIaq*1CQfYpLQpaRQL#{}*N=bg>{m)evhqA4mWl;Tlw7Kcum{f0 zD%GPj_b%J7`Y&JMVkNY~E4|FxY$63_&H92%p9xn4Op}MHP#$Jqz9*RW8+%AO`|m%$ z{RIsxR;!6*MHfDhD{dNbDP{O#F=Z!%TV_(@Y6Vo5TVfG~Ze$UF_y{(h&*#lvlOKJ9 zMir-Ea&BR9zgg`ZGh#t<=hd7@!a8ijIm#;5n*+ANPbTljmtz8^{bfzgJ8Dr*eDmgh z3VKEJ5yXI+4#0u}z=#DcE0a-)iU`LtbEcJqVVz*=4(i;^O@>Coo4b`2VwE(rLacA& z)t~vWwq9uHic!rZU85-E17O*B9pwm1k+dHUyxWG___J=S;S{@OZ!DxgOt4O!v zC-J)vs!;Rj)@r&g&0fBr3WJn&(&?O~y%SH*VctMuwBb3#sJcge8UhhB+P&)cVWD9s z&GBU18PLDkS`Z-Fp$(kExh5)o@D8|Eh+S%Sj$X9J^V9KYu~4F^F}0iR)b({N=R(mVJZSb02T-*T2s-gGn@wH9Ml6%wWeYCScZimj-Y0HQ^Kpn zqreUZj+fbzT)xP%0I_{dqGpIz5w1PqT&rDPi-rRW5q-Q=h%l{w^QD1Fze}u>`PQUh`HR9vHM{ZDCk=X@7>L^UsgxD`o2o z)H+{57N{13*7q1z6tcOKNoY`NVs!ZfuvF7PRD*O{$F%4=j%hJwJ4mOqIM4)UMsA3) zdS=cazaCT(q!9Md80cCi-4cLT1v77W#by(EI}BGsu-+aBTH*B&p>q##)g4Vn@3D+S zfK|K0FkZ{wt`O@6Cin!LtGJV>M5+)Ys7822h^1(nn&SvT(^3so(SIU>g;k+XAMV*% zr9H@1qS~z%y<^(W7hyV@7W?afwV5Qq%9(tTs%qB68exD?1ZnhwSD?Wz_wsXIdd4$d z`62RL(5PCS5Bgn9#R65tth)W`8%EYx#-ksIFgr9$3V4Qhv|%PAc`ZgIs3( z4=_$(;b3YN6@ndMQKyfZljH8Bk4mD!u#D!`R?CJx9caacUnajxG%K)i)OT7Qo-P)2 z=LzSF3&N|O54AsST3#xRAbM8dT2b8(KeRABP8*GKioN|=IVQ{@-;`dGVcDjCcu3f6 z$30N5Y}tQgyv(yrUdCB_Chi7^PusG%ytx@A8v|B$CE1v>M_G^J!g&I-C+sYRuM{Q- zc3-Wt@{V~?)|=OPbDF~$Fm19O3)_d12KYD)%R_er2EwM^s}_jC{D_6VQUT-PQw6Lm zpI8;hC;7+Oq1i-HF!P~yl1LZ*PJ%;`JvCi~+(Fzb;bD~wT0B6`Ga|gg+y}@)%odQa z1~$i52Z(0HtNjYmsyg9Q9gz$b6s{7{!jwp3V@=76thSHP8RXD_qZ2r_`@gmi`t5&V z_4g;>R{I*VdsNB5`#KC-ui$i8L6^*jliAng>VH1^>Jah#-+BNI_AdP+JbFv{{dNrkhh=+&^6dfXaUxg3q)s>fM=CcL;9pAjK; z(xj>IH6d1)`PG}Zy!?!y2Kp6QM}b&xx)VaH(da!EDajW>w*BeTJJo@|p zfNp&ou+~xF$n91%X6AG*#i6TzFPF0=zY{7EcJVmRy*$KzPAg?M8iAb)f}TB}Pr9gU z6zA1}ted`l`))F)|BM#hPKh=eJu{UfW((*GEUW-v-Rz%f!$}waadve^Z&0oJK&y}4 zqY>v9b-Txl2|bRED;GnXpeERxhABI4Gr@{uFTkSb6j%GC_JT5Tztd_sr%BMAjA4t{ z(?nIdbTR#V)`fZwb1B@eY}RkIcpv)$#TF8Q%-^dl8G>kKFF0DFHAG?kv>aLlo55q3 zpC$2_YitB;HrR~?(As9Ugk-*LN$uNU1)Vw42FzE`uwXgeUEh$|Q8*NAh+TXw4qpUa?1O zH5~rg%lXQzwK6@-zN=x$b*niB#2%OgAYsvcP>t)}lE$ZHzILZ7+QaFY>X=Sk_g!7n zUZ5ez;QV$2`NKYVRj;>X=cw<}o%zJl4Q}l~=0fxJ{c0S1 zZgM#qjYs3ldjYHxVbm?b6>}`?=fKR6WGOki{-6USNT1 z$$pLi^@j9MAUOfqc&V)I2ZLU7KbSi6M>2MDc($;vv{f%DrNbY|TMQGj>5e)3F#lh|3gy zKq*9_Rx2f-d*BYtKXw_7rU%_o3`2!*%n*W@%+0Ci?305 z6yluD$6IqTgxt}ThhB;0&C;N$Oj#{H!!w#hoQ%gVh&cS@OW!wi@c&fLUlP9xZ#XWQ zW(n8TjeOoKm1umac3xk;zkCzDa30p-p)f3>SOiyxZw~o0-Amxr7#bE33tz%=Ni?e@ zh?RGAMM4@P*Hk9SeKpEm%`pAB%l3CBjV}<-=o(h-{=;o7!mCfWH1MkN6=2bm_IdRt za{A+7QQP^W_~>r~)*7ULc#ojl7%;h~q;kPd(Iw8ooh?KVm-kwHzQ(=ucCNga%ZBr2 zb3hXt6C(CBAc*fuq8=y2S*z8mYx-f?H?wBkw1U9OLPjJ2@l3<@cF$1me0Fq1sP$jY zuI@K&Jd5^e9(MPoPxIEvzt z%&N-2y!YH|lg?_DnGKdw(lVKRaX9z<&OPVq%V-o~o$!hmRtLnb&L`80uy?7ot{bM= zsGCfCcpj9DdwOg0d-T~h3Rr*s_^-=)YiW88ee;NcSq{v*8pd4BvFi}xxJCo}He6u= zUlu`~UuWSCDadbyWQqQsuQ!mPLrCQ~^u{m>FJ@R`Wha_+6z44L?jA^@!XA%`EJtCg zljFplH@u<48_|dp-Fw9ztb;`J+S}ze!Z@E{M;^-TYhPBLccq($g?PSR#;`&K0Sxpr zM21@qJm~w%UupFEj%#v&TZ~wIWP~>aO*9!+^Ds2%S`N^ppsIrALjy~OFl$*A`g?-2 zP_L@ovZ}*I3RxW=47wF0cQ7rkp)Wy}>L91D)9pk-(5br^K`v9hf0Z5iq^bNj@?`LvvASTj;X$>$k5?tMjt~Gck4My!9|PWuytx3_>-omB@s z3uECLh+JO#07*naR8_86*isb0N+*D&&<}?GZ_Ch7kJH~6UWq@I(i@x$K0MM5 z!Gk4wHA-sh;qFf*fR)6}e0y5R^+AWJvU2#l8W#4D^La%)?h@gGbYvT=z8`x~+mVNS z&6+jg6%x)1m!}0scY}T~o=$0Sn+w4jaH`dmc=*-me8_zs#`}-gmwMJOsMs5#Z?&Q# zz0J_IVimz(>|ltZegu~&y(AJ+^~VH(pXXy3yC$~bdDlI&0P#wVmwVv8IF30MJo*G! z%K`!zE(v>lzh2M{n^-D+yL3f&97|WL^q5n^+y=fRoE73vh*(4ydp>!4N2kOp|q%0p08sagD3H1oh_@iB1FU@qXDi+eKP${ojj3+5Hs#e;_ zb|-XL7AuNC7ElXX72dThw-{O~#43eek1b8fA-2I%h;zXzTGdpU|=VZ3d%q$m>akbx?M(W76?|YB9ZTH3Hhs(iFY-FAi5ik{&9aU z`F*gt&+h-W9SH}qiWL{Q1E$8mB)lt8xWw=v$TfSOXR$l$Ifj){pg|Q?JR#H2s?rKb zlr|i?DwJ-T$Y>^1C4N(u@($Bk`X;#!#VE8@6yd>vfGj6XsZDJtrmxp7=8?WvQyt zCf0{O!l%p_-hiwCj~*X0kMZr{;Q>j;ncw)`OB~5i`sOd6+Uo(|FsJ=KU}aNik;Q5b zszOar45T%1$N{euL&v!WHR+x97N@oY+GQI-6!12DIAOsZD@x-#PIw%R?nY4;^u~MV zU!U4Em-(KG)g0B)9L{mq^=k2-m!&yktrzHZk;s){doKknu7Ws1B?R9CtN?H%&K;Ka0}gkW z9tm-|?{N&gpwj*;cCjDr%0VKAJ}CkdTZ7Q7gS|aDDSUIV%UtV?#Q(9?;e~lvG{spi z_Wz0+&uc%jx&*NL4##q^S_xh$gl9R7e+VEi(({s|X0YQ13BFRTdKx@C^rR&;;~XrN z5KD7CL(#dYS(N(}z%a#-C8Aa-N5l%sdRfAeJ2e{iPT+57*Kk1C5fej>cY5f*Wb~>u z39q^VTVu{g(iLz{BcT+w&l2Bv+=#r@-;1H)8SExJ}_LlkRGfR!V>N@bqBl^H~`hFQ*iSLnXGcGn)`Rp!_YS1lan zEnt`0mRPh;RyQ}dF~JflHJ`N35i3I%x2vChIv2!3zvE3Xxe2=6Rddx{-SB7#wS5iz zTGwiv@Dp3@^1RkSFGA(D3zoOl)8oKrzCAoVe%<2LhJM~#4eKu%J`IIzRm#L>hu^4H z`PccwKcZm`(W9zhmyjkb9*i&_y{(^~F0K~~lxHzwozmol{z1Rsmi(kPdkvrFSw%mt6ALdCUYv*Z z1JGrc?dXypbHLn*t0}e<-GO8=uw9e|b{Qg}Vd4Cb7ZLfPyZb`acJ{=uCALzwzwe1+ z&oIS_qs-b~n1@viVg6Kdo>vvK!H)!5G`zj8;I35+i$xZoEKO5$DLgc#lr-JKPCLzq z3M*Jz)hiNQRTa(Ct(@gnv9W{9<*KIBvv`Y5v5=LEee~Z$A*+;6qHz<{s@dsxI{}uP zu@hav7W7G_1MRBDMvHP8<0JR4o^*j%mE=o=~i37#3If8SGU89ZBb{VwxLNb;HOoU=gpOuVvFN#hFl?dZ2q@ z>q6mi3efX2M4pMhUMr8>l~4 zOtIpqt8}^q9Y6hTj(vQmbod8P36c4ti*CgQ$Am8&e^o~-4pyHLYE0u+uTH>KcaYC% z7JS>gx{B4RDVPwPS3jMNM^^*pSA;+xin_P-4a3$wqo5ZIBzc<9@ih&n3RSneT*7x1 zO^KR~0_@h)2YN@mYKjW!&zLijIWr}eXVz_pt9=BojuX{gG%en$0n%zj!d(5B_y8Jj z(5XSpk)JnkZ6Tii?I~6vFGY0+xBAFjYk?#}nEDGSTIEGWngda5?VG-Ltg3lcCk|>D zzW!3<=>Be8O~`-jbKc&*=vhhJ@s8Be^E(F&RveoQFnY!P&#{?-qv7}X+)!{&;u?+^ zxZX(U1KZ(I48}gwA6}Y=RW#m*7WZ`$V5Jb=mwKI&BR$;LTh%HLa#pBWrBqcxX-qkG+>leXLw}$P)T$@J1TCLnfmmyM!q{p+fR%x@IlQ>IScR*{_pAK2NV$E|VTKjs z)ks%E*By@NYX@fWM0mEH2)`1?>L<6`+pF97*2e|tYJz4lWD#g#Wt|8>4#$*9AWVs& z$X&d9*AnpBJUsEM&Bno|Xg=;O;|FAv+@F+E3|NVSI&ak4R-`Ia4(FcFx#xtd z>6}JEdL`l&{W0m$r=3qZ9fD8p2&gR4u?*fK61Xxzve-kVK-@>Syp5b3MX^*Bu2`a3 z=*&f~YB_&E^Iw}qEQT$jS_cEvm=Qde4-u1vLkDT4_ZL2-EBd;gx2PDtNB5EUWWa)8 zwIxWyWf7^^b+8ND`c|Cjz9Uu#1S3nu{0_~09FdF<{LbWSTU_nC@jDWKCH01))Tf^B zNPPTO+@zD*e&Q*i4rI|eQItl)U()rWRg$C^HZ$0I9XX_+M!N12Z9;UPM)!KrR8=@d zbr^@ObWR~iOFLtwSah*h${j6r0-1U)IU8hVb?hGV6zJxftX?%5#H{+LaSl4+uoDLT zWx#)JzV3-6wjzVAXL)V9`6D7B-C#ci|(`dfbbsG zl2R;OWp+={n$5lw;Q#!7GJJ$#!T6btAD{b{=8P=--O^1@0nsYm@C%My?`9=PT!wx+ zwxDR`zJ2?8O>pIX<*H?RbNGbt>-F``enL|+RRXL&0ai@0s+o*p|2+z^kOR{w@am3W zeGWt5Q}{`0w8PK*`so(87_#`>(5>5!o<%Rbs;eBqmyxk{OyBJI^y6Z&n2uRR6U1V; zy5XjsIPe)akaJPlD3M7h*8Yzg3m+K?)e7vQT07YU)A_vXaF=Mm5bz(w?kX2Zb7&_+P$soeBlDHCza!}4Vr1X$6O zU@DxTnwPU7BLb}Lwp+JUHbc}5Vbp*b=&juX&&ek(1d4>hKoxXAJVsWup3>J&F z=|2^)fI2W+A*q4Y_uc0yz!HuHp;&D(ZtaQi&VtkyPjg%BYS{V*D_475!wR(8i&Ofz zQ&rd*6D~%;)Sh^}_*^k2a8GQ0){Ce3DJ3K#%*knvZT}O5=wBsgjj2OTn#(T4$Ux)pwkSy%?>r2zjGq#z2Q*K5dmk!tY-ZB?tJsV1nbW`+?SXQz0?OVdH_Sv%~1_l9Sc+`JR5KDsSt%polkM9y9(2BiBG!b$oVIFNc zd2Hmg4zYgIUJ%1-5qjl)e4t`>`a@0wWvrS{CSQnH(e$>8_&g@W>hm-TN6Y2=I*n!( z4G~iWG9r)V3)t4T41469!uN1Wzs~7jM;Fog>Kq35Ic)Be$uO9Jx~*2PUk_vp2g@>o zR2DDKSfXbMUJ=L2FIw$XeOuelrJ$a3vvvWHJ5TH-w3VVa);!I&9b!^; z5e7Op{Zp__3S`$>3vbh9WR7w!Lq7@SDXTwPAg0a(-8fg$v(p zHXv6sxVGSgpFQM#r$2wpu!xu7Fu$g#rZXBfvXW&-6M#rh*;4kVbd&VuB&np*r)6fP zY9?I;*{N1Fu7IZrqwJX;LD)TOX0F-2zV0$$fiS6rSN893r-IH~ z6?a$Qf?TZzM?zY$VjLsK8^~pr|A1c+Xf5Y zTwD;!nWkqwQFKqGWW-~BwZmj9jxh#t+KH1D_O^H9WSBjnPumFPGh***r#D z7Xlk{)sBnh!G5<@=NuQqk36}!bMM2>)=O%M{GS&*a!7x~!yf}Gr6|R@F zaI)!1M6fif@=VApg|nFuEm#11K!m?Z{{!giolB6zMizE%r$Pa(ck##wzIA>+`+>>f z$M+;ZK5H$xD3x*y;|7z9<44LCf_>o z8AHBK*1pT;%ZzBOIvT54$Zc?mjnz^~hQECUhlDkjIwS5?y2yA@6QZ@skS3{UQ!wGcqkRS#Giz`Z2 zUncZE;nl@-egs?#9NY8`3s~m%U{oi@<`-IHnkvz*X;d`NR87;FMgb~V={XcKI|O%p z>N%%}{&hC+4W*)hUs;tJGVAHDiXhdk$w9<-B2I;ZesTG_UGcE26xVF~eK+!Mbj612d(wx4!N zSTELX)3J{<;zgS6)Uo(y$=aVlmYnU?O@PwJi&HyiLGmiGtBUSfNgESfX&Di3=%+UG-KNU3TkTxDl^pMBsaCC2#g<_vU1XDi#VM0D zQL;2GQ^PtR%i#MZ09IxE0U~-htkE2)jox~Z#P)$=#gN6TIiHg#2ZpPwS?>y$Uwww~ z#{*#y^oJeI;Ed54;L(sW)qP@F?1P1ytR65M;~j!iz()QL|b2ARut;+tb| zx6CiapP5wwuN1=K2M88j)p~3sguo6oVQWC1Gi3;^TKRSX=lw|YEFdpf^N0;qDtbSP zWNrhrM9T=< z@V%<@o`4lV=GP@Eu6z1Vy zC~_hiUcwKHioS3NEiNqP1ojRbt|}xBp>Q}5$HRM+r;MTzkBak|46EMJj77(Yr?Vgk(*>m>)rL@ivKd6FfdHIJqX`)Us~sA=K*$hQLZ>~Cq>5-M&%LW=vpH%F zZui8mZuZNI-DEjh9&UoR6|f2j6d>2lQgovG%Qpuu5tjjAE&tYe7u%Y`6Zq z$9F7o_@*FaeMA4>dsqOgPG?xQQ%9{go!r&@(QGe4E%=3UI}-^)Y$aBgm?csZ#1}I+hWO=~fO;gW(+*R$wxk zBzpDpPp^J9qby*6NtUE0zeliOzWjrdkO3?i(vY_ut1?6_``)IurTy1Bw^}0>OPKC7tYP_6Y(Am7}i@G5z)^l)` z({9?RTVA!gk>aKbtvhmYsBAWogp=i03PG00*g@`UTP$@88UGARNbTyS+pcD_&UrSc zs6;Cz$D@C|;~?7TnaR%~(UIbgdPLYWB*dm55A}jA8?k%C+D|wi3(N|k%l;xEB&VTb zk?#{ld=yVlaf{E3rwRU2kuHh1MZVC3;Im@!c|9x*`P_ygmt}1eH*8IV37>4jQAE*$ zbsXNvA?}1X2otI1rY$QBQ&?=akuho5b*crmp$3hWS+b3>Oo#(!)G$*Y==Sygu$z1w zE&C!hhEVF_q7Q2sFsS8`JKY?_s8H~)LmcH)Gz1S}NuXlF-_-a(> z_y3(?nGI|TJcTU83emW1B)@A5b(TqrJa1_PA{R@N8}EoPWsy(j@vyN{Cz5v-sfq{ry*0j|KU2&{nq<#MG? zXZrn+PAyO81C%VpbT*k04l)3lXf)_Xo#_f!jxTjt6149KSagE_6Zx;H>wyn)OwAR} z{sGr7dB^%kfQ2?Y4ExZw!6xCkd+B+o2HWf}+O0zJPNz7XBg9Ip1{+n?2lIK4kQME5 zkgbQe4~g>I8ll$Y=F#`-b*tXH8w~2ivFcbSP$W9=bt?X{1Xl`gcT0)}j)-QHGM@VD zZq=(3R88so%}2dCy_MZ>{ndIqBX&b1nCK&ZWLl0J?z*b0!O$?rkR?1w(^=VCuN>Dq zce09!X=J@xMp800_E#_HmPU*CX|BZ9jao_O&OU;2v12^@)7JGAp zy%0bZpK+Z|h>Q~-GYxFb)G82tpw*SkK#5flwVE-s;NLJE(!*%wb2E>q)mCd@Fv0p% z{Ir<}$BF>0=;abZ?dhlT5$!#(xU>`gC?lL|fmSEYaua^}mCa^;_g8P@XlX|gnpN%@ zON>{^C?hJwURSl_)I+&R*%0e~A8%Ibq#9ky})C`F` zGlYM2XCgHkIc7vD&#zZ*nqWKIW&fG`wdZ&n0@rx-nSd1uWL3Of6A88ogFwMoiK8&# z7^%wQ1}0cSt#xwpg2fI+Q8xw~iDBN`IgJR<87>sV+`4DqtP}L(BMA|s`n;I0-(QdU zcb1Au9FF6R3AwOEKv!)%jz>$SV9zWQmB+TFm<~)(urnCtw+N~aO~XK#7h#!c$qx2% zY%J`QMCe35Rb!S!#o!>%W)O%(ZGLFgh)2N-0-AP?R1KC3OAXOn&zI4);y@jw5(2Go z%63;*54XG9D?+W;`>W+IeZj6KPk4npbaLJtL@(=b>{1YBQZU?%} zl7@0A%6J8{7XTKVl&NmiYzT$MQ(I4_DwWSARko~JZHNw*Vt*<+Q$nP^fUKLZDAtY# zgp-d1Ry)?K0j&m93D#<%=1CcDV-+yj{ATmlZuhVmyXTIUwOB}$O;fRyjM;%`ET(FT z7>UKsl8P$IK*P|eA!i{%zhsYe zAeQI3tE!v5zI4yk?yQP6m8!cUh^2SZ`NL>#jOM)wdRP;9I{K4`_r>=_uTUY*ALmnz z@Mk`?h*eo*&7r^Qv^|Nc1x4y;gi#ty6olM>ecdH(Q=d*do#}S#Erj%RzFn{HyYz;( z+N|rFBp4PON`T}PfL=mCs&n&7ME>yAFdT$Nq&?Sz#~1#WL;+YBrsi0)ae3`^g~<#w zu~^lCbRUsGU|F*nmZ;k~dcEnY=gvgVb=PgrJVnJo_PLIuVc`>V8VR;=puS@L`$?~s z^Qr&h&I#fCiUqrtOp1FR(hlL&qEA+j-H=4~xBVW_yFAZ0WSEj0IhEacJ8Zyq^ z6gDkXw5O-1(D#wnBhmE?mIXeBlSH(olrja`_w-D)^<^JtV-TH$-D`ez{-ei3lc@~nVike0W)F?tVB?Z=^ zVje^E5+q_?VlP?F8tZDlM53u8ih>BQ;DF8TZ8vqKeD=Hl0azRk{ld^aHhG1R2kmU| zM(z|5l#lJAX%fK@h1CEnX)f>x$`13?i9LNx#I5hx-^ zQLK6dxat_LSn@t!$7rH0y%*V-C>V(3AK7bk$G-n_x&Tx>GG1sO_% z2fY;=fb0iF&nib>!B54zJwg(ul49s2ubrvaZaU3fInO~eNnA4iD&hdsuXMW8C8jl% zhEmC7EJfD+P`5}H!jq!J(gD)?l}4#hkP!8zNEJ_a!UxL>Lr>TA45WCoDPv)_Ayq=s zlntd($-wH+v_%i0Xvv}Xz#MR|Q_@O93HQ8Kz*uV+D_Uwbd;MAt(Z6GF6g+ zAXmYfN9|{i#IN=@kB|G0`-injwH0*xlczhnslErVIIckxim2r4!y(}71IX3py%@-E zu0<5-7u4E18}O&a!^6XLcH_hqqmO+qPMvw7!opB!!W@t0bEK^m-%r_uYjU0d%aJ*err8{S zRzq~_M2qRyMt;_W?78|!V!2`^I3C-!{YQY+_X4eunS4@>XM|X@5V+tV8o)6P&DyrA z{<;O$lO*j@G(_e8hnH#7PSF+IoC3EI@q>G|<9;VPt%jTGwLW8tot6}#LAcIWg2G?SAyY^`E*zE>bjI*)^?XUo6V>yca%x7CD#?gXA9g*u2fXy&+P5}HM>1DObFIq_8Y|8%hfUF zdg+u<*s%DDCyv!VD&k`8lvQV-l{JN;t#9=Vg=|2&MwU}J4 zf-nw4%a0<@8(og+>+N>hSbZ*bmYTDiJH7^yE}wtI@tdlfI3`qd*~}}B8(aR&iylx0 zGNYH95@0Rk0crzX$Iy(jNjH>4{)rrSGkFL(NRQtZiD7-Fn?SjI1iEy4Q8tA)A=&7W zOi>9$pDniCB3Bch9}$l{B0eU{Rr!z*tzm=W$8)#Hu?`q_ojVSFulO|iwWow4TTk@K zGo4B&n>BDNq|=N{B2Q+QrJ$$;OFl~dhQaQgU{{!2Jtz02QweCLgf_(D^SjipaCPxq zi@R7~=fgtex}rCTAYtx~;(0ZUn~2FLfhUndRx9X3l^tC|cW^~jy!q`?3q5u0gjmiY zI)$AcDO17rAV?P{xhodYG@o&Zx2UTlGzoTl1X?!#MmAqnwA0%nAFGAb<8F(~>QQ9h zBK25kwE}zHT_dhM3T-A5O1NhdVnvhr=DD z*|E`zu!^v$wmCc$q$^=sNmm8R!IC6p0<4)eyNYfSxVl~3J^-}tw^cif|1SxNVIfII zO_JH+kJyrqoI8C~~7_#m-X(kXp2D|kq(5oMLN%Qyg zrT!QFYUo~Im5rD#0teTliemZLkHc9M=d(GS{E1zgZ066h$p}WgE zGTH7=#?1*SK}fd%z9}p|Po@xokbFLYj%5WS7u7_h!!_(7<>@A@S+Zs2ix_v`4nmDc zmm*u5qML?g730vG`5xV$Z@k&`ei8Je`5+#+#eq9ugfR^dgH;k?9k5`FV&OpQ@lL!RGu&_cDD9FI=V$=v7G9Ya5s?4%QXKUT=o&M83=lcbB zduOf>78OB(T}*Ov&i6at`9`D3c;xE(A7t!2K=O|Xy4P95%A~ejYTr1BCb?zms^dt} zC|!>;lDCrIQviR8C$7HebXO~cWO~$uypgB>h*>-?A;&438uM9o&5|L`*S8lvF*JzL zomWxxh59fGefoC%k&j(AXx2ceuonZDM&!Z1;cFBGQ zjfh*|u0iMey4Pz?(>GT(=i~sNxHf@PkSUBRAAjsG^SjhF2o`{d!^w*0r`7Yc#40O` zR@`$amVU~_{dBQjWDLaBsfzrfCQQpv)h<^@yBrvMbv~_MO=Ttzo?9YbWnRm$)+G)G zT84aw@0;zV6*^8>&LnnuhT;AoTaJ-C8aB3_*xNJcSFrsu2UGcZDhYH9+x*7AlR-T|)|9 z1qS=!5tT|o*|82=jiXlM^F=H8Fqhz&;~fyJvxgvP&j(NQ0D#pibON9j@Tzgt8?@UG zXP3aGcKc~%1z-im_cxNN1AMOF<3P&sD=SZDu|^b{rM{mj?85Foix&6I<|JBtnT#eA zaI9vZD@^yej9+lNXRMNfEM4aKrIv?hoG~noHr$KzamG|qC&ak6R#FW+nr(6_xn`0q zkz;ubZ4iP5wP|r!QQ?Fm?F}+9lLLY2a$lFqIA>T0){Q|kE-#m6_n&_YS*nsnp7m!! z)}N$T^BX@2T`tH7B`G1uqFD(?EbcaEO;0zpl4at(IgX~6RI*=^IS#&Wr&QYzG_JYz z9kB3>tsgx8asQ1QxQ+8MYs$c`KfH{B4-)y!CIN}e^{ zka^XO=V_6{fd>PEy6<%m~4=w<>vWeYxf*>wJQBvPvk8&Z=y+sgR9Td{tVPiT5HH->xfV z$+8ynOjiZ!Ub#xh0rN(gTQWgXq?K{Tat%6c7((jXj&J7NJ-uuu9NTo+ZpBiU1OA*a z97k7ERS%i6TxJ5PX@IIFc9}_Ph;dtT;ZItflR~R-2xw`|2X~c1tI>n-tKiV-H0~Nq z8l^fsl+rsM$9M-khAHoz;G!`AHns19e;!;M?;IcFpld@7wg>Yup2}nJZr*4?Oh%02_uR>>s7IJ$+Cq~vwlc8(

LD_U?`~Bmn>9QLzej?{YM?Wu?G0FdnSkjP# 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 V^%`dSwFLkG002ovPDHLkV1iJh@RI-l literal 0 HcmV?d00001 diff --git a/public/placeholder.svg b/public/placeholder.svg new file mode 100644 index 0000000..e763910 --- /dev/null +++ b/public/placeholder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/site.webmanifest b/public/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/public/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/sanity-typegen.json b/sanity-typegen.json new file mode 100644 index 0000000..a6447b8 --- /dev/null +++ b/sanity-typegen.json @@ -0,0 +1,6 @@ +{ + "path": "src/sanity/lib/queries.ts", + "generates": "sanity.types.ts", + "schema": "schema.json", + "overloadClientMethods": true +} diff --git a/sanity.cli.ts b/sanity.cli.ts new file mode 100644 index 0000000..4485d2d --- /dev/null +++ b/sanity.cli.ts @@ -0,0 +1,14 @@ +import { dataset, projectId } from "@/sanity/lib/api"; +import { defineCliConfig } from "sanity/cli"; + +/** + * https://www.sanity.io/docs/cli + * Build, deploy, init plugin boilerplate, run scripts, + * and wrangle datasets and webhooks, all from the command line + */ +export default defineCliConfig({ + api: { + projectId, + dataset + } +}); diff --git a/sanity.config.ts b/sanity.config.ts new file mode 100644 index 0000000..ff6bc0b --- /dev/null +++ b/sanity.config.ts @@ -0,0 +1,96 @@ +import { CustomMarkdownInput } from '@/sanity/components/custom-markdown-input'; +import documentNode from '@/sanity/document-node'; +import { apiVersion, dataset, projectId, studioUrl } from '@/sanity/lib/api'; +import { singletonPlugin } from '@/sanity/plugins/singleton'; +import { schemaTypes } from '@/sanity/schemas'; +import settings from '@/sanity/schemas/documents/settings'; +import { structure } from '@/sanity/structure'; +import { codeInput } from '@sanity/code-input'; +import { + dashboardTool, + projectInfoWidget, + projectUsersWidget, + sanityTutorialsWidget +} from "@sanity/dashboard"; +import { visionTool } from '@sanity/vision'; +import { defineConfig } from 'sanity'; +import { unsplashImageAsset } from "sanity-plugin-asset-source-unsplash"; +import { markdownSchema } from "sanity-plugin-markdown"; +import { media } from 'sanity-plugin-media'; +import { presentationTool } from 'sanity/presentation'; +import { structureTool } from 'sanity/structure'; +import { customDocumentActionsPlugin } from '@/sanity/plugins/customDocumentActions'; + +export default defineConfig({ + name: 'Studio', + basePath: studioUrl, + projectId, + dataset, + + schema: { + types: schemaTypes, + }, + + plugins: [ + // https://www.sanity.io/docs/structure-tool-api + // The Structure Tool is a top-level view within Sanity Studio + // where editors can drill down to specific documents to edit them. + structureTool({ + defaultDocumentNode: documentNode, + structure: structure(), + }), + + // https://www.sanity.io/docs/the-vision-plugin + // Vision is a plugin that lets you quickly test your GROQ queries right from the Studio. + visionTool({ + title: 'Query', + defaultApiVersion: apiVersion, + defaultDataset: dataset, + }), + + // https://www.sanity.io/docs/configuring-the-presentation-tool + // https://www.sanity.io/docs/draft-mode + // The Presentation tool enables Visual Editing for interactive live previews. + // demo: https://github.com/javayhu/sanity-press/blob/main/sanity/src/presentation.ts#L4 + // demo: https://github.com/javayhu/sanity-press/blob/main/sanity/sanity.config.ts#L32 + presentationTool({ + previewUrl: { previewMode: { enable: "/api/draft" } }, + }), + + // https://www.sanity.io/plugins/sanity-plugin-media + // A convenient way to browse, manage and select all your Sanity assets. + media(), + + // https://www.sanity.io/plugins/sanity-plugin-markdown + markdownSchema({ input: CustomMarkdownInput }), + + // https://www.sanity.io/docs/dashboard + // Dashboard is a Sanity Studio tool that allows you to add widgets that display information + // about your content, project details, or anything else you'd want to put there. + dashboardTool({ + widgets: [ + projectInfoWidget(), + projectUsersWidget( + { layout: { width: 'large' } } + ), + sanityTutorialsWidget() + ], + }), + + // Configures the global "new document" button, and document actions, + // hide the "duplicate" action on the Singletons (such as Settings) + singletonPlugin([settings.name]), + + // https://www.sanity.io/plugins/code-input + // Syntax highlighted editor for code. + // if you need codeInput, you need to install @sanity/code-input + codeInput(), + + // https://www.sanity.io/plugins/sanity-plugin-asset-source-unsplash + // Search photos on Unsplash and insert them directly inside of your Sanity Studio. + unsplashImageAsset(), + + // https://www.sanity.io/docs/document-actions + customDocumentActionsPlugin() + ], +}) diff --git a/sanity.types.ts b/sanity.types.ts new file mode 100644 index 0000000..0ec3cd1 --- /dev/null +++ b/sanity.types.ts @@ -0,0 +1,2461 @@ +/** + * --------------------------------------------------------------------------------- + * This file has been generated by Sanity TypeGen. + * Command: `sanity typegen generate` + * + * Any modifications made directly to this file will be overwritten the next time + * the TypeScript definitions are generated. Please make changes to the Sanity + * schema definitions and/or GROQ queries if you need to update these types. + * + * For more information on how to use Sanity TypeGen, visit the official documentation: + * https://www.sanity.io/docs/sanity-typegen + * --------------------------------------------------------------------------------- + */ + +// Source: schema.json +export type SanityImagePaletteSwatch = { + _type: "sanity.imagePaletteSwatch"; + background?: string; + foreground?: string; + population?: number; + title?: string; +}; + +export type SanityImagePalette = { + _type: "sanity.imagePalette"; + darkMuted?: SanityImagePaletteSwatch; + lightVibrant?: SanityImagePaletteSwatch; + darkVibrant?: SanityImagePaletteSwatch; + vibrant?: SanityImagePaletteSwatch; + dominant?: SanityImagePaletteSwatch; + lightMuted?: SanityImagePaletteSwatch; + muted?: SanityImagePaletteSwatch; +}; + +export type SanityImageDimensions = { + _type: "sanity.imageDimensions"; + height?: number; + width?: number; + aspectRatio?: number; +}; + +export type SanityFileAsset = { + _id: string; + _type: "sanity.fileAsset"; + _createdAt: string; + _updatedAt: string; + _rev: string; + originalFilename?: string; + label?: string; + title?: string; + description?: string; + altText?: string; + sha1hash?: string; + extension?: string; + mimeType?: string; + size?: number; + assetId?: string; + uploadId?: string; + path?: string; + url?: string; + source?: SanityAssetSourceData; +}; + +export type Geopoint = { + _type: "geopoint"; + lat?: number; + lng?: number; + alt?: number; +}; + +export type BlockContent = Array<{ + children?: Array<{ + marks?: Array; + text?: string; + _type: "span"; + _key: string; + }>; + style?: "normal" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "blockquote"; + listItem?: "bullet" | "number"; + markDefs?: Array<{ + reference?: never; + _type: "internalLink"; + _key: string; + } | { + href?: string; + _type: "link"; + _key: string; + }>; + level?: number; + _type: "block"; + _key: string; +} | { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + _key: string; +} | { + _key: string; +} & Code>; + +export type Settings = { + _id: string; + _type: "settings"; + _createdAt: string; + _updatedAt: string; + _rev: string; + title?: string; +}; + +export type PasswordResetToken = { + _id: string; + _type: "passwordResetToken"; + _createdAt: string; + _updatedAt: string; + _rev: string; + identifier?: string; + token?: string; + expires?: string; +}; + +export type VerificationToken = { + _id: string; + _type: "verificationToken"; + _createdAt: string; + _updatedAt: string; + _rev: string; + identifier?: string; + token?: string; + expires?: string; +}; + +export type Page = { + _id: string; + _type: "page"; + _createdAt: string; + _updatedAt: string; + _rev: string; + title?: string; + slug?: Slug; + excerpt?: string; + body?: BlockContent; + publishDate?: string; +}; + +export type BlogCategory = { + _id: string; + _type: "blogCategory"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + priority?: number; +}; + +export type BlogPost = { + _id: string; + _type: "blogPost"; + _createdAt: string; + _updatedAt: string; + _rev: string; + title?: string; + slug?: Slug; + excerpt?: string; + featured?: boolean; + categories?: Array<{ + _ref: string; + _type: "reference"; + _weak?: boolean; + _key: string; + [internalGroqTypeReferenceTo]?: "blogCategory"; + }>; + author?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "user"; + }; + body?: BlockContent; + image?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + relatedPosts?: Array<{ + _ref: string; + _type: "reference"; + _weak?: boolean; + _key: string; + [internalGroqTypeReferenceTo]?: "blogPost"; + }>; + publishDate?: string; +}; + +export type Collection = { + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; +}; + +export type Category = { + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; +}; + +export type Group = { + _id: string; + _type: "group"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + priority?: number; +}; + +export type Tag = { + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; +}; + +export type Item = { + _id: string; + _type: "item"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + featured?: boolean; + link?: string; + affiliateLink?: string; + description?: string; + collections?: Array<{ + _ref: string; + _type: "reference"; + _weak?: boolean; + _key: string; + [internalGroqTypeReferenceTo]?: "collection"; + }>; + categories?: Array<{ + _ref: string; + _type: "reference"; + _weak?: boolean; + _key: string; + [internalGroqTypeReferenceTo]?: "category"; + }>; + tags?: Array<{ + _ref: string; + _type: "reference"; + _weak?: boolean; + _key: string; + [internalGroqTypeReferenceTo]?: "tag"; + }>; + submitter?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "user"; + }; + introduction?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + image?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + publishDate?: string; + pricePlan?: "free" | "pro" | "sponsor"; + freePlanStatus?: "submitting" | "pending" | "approved" | "rejected"; + proPlanStatus?: "submitting" | "pending" | "success" | "failed"; + rejectionReason?: "The item is not good fit for our directory" | "The image of the item is not in good quality" | "The icon of the item is not in good quality" | "The information of the item is not clear" | "The backlink to our site is not provided" | "Other reasons"; + sponsorPlanStatus?: "submitting" | "pending" | "success" | "failed"; + paid?: boolean; + order?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + }; + forceHidden?: boolean; + sponsor?: boolean; + sponsorStartDate?: string; + sponsorEndDate?: string; + note?: string; +}; + +export type Order = { + _id: string; + _type: "order"; + _createdAt: string; + _updatedAt: string; + _rev: string; + user?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "user"; + }; + item?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "item"; + }; + status?: "success" | "failed"; + date?: string; +}; + +export type SanityImageCrop = { + _type: "sanity.imageCrop"; + top?: number; + bottom?: number; + left?: number; + right?: number; +}; + +export type SanityImageHotspot = { + _type: "sanity.imageHotspot"; + x?: number; + y?: number; + height?: number; + width?: number; +}; + +export type SanityImageAsset = { + _id: string; + _type: "sanity.imageAsset"; + _createdAt: string; + _updatedAt: string; + _rev: string; + originalFilename?: string; + label?: string; + title?: string; + description?: string; + altText?: string; + sha1hash?: string; + extension?: string; + mimeType?: string; + size?: number; + assetId?: string; + uploadId?: string; + path?: string; + url?: string; + metadata?: SanityImageMetadata; + source?: SanityAssetSourceData; +}; + +export type SanityAssetSourceData = { + _type: "sanity.assetSourceData"; + name?: string; + id?: string; + url?: string; +}; + +export type SanityImageMetadata = { + _type: "sanity.imageMetadata"; + location?: Geopoint; + dimensions?: SanityImageDimensions; + palette?: SanityImagePalette; + lqip?: string; + blurHash?: string; + hasAlpha?: boolean; + isOpaque?: boolean; +}; + +export type User = { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; +}; + +export type Account = { + _id: string; + _type: "account"; + _createdAt: string; + _updatedAt: string; + _rev: string; + userId?: string; + type?: string; + provider?: string; + providerAccountId?: string; + refreshToken?: string; + accessToken?: string; + expiresAt?: number; + tokenType?: string; + scope?: string; + idToken?: string; + sessionState?: string; + user?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "user"; + }; +}; + +export type Code = { + _type: "code"; + language?: string; + filename?: string; + code?: string; + highlightedLines?: Array; +}; + +export type Markdown = string; + +export type MediaTag = { + _id: string; + _type: "media.tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: Slug; +}; + +export type Slug = { + _type: "slug"; + current?: string; + source?: string; +}; + +export type AllSanitySchemaTypes = SanityImagePaletteSwatch | SanityImagePalette | SanityImageDimensions | SanityFileAsset | Geopoint | BlockContent | Settings | PasswordResetToken | VerificationToken | Page | BlogCategory | BlogPost | Collection | Category | Group | Tag | Item | Order | SanityImageCrop | SanityImageHotspot | SanityImageAsset | SanityAssetSourceData | SanityImageMetadata | User | Account | Code | Markdown | MediaTag | Slug; +export declare const internalGroqTypeReferenceTo: unique symbol; +// Source: src/sanity/lib/queries.ts +// Variable: itemByIdQuery +// Query: *[_type == "item" && _id == $id][0] { _id, _createdAt, name, slug, description, link, affiliateLink, sponsor, sponsorStartDate, sponsorEndDate, note, featured, icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, paid, order, pricePlan, freePlanStatus, proPlanStatus, sponsorPlanStatus, rejectionReason, submitter->, collections[]->, categories[]->, tags[]->,} +export type ItemByIdQueryResult = { + _id: string; + _createdAt: string; + name: string | null; + slug: Slug | null; + description: string | null; + link: string | null; + affiliateLink: string | null; + sponsor: boolean | null; + sponsorStartDate: string | null; + sponsorEndDate: string | null; + note: string | null; + featured: boolean | null; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + paid: boolean | null; + order: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + } | null; + pricePlan: "free" | "pro" | "sponsor" | null; + freePlanStatus: "approved" | "pending" | "rejected" | "submitting" | null; + proPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + sponsorPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + rejectionReason: "Other reasons" | "The backlink to our site is not provided" | "The icon of the item is not in good quality" | "The image of the item is not in good quality" | "The information of the item is not clear" | "The item is not good fit for our directory" | null; + submitter: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + collections: Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; + }> | null; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }> | null; + tags: Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + }> | null; +} | null; +// Variable: itemInfoBySlugQuery +// Query: *[_type == "item" && slug.current == $slug][0] { _id, _createdAt, name, slug, description, link, affiliateLink, sponsor, sponsorStartDate, sponsorEndDate, note, featured, icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, paid, order, pricePlan, freePlanStatus, proPlanStatus, sponsorPlanStatus, rejectionReason, submitter->, collections[]->, categories[]->, tags[]->,} +export type ItemInfoBySlugQueryResult = { + _id: string; + _createdAt: string; + name: string | null; + slug: Slug | null; + description: string | null; + link: string | null; + affiliateLink: string | null; + sponsor: boolean | null; + sponsorStartDate: string | null; + sponsorEndDate: string | null; + note: string | null; + featured: boolean | null; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + paid: boolean | null; + order: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + } | null; + pricePlan: "free" | "pro" | "sponsor" | null; + freePlanStatus: "approved" | "pending" | "rejected" | "submitting" | null; + proPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + sponsorPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + rejectionReason: "Other reasons" | "The backlink to our site is not provided" | "The icon of the item is not in good quality" | "The image of the item is not in good quality" | "The information of the item is not clear" | "The item is not good fit for our directory" | null; + submitter: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + collections: Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; + }> | null; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }> | null; + tags: Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + }> | null; +} | null; +// Variable: itemFullInfoByIdQuery +// Query: *[_type == "item" && _id == $id][0] { _id, _createdAt, name, slug, description, link, affiliateLink, sponsor, sponsorStartDate, sponsorEndDate, note, featured, icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, paid, order, pricePlan, freePlanStatus, proPlanStatus, sponsorPlanStatus, rejectionReason, submitter->, collections[]->, categories[]->, tags[]->, introduction,} +export type ItemFullInfoByIdQueryResult = { + _id: string; + _createdAt: string; + name: string | null; + slug: Slug | null; + description: string | null; + link: string | null; + affiliateLink: string | null; + sponsor: boolean | null; + sponsorStartDate: string | null; + sponsorEndDate: string | null; + note: string | null; + featured: boolean | null; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + paid: boolean | null; + order: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + } | null; + pricePlan: "free" | "pro" | "sponsor" | null; + freePlanStatus: "approved" | "pending" | "rejected" | "submitting" | null; + proPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + sponsorPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + rejectionReason: "Other reasons" | "The backlink to our site is not provided" | "The icon of the item is not in good quality" | "The image of the item is not in good quality" | "The information of the item is not clear" | "The item is not good fit for our directory" | null; + submitter: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + collections: Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; + }> | null; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }> | null; + tags: Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + }> | null; + introduction: string | null; +} | null; +// Variable: itemFullInfoBySlugQuery +// Query: *[_type == "item" && slug.current == $slug && forceHidden != true] [0] { introduction, "related": *[_type == "item" && defined(slug.current) && defined(publishDate) && forceHidden != true && sponsor != true && count(categories[@._ref in ^.^.categories[]._ref]) > 0 && _id != ^._id] | order(publishedDate desc, _createdAt desc) [0...3] { _id, _createdAt, name, slug, description, link, affiliateLink, sponsor, sponsorStartDate, sponsorEndDate, note, featured, icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, paid, order, pricePlan, freePlanStatus, proPlanStatus, sponsorPlanStatus, rejectionReason, submitter->, collections[]->, categories[]->, tags[]->, }, _id, _createdAt, name, slug, description, link, affiliateLink, sponsor, sponsorStartDate, sponsorEndDate, note, featured, icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, paid, order, pricePlan, freePlanStatus, proPlanStatus, sponsorPlanStatus, rejectionReason, submitter->, collections[]->, categories[]->, tags[]->,} +export type ItemFullInfoBySlugQueryResult = { + introduction: string | null; + related: Array<{ + _id: string; + _createdAt: string; + name: string | null; + slug: Slug | null; + description: string | null; + link: string | null; + affiliateLink: string | null; + sponsor: boolean | null; + sponsorStartDate: string | null; + sponsorEndDate: string | null; + note: string | null; + featured: boolean | null; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + paid: boolean | null; + order: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + } | null; + pricePlan: "free" | "pro" | "sponsor" | null; + freePlanStatus: "approved" | "pending" | "rejected" | "submitting" | null; + proPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + sponsorPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + rejectionReason: "Other reasons" | "The backlink to our site is not provided" | "The icon of the item is not in good quality" | "The image of the item is not in good quality" | "The information of the item is not clear" | "The item is not good fit for our directory" | null; + submitter: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + collections: Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; + }> | null; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }> | null; + tags: Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + }> | null; + }>; + _id: string; + _createdAt: string; + name: string | null; + slug: Slug | null; + description: string | null; + link: string | null; + affiliateLink: string | null; + sponsor: boolean | null; + sponsorStartDate: string | null; + sponsorEndDate: string | null; + note: string | null; + featured: boolean | null; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + paid: boolean | null; + order: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + } | null; + pricePlan: "free" | "pro" | "sponsor" | null; + freePlanStatus: "approved" | "pending" | "rejected" | "submitting" | null; + proPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + sponsorPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + rejectionReason: "Other reasons" | "The backlink to our site is not provided" | "The icon of the item is not in good quality" | "The image of the item is not in good quality" | "The information of the item is not clear" | "The item is not good fit for our directory" | null; + submitter: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + collections: Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; + }> | null; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }> | null; + tags: Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + }> | null; +} | null; +// Variable: itemListQuery +// Query: *[_type == "item" && defined(slug.current) && defined(publishDate) && forceHidden != true && sponsor != true] | order(coalesce(featured, false) desc, publishDate desc) { _id, _createdAt, name, slug, description, link, affiliateLink, sponsor, sponsorStartDate, sponsorEndDate, note, featured, icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, paid, order, pricePlan, freePlanStatus, proPlanStatus, sponsorPlanStatus, rejectionReason, submitter->, collections[]->, categories[]->, tags[]->,} +export type ItemListQueryResult = Array<{ + _id: string; + _createdAt: string; + name: string | null; + slug: Slug | null; + description: string | null; + link: string | null; + affiliateLink: string | null; + sponsor: boolean | null; + sponsorStartDate: string | null; + sponsorEndDate: string | null; + note: string | null; + featured: boolean | null; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + paid: boolean | null; + order: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + } | null; + pricePlan: "free" | "pro" | "sponsor" | null; + freePlanStatus: "approved" | "pending" | "rejected" | "submitting" | null; + proPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + sponsorPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + rejectionReason: "Other reasons" | "The backlink to our site is not provided" | "The icon of the item is not in good quality" | "The image of the item is not in good quality" | "The information of the item is not clear" | "The item is not good fit for our directory" | null; + submitter: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + collections: Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; + }> | null; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }> | null; + tags: Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + }> | null; +}>; +// Variable: sponsorItemListQuery +// Query: *[_type == "item" && defined(slug.current) && defined(publishDate) && forceHidden != true && sponsor == true && sponsorStartDate <= now() && sponsorEndDate >= now()] | order(coalesce(featured, false) desc, publishDate desc) { _id, _createdAt, name, slug, description, link, affiliateLink, sponsor, sponsorStartDate, sponsorEndDate, note, featured, icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, paid, order, pricePlan, freePlanStatus, proPlanStatus, sponsorPlanStatus, rejectionReason, submitter->, collections[]->, categories[]->, tags[]->,} +export type SponsorItemListQueryResult = Array<{ + _id: string; + _createdAt: string; + name: string | null; + slug: Slug | null; + description: string | null; + link: string | null; + affiliateLink: string | null; + sponsor: boolean | null; + sponsorStartDate: string | null; + sponsorEndDate: string | null; + note: string | null; + featured: boolean | null; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + paid: boolean | null; + order: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + } | null; + pricePlan: "free" | "pro" | "sponsor" | null; + freePlanStatus: "approved" | "pending" | "rejected" | "submitting" | null; + proPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + sponsorPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + rejectionReason: "Other reasons" | "The backlink to our site is not provided" | "The icon of the item is not in good quality" | "The image of the item is not in good quality" | "The information of the item is not clear" | "The item is not good fit for our directory" | null; + submitter: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + collections: Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; + }> | null; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }> | null; + tags: Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + }> | null; +}>; +// Variable: itemListOfFeaturedQuery +// Query: *[_type == "item" && defined(slug.current) && defined(publishDate) && forceHidden != true && sponsor != true && featured == true] | order(coalesce(featured, false) desc, publishDate desc) [0...$count] { _id, _createdAt, name, slug, description, link, affiliateLink, sponsor, sponsorStartDate, sponsorEndDate, note, featured, icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, paid, order, pricePlan, freePlanStatus, proPlanStatus, sponsorPlanStatus, rejectionReason, submitter->, collections[]->, categories[]->, tags[]->,} +export type ItemListOfFeaturedQueryResult = Array<{ + _id: string; + _createdAt: string; + name: string | null; + slug: Slug | null; + description: string | null; + link: string | null; + affiliateLink: string | null; + sponsor: boolean | null; + sponsorStartDate: string | null; + sponsorEndDate: string | null; + note: string | null; + featured: boolean | null; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + paid: boolean | null; + order: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + } | null; + pricePlan: "free" | "pro" | "sponsor" | null; + freePlanStatus: "approved" | "pending" | "rejected" | "submitting" | null; + proPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + sponsorPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + rejectionReason: "Other reasons" | "The backlink to our site is not provided" | "The icon of the item is not in good quality" | "The image of the item is not in good quality" | "The information of the item is not clear" | "The item is not good fit for our directory" | null; + submitter: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + collections: Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; + }> | null; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }> | null; + tags: Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + }> | null; +}>; +// Variable: itemListOfLatestQuery +// Query: *[_type == "item" && defined(slug.current) && defined(publishDate) && forceHidden != true && sponsor != true] | order(coalesce(featured, false) desc, publishDate desc) [0...$count] { _id, _createdAt, name, slug, description, link, affiliateLink, sponsor, sponsorStartDate, sponsorEndDate, note, featured, icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, paid, order, pricePlan, freePlanStatus, proPlanStatus, sponsorPlanStatus, rejectionReason, submitter->, collections[]->, categories[]->, tags[]->,} +export type ItemListOfLatestQueryResult = Array<{ + _id: string; + _createdAt: string; + name: string | null; + slug: Slug | null; + description: string | null; + link: string | null; + affiliateLink: string | null; + sponsor: boolean | null; + sponsorStartDate: string | null; + sponsorEndDate: string | null; + note: string | null; + featured: boolean | null; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + paid: boolean | null; + order: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + } | null; + pricePlan: "free" | "pro" | "sponsor" | null; + freePlanStatus: "approved" | "pending" | "rejected" | "submitting" | null; + proPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + sponsorPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + rejectionReason: "Other reasons" | "The backlink to our site is not provided" | "The icon of the item is not in good quality" | "The image of the item is not in good quality" | "The information of the item is not clear" | "The item is not good fit for our directory" | null; + submitter: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + collections: Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; + }> | null; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }> | null; + tags: Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + }> | null; +}>; +// Variable: collectionListQuery +// Query: *[_type == "collection" && defined(slug.current)] | order(priority desc) { ..., icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, },} +export type CollectionListQueryResult = Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + priority?: number; +}>; +// Variable: collectionQuery +// Query: *[_type == "collection" && slug.current == $slug][0] { ..., icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, },} +export type CollectionQueryResult = { + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + priority?: number; +} | null; +// Variable: groupListQuery +// Query: *[_type=="group"] | order(priority desc, _createdAt asc) { ..., "categories": *[_type=='category' && references(^._id)] | order(priority desc, _createdAt asc) { ..., }} +export type GroupListQueryResult = Array<{ + _id: string; + _type: "group"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + priority?: number; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }>; +}>; +// Variable: categoryListQuery +// Query: *[_type == "category" && defined(slug.current)] | order(priority desc) { ...,} +export type CategoryListQueryResult = Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; +}>; +// Variable: categoryQuery +// Query: *[_type == "category" && slug.current == $slug][0] { ...,} +export type CategoryQueryResult = { + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; +} | null; +// Variable: tagListQuery +// Query: *[_type == "tag" && defined(slug.current)] | order(slug.current asc) { ...,} +export type TagListQueryResult = Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; +}>; +// Variable: tagQuery +// Query: *[_type == "tag" && slug.current == $slug][0] { ...,} +export type TagQueryResult = { + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; +} | null; +// Variable: submissionListQuery +// Query: *[_type == "item" && defined(slug.current) && submitter._ref == $userId] | order(_createdAt desc) { _id, _createdAt, name, slug, description, link, affiliateLink, sponsor, sponsorStartDate, sponsorEndDate, note, featured, icon { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, paid, order, pricePlan, freePlanStatus, proPlanStatus, sponsorPlanStatus, rejectionReason, submitter->, collections[]->, categories[]->, tags[]->,} +export type SubmissionListQueryResult = Array<{ + _id: string; + _createdAt: string; + name: string | null; + slug: Slug | null; + description: string | null; + link: string | null; + affiliateLink: string | null; + sponsor: boolean | null; + sponsorStartDate: string | null; + sponsorEndDate: string | null; + note: string | null; + featured: boolean | null; + icon: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + paid: boolean | null; + order: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "order"; + } | null; + pricePlan: "free" | "pro" | "sponsor" | null; + freePlanStatus: "approved" | "pending" | "rejected" | "submitting" | null; + proPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + sponsorPlanStatus: "failed" | "pending" | "submitting" | "success" | null; + rejectionReason: "Other reasons" | "The backlink to our site is not provided" | "The icon of the item is not in good quality" | "The image of the item is not in good quality" | "The information of the item is not clear" | "The item is not good fit for our directory" | null; + submitter: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + collections: Array<{ + _id: string; + _type: "collection"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + icon?: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + }; + priority?: number; + }> | null; + categories: Array<{ + _id: string; + _type: "category"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + group?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "group"; + }; + priority?: number; + }> | null; + tags: Array<{ + _id: string; + _type: "tag"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + }> | null; +}>; +// Variable: pageQuery +// Query: *[_type == "page" && slug.current == $slug][0] { ..., body[]{ ..., markDefs[]{ ..., _type == "internalLink" => { "slug": @.reference->slug } } }, } +export type PageQueryResult = { + _id: string; + _type: "page"; + _createdAt: string; + _updatedAt: string; + _rev: string; + title?: string; + slug?: Slug; + excerpt?: string; + body: Array<{ + children?: Array<{ + marks?: Array; + text?: string; + _type: "span"; + _key: string; + }>; + style?: "blockquote" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "normal"; + listItem?: "bullet" | "number"; + markDefs: Array<{ + reference?: never; + _type: "internalLink"; + _key: string; + slug: null; + } | { + href?: string; + _type: "link"; + _key: string; + }> | null; + level?: number; + _type: "block"; + _key: string; + } | { + _key: string; + _type: "code"; + language?: string; + filename?: string; + code?: string; + highlightedLines?: Array; + markDefs: null; + } | { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + _key: string; + markDefs: null; + }> | null; + publishDate?: string; +} | null; +// Variable: blogCategoryListQuery +// Query: *[_type == "blogCategory" && defined(slug.current)] | order(priority desc) { name, slug, description, priority,} +export type BlogCategoryListQueryResult = Array<{ + name: string | null; + slug: Slug | null; + description: string | null; + priority: number | null; +}>; +// Variable: blogCategoryMetadateQuery +// Query: *[_type == "blogCategory" && slug.current == $slug][0] { name, slug, description, priority, } +export type BlogCategoryMetadateQueryResult = { + name: string | null; + slug: Slug | null; + description: string | null; + priority: number | null; +} | null; +// Variable: blogPostQuery +// Query: *[_type == "blogPost" && slug.current == $slug][0] { relatedPosts[]-> { _id, _createdAt, title, slug, excerpt, featured, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, author->, categories[]->, }, body[]{ ..., markDefs[]{ ..., _type == "internalLink" => { "slug": @.reference->slug } } }, _id, _createdAt, title, slug, excerpt, featured, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, author->, categories[]->, // "estReadingTime": round(length(pt::text(body)) / 5 / 180 ), // "related": *[_type == "blogPost" && count(categories[@._ref in ^.^.categories[]._ref]) > 0 ] | order(publishedDate desc, _createdAt desc) [0...2] { // slug, // title, // excerpt, // publishDate, // "date": coalesce(publishedDate, _createdAt), // "image": image // },} +export type BlogPostQueryResult = { + relatedPosts: Array<{ + _id: string; + _createdAt: string; + title: string | null; + slug: Slug | null; + excerpt: string | null; + featured: boolean | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + author: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + categories: Array<{ + _id: string; + _type: "blogCategory"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + priority?: number; + }> | null; + }> | null; + body: Array<{ + children?: Array<{ + marks?: Array; + text?: string; + _type: "span"; + _key: string; + }>; + style?: "blockquote" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "normal"; + listItem?: "bullet" | "number"; + markDefs: Array<{ + reference?: never; + _type: "internalLink"; + _key: string; + slug: null; + } | { + href?: string; + _type: "link"; + _key: string; + }> | null; + level?: number; + _type: "block"; + _key: string; + } | { + _key: string; + _type: "code"; + language?: string; + filename?: string; + code?: string; + highlightedLines?: Array; + markDefs: null; + } | { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + _key: string; + markDefs: null; + }> | null; + _id: string; + _createdAt: string; + title: string | null; + slug: Slug | null; + excerpt: string | null; + featured: boolean | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + author: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + categories: Array<{ + _id: string; + _type: "blogCategory"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + priority?: number; + }> | null; +} | null; +// Variable: blogPostMetadataQuery +// Query: *[_type == "blogPost" && slug.current == $slug][0] { _id, _createdAt, title, slug, excerpt, featured, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, author->, categories[]->,} +export type BlogPostMetadataQueryResult = { + _id: string; + _createdAt: string; + title: string | null; + slug: Slug | null; + excerpt: string | null; + featured: boolean | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + author: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + categories: Array<{ + _id: string; + _type: "blogCategory"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + priority?: number; + }> | null; +} | null; +// Variable: blogPostListQuery +// Query: *[_type == "blogPost" && defined(slug.current) && defined(publishDate)] | order(publishDate desc) { _id, _createdAt, title, slug, excerpt, featured, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, author->, categories[]->,} +export type BlogPostListQueryResult = Array<{ + _id: string; + _createdAt: string; + title: string | null; + slug: Slug | null; + excerpt: string | null; + featured: boolean | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + author: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + categories: Array<{ + _id: string; + _type: "blogCategory"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + priority?: number; + }> | null; +}>; +// Variable: blogPostListOfLatestQuery +// Query: *[_type == "blogPost" && defined(slug.current) && defined(publishDate)] | order(publishDate desc) [0...$count] { _id, _createdAt, title, slug, excerpt, featured, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, author->, categories[]->,} +export type BlogPostListOfLatestQueryResult = Array<{ + _id: string; + _createdAt: string; + title: string | null; + slug: Slug | null; + excerpt: string | null; + featured: boolean | null; + image: { + asset?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "sanity.imageAsset"; + }; + hotspot?: SanityImageHotspot; + crop?: SanityImageCrop; + alt?: string; + _type: "image"; + blurDataURL: string | null; + imageColor: string | null; + } | null; + publishDate: string | null; + author: { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts?: { + _ref: string; + _type: "reference"; + _weak?: boolean; + [internalGroqTypeReferenceTo]?: "account"; + }; + stripeCustomerId?: string; + } | null; + categories: Array<{ + _id: string; + _type: "blogCategory"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + slug?: Slug; + description?: string; + priority?: number; + }> | null; +}>; +// Variable: searchBlogQuery +// Query: *[_type == "blogPost" && defined(slug.current) && defined(publishDate) && _score > 0] | score(title match $query || excerpt match $query || pt::text(body) match $query) | order(_score desc) { _score, _id, _createdAt, title, slug, excerpt, featured, image { ..., "blurDataURL": asset->metadata.lqip, "imageColor": asset->metadata.palette.dominant.background, }, publishDate, author->, categories[]->,} +export type SearchBlogQueryResult = Array; +// Variable: blogCategoryWithCountQuery +// Query: *[_type == "blogCategory"] { name, slug, description, priority, "count": count(*[_type == "blogPost" && references(^._id)])} | order(count desc) [0...5] +export type BlogCategoryWithCountQueryResult = Array<{ + name: string | null; + slug: Slug | null; + description: string | null; + priority: number | null; + count: number; +}>; +// Variable: userWithAccountsQuery +// Query: *[_type == "user" && _id == $id][0] { ..., accounts[]->, } +export type UserWithAccountsQueryResult = { + _id: string; + _type: "user"; + _createdAt: string; + _updatedAt: string; + _rev: string; + name?: string; + email?: string; + emailVerified?: string; + image?: string; + link?: string; + password?: string; + role?: "ADMIN" | "USER"; + accounts: null; + stripeCustomerId?: string; +} | null; +// Variable: itemListQueryForSitemap +// Query: *[_type == "item" && defined(slug.current) && defined(publishDate)] | order(_createdAt asc) { _id, _updatedAt, "slug": slug.current,} +export type ItemListQueryForSitemapResult = Array<{ + _id: string; + _updatedAt: string; + slug: string | null; +}>; +// Variable: categoryListQueryForSitemap +// Query: *[_type == "category" && defined(slug.current)] | order(_createdAt asc) { _id, _updatedAt, "slug": slug.current, "count": count(*[_type == "item" && defined(publishDate) && forceHidden != true && references(^._id)])} +export type CategoryListQueryForSitemapResult = Array<{ + _id: string; + _updatedAt: string; + slug: string | null; + count: number; +}>; +// Variable: tagListQueryForSitemap +// Query: *[_type == "tag" && defined(slug.current)] | order(_createdAt asc) { _id, _updatedAt, "slug": slug.current, "count": count(*[_type == "item" && defined(publishDate) && forceHidden != true && references(^._id)])} +export type TagListQueryForSitemapResult = Array<{ + _id: string; + _updatedAt: string; + slug: string | null; + count: number; +}>; +// Variable: collectionListQueryForSitemap +// Query: *[_type == "collection" && defined(slug.current)] | order(_createdAt asc) { _id, _updatedAt, "slug": slug.current, "count": count(*[_type == "item" && defined(publishDate) && forceHidden != true && references(^._id)])} +export type CollectionListQueryForSitemapResult = Array<{ + _id: string; + _updatedAt: string; + slug: string | null; + count: number; +}>; +// Variable: blogListQueryForSitemap +// Query: *[_type == "blogPost" && defined(slug.current) && defined(publishDate)] | order(publishDate desc, _createdAt asc) { _id, _updatedAt, "slug": slug.current,} +export type BlogListQueryForSitemapResult = Array<{ + _id: string; + _updatedAt: string; + slug: string | null; +}>; +// Variable: blogCategoryListQueryForSitemap +// Query: *[_type == "blogCategory" && defined(slug.current)] | order(_createdAt asc) { _id, _updatedAt, "slug": slug.current, "count": count(*[_type == "blogPost" && defined(publishDate) && references(^._id)])} +export type BlogCategoryListQueryForSitemapResult = Array<{ + _id: string; + _updatedAt: string; + slug: string | null; + count: number; +}>; +// Variable: pageListQueryForSitemap +// Query: *[_type == "page" && defined(slug.current)] | order(_createdAt asc) { _id, _updatedAt, "slug": slug.current,} +export type PageListQueryForSitemapResult = Array<{ + _id: string; + _updatedAt: string; + slug: string | null; +}>; + +// Query TypeMap +import "@sanity/client"; +declare module "@sanity/client" { + interface SanityQueries { + "*[_type == \"item\" && _id == $id][0] {\n \n _id,\n _createdAt,\n name,\n slug,\n description,\n link,\n affiliateLink,\n sponsor,\n sponsorStartDate,\n sponsorEndDate,\n note,\n featured,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n paid,\n order,\n pricePlan,\n freePlanStatus,\n proPlanStatus,\n sponsorPlanStatus,\n rejectionReason,\n submitter->,\n collections[]->,\n categories[]->,\n tags[]->,\n\n}": ItemByIdQueryResult; + "*[_type == \"item\" && slug.current == $slug][0] {\n \n _id,\n _createdAt,\n name,\n slug,\n description,\n link,\n affiliateLink,\n sponsor,\n sponsorStartDate,\n sponsorEndDate,\n note,\n featured,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n paid,\n order,\n pricePlan,\n freePlanStatus,\n proPlanStatus,\n sponsorPlanStatus,\n rejectionReason,\n submitter->,\n collections[]->,\n categories[]->,\n tags[]->,\n\n}": ItemInfoBySlugQueryResult; + "*[_type == \"item\" && _id == $id][0] {\n \n \n _id,\n _createdAt,\n name,\n slug,\n description,\n link,\n affiliateLink,\n sponsor,\n sponsorStartDate,\n sponsorEndDate,\n note,\n featured,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n paid,\n order,\n pricePlan,\n freePlanStatus,\n proPlanStatus,\n sponsorPlanStatus,\n rejectionReason,\n submitter->,\n collections[]->,\n categories[]->,\n tags[]->,\n\n introduction,\n\n}": ItemFullInfoByIdQueryResult; + "*[_type == \"item\" && slug.current == $slug \n&& forceHidden != true] [0] {\n \n introduction,\n \"related\": *[_type == \"item\" && defined(slug.current) \n && defined(publishDate) \n && forceHidden != true\n && sponsor != true\n && count(categories[@._ref in ^.^.categories[]._ref]) > 0 && _id != ^._id] \n | order(publishedDate desc, _createdAt desc) [0...3] {\n \n _id,\n _createdAt,\n name,\n slug,\n description,\n link,\n affiliateLink,\n sponsor,\n sponsorStartDate,\n sponsorEndDate,\n note,\n featured,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n paid,\n order,\n pricePlan,\n freePlanStatus,\n proPlanStatus,\n sponsorPlanStatus,\n rejectionReason,\n submitter->,\n collections[]->,\n categories[]->,\n tags[]->,\n\n },\n \n _id,\n _createdAt,\n name,\n slug,\n description,\n link,\n affiliateLink,\n sponsor,\n sponsorStartDate,\n sponsorEndDate,\n note,\n featured,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n paid,\n order,\n pricePlan,\n freePlanStatus,\n proPlanStatus,\n sponsorPlanStatus,\n rejectionReason,\n submitter->,\n collections[]->,\n categories[]->,\n tags[]->,\n\n\n}": ItemFullInfoBySlugQueryResult; + "*[_type == \"item\" && defined(slug.current) \n && defined(publishDate)\n && forceHidden != true\n && sponsor != true]\n | order(coalesce(featured, false) desc, publishDate desc) {\n \n _id,\n _createdAt,\n name,\n slug,\n description,\n link,\n affiliateLink,\n sponsor,\n sponsorStartDate,\n sponsorEndDate,\n note,\n featured,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n paid,\n order,\n pricePlan,\n freePlanStatus,\n proPlanStatus,\n sponsorPlanStatus,\n rejectionReason,\n submitter->,\n collections[]->,\n categories[]->,\n tags[]->,\n\n}": ItemListQueryResult; + "*[_type == \"item\" && defined(slug.current) \n && defined(publishDate)\n && forceHidden != true\n && sponsor == true\n && sponsorStartDate <= now()\n && sponsorEndDate >= now()] \n | order(coalesce(featured, false) desc, publishDate desc) {\n \n _id,\n _createdAt,\n name,\n slug,\n description,\n link,\n affiliateLink,\n sponsor,\n sponsorStartDate,\n sponsorEndDate,\n note,\n featured,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n paid,\n order,\n pricePlan,\n freePlanStatus,\n proPlanStatus,\n sponsorPlanStatus,\n rejectionReason,\n submitter->,\n collections[]->,\n categories[]->,\n tags[]->,\n\n}": SponsorItemListQueryResult; + "*[_type == \"item\" && defined(slug.current) \n && defined(publishDate) \n && forceHidden != true \n && sponsor != true\n && featured == true] \n | order(coalesce(featured, false) desc, publishDate desc) [0...$count] {\n \n _id,\n _createdAt,\n name,\n slug,\n description,\n link,\n affiliateLink,\n sponsor,\n sponsorStartDate,\n sponsorEndDate,\n note,\n featured,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n paid,\n order,\n pricePlan,\n freePlanStatus,\n proPlanStatus,\n sponsorPlanStatus,\n rejectionReason,\n submitter->,\n collections[]->,\n categories[]->,\n tags[]->,\n\n}": ItemListOfFeaturedQueryResult; + "*[_type == \"item\" && defined(slug.current) \n && defined(publishDate) \n && forceHidden != true\n && sponsor != true] \n | order(coalesce(featured, false) desc, publishDate desc) [0...$count] {\n \n _id,\n _createdAt,\n name,\n slug,\n description,\n link,\n affiliateLink,\n sponsor,\n sponsorStartDate,\n sponsorEndDate,\n note,\n featured,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n paid,\n order,\n pricePlan,\n freePlanStatus,\n proPlanStatus,\n sponsorPlanStatus,\n rejectionReason,\n submitter->,\n collections[]->,\n categories[]->,\n tags[]->,\n\n}": ItemListOfLatestQueryResult; + "*[_type == \"collection\" && defined(slug.current)] \n | order(priority desc) {\n \n ...,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n\n}": CollectionListQueryResult; + "*[_type == \"collection\" && slug.current == $slug][0] {\n \n ...,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n\n}": CollectionQueryResult; + "*[_type==\"group\"] | order(priority desc, _createdAt asc) {\n \n ...,\n \"categories\": *[_type=='category' && references(^._id)] | order(priority desc, _createdAt asc)\n { \n ..., \n }\n\n}": GroupListQueryResult; + "*[_type == \"category\" && defined(slug.current)] \n | order(priority desc) {\n \n ...,\n\n}": CategoryListQueryResult; + "*[_type == \"category\" && slug.current == $slug][0] {\n \n ...,\n\n}": CategoryQueryResult; + "*[_type == \"tag\" && defined(slug.current)] \n | order(slug.current asc) {\n \n ...,\n\n}": TagListQueryResult; + "*[_type == \"tag\" && slug.current == $slug][0] {\n \n ...,\n\n}": TagQueryResult; + "*[_type == \"item\" && defined(slug.current)\n && submitter._ref == $userId] \n | order(_createdAt desc) {\n \n _id,\n _createdAt,\n name,\n slug,\n description,\n link,\n affiliateLink,\n sponsor,\n sponsorStartDate,\n sponsorEndDate,\n note,\n featured,\n icon {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n paid,\n order,\n pricePlan,\n freePlanStatus,\n proPlanStatus,\n sponsorPlanStatus,\n rejectionReason,\n submitter->,\n collections[]->,\n categories[]->,\n tags[]->,\n\n}": SubmissionListQueryResult; + "\n *[_type == \"page\" && slug.current == $slug][0] {\n ...,\n body[]{\n ...,\n markDefs[]{\n ...,\n _type == \"internalLink\" => {\n \"slug\": @.reference->slug\n }\n }\n },\n }\n": PageQueryResult; + "\n *[_type == \"blogCategory\" && defined(slug.current)] \n | order(priority desc) {\n \n name,\n slug,\n description,\n priority,\n\n}": BlogCategoryListQueryResult; + "\n *[_type == \"blogCategory\" && slug.current == $slug][0] {\n \n name,\n slug,\n description,\n priority,\n\n }\n": BlogCategoryMetadateQueryResult; + "\n *[_type == \"blogPost\" && slug.current == $slug][0] {\n \n relatedPosts[]-> {\n \n _id,\n _createdAt,\n title,\n slug,\n excerpt,\n featured,\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n author->,\n categories[]->,\n\n },\n body[]{\n ...,\n markDefs[]{\n ...,\n _type == \"internalLink\" => {\n \"slug\": @.reference->slug\n }\n }\n },\n \n _id,\n _createdAt,\n title,\n slug,\n excerpt,\n featured,\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n author->,\n categories[]->,\n\n \n // \"estReadingTime\": round(length(pt::text(body)) / 5 / 180 ),\n // \"related\": *[_type == \"blogPost\" && count(categories[@._ref in ^.^.categories[]._ref]) > 0 ] | order(publishedDate desc, _createdAt desc) [0...2] {\n // slug,\n // title,\n // excerpt,\n // publishDate,\n // \"date\": coalesce(publishedDate, _createdAt),\n // \"image\": image\n // },\n\n}": BlogPostQueryResult; + "\n *[_type == \"blogPost\" && slug.current == $slug][0] {\n \n _id,\n _createdAt,\n title,\n slug,\n excerpt,\n featured,\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n author->,\n categories[]->,\n\n}": BlogPostMetadataQueryResult; + "\n *[_type == \"blogPost\" && defined(slug.current) && defined(publishDate)] \n | order(publishDate desc) {\n \n _id,\n _createdAt,\n title,\n slug,\n excerpt,\n featured,\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n author->,\n categories[]->,\n\n}": BlogPostListQueryResult; + "\n *[_type == \"blogPost\" && defined(slug.current) && defined(publishDate)] \n | order(publishDate desc) [0...$count] {\n \n _id,\n _createdAt,\n title,\n slug,\n excerpt,\n featured,\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n author->,\n categories[]->,\n\n}": BlogPostListOfLatestQueryResult; + "\n *[_type == \"blogPost\" && defined(slug.current) && defined(publishDate) && _score > 0]\n | score(title match $query || excerpt match $query || pt::text(body) match $query)\n | order(_score desc) {\n _score,\n \n _id,\n _createdAt,\n title,\n slug,\n excerpt,\n featured,\n image {\n ...,\n \"blurDataURL\": asset->metadata.lqip,\n \"imageColor\": asset->metadata.palette.dominant.background,\n },\n publishDate,\n author->,\n categories[]->,\n\n}": SearchBlogQueryResult; + "\n *[_type == \"blogCategory\"] {\n \n name,\n slug,\n description,\n priority,\n\n \"count\": count(*[_type == \"blogPost\" && references(^._id)])\n} | order(count desc) [0...5]": BlogCategoryWithCountQueryResult; + "\n *[_type == \"user\" && _id == $id][0] {\n ...,\n accounts[]->,\n }\n": UserWithAccountsQueryResult; + "*[_type == \"item\" && defined(slug.current) && defined(publishDate)] | order(_createdAt asc) {\n _id,\n _updatedAt,\n \"slug\": slug.current,\n}": ItemListQueryForSitemapResult; + "*[_type == \"category\" && defined(slug.current)] | order(_createdAt asc) {\n _id, \n _updatedAt,\n \"slug\": slug.current,\n \"count\": count(*[_type == \"item\" && defined(publishDate) && forceHidden != true && references(^._id)])\n}": CategoryListQueryForSitemapResult; + "*[_type == \"tag\" && defined(slug.current)] | order(_createdAt asc) {\n _id, \n _updatedAt,\n \"slug\": slug.current,\n \"count\": count(*[_type == \"item\" && defined(publishDate) && forceHidden != true && references(^._id)])\n}": TagListQueryForSitemapResult; + "*[_type == \"collection\" && defined(slug.current)] | order(_createdAt asc) {\n _id, \n _updatedAt,\n \"slug\": slug.current,\n \"count\": count(*[_type == \"item\" && defined(publishDate) && forceHidden != true && references(^._id)])\n}": CollectionListQueryForSitemapResult; + "*[_type == \"blogPost\" && defined(slug.current) && defined(publishDate)] | order(publishDate desc, _createdAt asc) {\n _id, \n _updatedAt,\n \"slug\": slug.current,\n}": BlogListQueryForSitemapResult; + "*[_type == \"blogCategory\" && defined(slug.current)] | order(_createdAt asc) {\n _id, \n _updatedAt,\n \"slug\": slug.current,\n \"count\": count(*[_type == \"blogPost\" && defined(publishDate) && references(^._id)])\n}": BlogCategoryListQueryForSitemapResult; + "*[_type == \"page\" && defined(slug.current)] | order(_createdAt asc) {\n _id, \n _updatedAt,\n \"slug\": slug.current,\n}": PageListQueryForSitemapResult; + } +} diff --git a/schema.json b/schema.json new file mode 100644 index 0000000..b2cbc07 --- /dev/null +++ b/schema.json @@ -0,0 +1,3022 @@ +[ + { + "name": "sanity.imagePaletteSwatch", + "type": "type", + "value": { + "type": "object", + "attributes": { + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sanity.imagePaletteSwatch" + } + }, + "background": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "foreground": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "population": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "title": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + } + }, + { + "name": "sanity.imagePalette", + "type": "type", + "value": { + "type": "object", + "attributes": { + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sanity.imagePalette" + } + }, + "darkMuted": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imagePaletteSwatch" + }, + "optional": true + }, + "lightVibrant": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imagePaletteSwatch" + }, + "optional": true + }, + "darkVibrant": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imagePaletteSwatch" + }, + "optional": true + }, + "vibrant": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imagePaletteSwatch" + }, + "optional": true + }, + "dominant": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imagePaletteSwatch" + }, + "optional": true + }, + "lightMuted": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imagePaletteSwatch" + }, + "optional": true + }, + "muted": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imagePaletteSwatch" + }, + "optional": true + } + } + } + }, + { + "name": "sanity.imageDimensions", + "type": "type", + "value": { + "type": "object", + "attributes": { + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sanity.imageDimensions" + } + }, + "height": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "width": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "aspectRatio": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + } + } + } + }, + { + "name": "sanity.fileAsset", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sanity.fileAsset" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "originalFilename": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "label": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "title": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "description": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "altText": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "sha1hash": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "extension": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "mimeType": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "size": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "assetId": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "uploadId": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "path": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "url": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "source": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.assetSourceData" + }, + "optional": true + } + } + }, + { + "name": "geopoint", + "type": "type", + "value": { + "type": "object", + "attributes": { + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "geopoint" + } + }, + "lat": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "lng": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "alt": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + } + } + } + }, + { + "name": "blockContent", + "type": "type", + "value": { + "type": "array", + "of": { + "type": "union", + "of": [ + { + "type": "object", + "attributes": { + "children": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "object", + "attributes": { + "marks": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "string" + } + }, + "optional": true + }, + "text": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "span" + } + } + }, + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + } + }, + "optional": true + }, + "style": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "normal" + }, + { + "type": "string", + "value": "h1" + }, + { + "type": "string", + "value": "h2" + }, + { + "type": "string", + "value": "h3" + }, + { + "type": "string", + "value": "h4" + }, + { + "type": "string", + "value": "h5" + }, + { + "type": "string", + "value": "h6" + }, + { + "type": "string", + "value": "blockquote" + } + ] + }, + "optional": true + }, + "listItem": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "bullet" + }, + { + "type": "string", + "value": "number" + } + ] + }, + "optional": true + }, + "markDefs": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "union", + "of": [ + { + "type": "object", + "attributes": { + "reference": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [] + }, + "optional": true + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "internalLink" + } + } + }, + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + }, + { + "type": "object", + "attributes": { + "href": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "link" + } + } + }, + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + } + ] + } + }, + "optional": true + }, + "level": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "block" + } + } + }, + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + }, + { + "type": "object", + "attributes": { + "asset": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "sanity.imageAsset" + }, + "optional": true + }, + "hotspot": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageHotspot" + }, + "optional": true + }, + "crop": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageCrop" + }, + "optional": true + }, + "alt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "image" + } + } + }, + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + }, + { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + }, + "rest": { + "type": "inline", + "name": "code" + } + } + ] + } + } + }, + { + "name": "settings", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "settings" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "title": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + }, + { + "name": "passwordResetToken", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "passwordResetToken" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "identifier": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "token": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "expires": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + }, + { + "name": "verificationToken", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "verificationToken" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "identifier": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "token": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "expires": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + }, + { + "name": "page", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "page" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "title": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "slug": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "slug" + }, + "optional": true + }, + "excerpt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "body": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "blockContent" + }, + "optional": true + }, + "publishDate": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + }, + { + "name": "blogCategory", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "blogCategory" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "name": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "slug": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "slug" + }, + "optional": true + }, + "description": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "priority": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + } + } + }, + { + "name": "blogPost", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "blogPost" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "title": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "slug": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "slug" + }, + "optional": true + }, + "excerpt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "featured": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + }, + "categories": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "blogCategory", + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + } + }, + "optional": true + }, + "author": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "user" + }, + "optional": true + }, + "body": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "blockContent" + }, + "optional": true + }, + "image": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "asset": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "sanity.imageAsset" + }, + "optional": true + }, + "hotspot": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageHotspot" + }, + "optional": true + }, + "crop": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageCrop" + }, + "optional": true + }, + "alt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "image" + } + } + } + }, + "optional": true + }, + "relatedPosts": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "blogPost", + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + } + }, + "optional": true + }, + "publishDate": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + }, + { + "name": "collection", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "collection" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "name": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "slug": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "slug" + }, + "optional": true + }, + "description": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "icon": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "asset": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "sanity.imageAsset" + }, + "optional": true + }, + "hotspot": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageHotspot" + }, + "optional": true + }, + "crop": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageCrop" + }, + "optional": true + }, + "alt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "image" + } + } + } + }, + "optional": true + }, + "priority": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + } + } + }, + { + "name": "category", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "category" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "name": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "slug": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "slug" + }, + "optional": true + }, + "description": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "group": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "group" + }, + "optional": true + }, + "priority": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + } + } + }, + { + "name": "group", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "group" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "name": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "slug": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "slug" + }, + "optional": true + }, + "description": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "priority": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + } + } + }, + { + "name": "tag", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "tag" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "name": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "slug": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "slug" + }, + "optional": true + }, + "description": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + }, + { + "name": "item", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "item" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "name": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "slug": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "slug" + }, + "optional": true + }, + "featured": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + }, + "link": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "affiliateLink": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "description": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "collections": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "collection", + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + } + }, + "optional": true + }, + "categories": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "category", + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + } + }, + "optional": true + }, + "tags": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "tag", + "rest": { + "type": "object", + "attributes": { + "_key": { + "type": "objectAttribute", + "value": { + "type": "string" + } + } + } + } + } + }, + "optional": true + }, + "submitter": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "user" + }, + "optional": true + }, + "introduction": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "icon": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "asset": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "sanity.imageAsset" + }, + "optional": true + }, + "hotspot": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageHotspot" + }, + "optional": true + }, + "crop": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageCrop" + }, + "optional": true + }, + "alt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "image" + } + } + } + }, + "optional": true + }, + "image": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "asset": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "sanity.imageAsset" + }, + "optional": true + }, + "hotspot": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageHotspot" + }, + "optional": true + }, + "crop": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageCrop" + }, + "optional": true + }, + "alt": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "image" + } + } + } + }, + "optional": true + }, + "publishDate": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "pricePlan": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "free" + }, + { + "type": "string", + "value": "pro" + }, + { + "type": "string", + "value": "sponsor" + } + ] + }, + "optional": true + }, + "freePlanStatus": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "submitting" + }, + { + "type": "string", + "value": "pending" + }, + { + "type": "string", + "value": "approved" + }, + { + "type": "string", + "value": "rejected" + } + ] + }, + "optional": true + }, + "proPlanStatus": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "submitting" + }, + { + "type": "string", + "value": "pending" + }, + { + "type": "string", + "value": "success" + }, + { + "type": "string", + "value": "failed" + } + ] + }, + "optional": true + }, + "rejectionReason": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "The item is not good fit for our directory" + }, + { + "type": "string", + "value": "The image of the item is not in good quality" + }, + { + "type": "string", + "value": "The icon of the item is not in good quality" + }, + { + "type": "string", + "value": "The information of the item is not clear" + }, + { + "type": "string", + "value": "The backlink to our site is not provided" + }, + { + "type": "string", + "value": "Other reasons" + } + ] + }, + "optional": true + }, + "sponsorPlanStatus": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "submitting" + }, + { + "type": "string", + "value": "pending" + }, + { + "type": "string", + "value": "success" + }, + { + "type": "string", + "value": "failed" + } + ] + }, + "optional": true + }, + "paid": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + }, + "order": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "order" + }, + "optional": true + }, + "forceHidden": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + }, + "sponsor": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + }, + "sponsorStartDate": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "sponsorEndDate": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "note": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + }, + { + "name": "order", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "order" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "user": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "user" + }, + "optional": true + }, + "item": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "item" + }, + "optional": true + }, + "status": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "success" + }, + { + "type": "string", + "value": "failed" + } + ] + }, + "optional": true + }, + "date": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + }, + { + "name": "sanity.imageCrop", + "type": "type", + "value": { + "type": "object", + "attributes": { + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sanity.imageCrop" + } + }, + "top": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "bottom": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "left": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "right": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + } + } + } + }, + { + "name": "sanity.imageHotspot", + "type": "type", + "value": { + "type": "object", + "attributes": { + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sanity.imageHotspot" + } + }, + "x": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "y": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "height": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "width": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + } + } + } + }, + { + "name": "sanity.imageAsset", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sanity.imageAsset" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "originalFilename": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "label": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "title": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "description": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "altText": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "sha1hash": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "extension": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "mimeType": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "size": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "assetId": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "uploadId": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "path": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "url": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "metadata": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageMetadata" + }, + "optional": true + }, + "source": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.assetSourceData" + }, + "optional": true + } + } + }, + { + "name": "sanity.assetSourceData", + "type": "type", + "value": { + "type": "object", + "attributes": { + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sanity.assetSourceData" + } + }, + "name": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "id": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "url": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + } + }, + { + "name": "sanity.imageMetadata", + "type": "type", + "value": { + "type": "object", + "attributes": { + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "sanity.imageMetadata" + } + }, + "location": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "geopoint" + }, + "optional": true + }, + "dimensions": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imageDimensions" + }, + "optional": true + }, + "palette": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "sanity.imagePalette" + }, + "optional": true + }, + "lqip": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "blurHash": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "hasAlpha": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + }, + "isOpaque": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + } + } + }, + { + "name": "user", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "user" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "name": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "email": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "emailVerified": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "image": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "link": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "password": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "role": { + "type": "objectAttribute", + "value": { + "type": "union", + "of": [ + { + "type": "string", + "value": "ADMIN" + }, + { + "type": "string", + "value": "USER" + } + ] + }, + "optional": true + }, + "accounts": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "account" + }, + "optional": true + }, + "stripeCustomerId": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + }, + { + "name": "account", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "account" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "userId": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "type": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "provider": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "providerAccountId": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "refreshToken": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "accessToken": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "expiresAt": { + "type": "objectAttribute", + "value": { + "type": "number" + }, + "optional": true + }, + "tokenType": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "scope": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "idToken": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "sessionState": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "user": { + "type": "objectAttribute", + "value": { + "type": "object", + "attributes": { + "_ref": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "reference" + } + }, + "_weak": { + "type": "objectAttribute", + "value": { + "type": "boolean" + }, + "optional": true + } + }, + "dereferencesTo": "user" + }, + "optional": true + } + } + }, + { + "name": "code", + "type": "type", + "value": { + "type": "object", + "attributes": { + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "code" + } + }, + "language": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "filename": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "code": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "highlightedLines": { + "type": "objectAttribute", + "value": { + "type": "array", + "of": { + "type": "number" + } + }, + "optional": true + } + } + } + }, + { + "name": "markdown", + "type": "type", + "value": { + "type": "string" + } + }, + { + "name": "media.tag", + "type": "document", + "attributes": { + "_id": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "media.tag" + } + }, + "_createdAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_updatedAt": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "_rev": { + "type": "objectAttribute", + "value": { + "type": "string" + } + }, + "name": { + "type": "objectAttribute", + "value": { + "type": "inline", + "name": "slug" + }, + "optional": true + } + } + }, + { + "name": "slug", + "type": "type", + "value": { + "type": "object", + "attributes": { + "_type": { + "type": "objectAttribute", + "value": { + "type": "string", + "value": "slug" + } + }, + "current": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + }, + "source": { + "type": "objectAttribute", + "value": { + "type": "string" + }, + "optional": true + } + } + } + } +] diff --git a/scripts/batch-all.ts b/scripts/batch-all.ts new file mode 100644 index 0000000..f625e8d --- /dev/null +++ b/scripts/batch-all.ts @@ -0,0 +1,124 @@ +import { + importCategories, + removeCategories, + updateCategories, +} from "./batch-category"; +import { importGroups, removeGroups, updateGroups } from "./batch-group"; +import { importItems, removeItems, updateItems } from "./batch-item"; +import { + importItemsMicrolink, + removeItemsMicrolink, +} from "./batch-item-microlink"; +import { importTags, removeTags, updateTags } from "./batch-tag"; + +/** + * Demo: Batch Operations Manager + * + * A centralized script to manage all batch operations across different entities + * in the Sanity database. + * + * Features: + * - Unified data cleanup + * - Coordinated imports + * - Bulk updates + * - Sequential processing + * + * Available Operations: + * 1. removeAll: Remove all data + * 2. importAll: Import all data + * 3. updateAll: Update all data + * + * Usage Examples: + * ```typescript + * // Clean everything + * await removeAll(); + * + * // Fresh import + * await importAll(); + * + * // Update everything + * await updateAll(); + * + * // Custom sequence + * await removeAll(); + * await importGroups(); + * await importCategories(); + * await importTags(); + * await importItems(); + * ``` + */ + +export const removeAll = async () => { + console.log("Removing all data..."); + + try { + // Remove in reverse order of dependencies + await removeItems(); + await removeTags(); + await removeCategories(); + await removeGroups(); + + console.log("All data removed successfully"); + } catch (error) { + console.error("Error removing data:", error); + } +}; + +export const importAll = async () => { + console.log("Importing all data..."); + + try { + // Import in order of dependencies + await importGroups(); + await importCategories(); + await importTags(); + await importItems(); + + console.log("All data imported successfully"); + } catch (error) { + console.error("Error importing data:", error); + } +}; + +export const updateAll = async () => { + console.log("Updating all data..."); + + try { + await updateGroups(); + await updateCategories(); + await updateTags(); + await updateItems(); + + console.log("All data updated successfully"); + } catch (error) { + console.error("Error updating data:", error); + } +}; + +// get operation from command line +const operation = process.argv[2]; + +// run operation based on command line argument +const runOperation = async () => { + switch (operation) { + case "remove": + await removeAll(); + break; + case "import": + await importAll(); + break; + case "update": + await updateAll(); + break; + default: + console.log(` +Available commands: +- remove: Remove all data +- import: Import all data +- update: Update all data + `); + } +}; + +// run operation +runOperation().catch(console.error); diff --git a/scripts/batch-category.ts b/scripts/batch-category.ts new file mode 100644 index 0000000..f6759a6 --- /dev/null +++ b/scripts/batch-category.ts @@ -0,0 +1,252 @@ +import { slugify } from "@/lib/utils"; +import type { Group } from "@/sanity.types"; +import { createClient } from "@sanity/client"; +import dotenv from "dotenv"; +dotenv.config(); + +// make sure you have set the environment variables in .env file +const client = createClient({ + // biome-ignore lint/style/noNonNullAssertion: + projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!, + // biome-ignore lint/style/noNonNullAssertion: + dataset: process.env.NEXT_PUBLIC_SANITY_DATASET!, + apiVersion: "2024-08-01", + useCdn: false, + perspective: "published", + token: process.env.SANITY_API_TOKEN, +}); + +/** + * Demo: Category Management + * + * This script manages categories in the Sanity database, including their + * relationships with category groups. + * + * Operations: + * 1. Remove all existing categories + * 2. Import predefined categories with group associations + * 3. (Optional) Update existing categories + * + * Features: + * - Hierarchical category organization + * - Priority-based ordering + * - Group relationship management + * - Automatic slug generation + * + * Data Structure: + * - name: Category display name + * - slug: URL-friendly identifier + * - description: Detailed category explanation + * - priority: The priority of the category, the higher the number, the higher the priority + * - group: The group that the category belongs to + * + * Requirements: + * 1. Each category must have a unique priority value + * 2. When using groups, group names must exist in the database + * 3. Environment variables of Sanity are required in .env file + * + * Example Usage: + * ``` + * // Remove all categories and import new ones + * removeCategories(); + * importCategories(); + * + * // Update existing categories + * updateCategories(); + * ``` + * + * Note: This script requires proper environment variables in .env + */ +const data = [ + // fullstack + { + priority: 200, + name: "NextJS Boilerplates", + group: "Fullstack", + description: "The nextjs boilerplates", + }, + { + priority: 199, + name: "Nuxt Boilerplates", + group: "Fullstack", + description: "The nuxt boilerplates", + }, + { + priority: 198, + name: "SvelteKit Boilerplates", + group: "Fullstack", + description: "The sveltekit boilerplates", + }, + { + priority: 197, + name: "Django Boilerplates", + group: "Fullstack", + description: "The django boilerplates", + }, + { + priority: 196, + name: "Express Boilerplates", + group: "Fullstack", + description: "The express boilerplates", + }, + { + priority: 195, + name: "NodeJS Boilerplates", + group: "Fullstack", + description: "The nodejs boilerplates", + }, + { + priority: 194, + name: "PHP Boilerplates", + group: "Fullstack", + description: "The php boilerplates", + }, + { + priority: 193, + name: "Ruby on Rails Boilerplates", + group: "Fullstack", + description: "The ruby on rails boilerplates", + }, + { + priority: 192, + name: "Laravel Boilerplates", + group: "Fullstack", + description: "The laravel boilerplates", + }, + + // frontend + { + priority: 150, + name: "React Boilerplates", + group: "Frontend", + description: "The react boilerplates", + }, + { + priority: 149, + name: "Vue Boilerplates", + group: "Frontend", + description: "The vue boilerplates", + }, + { + priority: 148, + name: "Svelte Boilerplates", + group: "Frontend", + description: "The svelte boilerplates", + }, + { + priority: 147, + name: "Astro Boilerplates", + group: "Frontend", + description: "The astro boilerplates", + }, + { + priority: 146, + name: "Typescript Boilerplates", + group: "Frontend", + description: "The typescript boilerplates", + }, + + // mobile + { + priority: 100, + name: "React Native Boilerplates", + group: "Mobile", + description: "The react native boilerplates", + }, + { + priority: 99, + name: "Flutter Boilerplates", + group: "Mobile", + description: "The flutter boilerplates", + }, + { + priority: 98, + name: "Expo Boilerplates", + group: "Mobile", + description: "The expo boilerplates", + }, + { + priority: 97, + name: "Swift Boilerplates", + group: "Mobile", + description: "The swift boilerplates", + }, + { + priority: 96, + name: "Kotlin Boilerplates", + group: "Mobile", + description: "The kotlin boilerplates", + }, +]; + +export const removeCategories = async () => { + const data = await client.delete({ + query: "*[_type == 'category']", + }); + console.log("removeCategories:", data); +}; + +export const importCategories = async () => { + try { + console.log("importCategories start"); + + // get all category groups + const groups = await client.fetch(`*[_type == "group"]`); + + for (let i = 0; i < data.length; i++) { + const item = data[i]; + console.log("index: ", i, "item:", item.name); + const group = findGroup(groups, item.group); + // accept category without group + // if (!group) { + // console.error(`Group ${item.group} not found`); + // continue; + // } + await client.create({ + // _id: item._id, + // _createdAt: item._createdAt, + // _updatedAt: item._updatedAt, + _type: "category", + name: item.name, + slug: { + _type: "slug", + // current: item.slug, + current: slugify(item.name), + }, + description: item.description, + priority: item.priority, + group: group + ? { + _type: "reference", + _ref: group._id, + } + : undefined, + }); + } + + console.log("importCategories success"); + } catch (error) { + console.error(error); + } +}; + +const findGroup = (groups: Group[], name: string) => { + return groups.find((group: Group) => group.name === name); +}; + +export const updateCategories = async () => { + const categories = await client.fetch(`*[_type == "category"]`); + + for (const category of categories) { + const result = await client + .patch(category._id) + .set({ + // do what you want to update here + }) + .commit(); + + console.log(`Updated category ${category.name}:`, result); + } + + console.log(`Updated ${categories.length} categories`); +}; diff --git a/scripts/batch-group.ts b/scripts/batch-group.ts new file mode 100644 index 0000000..88776b1 --- /dev/null +++ b/scripts/batch-group.ts @@ -0,0 +1,103 @@ +import { slugify } from "@/lib/utils"; +import { createClient } from "@sanity/client"; +import dotenv from "dotenv"; +dotenv.config(); + +// make sure you have set the environment variables in .env file +const client = createClient({ + // biome-ignore lint/style/noNonNullAssertion: + projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!, + // biome-ignore lint/style/noNonNullAssertion: + dataset: process.env.NEXT_PUBLIC_SANITY_DATASET!, + apiVersion: "2024-08-01", + useCdn: false, + perspective: "published", + token: process.env.SANITY_API_TOKEN, +}); + +/** + * Demo: Category Group Management + * + * This script manages category groups in the Sanity.io database. + * + * Operations: + * 1. Remove all existing category groups + * 2. Import predefined category groups + * 3. (Optional) Update existing groups + * + * Features: + * - Handles basic group metadata (name, slug, description) + * - Maintains priority ordering + * - Ensures consistent slug generation + * + * Data Structure: + * - name: Group display name + * - slug: URL-friendly identifier + * - description: Detailed group explanation + * - priority: The priority of the group, the higher the number, the higher the priority + * + * Use Cases: + * - Initial system setup + * - Category Groups restructuring + * - Batch updates to group metadata + * + * Note: This script requires proper environment variables in .env + */ +const data = [ + { priority: 3, name: "Fullstack", description: "The fullstack boilerplates" }, + { priority: 2, name: "Frontend", description: "The frontend boilerplates" }, + { priority: 1, name: "Mobile", description: "The mobile boilerplates" }, +]; + +export const removeGroups = async () => { + const data = await client.delete({ + query: "*[_type == 'group']", + }); + console.log("removeGroups:", data); +}; + +export const importGroups = async () => { + try { + console.log("importGroups start"); + + for (let i = 0; i < data.length; i++) { + const item = data[i]; + console.log("index: ", i, "item:", item.name); + await client.create({ + // _id: item._id, + // _createdAt: item._createdAt, + // _updatedAt: item._updatedAt, + _type: "group", + name: item.name, + slug: { + _type: "slug", + // current: item.slug, + current: slugify(item.name), + }, + description: item.description, + priority: item.priority, + }); + } + + console.log("importGroups success"); + } catch (error) { + console.error(error); + } +}; + +export const updateGroups = async () => { + const groups = await client.fetch(`*[_type == "group"]`); + + for (const group of groups) { + const result = await client + .patch(group._id) + .set({ + // do what you want to update here + }) + .commit(); + + console.log(`Updated group ${group.name}:`, result); + } + + console.log(`Updated ${groups.length} groups`); +}; diff --git a/scripts/batch-item-manual.ts b/scripts/batch-item-manual.ts new file mode 100644 index 0000000..4b67a8b --- /dev/null +++ b/scripts/batch-item-manual.ts @@ -0,0 +1,252 @@ +import { slugify } from "@/lib/utils"; +import type { Category, Tag } from "@/sanity.types"; +import { createClient } from "@sanity/client"; +import dotenv from "dotenv"; +import fetch from "node-fetch"; +dotenv.config(); + +// make sure you have set the environment variables in .env file +const client = createClient({ + // biome-ignore lint/style/noNonNullAssertion: + projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!, + // biome-ignore lint/style/noNonNullAssertion: + dataset: process.env.NEXT_PUBLIC_SANITY_DATASET!, + apiVersion: "2024-08-01", + useCdn: false, + perspective: "published", + token: process.env.SANITY_API_TOKEN, +}); + +/** + * Demo: Item Management + * + * A comprehensive script for managing items in the Sanity database + * with manual data entry approach. + * + * Operations: + * 1. Remove existing items (cleanup) + * 2. Import predefined items + * 3. (Optional) Update existing items + * + * Features: + * - Manual data curation + * - Asset management (icons, images) + * - Category and tag relationships + * - Automatic slug generation + * - Metadata handling + * + * Data Structure: + * - name: Item display name + * - slug: URL-friendly identifier + * - description: Detailed item explanation + * - link: The link of the item + * - categories: The categories that the item belongs to + * - tags: The tags that the item belongs to + * - image: The image of the item + * - icon: The icon of the item + * + * Advantages: + * 1. High data accuracy and quality control + * 2. Precise metadata management + * 3. Controlled categorization + * + * Limitations: + * 1. Time-intensive manual data entry + * 2. Requires regular maintenance + * 3. Limited scalability for large datasets + * 4. Content of the items are missing + * + * Use Cases: + * 1. Initial platform seeding + * 2. Featured content management + * 3. Quality-focused collections + * 4. Custom showcase items + * + * Note: This script requires proper environment variables in .env + */ +const data = [ + { + name: "Mkdirs", + description: "The best directory boilerplate", + link: "https://mkdirs.com", + categories: [ + "NextJS Boilerplates", + "Typescript Boilerplates", + "React Boilerplates", + ], + tags: [ + "NextJS", + "Directory", + "Tailwind", + "React", + "TypeScript", + "Shadcn", + "Resend", + "Stripe", + "Auth", + "Blog", + ], + image: "https://mkdirs.com/og.png", + // icon: "https://mkdirs.com/logo.png", + icon: "https://s2.googleusercontent.com/s2/favicons?domain=mkdirs.com&sz=128", + }, + { + name: "Achromatic", + description: "An advanced Next 15 SaaS starter kit", + link: "https://achromatic.dev", + categories: [ + "NextJS Boilerplates", + "Typescript Boilerplates", + "React Boilerplates", + ], + tags: [ + "NextJS", + "Tailwind", + "React", + "TypeScript", + "Shadcn", + "Resend", + "Stripe", + "Auth", + "Blog", + ], + image: "https://achromatic.dev/og.jpg", + // icon: "https://achromatic.dev/favicon.ico", + icon: "https://s2.googleusercontent.com/s2/favicons?domain=achromatic.dev&sz=128", + }, +]; + +export const removeItems = async () => { + const data = await client.delete({ + query: "*[_type == 'item']", + }); + console.log("removeItems:", data); +}; + +export const importItems = async () => { + try { + console.log("importItems start"); + + // get all categories and tags + const categories = await client.fetch(`*[_type == "category"]`); + const tags = await client.fetch(`*[_type == "tag"]`); + + for (let i = 0; i < data.length; i++) { + const item = data[i]; + console.log("index: ", i, "item:", item.name); + const itemCategories = findCategory(categories, item.categories); + const itemTags = findTag(tags, item.tags); + + // Fetch icon and image + const [iconResponse, imageResponse] = await Promise.all([ + fetch(item.icon), + fetch(item.image), + ]); + const [iconArrayBuffer, imageArrayBuffer] = await Promise.all([ + iconResponse.arrayBuffer(), + imageResponse.arrayBuffer(), + ]); + + // Convert ArrayBuffer to Buffer for Sanity upload + const [iconBuffer, imageBuffer] = [ + Buffer.from(iconArrayBuffer), + Buffer.from(imageArrayBuffer), + ]; + + // Upload icon and image to sanity + const [iconAsset, imageAsset] = await Promise.all([ + client.assets.upload("image", iconBuffer, { + filename: `${slugify(item.name)}_logo.png`, + }), + client.assets.upload("image", imageBuffer, { + filename: `${slugify(item.name)}_image.png`, + }), + ]); + + await client.create({ + // _id: item._id, + // _createdAt: item._createdAt, + // _updatedAt: item._updatedAt, + _type: "item", + name: item.name, + slug: { + _type: "slug", + // current: item.slug, + current: slugify(item.name), + }, + link: item.link, + description: item.description, + publishDate: new Date(), + pricePlan: "free", + freePlanStatus: "approved", + + // set submitter if you need, change the _ref to your user id + // submitter: { + // _type: "reference", + // _ref: "", + // }, + + // set categories and tags + categories: itemCategories.map((category, index) => ({ + _type: "reference", + _ref: category._id, + _key: index.toString(), + })), + tags: itemTags.map((tag, index) => ({ + _type: "reference", + _ref: tag._id, + _key: index.toString(), + })), + + // set icon and image + icon: { + _type: "image", + asset: { + _type: "reference", + _ref: iconAsset._id, + }, + alt: `Logo of ${item.name}`, + }, + image: { + _type: "image", + asset: { + _type: "reference", + _ref: imageAsset._id, + }, + alt: `Screenshot of ${item.name}`, + }, + }); + } + + console.log("importItems success"); + } catch (error) { + console.error(error); + } +}; + +const findCategory = (categories: Category[], names: string[]) => { + return categories.filter((category: Category) => + names.includes(category.name), + ); +}; + +const findTag = (tags: Tag[], names: string[]) => { + return tags.filter((tag: Tag) => names.includes(tag.name)); +}; + +export const updateItems = async () => { + const items = await client.fetch(`*[_type == "item"]`); + + for (const item of items) { + const result = await client + .patch(item._id) + .set({ + // do what you want to update here + }) + .commit(); + + console.log(`Updated item ${item.name}:`, result); + } + + console.log(`Updated ${items.length} items`); +}; diff --git a/scripts/batch-item-microlink.ts b/scripts/batch-item-microlink.ts new file mode 100644 index 0000000..e0a99ec --- /dev/null +++ b/scripts/batch-item-microlink.ts @@ -0,0 +1,243 @@ +import { slugify } from "@/lib/utils"; +import type { Category, Tag } from "@/sanity.types"; +import mql from "@microlink/mql"; +import { createClient } from "@sanity/client"; +import dotenv from "dotenv"; +import fetch from "node-fetch"; +dotenv.config(); + +// make sure you have set the environment variables in .env file +const client = createClient({ + // biome-ignore lint/style/noNonNullAssertion: + projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!, + // biome-ignore lint/style/noNonNullAssertion: + dataset: process.env.NEXT_PUBLIC_SANITY_DATASET!, + apiVersion: "2024-08-01", + useCdn: false, + perspective: "published", + token: process.env.SANITY_API_TOKEN, +}); + +/** + * Demo: Automated Item Import Script (with Microlink API) + * + * A script that leverages Microlink API to automatically fetch and import + * items into Sanity database. + * + * Operations: + * 1. Remove existing items (cleanup) + * 2. Fetch metadata via Microlink API + * 3. Process and import items + * + * Features: + * - Automated metadata extraction + * - Bulk URL processing + * - Asset auto-discovery + * - Sequential processing for reliability + * + * Data Structure: + * - name: Item display name + * - slug: URL-friendly identifier + * - description: Detailed item explanation + * - link: The link of the item + * - categories: The categories that the item belongs to + * - tags: The tags that the item belongs to + * - image: The image of the item + * - icon: The icon of the item + * + * Data Fetched via Microlink: + * - title → name + * - description + * - logo → icon + * - image + * - url → link + * + * Advantages: + * 1. Automated metadata extraction + * 2. Faster data entry process + * 3. Consistent data structure + * 4. Scalable for large datasets + * + * Limitations: + * 1. Manual category/tag assignment still needed + * 2. Variable asset quality (logos/images) + * 3. Dependent on Microlink API availability + * 4. Content of the items are missing + * + * Use Cases: + * 1. Bulk item imports + * 2. Quick prototyping + * 3. Initial database population + * 4. Regular content updates + * + * Note: This script requires proper environment variables in .env + */ +const links = [ + "https://mkdirs.com", + "https://achromatic.dev", + // Add more links here... +]; + +const fetchItem = async (url: string) => { + try { + const { data } = await mql(url, { + data: { + title: { selector: "title" }, + description: { selector: 'meta[name="description"]' }, + logo: { selector: 'link[rel="icon"]' }, + image: { selector: 'meta[property="og:image"]' }, + url: { selector: 'link[rel="canonical"]' }, + }, + }); + + return { + name: data.title || new URL(url).hostname, + description: data.description || `A great boilerplate from ${url}`, + link: url, + categories: [ + "NextJS Boilerplates", + "Typescript Boilerplates", + "React Boilerplates", + ], + tags: ["NextJS", "Tailwind", "React", "TypeScript", "Shadcn"], + image: + data.image?.url || + `https://image.thum.io/get/width/1200/crop/800/${url}`, + icon: + data.logo?.url || + `https://s2.googleusercontent.com/s2/favicons?domain=${new URL(url).hostname}&sz=128`, + }; + } catch (error) { + console.error(`Error fetching data for ${url}:`, error); + return null; + } +}; + +export const removeItemsMicrolink = async () => { + const data = await client.delete({ + query: "*[_type == 'item']", + }); + // console.log("removeItems:", data); + console.log("removeItems success, length:", data.length); +}; + +export const importItemsMicrolink = async () => { + try { + // get all categories and tags first (only need to fetch once) + const categories = await client.fetch(`*[_type == "category"]`); + const tags = await client.fetch(`*[_type == "tag"]`); + + console.log("Processing links one by one..."); + for (const link of links) { + try { + console.log(`Processing link: ${link}`); + const item = await fetchItem(link); + + if (!item) { + console.log(`Skipping ${link} due to fetch error`); + continue; + } + + console.log(`Creating item for: ${item.name}`); + const itemCategories = findCategory(categories, item.categories); + const itemTags = findTag(tags, item.tags); + + // Fetch icon and image + const [iconResponse, imageResponse] = await Promise.all([ + fetch(item.icon), + fetch(item.image), + ]); + const [iconArrayBuffer, imageArrayBuffer] = await Promise.all([ + iconResponse.arrayBuffer(), + imageResponse.arrayBuffer(), + ]); + + // Convert ArrayBuffer to Buffer for Sanity upload + const [iconBuffer, imageBuffer] = [ + Buffer.from(iconArrayBuffer), + Buffer.from(imageArrayBuffer), + ]; + + // Upload icon and image to sanity + const [iconAsset, imageAsset] = await Promise.all([ + client.assets.upload("image", iconBuffer, { + filename: `${slugify(item.name)}_logo.png`, + }), + client.assets.upload("image", imageBuffer, { + filename: `${slugify(item.name)}_image.png`, + }), + ]); + + await client.create({ + // _id: item._id, + // _createdAt: item._createdAt, + // _updatedAt: item._updatedAt, + _type: "item", + name: item.name, + slug: { + _type: "slug", + // current: item.slug, + current: slugify(item.name), + }, + link: item.link, + description: item.description, + publishDate: new Date(), + pricePlan: "free", + freePlanStatus: "submitting", + + // set submitter if you need, change the _ref to your user id + // submitter: { + // _type: "reference", + // _ref: "", + // }, + + // set categories and tags + categories: itemCategories.map((category, index) => ({ + _type: "reference", + _ref: category._id, + _key: index.toString(), + })), + tags: itemTags.map((tag, index) => ({ + _type: "reference", + _ref: tag._id, + _key: index.toString(), + })), + + // set icon and image + icon: { + _type: "image", + asset: { + _type: "reference", + _ref: iconAsset._id, + }, + alt: `Logo of ${item.name}`, + }, + image: { + _type: "image", + asset: { + _type: "reference", + _ref: imageAsset._id, + }, + alt: `Screenshot of ${item.name}`, + }, + }); + } catch (error) { + console.error(`Error processing link: ${link}`, error); + } + } + + console.log("importItems success"); + } catch (error) { + console.error(error); + } +}; + +const findCategory = (categories: Category[], names: string[]) => { + return categories.filter((category: Category) => + names.includes(category.name), + ); +}; + +const findTag = (tags: Tag[], names: string[]) => { + return tags.filter((tag: Tag) => names.includes(tag.name)); +}; diff --git a/scripts/batch-item.ts b/scripts/batch-item.ts new file mode 100644 index 0000000..c37e06c --- /dev/null +++ b/scripts/batch-item.ts @@ -0,0 +1,375 @@ +import { slugify } from "@/lib/utils"; +import type { Category, Tag } from "@/sanity.types"; +import { google } from "@ai-sdk/google"; +import mql from "@microlink/mql"; +import { createClient } from "@sanity/client"; +import { generateObject } from "ai"; +import dotenv from "dotenv"; +import fetch from "node-fetch"; +import { z } from "zod"; +dotenv.config(); + +// make sure you have set the environment variables in .env file +const client = createClient({ + // biome-ignore lint/style/noNonNullAssertion: + projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!, + // biome-ignore lint/style/noNonNullAssertion: + dataset: process.env.NEXT_PUBLIC_SANITY_DATASET!, + apiVersion: "2024-08-01", + useCdn: false, + perspective: "published", + token: process.env.SANITY_API_TOKEN, +}); + +/** + * AI-Powered Item Management System + * + * An automated script for managing content items in Sanity CMS using AI SDK + * and Microlink for data enrichment. + * + * Core Functions: + * 1. Content Scraping: Extract data from URLs using Microlink + * 2. AI Analysis: Process content using Google's Gemini AI + * 3. Asset Management: Handle images and icons + * 4. Database Operations: CRUD operations in Sanity + * + * Data Processing Flow: + * 1. URL → Microlink (metadata) + AI SDK (content analysis) + * 2. Data Enrichment → Categories & Tags mapping + * 3. Asset Processing → Icon & Image handling + * 4. Sanity Import → Structured content creation + * + * Content Structure: + * - name: Title of the item + * - slug: Auto-generated URL-friendly identifier + * - description: AI-generated short description (160 chars) + * - introduction: AI-generated detailed markdown content + * - link: Source URL + * - categories: Auto-mapped category references + * - tags: Auto-mapped tag references + * - image: Screenshot or main image + * - icon: Favicon or logo + * + * Key Features: + * - AI-powered content analysis + * - Automated metadata extraction + * - Smart category/tag mapping + * - Automated asset management + * - Bulk processing support + * + * Requirements: + * - Sanity CMS credentials + * - Google AI SDK access + * - Microlink API access + * - Environment variables configured + * + * Usage: + * 1. pnpm run item remove + * remove all items + * 2. pnpm run item import + * import all items defined in links array + * 3. pnpm run item update + * update all items + * 4. pnpm run item fetch + * fetch item info for the specified url + */ +const links = [ + "https://mkdirs.com", + "https://achromatic.dev", +]; + +export const removeItems = async () => { + const data = await client.delete({ + query: "*[_type == 'item']", + }); + console.log("removeItems:", data); +}; + +/** + * fetch item info for the specified url with Microlink and AI SDK + */ +export const fetchItem = async (url: string) => { + // step 1: fetch item info with Microlink + const microlinkData = await fetchItemWithMicrolink(url); + console.log("fetchItem, url:", url, "microlinkData:", microlinkData); + + // step 2: fetch item info with AI SDK + const aisdkData = await fetchItemWithAISdk(url); + console.log("fetchItem, url:", url, "aisdkData:", aisdkData); + + // step 3: merge the data + const mergedData = { + link: url, + name: aisdkData.object.title, + description: aisdkData.object.description, + introduction: aisdkData.object.introduction, + categories: aisdkData.object.categories, + tags: aisdkData.object.tags, + image: microlinkData?.image?.url, // or get a new screenshot + icon: `https://s2.googleusercontent.com/s2/favicons?domain=${url}&sz=128`, // or microlinkData?.logo?.url + }; + console.log("fetchItem, url:", url, "mergedData:", mergedData); + return mergedData; +}; + +/** + * fetch item info for the specified url with Microlink + */ +export const fetchItemWithMicrolink = async (url: string) => { + try { + const { data } = await mql(url, { + // information included: + // - title: page title + // - description: page description + // - lang: page language + // - author: author information + // - publisher: publisher information + // - image: main image + // - logo: website logo + // - url: normalized URL + }); + // console.log("fetchItemWithMicrolink, url:", url, "data:", data); + return data; + } catch (error) { + console.error( + `fetchItemWithMicrolink, Error processing url for ${url}:`, + error, + ); + return null; + } +}; + +/** + * fetch item info for the specified url with AI SDK + */ +export const fetchItemWithAISdk = async (url: string) => { + try { + // get all categories and tags + const categories = await client.fetch(`*[_type == "category"]`); + const tags = await client.fetch(`*[_type == "tag"]`); + const availableCategories = categories.map((cat) => cat.name); + const availableTags = tags.map((tag) => tag.name); + + const schema = z.object({ + title: z.string().describe("A short, concise name without description"), + description: z + .string() + .max(160) + .describe("One sentence summary, max 160 characters"), + introduction: z + .string() + .describe("Detailed introduction in markdown format"), + categories: z + .array(z.string()) + .describe("Array of category names that best match the content"), + tags: z + .array(z.string()) + .describe("Array of tag names that best match the content") + }); + + const response = await fetch(url); + const htmlContent = (await response.text()) + .replace(/class="[^"]*"/g, '') + .replace(/]*>.*?<\/svg>/g, '') + .replace(/)<[^<]*)*<\/script>/gi, ''); + const result = await generateObject({ + model: google("gemini-2.0-flash-exp", { + structuredOutputs: true, + }), + schema, + prompt: `Analyze the following webpage content and provide structured information: + + Content to analyze: + ${htmlContent} + + Available Categories: + ${availableCategories.join(", ")} + + Available Tags: + ${availableTags.join(", ")} + + Please analyze the content and provide: + 1. A concise title (just the name, no description) + 2. A brief description (one sentence, max 160 characters) + 3. A detailed introduction in markdown format (include key features and use cases) + 4. Select appropriate categories from the available categories list (return array of names) + 5. Select relevant tags from the available tags list (return array of names) + + Focus on technical aspects and practical applications. If the content is a tool or service, + emphasize its main features, target users, and unique selling points.`, + }); + + // console.log("fetchItemWithAISdk, url:", url, "result:", result); + return result; + } catch (error) { + console.error( + `fetchItemWithAISdk, Error processing url for ${url}:`, + error, + ); + return null; + } +}; + +export const importItems = async () => { + try { + console.log("importItems start"); + + // get all categories and tags + const categories = await client.fetch(`*[_type == "category"]`); + const tags = await client.fetch(`*[_type == "tag"]`); + + for (let i = 0; i < links.length; i++) { + const item = await fetchItem(links[i]); + console.log("index: ", i, ", url: ", links[i], ", item:", item.name); + + const itemCategories = findCategory(categories, item.categories); + const itemTags = findTag(tags, item.tags); + + // Fetch icon and image + const [iconResponse, imageResponse] = await Promise.all([ + fetch(item.icon), + fetch(item.image), + ]); + const [iconArrayBuffer, imageArrayBuffer] = await Promise.all([ + iconResponse.arrayBuffer(), + imageResponse.arrayBuffer(), + ]); + + // Convert ArrayBuffer to Buffer for Sanity upload + const [iconBuffer, imageBuffer] = [ + Buffer.from(iconArrayBuffer), + Buffer.from(imageArrayBuffer), + ]; + + // Upload icon and image to sanity + const [iconAsset, imageAsset] = await Promise.all([ + client.assets.upload("image", iconBuffer, { + filename: `${slugify(item.name)}_logo.png`, + }), + client.assets.upload("image", imageBuffer, { + filename: `${slugify(item.name)}_image.png`, + }), + ]); + + await client.create({ + // _id: item._id, + // _createdAt: item._createdAt, + // _updatedAt: item._updatedAt, + _type: "item", + name: item.name, + slug: { + _type: "slug", + current: slugify(item.name), + }, + link: item.link, + description: item.description, + publishDate: new Date(), + pricePlan: "free", + freePlanStatus: "approved", + + introduction: item.introduction, + + // set submitter if you need, change the _ref to your user id + // submitter: { + // _type: "reference", + // _ref: "", + // }, + + // set categories and tags + categories: itemCategories.map((category, index) => ({ + _type: "reference", + _ref: category._id, + _key: index.toString(), + })), + tags: itemTags.map((tag, index) => ({ + _type: "reference", + _ref: tag._id, + _key: index.toString(), + })), + + // set icon and image + icon: { + _type: "image", + asset: { + _type: "reference", + _ref: iconAsset._id, + }, + alt: `Logo of ${item.name}`, + }, + image: { + _type: "image", + asset: { + _type: "reference", + _ref: imageAsset._id, + }, + alt: `Screenshot of ${item.name}`, + }, + }); + } + + console.log("importItems success"); + } catch (error) { + console.error(error); + } +}; + +const findCategory = (categories: Category[], names: string[]) => { + return categories.filter((category: Category) => + names.includes(category.name), + ); +}; + +const findTag = (tags: Tag[], names: string[]) => { + return tags.filter((tag: Tag) => names.includes(tag.name)); +}; + +export const updateItems = async () => { + const items = await client.fetch(`*[_type == "item"]`); + + for (const item of items) { + const result = await client + .patch(item._id) + .set({ + // do what you want to update here + }) + .commit(); + + console.log(`Updated item ${item.name}:`, result); + } + + console.log(`Updated ${items.length} items`); +}; + +// get operation from command line +const operation = process.argv[2]; +// get url from command line +const url = process.argv[3]; + +// run operation based on command line argument +const runOperation = async () => { + switch (operation) { + case "remove": + await removeItems(); + break; + case "import": + await importItems(); + break; + case "update": + await updateItems(); + break; + case "fetch": + await fetchItem(url); + break; + default: + console.log(` +Available commands: +- remove: Remove all items +- import: Import all items +- update: Update all items +- fetch: Fetch item info for the specified url with AI SDK and Microlink and return structured data + `); + } +}; + +// run operation +runOperation().catch(console.error); diff --git a/scripts/batch-tag.ts b/scripts/batch-tag.ts new file mode 100644 index 0000000..7ee9832 --- /dev/null +++ b/scripts/batch-tag.ts @@ -0,0 +1,345 @@ +import { slugify } from "@/lib/utils"; +import { createClient } from "@sanity/client"; +import dotenv from "dotenv"; +dotenv.config(); + +// make sure you have set the environment variables in .env file +const client = createClient({ + // biome-ignore lint/style/noNonNullAssertion: + projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!, + // biome-ignore lint/style/noNonNullAssertion: + dataset: process.env.NEXT_PUBLIC_SANITY_DATASET!, + apiVersion: "2024-08-01", + useCdn: false, + perspective: "published", + token: process.env.SANITY_API_TOKEN, +}); + +/** + * Demo: Tag Management + * + * This script manages the tag system in Sanity database. + * + * Operations: + * 1. Remove all existing tags + * 2. Import predefined tags + * 3. (Optional) Update existing tags + * + * Features: + * - Automatic slug generation from tag names + * - Descriptive metadata for each tag + * - Batch processing capabilities + * + * Data Structure: + * - name: Tag display name + * - slug: URL-friendly identifier + * - description: Detailed tag explanation + * + * Example Usage: + * ``` + * // Clean and import + * removeTags(); + * importTags(); + * + * // Update existing tags + * updateTags(); + * ``` + * + * Note: This script requires proper environment variables in .env + */ +const data = [ + // You can use Cursor to help you generate the data + { + name: "Open Source", + description: "The boilerplates which are open source", + }, + { + name: "Auth", + description: "The boilerplates with authentication functionality", + }, + { name: "AI", description: "The boilerplates with AI integration" }, + { + name: "Admin Panel", + description: "The boilerplates with admin panel functionality", + }, + { + name: "Stripe", + description: "The boilerplates with Stripe payment integration", + }, + { + name: "Database", + description: "The boilerplates with database integration", + }, + { + name: "Directory", + description: "The boilerplates with directory structure", + }, + { name: "Blog", description: "The boilerplates with blogging functionality" }, + { + name: "Analytics", + description: "The boilerplates with analytics integration", + }, + { + name: "CMS", + description: "The boilerplates with content management system", + }, + { + name: "Billing", + description: "The boilerplates with billing functionality", + }, + { name: "Themes", description: "The boilerplates with theming support" }, + { + name: "Subscription", + description: "The boilerplates with subscription functionality", + }, + { + name: "Microservices", + description: "The boilerplates with microservices architecture", + }, + { name: "Payments", description: "The boilerplates with payment processing" }, + { name: "Email", description: "The boilerplates with email functionality" }, + { + name: "Deployment", + description: "The boilerplates with deployment configurations", + }, + { + name: "Animations", + description: "The boilerplates with animation features", + }, + { + name: "Checkout", + description: "The boilerplates with checkout functionality", + }, + { name: "Ads", description: "The boilerplates with advertising integration" }, + { + name: "Components", + description: "The boilerplates with reusable components", + }, + { name: "SEO", description: "The boilerplates with SEO optimization" }, + { name: "Storage", description: "The boilerplates with storage solutions" }, + { + name: "Onboarding", + description: "The boilerplates with user onboarding flow", + }, + { + name: "Dashboard", + description: "The boilerplates with dashboard interface", + }, + { name: "Login", description: "The boilerplates with login functionality" }, + { + name: "Documentation", + description: "The boilerplates with documentation setup", + }, + { + name: "Lemon Squeezy", + description: "The boilerplates with Lemon Squeezy integration", + }, + { + name: "Landing Page", + description: "The boilerplates with landing page templates", + }, + { name: "CI/CD", description: "The boilerplates with CI/CD pipeline setup" }, + { + name: "Navigation", + description: "The boilerplates with navigation components", + }, + { name: "UI/UX", description: "The boilerplates with UI/UX design system" }, + { + name: "Multi-tenancy", + description: "The boilerplates with multi-tenant architecture", + }, + { name: "Tables", description: "The boilerplates with table components" }, + { name: "Support", description: "The boilerplates with support system" }, + { + name: "Paywalls", + description: "The boilerplates with paywall functionality", + }, + { + name: "Customizable", + description: "The boilerplates with customization options", + }, + { + name: "Referral Tracking", + description: "The boilerplates with referral tracking system", + }, + { + name: "Responsive", + description: "The boilerplates with responsive design", + }, + { name: "Plugins", description: "The boilerplates with plugin system" }, + { name: "Style", description: "The boilerplates with styling system" }, + { + name: "Notifications", + description: "The boilerplates with notification system", + }, + { + name: "Paddle", + description: "The boilerplates with Paddle payment integration", + }, + { + name: "Waitlist", + description: "The boilerplates with waitlist functionality", + }, + { + name: "Community", + description: "The boilerplates with community features", + }, + { name: "Updates", description: "The boilerplates with update system" }, + { name: "Dark Mode", description: "The boilerplates with dark mode support" }, + { + name: "Lambda Architecture", + description: "The boilerplates with Lambda architecture", + }, + { + name: "Integrations", + description: "The boilerplates with third-party integrations", + }, + { name: "Resend", description: "The boilerplates with Resend email service" }, + { + name: "Settings", + description: "The boilerplates with settings management", + }, + { + name: "2FA", + description: "The boilerplates with two-factor authentication", + }, + { + name: "Revenue Cat", + description: "The boilerplates with Revenue Cat integration", + }, + { + name: "In-app purchases", + description: "The boilerplates with in-app purchase functionality", + }, + { + name: "NextJS", + description: "The boilerplates built with Next.js framework", + }, + { name: "React", description: "The boilerplates built with React library" }, + { + name: "Tailwind", + description: "The boilerplates using Tailwind CSS framework", + }, + { + name: "Django", + description: "The boilerplates built with Django framework", + }, + { + name: "Laravel", + description: "The boilerplates built with Laravel framework", + }, + { + name: "Supabase", + description: "The boilerplates integrated with Supabase", + }, + { name: "TypeScript", description: "The boilerplates using TypeScript" }, + { + name: "Shadcn", + description: "The boilerplates using Shadcn UI components", + }, + { name: "NodeJS", description: "The boilerplates built with Node.js" }, + { name: "PHP", description: "The boilerplates using PHP" }, + { + name: "React Native", + description: "The boilerplates built with React Native", + }, + { name: "Python", description: "The boilerplates using Python" }, + { name: "HTMX", description: "The boilerplates using HTMX" }, + { name: "Flutter", description: "The boilerplates built with Flutter" }, + { name: "Vue", description: "The boilerplates built with Vue.js" }, + { + name: "Ruby on Rails", + description: "The boilerplates built with Ruby on Rails", + }, + { name: "Astro", description: "The boilerplates built with Astro framework" }, + { + name: "Nuxt", + description: "The boilerplates built with Nuxt.js framework", + }, + { name: "Kotlin", description: "The boilerplates using Kotlin" }, + { name: "Figma", description: "The boilerplates with Figma design assets" }, + { name: "Express", description: "The boilerplates built with Express.js" }, + { + name: "PostgreSQL", + description: "The boilerplates using PostgreSQL database", + }, + { name: "Mailgun", description: "The boilerplates integrated with Mailgun" }, + { name: "Remix", description: "The boilerplates built with Remix framework" }, + { name: "Expo", description: "The boilerplates built with Expo" }, + { name: "SwiftUI", description: "The boilerplates built with SwiftUI" }, + { name: "SvelteKit", description: "The boilerplates built with SvelteKit" }, + { name: "CSS", description: "The boilerplates with CSS styling" }, + { name: "HTML", description: "The boilerplates using HTML" }, + { name: "DaisyUI", description: "The boilerplates using DaisyUI components" }, + { + name: "Strapi", + description: "The boilerplates integrated with Strapi CMS", + }, + { name: "Svelte", description: "The boilerplates built with Svelte" }, + { name: "Javascript", description: "The boilerplates using JavaScript" }, + { name: "Chakra", description: "The boilerplates using Chakra UI" }, + { + name: "Firebase", + description: "The boilerplates integrated with Firebase", + }, + { name: "Livewire", description: "The boilerplates using Laravel Livewire" }, + { name: "Prisma", description: "The boilerplates using Prisma ORM" }, + { + name: "Pocketbase", + description: "The boilerplates integrated with Pocketbase", + }, + { name: "MongoDB", description: "The boilerplates using MongoDB database" }, + { name: "Fly.io", description: "The boilerplates deployed on Fly.io" }, +]; + +export const removeTags = async () => { + const data = await client.delete({ + query: "*[_type == 'tag']", + }); + console.log("removeTags:", data); +}; + +export const importTags = async () => { + try { + console.log("importTags start"); + + for (let i = 0; i < data.length; i++) { + const item = data[i]; + console.log("index: ", i, "item:", item.name); + await client.create({ + // _id: item._id, + // _createdAt: item._createdAt, + // _updatedAt: item._updatedAt, + _type: "tag", + name: item.name, + slug: { + _type: "slug", + // current: item.slug, + current: slugify(item.name), + }, + description: item.description, + }); + } + + console.log("importTags success"); + } catch (error) { + console.error(error); + } +}; + +export const updateTags = async () => { + const tags = await client.fetch(`*[_type == "tag"]`); + + for (const tag of tags) { + const result = await client + .patch(tag._id) + .set({ + // do what you want to update here + }) + .commit(); + + console.log(`Updated tag ${tag.name}:`, result); + } + + console.log(`Updated ${tags.length} tags`); +}; diff --git a/scripts/explore-aisdk.ts b/scripts/explore-aisdk.ts new file mode 100644 index 0000000..a8180e7 --- /dev/null +++ b/scripts/explore-aisdk.ts @@ -0,0 +1,162 @@ +import type { Category, Tag } from "@/sanity.types"; +import { google } from "@ai-sdk/google"; +import { createClient } from "@sanity/client"; +import { generateObject, generateText } from "ai"; +import dotenv from "dotenv"; +import { z } from "zod"; +dotenv.config(); + +// make sure you have set the environment variables in .env file +const client = createClient({ + // biome-ignore lint/style/noNonNullAssertion: + projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!, + // biome-ignore lint/style/noNonNullAssertion: + dataset: process.env.NEXT_PUBLIC_SANITY_DATASET!, + apiVersion: "2024-08-01", + useCdn: false, + perspective: "published", + token: process.env.SANITY_API_TOKEN, +}); + +/** + * AI SDK API Integration (using Google Gemini) + * + * This module provides functions to interact with the AI SDK, + * allowing you to fetch metadata from a given URL. + * + * Available functions: + * - aisdkFetch: Fetch data from AI SDK for the specified message + */ + +// https://sdk.vercel.ai/docs/foundations/overview +// https://sdk.vercel.ai/docs/getting-started/nodejs +// test successfully: pnpm run aisdk:fetch "https://mkdirs.com" +export const aisdkFetch = async (url: string) => { + try { + const response = await fetch(url); + const htmlContent = (await response.text()) + .replace(/class="[^"]*"/g, '') + .replace(/]*>.*?<\/svg>/g, '') + .replace(/)<[^<]*)*<\/script>/gi, ''); + + const prompt = `Analyze the following webpage content and URL: ${url} + + Webpage content: + ${htmlContent} + + Based on the above content, provide the following information in a structured format: + 1. Title of the page (extract from content if possible, just return the short name, no description) + 2. Brief description (1 sentence summarizing the main content, no more than 160 characters) + 3. Detailed introduction (in markdown format, include the key features and prices of the product) + + Format your response as follows: + { + "title": "...", + "description": "...", + "introduction": "... (in markdown)" + }`; + + const { text } = await generateText({ + model: google("gemini-2.0-flash-exp"), + prompt: prompt, + }); + + console.log("aisdkFetch, url:", url, "response:", text); + return text; + } catch (error) { + console.error(`Error fetching data for URL ${url}:`, error); + return null; + } +}; + +// https://sdk.vercel.ai/providers/ai-sdk-providers/google-generative-ai#schema-limitations +// test successfully: pnpm run aisdk:structure "https://mkdirs.com" +export const aisdkStructure = async (url: string) => { + try { + // 获取实际的分类和标签数据 + const categories = await client.fetch(`*[_type == "category"]`); + const tags = await client.fetch(`*[_type == "tag"]`); + + const schema = z.object({ + title: z.string().describe("A short, concise name without description"), + description: z + .string() + .max(160) + .describe("One sentence summary, max 160 characters"), + introduction: z + .string() + .describe("Detailed introduction in markdown format"), + }); + + const response = await fetch(url); + const htmlContent = (await response.text()) + .replace(/class="[^"]*"/g, '') + .replace(/]*>.*?<\/svg>/g, '') + .replace(/)<[^<]*)*<\/script>/gi, ''); + + const result = await generateObject({ + model: google("gemini-2.0-flash-exp", { + structuredOutputs: true, + }), + schema, + prompt: `Analyze the following content and provide structured information: + + Content to analyze: + ${htmlContent} + + Please provide a concise title, brief description, and detailed introduction. + The introduction should be in markdown format, include the key features and prices of the product.`, + }); + + console.log( + "aisdkStructure, url:", + url, + "structured response:", + result, + ); + return result; + } catch (error) { + console.error(`Error processing url for ${url}:`, error); + return null; + } +}; + +// get operation from command line +const operation = process.argv[2]; +// get message from command line (new) +const url = process.argv[3]; + +// run operation based on command line argument +const runOperation = async () => { + switch (operation) { + case "fetch": { + if (!url) { + console.error("Please provide a url as the second argument"); + return; + } + const result = await aisdkFetch(url); + console.log("aisdkFetch, url:", url, "result:", result); + break; + } + + case "structure": { + if (!url) { + console.error("Please provide a url as the second argument"); + return; + } + const result = await aisdkStructure(url); + console.log("aisdkStructure, url:", url, "result:", result); + break; + } + + default: + console.log(` +Available commands: +- fetch : Fetch data for the specified url +- structure : Fetch data for the specified url and return structured data + `); + } +}; + +// run operation +runOperation().catch(console.error); diff --git a/scripts/explore-microlink.ts b/scripts/explore-microlink.ts new file mode 100644 index 0000000..d12d2ef --- /dev/null +++ b/scripts/explore-microlink.ts @@ -0,0 +1,138 @@ +import mql from "@microlink/mql"; +import dotenv from "dotenv"; +dotenv.config(); + +/** + * Microlink API Integration + * + * This module provides functions to interact with the Microlink API, + * allowing you to fetch metadata and screenshots from a given URL. + * + * Available functions: + * - microlinkFetch: Fetches metadata such as title, description, logo, etc. + * - microlinkInsights: Fetches insights such as technologies, languages, etc. + * - microlinkScreenshot: Captures a screenshot of the webpage. + * - microlinkFullpage: Captures a fullpage screenshot of the webpage. + */ + +// https://microlink.io/docs/api/getting-started/overview +// test successfully: pnpm run microlink:fetch https://mkdirs.com +export const microlinkFetch = async (url: string) => { + try { + const { data } = await mql(url, { + // information included: + // - title: page title + // - description: page description + // - lang: page language + // - author: author information + // - publisher: publisher information + // - image: main image + // - logo: website logo + // - url: normalized URL + }); + console.log("microlinkFetch, url:", url, "data:", data); + return data; + } catch (error) { + console.error(`Error fetching data for ${url}:`, error); + return null; + } +}; + +// https://microlink.io/docs/api/parameters/insights/technologies +// test successfully: pnpm run microlink:insights https://mkdirs.com +export const microlinkInsights = async (url: string) => { + try { + const { data } = await mql(url, { + insights: { + technologies: true, + }, + }); + console.log("microlinkInsights, url:", url, "data:", JSON.stringify(data, null, 2)); + return data; + } catch (error) { + console.error(`Error fetching data for ${url}:`, error); + return null; + } +}; + +// https://microlink.io/docs/api/parameters/screenshot +// test successfully: pnpm run microlink:screenshot https://mkdirs.com +export const microlinkScreenshot = async (url: string) => { + try { + const { data } = await mql(url, { + screenshot: true, + }); + console.log("microlinkScreenshot, url:", url, "data:", data); + return data; + } catch (error) { + console.error(`Error fetching data for ${url}:`, error); + return null; + } +}; + +// https://microlink.io/docs/api/parameters/screenshot +// test failed: pnpm run microlink:fullpage https://mkdirs.com +export const microlinkFullpage = async (url: string) => { + try { + const { data } = await mql(url, { + screenshot: { + fullPage: true, + }, + }); + console.log("microlinkFullpage, url:", url, "data:", data); + return data; + } catch (error) { + console.error(`Error fetching data for ${url}:`, error); + return null; + } +}; + +// get operation from command line +const operation = process.argv[2]; +// get url from command line (new) +const url = process.argv[3]; + +// run operation based on command line argument +const runOperation = async () => { + switch (operation) { + case "fetch": + if (!url) { + console.error("Please provide a URL as the second argument"); + return; + } + await microlinkFetch(url); + break; + case "insights": + if (!url) { + console.error("Please provide a URL as the second argument"); + return; + } + await microlinkInsights(url); + break; + case "screenshot": + if (!url) { + console.error("Please provide a URL as the second argument"); + return; + } + await microlinkScreenshot(url); + break; + case "fullpage": + if (!url) { + console.error("Please provide a URL as the second argument"); + return; + } + await microlinkFullpage(url); + break; + default: + console.log(` +Available commands: +- fetch : Fetch data from Microlink API for the specified URL +- insights : Fetch insights from Microlink API for the specified URL +- screenshot : Fetch screenshot from Microlink API for the specified URL +- fullpage : Fetch fullpage screenshot from Microlink API for the specified URL + `); + } +}; + +// run operation +runOperation().catch(console.error); diff --git a/scripts/export-user-emails.ts b/scripts/export-user-emails.ts new file mode 100644 index 0000000..59ca21e --- /dev/null +++ b/scripts/export-user-emails.ts @@ -0,0 +1,29 @@ +import { createClient } from '@sanity/client'; +import dotenv from 'dotenv'; +dotenv.config(); + +const client = createClient({ + // biome-ignore lint/style/noNonNullAssertion: + projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!, + // biome-ignore lint/style/noNonNullAssertion: + dataset: process.env.NEXT_PUBLIC_SANITY_DATASET!, + apiVersion: '2024-08-01', + useCdn: false, + perspective: 'published', + token: process.env.SANITY_API_TOKEN, +}); + +async function exportUserEmails() { + try { + const query = `*[_type == "user" && defined(email)].email`; + const emails: string[] = await client.fetch(query); + const emailString = emails.filter(Boolean).join(', '); + console.log('User emails:'); + console.log(emailString); + console.log(`\nTotal: ${emails.length} email addresses`); + } catch (error) { + console.error('Error fetching emails:', error); + } +} + +exportUserEmails(); diff --git a/src/actions/admin.ts b/src/actions/admin.ts new file mode 100644 index 0000000..10e06ab --- /dev/null +++ b/src/actions/admin.ts @@ -0,0 +1,23 @@ +"use server"; + +import { currentRole } from "@/lib/auth"; +import { UserRole } from "@/types/user-role"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +/** + * demostrate how to use currentRole to check user's role, + * and return different responses according to different roles. + */ +export async function admin(): Promise { + const role = await currentRole(); + + if (role === UserRole.ADMIN) { + return { status: "success", message: "Allowed Server Action!" }; + } + + return { status: "error", message: "Forbidden Server Action!" }; +} diff --git a/src/actions/create-checkout-session.ts b/src/actions/create-checkout-session.ts new file mode 100644 index 0000000..b27b045 --- /dev/null +++ b/src/actions/create-checkout-session.ts @@ -0,0 +1,140 @@ +"use server"; + +import { getUserById } from "@/data/user"; +import { currentUser } from "@/lib/auth"; +import { stripe } from "@/lib/stripe"; +import { absoluteUrl } from "@/lib/utils"; +import { sanityClient } from "@/sanity/lib/client"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { itemByIdQuery } from "@/sanity/lib/queries"; +import type { ItemInfo } from "@/types"; +import { redirect } from "next/navigation"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; + stripeUrl?: string; +}; + +/** + * https://github.com/javayhu/lms-studio-antonio/blob/main/app/api/courses/%5BcourseId%5D/checkout/route.ts + */ +export async function createCheckoutSession( + itemId: string, + priceId: string, + pricePlan: string, +): Promise { + let redirectUrl = ""; + + try { + const user = await currentUser(); + if (!user || !user.email || !user.id) { + return { status: "error", message: "Unauthorized" }; + } + + const item = await sanityFetch({ + query: itemByIdQuery, + params: { id: itemId }, + }); + if (!item) { + return { status: "error", message: "Item not found!" }; + } + + // 1. get user's stripeCustomerId + const sanityUser = await getUserById(user.id); + if (item.submitter._id !== user.id) { + return { status: "error", message: "You are not allowed to do this!" }; + } + let stripeCustomerId = sanityUser?.stripeCustomerId; + // console.log('stripeCustomerId:', stripeCustomerId); + + // 2. if the item is paid and the submitter is the user, then redirect to the billing portal + if (stripeCustomerId && item.paid) { + console.log("item is paid, redirect to billing portal"); + const billingUrl = absoluteUrl("/dashboard"); + const stripeSession = await stripe.billingPortal.sessions.create({ + customer: stripeCustomerId, + return_url: billingUrl, + }); + redirectUrl = stripeSession.url as string; + // console.log('stripe billing portal session created, url:', redirectUrl); + } else { + // 3. make sure the user has a stripeCustomerId + console.log("item is not paid, redirect to stripe checkout session"); + if (!stripeCustomerId) { + console.log("creating customer in Stripe and Sanity"); + const customer = await stripe.customers.create({ + email: user.email, + }); + if (!customer) { + return { + status: "error", + message: "Failed to create customer in Stripe", + }; + } + + const result = await sanityClient + .patch(user.id) + .set({ + stripeCustomerId: customer.id, + }) + .commit(); + if (!result) { + return { + status: "error", + message: "Failed to save customer in Sanity", + }; + } + stripeCustomerId = customer.id; + } + + // 4. create stripe checkout session + console.log( + "Creating Stripe checkout session:", + { + customerId: stripeCustomerId, + priceId, + userId: user.id, + itemId, + } + ); + // TODO: optimize the success and cancel urls with sessionId!!! + const successUrl = absoluteUrl(`/publish/${itemId}?pay=success`); + const cancelUrl = absoluteUrl(`/payment/${itemId}?pay=failed`); + const stripeSession = await stripe.checkout.sessions.create({ + customer: stripeCustomerId, + mode: "payment", + line_items: [ + { + price: priceId, + quantity: 1, + }, + ], + metadata: { + userId: user.id, + itemId: itemId, + priceId: priceId, + pricePlan: pricePlan, + }, + success_url: successUrl, + cancel_url: cancelUrl, + // do not limit to card, allow other payment methods + // payment_method_types: ["card"], + billing_address_collection: "auto", + // allow promotion codes if you need + allow_promotion_codes: true, + }); + + redirectUrl = stripeSession.url as string; + console.log("stripe checkout session created, url:", redirectUrl); + } + } catch (error) { + return { + status: "error", + message: "Failed to generate stripe checkout session", + }; + } + + // 5. redirect to new url, no revalidatePath because redirect + redirect(redirectUrl); +} diff --git a/src/actions/edit.ts b/src/actions/edit.ts new file mode 100644 index 0000000..e747515 --- /dev/null +++ b/src/actions/edit.ts @@ -0,0 +1,184 @@ +"use server"; + +import { getItemById } from "@/data/item"; +import { currentUser } from "@/lib/auth"; +import type { SUPPORT_ITEM_ICON } from "@/lib/constants"; +import { sendNotifySubmissionEmail } from "@/lib/mail"; +import { EditSchema } from "@/lib/schemas"; +import { FreePlanStatus, PricePlans } from "@/lib/submission"; +import { + getItemLinkInStudio, + getItemStatusLinkInWebsite, + slugify, +} from "@/lib/utils"; +import { sanityClient } from "@/sanity/lib/client"; +import { revalidatePath } from "next/cache"; + +// biome-ignore format: conditional type +// biome-ignore lint/complexity/noBannedTypes: support item icon +// type IconField = typeof SUPPORT_ITEM_ICON extends true ? { iconId: string } : {}; + +// export type EditFormData = { +// id: string; +// name: string; +// link: string; +// description: string; +// introduction: string; +// tags: string[]; +// categories: string[]; +// imageId: string; +// pricePlan: string; +// planStatus: string; +// } & IconField; + +type BaseEditFormData = { + id: string; + name: string; + link: string; + description: string; + introduction: string; + tags: string[]; + categories: string[]; + imageId: string; + pricePlan: string; + planStatus: string; +}; + +export type EditFormData = typeof SUPPORT_ITEM_ICON extends true + ? BaseEditFormData & { iconId: string } + : BaseEditFormData; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +/** + * https://nextjs.org/learn/dashboard-app/mutating-data + */ +export async function edit( + formData: EditFormData, +): Promise { + try { + const user = await currentUser(); + if (!user) { + return { status: "error", message: "Unauthorized" }; + } + console.log("edit, user:", user); + + // console.log("edit, data:", formData); + const { + id, + name, + link, + description, + introduction, + imageId, + tags, + categories, + pricePlan, + planStatus, + ...rest + } = EditSchema.parse(formData); + const iconId = "iconId" in rest ? rest.iconId : undefined; + console.log("edit, name:", name, "link:", link); + + // check if the user is the submitter of the item + const item = await getItemById(id); + if (!item) { + return { status: "error", message: "Item not found!" }; + } + if (item.submitter._ref !== user.id) { + return { status: "error", message: "You are not allowed to do this!" }; + } + + const slug = slugify(name); + const data = { + _id: id, + _type: "item", + name, + slug: { + _type: "slug", + current: slug, + }, + link, + description, + introduction, + + // Free plan: update item leads to be unpublished and reviewed again + // remain submitted if the plan status is submitted, otherwise set to pending + ...(pricePlan === PricePlans.FREE && { + publishDate: null, + freePlanStatus: + planStatus === FreePlanStatus.SUBMITTING + ? FreePlanStatus.SUBMITTING + : FreePlanStatus.PENDING, + }), + + // The _key only needs to be unique within the array itself, use index as the _key + tags: tags.map((tag, index) => ({ + _type: "reference", + _ref: tag, + _key: index.toString(), + })), + categories: categories.map((category, index) => ({ + _type: "reference", + _ref: category, + _key: index.toString(), + })), + image: { + _type: "image", + alt: `image of ${name}`, + asset: { + _type: "reference", + _ref: imageId, + }, + }, + icon: iconId + ? { + _type: "image", + alt: `icon of ${name}`, + asset: { + _type: "reference", + _ref: iconId, + }, + } + : undefined, + }; + + // console.log("edit, data:", data); + const res = await sanityClient.patch(id).set(data).commit(); + if (!res) { + console.log("edit, fail"); + return { status: "error", message: "Failed to update item" }; + } + // console.log("edit, success, res:", res); + + // send notify email to admin and user + if (pricePlan === PricePlans.FREE) { + const statusLink = getItemStatusLinkInWebsite(id); + const reviewLink = getItemLinkInStudio(id); + sendNotifySubmissionEmail( + user.name, + user.email, + name, + statusLink, + reviewLink, + ); + } + + // Next.js has a Client-side Router Cache that stores the route segments in the user's browser for a time. + // Along with prefetching, this cache ensures that users can quickly navigate between routes + // while reducing the number of requests made to the server. + // Since you're updating the data displayed in the invoices route, you want to clear this cache and trigger a new request to the server. + // You can do this with the revalidatePath function from Next.js. + + // redirect to the updated item, but not working, still showing the old item + revalidatePath(`/edit/${id}`); + revalidatePath(`/item/${slug}`); + return { status: "success", message: "Successfully updated item" }; + } catch (error) { + console.log("edit, error", error); + return { status: "error", message: "Failed to update item" }; + } +} diff --git a/src/actions/fetch-website.ts b/src/actions/fetch-website.ts new file mode 100644 index 0000000..f9c29f7 --- /dev/null +++ b/src/actions/fetch-website.ts @@ -0,0 +1,270 @@ +"use server"; + +import { slugify } from "@/lib/utils"; +import type { Category, Tag } from "@/sanity.types"; +import { sanityClient } from "@/sanity/lib/client"; +import { deepseek } from "@ai-sdk/deepseek"; +import { google } from "@ai-sdk/google"; +import { openai } from "@ai-sdk/openai"; +import { xai } from "@ai-sdk/xai"; +import { createOpenRouter } from "@openrouter/ai-sdk-provider"; +import { generateObject } from "ai"; +import { z } from "zod"; + +/** + * Website info schema + * + * 1. when AI generates the image and icon, it will return the image URL and icon URL + * 2. when the image and icon are uploaded to Sanity, the image reference Id and icon reference Id will be set to the image and icon + * 3. when this server action is called, it will return the image url and icon url, and the image reference Id and icon reference Id + */ +const WebsiteInfoSchema = z.object({ + name: z.string().describe("A short, concise name without description"), + description: z + .string() + .max(160) + .describe("One sentence summary, max 160 characters"), + introduction: z.string().describe("Detailed introduction in markdown format"), + categories: z + .array(z.string()) + .describe("Array of category names that best match the content"), + tags: z + .array(z.string()) + .describe("Array of tag names that best match the content"), + image: z.string().describe("Website screenshot image URL"), + icon: z.string().describe("Website logo image URL"), + imageId: z + .string() + .optional() + .describe("Website screenshot image reference Id"), + iconId: z.string().optional().describe("Website logo image reference Id"), +}); + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; + data?: z.infer; +}; + +/** + * fetch info for the specified url + */ +export async function fetchWebsite(url: string): Promise { + try { + if (!process.env.DEFAULT_AI_PROVIDER) { + return { + status: "error", + message: "AI submit is not supported", + }; + } + + const data = await fetchWebsiteInfo(url); + if (data === null) { + return { + status: "error", + message: "Failed to fetch website info", + }; + } + return { + status: "success", + message: "Successfully fetched website info", + data, + }; + } catch (error) { + console.error("fetchWebsite, fetch website:", url, "error:", error); + return { + status: "error", + message: "Failed to fetch website info", + }; + } +} + +/** + * fetch website info for the specified url with Microlink and AI SDK + */ +export const fetchWebsiteInfo = async (url: string) => { + const fetchedData = await fetchWebsiteInfoWithAI(url); + if (fetchedData === null) { + console.error("fetchWebsiteInfo, url:", url, "fetchedData is null"); + return null; + } + console.log("fetchWebsiteInfo, url:", url, "fetchedData:", fetchedData); + + const websiteInfo = WebsiteInfoSchema.parse({ + name: fetchedData.object.name, + description: fetchedData.object.description, + introduction: fetchedData.object.introduction, + categories: fetchedData.object.categories, + tags: fetchedData.object.tags, + // image: microlinkData?.image?.url, // maybe we can use Microlink to get the screenshot as fallback + image: fetchedData.object.image, + // icon: microlinkData?.logo?.url, // maybe we can use Microlink to get the logo as fallback + // TODO: we don't use favicon URL, instead, we use Google API to get the logo + icon: `https://s2.googleusercontent.com/s2/favicons?domain=${url}&sz=128`, + }); + console.log("fetchWebsiteInfo, url:", url, "websiteInfo:", websiteInfo); + + if (websiteInfo.image && websiteInfo.icon) { + // Fetch icon and image + const [iconResponse, imageResponse] = await Promise.all([ + fetch(websiteInfo.icon), + fetch(websiteInfo.image), + ]); + + console.log("fetchWebsiteInfo, start fetching icon and image"); + const [iconArrayBuffer, imageArrayBuffer] = await Promise.all([ + iconResponse.arrayBuffer(), + imageResponse.arrayBuffer(), + ]); + + // Convert ArrayBuffer to Buffer for Sanity upload + const [iconBuffer, imageBuffer] = [ + Buffer.from(iconArrayBuffer), + Buffer.from(imageArrayBuffer), + ]; + + console.log("fetchWebsiteInfo, start uploading icon and image to sanity"); + // Upload icon and image to sanity + const [iconAsset, imageAsset] = await Promise.all([ + sanityClient.assets.upload("image", iconBuffer, { + filename: `${slugify(websiteInfo.name)}_logo.png`, + }), + sanityClient.assets.upload("image", imageBuffer, { + filename: `${slugify(websiteInfo.name)}_image.png`, + }), + ]); + + console.log("fetchWebsiteInfo, url:", url, "iconAsset:", iconAsset); + console.log("fetchWebsiteInfo, url:", url, "imageAsset:", imageAsset); + + websiteInfo.icon = iconAsset.url; + websiteInfo.image = imageAsset.url; + websiteInfo.iconId = iconAsset._id; + websiteInfo.imageId = imageAsset._id; + console.log("fetchWebsiteInfo, url:", url, "websiteInfo:", websiteInfo); + } + + return websiteInfo; +}; + +/** + * fetch website info for the specified url with AI SDK + */ +export const fetchWebsiteInfoWithAI = async (url: string) => { + try { + // get all categories and tags + const categories = await sanityClient.fetch( + `*[_type == "category"]`, + ); + const tags = await sanityClient.fetch(`*[_type == "tag"]`); + const availableCategories = categories.map((cat) => cat.name); + const availableTags = tags.map((tag) => tag.name); + + const response = await fetch(url); + // TODO: we need to convert htmlContent to simple content for AI to analyze (save time and cost) + // TODO: if the content is too long, error will be thrown, so sometimes AI submit will fail + // Google Gemini model support more tokens than DeepSeek model, so we prefer Google Gemini model + // Thanks to Justin3go for the original implementation. + const htmlContent = (await response.text()) + .replace(/class="[^"]*"/g, "") + .replace(/]*>.*?<\/svg>/g, "") + .replace(/)<[^<]*)*<\/script>/gi, ""); + + let aiModel = null; + if ( + process.env.DEFAULT_AI_PROVIDER === "google" && + process.env.GOOGLE_GENERATIVE_AI_API_KEY !== undefined + ) { + // https://ai-sdk.dev/providers/ai-sdk-providers/google-generative-ai + aiModel = google("gemini-2.0-flash-exp", { + structuredOutputs: true, + }); + } else if ( + process.env.DEFAULT_AI_PROVIDER === "deepseek" && + process.env.DEEPSEEK_API_KEY !== undefined + ) { + // https://ai-sdk.dev/providers/ai-sdk-providers/deepseek + aiModel = deepseek("deepseek-chat", { + // structuredOutputs: true, + }); + } else if ( + process.env.DEFAULT_AI_PROVIDER === "openai" && + process.env.OPENAI_API_KEY !== undefined + ) { + // https://ai-sdk.dev/providers/ai-sdk-providers/openai + aiModel = openai("gpt-4o-mini", { + structuredOutputs: true, + }); + } else if ( + process.env.DEFAULT_AI_PROVIDER === "xai" && + process.env.XAI_API_KEY !== undefined + ) { + // https://ai-sdk.dev/providers/ai-sdk-providers/xai + aiModel = xai("grok-3", { + // structuredOutputs: true, + }); + } else if ( + process.env.DEFAULT_AI_PROVIDER === "openrouter" && + process.env.OPENROUTER_API_KEY !== undefined && + process.env.OPENROUTER_MODEL !== undefined + ) { + // https://ai-sdk.dev/providers/community-providers/openrouter + const openrouter = createOpenRouter({ + apiKey: process.env.OPENROUTER_API_KEY, + }); + aiModel = openrouter(process.env.OPENROUTER_MODEL); + } + + if (aiModel === null) { + return null; + } + console.log("fetchWebsiteInfoWithAI, aiModel:", aiModel); + + const result = await generateObject({ + model: aiModel, + schema: WebsiteInfoSchema, + prompt: `Analyze the following webpage content and provide structured information: + + Content to analyze: + ${htmlContent} + + Available Categories: + ${availableCategories.join(", ")} + + Available Tags: + ${availableTags.join(", ")} + + Please analyze the content and provide: + 1. A concise title (just the name, no description) + 2. A brief description (one sentence, max 160 characters) + 3. A detailed introduction in markdown format (include key features and use cases) + 4. Select appropriate categories from the available categories list (return array of names) + 5. Select relevant tags from the available tags list (return array of names) + 6. Provide a screenshot image full URL, choose open graph image URL if possible + 7. Provide a website logo full URL, choose website favicon URL if possible + + Focus on technical aspects and practical applications. If the content is a tool or service, + emphasize its main features, target users, and unique selling points.`, + }); + + // console.log("fetchWebsiteInfoWithAI, url:", url, "result:", result); + + // filter AI generated categories and tags to make sure they are in the available categories and tags + const filteredCategories = result.object.categories.filter((category) => + availableCategories.includes(category), + ); + const filteredTags = result.object.tags.filter((tag) => + availableTags.includes(tag), + ); + result.object.categories = filteredCategories; + result.object.tags = filteredTags; + + return result; + } catch (error) { + console.error( + `fetchWebsiteInfoWithAI, error processing url for ${url}:`, + error, + ); + return null; + } +}; diff --git a/src/actions/get-banner-ad.ts b/src/actions/get-banner-ad.ts new file mode 100644 index 0000000..7bf39d0 --- /dev/null +++ b/src/actions/get-banner-ad.ts @@ -0,0 +1,52 @@ +"use server"; + +import { getItemTargetLinkInWebsite } from "@/lib/utils"; +import type { SponsorItemListQueryResult } from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { sponsorItemListQuery } from "@/sanity/lib/queries"; + +export type BannerAdData = { + content: string; + url: string; +}; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; + data?: BannerAdData; +}; + +export async function getBannerAd(): Promise { + try { + const result = await sanityFetch({ + query: sponsorItemListQuery, + }); + + // console.log("getBannerAd, result", result); + + // we only show the first sponsor item as banner ad + if (result && result.length > 0) { + return { + status: "success", + message: "Banner ad fetched successfully!", + data: { + content: `🎉 ${result[0].name}: ${result[0].description}`, + url: getItemTargetLinkInWebsite(result[0]), + }, + }; + } + + return { + status: "error", + message: "no banner ad!", + data: null, + }; + } catch (error) { + console.log("getBannerAd, error", error); + return { + status: "error", + message: "Failed to fetch banner ad!", + data: null, + }; + } +} diff --git a/src/actions/login.ts b/src/actions/login.ts new file mode 100644 index 0000000..1581b95 --- /dev/null +++ b/src/actions/login.ts @@ -0,0 +1,74 @@ +"use server"; + +import { signIn } from "@/auth"; +import { getUserByEmail } from "@/data/user"; +import { sendVerificationEmail } from "@/lib/mail"; +import { LoginSchema } from "@/lib/schemas"; +import { generateVerificationToken } from "@/lib/tokens"; +import { DEFAULT_LOGIN_REDIRECT } from "@/routes"; +import { AuthError } from "next-auth"; +import type * as z from "zod"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; + redirectUrl?: string; +}; + +export async function login( + values: z.infer, + callbackUrl?: string | null, +): Promise { + const validatedFields = LoginSchema.safeParse(values); + if (!validatedFields.success) { + return { status: "error", message: "Invalid fields!" }; + } + + const { email, password } = validatedFields.data; + const existingUser = await getUserByEmail(email); + if (!existingUser || !existingUser.email || !existingUser.password) { + return { status: "error", message: "User does not exist!" }; + } + + if (!existingUser.emailVerified) { + const verificationToken = await generateVerificationToken( + existingUser.email, + ); + await sendVerificationEmail( + verificationToken.identifier, + verificationToken.token, + ); + return { + status: "success", + message: "Please check your email for verification", + }; + } + + try { + console.log("login, start signIn"); + // https://youtu.be/1MTyCvS05V4?t=9828 + await signIn("credentials", { + email, + password, + redirect: false, + redirectTo: callbackUrl || DEFAULT_LOGIN_REDIRECT, + }); + + return { + status: "success", + message: "Login success", + redirectUrl: callbackUrl || DEFAULT_LOGIN_REDIRECT, + }; + } catch (error) { + // console.error("login, error:", error); + if (error instanceof AuthError) { + switch (error.type) { + case "CredentialsSignin": + return { status: "error", message: "Invalid credentials!" }; + default: + return { status: "error", message: "Something went wrong!" }; + } + } + return { status: "error", message: "Something went wrong!" }; + } +} diff --git a/src/actions/logout.ts b/src/actions/logout.ts new file mode 100644 index 0000000..291c72f --- /dev/null +++ b/src/actions/logout.ts @@ -0,0 +1,7 @@ +"use server"; + +import { signOut } from "@/auth"; + +export const logout = async () => { + await signOut(); +}; diff --git a/src/actions/new-password.ts b/src/actions/new-password.ts new file mode 100644 index 0000000..799834c --- /dev/null +++ b/src/actions/new-password.ts @@ -0,0 +1,56 @@ +"use server"; + +import { getPasswordResetTokenByToken } from "@/data/password-reset-token"; +import { getUserByEmail } from "@/data/user"; +import { NewPasswordSchema } from "@/lib/schemas"; +import { sanityClient } from "@/sanity/lib/client"; +import bcrypt from "bcryptjs"; +import type * as z from "zod"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function newPassword( + values: z.infer, + token?: string | null, +): Promise { + // console.log('newPassword, token:', token); + if (!token) { + return { status: "error", message: "Missing token!" }; + } + + const validatedFields = NewPasswordSchema.safeParse(values); + if (!validatedFields.success) { + return { status: "error", message: "Invalid fields!" }; + } + + const { password } = validatedFields.data; + + const existingToken = await getPasswordResetTokenByToken(token); + if (!existingToken) { + return { status: "error", message: "Invalid token!" }; + } + + const hasExpired = new Date(existingToken.expires) < new Date(); + if (hasExpired) { + return { status: "error", message: "Token has expired!" }; + } + + const existingUser = await getUserByEmail(existingToken.identifier); + if (!existingUser) { + return { status: "error", message: "Email does not exist!" }; + } + + const hashedPassword = await bcrypt.hash(password, 10); + await sanityClient + .patch(existingUser._id) + .set({ + password: hashedPassword, + }) + .commit(); + + await sanityClient.delete(existingToken._id); + return { status: "success", message: "Password updated!" }; +} diff --git a/src/actions/new-verification.ts b/src/actions/new-verification.ts new file mode 100644 index 0000000..cabb0c4 --- /dev/null +++ b/src/actions/new-verification.ts @@ -0,0 +1,41 @@ +"use server"; + +import { getUserByEmail } from "@/data/user"; +import { getVerificationTokenByToken } from "@/data/verification-token"; +import { sanityClient } from "@/sanity/lib/client"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function newVerification( + token: string, +): Promise { + const existingToken = await getVerificationTokenByToken(token); + if (!existingToken) { + return { status: "error", message: "Token does not exist!" }; + } + + const hasExpired = new Date(existingToken.expires) < new Date(); + if (hasExpired) { + return { status: "error", message: "Token has expired!" }; + } + + const existingUser = await getUserByEmail(existingToken.identifier); + if (!existingUser) { + return { status: "error", message: "Email does not exist!" }; + } + + await sanityClient + .patch(existingUser._id) + .set({ + emailVerified: new Date().toISOString(), + email: existingToken.identifier, + }) + .commit(); + console.log("Email verified:", existingUser.email); + + await sanityClient.delete(existingToken._id); + return { status: "success", message: "Email verified!" }; +} diff --git a/src/actions/open-customer-portal.ts b/src/actions/open-customer-portal.ts new file mode 100644 index 0000000..bd533c5 --- /dev/null +++ b/src/actions/open-customer-portal.ts @@ -0,0 +1,44 @@ +"use server"; + +import { currentUser } from "@/lib/auth"; +import { stripe } from "@/lib/stripe"; +import { absoluteUrl } from "@/lib/utils"; +import { redirect } from "next/navigation"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; + stripeUrl?: string; +}; + +const billingUrl = absoluteUrl("/dashboard"); + +/** + * NOTICE: not used in the app yet + */ +export async function openCustomerPortal( + stripeCustomerId: string, +): Promise { + let redirectUrl = ""; + + try { + const user = await currentUser(); + if (!user || !user.email) { + return { status: "error", message: "Unauthorized" }; + } + + if (stripeCustomerId) { + const stripeSession = await stripe.billingPortal.sessions.create({ + customer: stripeCustomerId, + return_url: billingUrl, + }); + + redirectUrl = stripeSession.url as string; + } + } catch (error) { + return { status: "error", message: "Failed to open customer portal" }; + } + + redirect(redirectUrl); + // return { status: "success", stripeUrl: redirectUrl }; +} diff --git a/src/actions/publish.ts b/src/actions/publish.ts new file mode 100644 index 0000000..387237a --- /dev/null +++ b/src/actions/publish.ts @@ -0,0 +1,45 @@ +"use server"; + +import { getItemById } from "@/data/item"; +import { currentUser } from "@/lib/auth"; +import { sanityClient } from "@/sanity/lib/client"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function publish(itemId: string): Promise { + console.log("publish, itemId:", itemId); + try { + const user = await currentUser(); + if (!user) { + return { status: "error", message: "Unauthorized" }; + } + // console.log("publish, user:", user); + + const item = await getItemById(itemId); + if (!item) { + return { status: "error", message: "Item not found!" }; + } + if (item.submitter._ref !== user.id) { + return { status: "error", message: "You are not allowed to do this!" }; + } + + const result = await sanityClient + .patch(itemId) + .set({ + publishDate: new Date().toISOString(), + }) + .commit(); + // console.log('publish, result:', result); + + if (!result) { + return { status: "error", message: "Failed to publish item!" }; + } + return { status: "success", message: "Successfully published!" }; + } catch (error) { + console.log("publish, error", error); + return { status: "error", message: "Failed to publish item!" }; + } +} diff --git a/src/actions/register.ts b/src/actions/register.ts new file mode 100644 index 0000000..8928e87 --- /dev/null +++ b/src/actions/register.ts @@ -0,0 +1,53 @@ +"use server"; + +import { getUserByEmail } from "@/data/user"; +import { sendVerificationEmail } from "@/lib/mail"; +import { RegisterSchema } from "@/lib/schemas"; +import { generateVerificationToken } from "@/lib/tokens"; +import { sanityClient } from "@/sanity/lib/client"; +import { UserRole } from "@/types/user-role"; +import { uuid } from "@sanity/uuid"; +import bcrypt from "bcryptjs"; +import type * as z from "zod"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function register( + values: z.infer, +): Promise { + const validatedFields = RegisterSchema.safeParse(values); + + if (!validatedFields.success) { + return { status: "error", message: "Invalid Fields!" }; + } + + const { email, password, name } = validatedFields.data; + const hashedPassword = await bcrypt.hash(password, 10); + + const existingUser = await getUserByEmail(email); + if (existingUser) { + return { status: "error", message: "Email already being used" }; + } + + await sanityClient.create({ + _type: "user", + _id: `user.${uuid()}`, + name, + email, + role: UserRole.USER, + password: hashedPassword, + }); + + const verificationToken = await generateVerificationToken(email); + await sendVerificationEmail( + verificationToken.identifier, + verificationToken.token, + ); + return { + status: "success", + message: "Please check your email for verification", + }; +} diff --git a/src/actions/reset.ts b/src/actions/reset.ts new file mode 100644 index 0000000..580759c --- /dev/null +++ b/src/actions/reset.ts @@ -0,0 +1,37 @@ +"use server"; + +import { getUserByEmail } from "@/data/user"; +import { sendPasswordResetEmail } from "@/lib/mail"; +import { ResetSchema } from "@/lib/schemas"; +import { generatePasswordResetToken } from "@/lib/tokens"; +import type * as z from "zod"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function reset( + values: z.infer, +): Promise { + const validatedFields = ResetSchema.safeParse(values); + if (!validatedFields.success) { + return { status: "error", message: "Invalid email!" }; + } + + const { email } = validatedFields.data; + + const existingUser = await getUserByEmail(email); + if (!existingUser) { + return { status: "error", message: "Email not found!" }; + } + + const passwordResetToken = await generatePasswordResetToken(email); + await sendPasswordResetEmail( + existingUser.name, + passwordResetToken.identifier, + passwordResetToken.token, + ); + + return { status: "success", message: "Password reset email sent" }; +} diff --git a/src/actions/settings.ts b/src/actions/settings.ts new file mode 100644 index 0000000..e3e5aa8 --- /dev/null +++ b/src/actions/settings.ts @@ -0,0 +1,78 @@ +"use server"; + +import { unstable_update } from "@/auth"; +import { getUserById } from "@/data/user"; +import { currentUser } from "@/lib/auth"; +import type { SettingsSchema } from "@/lib/schemas"; +import { sanityClient } from "@/sanity/lib/client"; +import bcrypt from "bcryptjs"; +import { revalidatePath } from "next/cache"; +import type * as z from "zod"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function settings( + values: z.infer, +): Promise { + try { + const user = await currentUser(); + if (!user) { + return { status: "error", message: "Unauthorized" }; + } + + const dbUser = await getUserById(user.id); + if (!dbUser) { + return { status: "error", message: "User not found" }; + } + + // console.log('settings, values:', values); + if (user.isOAuth) { + values.password = undefined; + values.newPassword = undefined; + } + + // password change needs verification + if (values.password && values.newPassword && dbUser.password) { + const passwordsMatch = await bcrypt.compare( + values.password, + dbUser.password, + ); + + if (!passwordsMatch) { + return { status: "error", message: "Incorrect password!" }; + } + + const hashedPassword = await bcrypt.hash(values.newPassword, 10); + values.password = hashedPassword; + values.newPassword = undefined; + } + + const updatedUser = await sanityClient + .patch(dbUser._id) + .set({ + ...values, + }) + .commit(); + console.log("settings, updatedUser:", updatedUser); + + // unstable update in Beta version + unstable_update({ + user: { + name: updatedUser.name, + link: updatedUser.link, + }, + }); + + revalidatePath("/settings"); + return { status: "success", message: "Account information updated!" }; + } catch (error) { + console.log("settings, error", error); + return { + status: "error", + message: "Failed to update account information!", + }; + } +} diff --git a/src/actions/submit-to-review.ts b/src/actions/submit-to-review.ts new file mode 100644 index 0000000..8b34174 --- /dev/null +++ b/src/actions/submit-to-review.ts @@ -0,0 +1,67 @@ +"use server"; + +import { getItemById } from "@/data/item"; +import { currentUser } from "@/lib/auth"; +import { sendNotifySubmissionEmail } from "@/lib/mail"; +import { FreePlanStatus, PricePlans } from "@/lib/submission"; +import { getItemLinkInStudio, getItemStatusLinkInWebsite } from "@/lib/utils"; +import { sanityClient } from "@/sanity/lib/client"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export const submitToReview = async ( + itemId: string, +): Promise => { + console.log("submitToReview, itemId:", itemId); + try { + const user = await currentUser(); + if (!user) { + return { status: "error", message: "Unauthorized" }; + } + // console.log("submitToReview, user:", user); + + const item = await getItemById(itemId); + if (!item) { + return { status: "error", message: "Item not found!" }; + } + if (item.submitter._ref !== user.id) { + return { status: "error", message: "You are not allowed to do this!" }; + } + if ( + item.pricePlan !== PricePlans.FREE || + item.freePlanStatus !== FreePlanStatus.SUBMITTING + ) { + return { status: "error", message: "Item is not in right plan status!" }; + } + + const result = await sanityClient + .patch(itemId) + .set({ + pricePlan: PricePlans.FREE, + freePlanStatus: FreePlanStatus.PENDING, + }) + .commit(); + // console.log('submitToReview, result:', result); + if (!result) { + return { status: "error", message: "Failed to submit item to review!" }; + } + + const statusLink = getItemStatusLinkInWebsite(itemId); + const reviewLink = getItemLinkInStudio(itemId); + sendNotifySubmissionEmail( + user.name, + user.email, + result.name, + statusLink, + reviewLink, + ); + + return { status: "success", message: "Item submitted to review!" }; + } catch (error) { + console.log("submitToReview, error", error); + return { status: "error", message: "Failed to submit item to review!" }; + } +}; diff --git a/src/actions/submit.ts b/src/actions/submit.ts new file mode 100644 index 0000000..5a45646 --- /dev/null +++ b/src/actions/submit.ts @@ -0,0 +1,141 @@ +"use server"; + +import { currentUser } from "@/lib/auth"; +import type { SUPPORT_ITEM_ICON } from "@/lib/constants"; +import { SubmitSchema } from "@/lib/schemas"; +import { FreePlanStatus, PricePlans } from "@/lib/submission"; +import { slugify } from "@/lib/utils"; +import { sanityClient } from "@/sanity/lib/client"; +import { revalidatePath } from "next/cache"; + +type BaseSubmitFormData = { + name: string; + link: string; + description: string; + introduction: string; + imageId: string; + tags: string[]; + categories: string[]; +}; + +export type SubmitFormData = typeof SUPPORT_ITEM_ICON extends true + ? BaseSubmitFormData & { iconId: string } + : BaseSubmitFormData; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; + id?: string; +}; + +/** + * https://nextjs.org/learn/dashboard-app/mutating-data + */ +export async function submit( + formData: SubmitFormData, +): Promise { + try { + const user = await currentUser(); + if (!user) { + return { status: "error", message: "Unauthorized" }; + } + + // console.log("submit, data:", formData); + const { + name, + link, + description, + introduction, + imageId, + tags, + categories, + ...rest + } = SubmitSchema.parse(formData); + const iconId = "iconId" in rest ? rest.iconId : undefined; + console.log("submit, name:", name, "link:", link); + + let slug = slugify(name); + // check if the slug already exists + const existingItem = await sanityClient.fetch( + `*[_type == "item" && slug.current == $slug][0]`, + { slug }, + ); + if (existingItem) { + const slugLink = slugify(link.replace(/^https?:\/\//, "")); + slug = `${slug}-${slugLink}`; + } + + const data = { + _type: "item", + name, + slug: { + _type: "slug", + current: slug, + }, + link, + description, + introduction, + publishDate: null, + + paid: false, + pricePlan: PricePlans.FREE, + freePlanStatus: FreePlanStatus.SUBMITTING, + submitter: { + _type: "reference", + _ref: user.id, + }, + + // The _key only needs to be unique within the array itself + tags: tags.map((tag, index) => ({ + _type: "reference", + _ref: tag, + _key: index.toString(), + })), + categories: categories.map((category, index) => ({ + _type: "reference", + _ref: category, + _key: index.toString(), + })), + image: { + _type: "image", + alt: `image of ${name}`, + asset: { + _type: "reference", + _ref: imageId, + }, + }, + icon: iconId + ? { + _type: "image", + alt: `icon of ${name}`, + asset: { + _type: "reference", + _ref: iconId, + }, + } + : undefined, + }; + + // console.log("submit, data:", data); + + const res = await sanityClient.create(data); + if (!res) { + console.log("submit, fail"); + return { status: "error", message: "Failed to submit" }; + } + + // console.log("submit, success, res:", res); + + // Next.js has a Client-side Router Cache that stores the route segments in the user's browser for a time. + // Along with prefetching, this cache ensures that users can quickly navigate between routes + // while reducing the number of requests made to the server. + // Since you're updating the data displayed in the invoices route, you want to clear this cache and trigger a new request to the server. + // You can do this with the revalidatePath function from Next.js. + revalidatePath("/submit"); + + return { status: "success", message: "Successfully created", id: res._id }; + } catch (error) { + console.log("submit, error", error); + return { status: "error", message: "Failed to submit" }; + } +} diff --git a/src/actions/subscribe-to-newsletter.ts b/src/actions/subscribe-to-newsletter.ts new file mode 100644 index 0000000..84d210d --- /dev/null +++ b/src/actions/subscribe-to-newsletter.ts @@ -0,0 +1,54 @@ +"use server"; + +import { NewsletterWelcomeEmail } from "@/emails/newsletter-welcome"; +import { resend } from "@/lib/mail"; +import { type NewsletterFormData, NewsletterFormSchema } from "@/lib/schemas"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function subscribeToNewsletter( + formdata: NewsletterFormData, +): Promise { + try { + const validatedInput = NewsletterFormSchema.safeParse(formdata); + if (!validatedInput.success) { + return { status: "error", message: "Invalid input" }; + } + + const subscribedResult = await resend.contacts.create({ + email: validatedInput.data.email, + unsubscribed: false, + audienceId: process.env.RESEND_AUDIENCE_ID, + }); + console.log("subscribeToNewsletter, subscribedResult", subscribedResult); + const subscribed = !subscribedResult.error; + + if (subscribed) { + const emailSentResult = await resend.emails.send({ + from: process.env.RESEND_EMAIL_FROM, + to: validatedInput.data.email, + subject: "Welcome to our newsletter!", + react: NewsletterWelcomeEmail({ email: validatedInput.data.email }), + }); + console.log("subscribeToNewsletter, emailSentResult", emailSentResult); + const emailSent = !emailSentResult.error; + if (emailSent) { + return { status: "success", message: "Subscribed to the newsletter" }; + } + } + + return { + status: "error", + message: "Failed to subscribe to the newsletter", + }; + } catch (error) { + console.error("subscribeToNewsletter, error:", error); + return { + status: "error", + message: "Failed to subscribe to the newsletter", + }; + } +} diff --git a/src/actions/unpublish.ts b/src/actions/unpublish.ts new file mode 100644 index 0000000..565c0d9 --- /dev/null +++ b/src/actions/unpublish.ts @@ -0,0 +1,46 @@ +"use server"; + +import { getItemById } from "@/data/item"; +import { currentUser } from "@/lib/auth"; +import { sanityClient } from "@/sanity/lib/client"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function unpublish(itemId: string): Promise { + console.log("unpublish, itemId:", itemId); + try { + const user = await currentUser(); + if (!user) { + return { status: "error", message: "Unauthorized" }; + } + // console.log("publish, user:", user); + + const item = await getItemById(itemId); + if (!item) { + return { status: "error", message: "Item not found!" }; + } + if (item.submitter._ref !== user.id) { + return { status: "error", message: "You are not allowed to do this!" }; + } + + const result = await sanityClient + .patch(itemId) + .set({ + publishDate: null, + }) + .commit(); + // console.log('unpublish, result:', result); + + if (!result) { + return { status: "error", message: "Failed to unpublish item!" }; + } + + return { status: "success", message: "Item unpublished!" }; + } catch (error) { + console.log("unpublish, error", error); + return { status: "error", message: "Failed to unpublish item!" }; + } +} diff --git a/src/actions/unsubscribe-to-newsletter.ts b/src/actions/unsubscribe-to-newsletter.ts new file mode 100644 index 0000000..23a622a --- /dev/null +++ b/src/actions/unsubscribe-to-newsletter.ts @@ -0,0 +1,47 @@ +"use server"; + +import { resend } from "@/lib/mail"; +import { type NewsletterFormData, NewsletterFormSchema } from "@/lib/schemas"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function unsubscribeToNewsletter( + formdata: NewsletterFormData, +): Promise { + try { + const validatedInput = NewsletterFormSchema.safeParse(formdata); + if (!validatedInput.success) { + return { status: "error", message: "Invalid input" }; + } + + const unsubscribedResult = await resend.contacts.remove({ + email: validatedInput.data.email, + audienceId: process.env.RESEND_AUDIENCE_ID, + }); + console.log( + "unsubscribeToNewsletter, unsubscribedResult", + unsubscribedResult, + ); + const unsubscribed = !unsubscribedResult.error; + if (unsubscribed) { + return { + status: "success", + message: "You have been unsubscribed from the newsletter", + }; + } + + return { + status: "error", + message: "Failed to unsubscribe to the newsletter", + }; + } catch (error) { + console.error("unsubscribeToNewsletter, error", error); + return { + status: "error", + message: "Failed to unsubscribe to the newsletter", + }; + } +} diff --git a/src/actions/update-link.ts b/src/actions/update-link.ts new file mode 100644 index 0000000..807c1ce --- /dev/null +++ b/src/actions/update-link.ts @@ -0,0 +1,56 @@ +"use server"; + +import { unstable_update } from "@/auth"; +import { getUserById } from "@/data/user"; +import { currentUser } from "@/lib/auth"; +import { type UserLinkData, UserLinkSchema } from "@/lib/schemas"; +import { sanityClient } from "@/sanity/lib/client"; +import { revalidatePath } from "next/cache"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function updateUserLink( + values: UserLinkData, +): Promise { + try { + const user = await currentUser(); + if (!user) { + return { status: "error", message: "Unauthorized" }; + } + + const dbUser = await getUserById(user.id); + if (!dbUser) { + return { status: "error", message: "User not found" }; + } + + // console.log('updateUserLink, values:', values); + const { link } = UserLinkSchema.parse(values); + + const updatedUser = await sanityClient + .patch(dbUser._id) + .set({ + link: link, + }) + .commit(); + // console.log("updateUserLink, user:", updatedUser); + + // unstable update in Beta version + unstable_update({ + user: { + link: updatedUser.link, + }, + }); + + revalidatePath("/settings"); + return { status: "success", message: "User link updated!" }; + } catch (error) { + console.log("updateUserLink, error", error); + return { + status: "error", + message: "Failed to update user link!", + }; + } +} diff --git a/src/actions/update-name.ts b/src/actions/update-name.ts new file mode 100644 index 0000000..828ccf9 --- /dev/null +++ b/src/actions/update-name.ts @@ -0,0 +1,56 @@ +"use server"; + +import { unstable_update } from "@/auth"; +import { getUserById } from "@/data/user"; +import { currentUser } from "@/lib/auth"; +import { type UserNameData, UserNameSchema } from "@/lib/schemas"; +import { sanityClient } from "@/sanity/lib/client"; +import { revalidatePath } from "next/cache"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function updateUserName( + values: UserNameData, +): Promise { + try { + const user = await currentUser(); + if (!user) { + return { status: "error", message: "Unauthorized" }; + } + + const dbUser = await getUserById(user.id); + if (!dbUser) { + return { status: "error", message: "User not found" }; + } + + // console.log('updateUserName, values:', values); + const { name } = UserNameSchema.parse(values); + + const updatedUser = await sanityClient + .patch(dbUser._id) + .set({ + name: name, + }) + .commit(); + // console.log("updateUserName, user:", updatedUser); + + // unstable update in Beta version + unstable_update({ + user: { + name: updatedUser.name, + }, + }); + + revalidatePath("/settings"); + return { status: "success", message: "User name updated!" }; + } catch (error) { + console.log("updateUserName, error", error); + return { + status: "error", + message: "Failed to update user name!", + }; + } +} diff --git a/src/actions/update-password.ts b/src/actions/update-password.ts new file mode 100644 index 0000000..8d8541b --- /dev/null +++ b/src/actions/update-password.ts @@ -0,0 +1,60 @@ +"use server"; + +import { getUserById } from "@/data/user"; +import { currentUser } from "@/lib/auth"; +import type { UserPasswordData } from "@/lib/schemas"; +import { sanityClient } from "@/sanity/lib/client"; +import bcrypt from "bcryptjs"; +import { revalidatePath } from "next/cache"; + +export type ServerActionResponse = { + status: "success" | "error"; + message?: string; +}; + +export async function updateUserPassword( + values: UserPasswordData, +): Promise { + try { + const user = await currentUser(); + if (!user) { + return { status: "error", message: "Unauthorized" }; + } + + const dbUser = await getUserById(user.id); + if (!dbUser) { + return { status: "error", message: "User not found" }; + } + + // password change needs verification + if (values.password && values.newPassword && dbUser.password) { + const passwordsMatch = await bcrypt.compare( + values.password, + dbUser.password, + ); + + if (!passwordsMatch) { + return { status: "error", message: "Incorrect password!" }; + } + + const hashedPassword = await bcrypt.hash(values.newPassword, 10); + const updatedUser = await sanityClient + .patch(dbUser._id) + .set({ + password: hashedPassword, + }) + .commit(); + console.log("updateUserPassword, user:", updatedUser); + + revalidatePath("/settings"); + return { status: "success", message: "User password updated!" }; + } + return { status: "error", message: "No password provided" }; + } catch (error) { + console.log("updateUserPassword, error", error); + return { + status: "error", + message: "Failed to update user password!", + }; + } +} diff --git a/src/app/(sanity)/layout.tsx b/src/app/(sanity)/layout.tsx new file mode 100644 index 0000000..5c572d2 --- /dev/null +++ b/src/app/(sanity)/layout.tsx @@ -0,0 +1,13 @@ +import "@/styles/globals.css"; + +export default function StudioLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + {children} + + ); +} diff --git a/src/app/(sanity)/studio/[[...index]]/page.tsx b/src/app/(sanity)/studio/[[...index]]/page.tsx new file mode 100644 index 0000000..ca888e0 --- /dev/null +++ b/src/app/(sanity)/studio/[[...index]]/page.tsx @@ -0,0 +1,11 @@ +"use client"; + +import config from "@/sanity.config"; +import { NextStudio } from "next-sanity/studio"; + +/** + * https://www.sanity.io/plugins/next-sanity#studio-route-with-app-router + */ +export default function Studio() { + return ; +} diff --git a/src/app/(website)/(newsletter)/unsubscribe/page.tsx b/src/app/(website)/(newsletter)/unsubscribe/page.tsx new file mode 100644 index 0000000..07eab9b --- /dev/null +++ b/src/app/(website)/(newsletter)/unsubscribe/page.tsx @@ -0,0 +1,53 @@ +"use client"; + +import { unsubscribeToNewsletter } from "@/actions/unsubscribe-to-newsletter"; +import { Logo } from "@/components/logo"; +import { Button } from "@/components/ui/button"; +import Link from "next/link"; +import { useSearchParams } from "next/navigation"; +import { useEffect, useState } from "react"; + +export default function UnsubscribePage() { + const searchParams = useSearchParams(); + const [message, setMessage] = useState("Processing your request..."); + + useEffect(() => { + const email = searchParams.get("email"); + if (email) { + unsubscribeToNewsletter({ email }) + .then((response) => { + console.log("unsubscribePage, response", response); + if (response.status === "success") { + setMessage(response.message || "You have been unsubscribed."); + } else { + setMessage( + response.message || "An error occurred. Please try again later.", + ); + } + }) + .catch(() => { + console.log("unsubscribePage, error"); + setMessage("An error occurred. Please try again later."); + }); + } else { + console.log("unsubscribePage, no email provided"); + setMessage("Invalid request. No email provided."); + } + }, [searchParams]); + + return ( +

+ + +

Unsubscribe from the newsletter

+ +

+ {message} +

+ + +
+ ); +} diff --git a/src/app/(website)/(protected)/(submit)/payment/[id]/layout.tsx b/src/app/(website)/(protected)/(submit)/payment/[id]/layout.tsx new file mode 100644 index 0000000..f03a6a0 --- /dev/null +++ b/src/app/(website)/(protected)/(submit)/payment/[id]/layout.tsx @@ -0,0 +1,20 @@ +import { DashboardSubmitHeader } from "@/components/dashboard/dashboard-submit-header"; +import { SubmitStepper } from "@/components/submit/submit-stepper"; + +export default async function PlanLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+ + + + +
{children}
+
+ ); +} diff --git a/src/app/(website)/(protected)/(submit)/payment/[id]/loading.tsx b/src/app/(website)/(protected)/(submit)/payment/[id]/loading.tsx new file mode 100644 index 0000000..c3e00ff --- /dev/null +++ b/src/app/(website)/(protected)/(submit)/payment/[id]/loading.tsx @@ -0,0 +1,20 @@ +import { PricingPlansSkeleton } from "@/components/dashboard/pricing-plans"; +import { SubmissionCardInPlanPageSkeleton } from "@/components/payment/submission-card-in-plan-page"; +import { Card } from "@/components/ui/card"; +import { Separator } from "@/components/ui/separator"; + +export default function Loading() { + return ( + +
+ +
+ + + +
+ +
+
+ ); +} diff --git a/src/app/(website)/(protected)/(submit)/payment/[id]/page.tsx b/src/app/(website)/(protected)/(submit)/payment/[id]/page.tsx new file mode 100644 index 0000000..85aff39 --- /dev/null +++ b/src/app/(website)/(protected)/(submit)/payment/[id]/page.tsx @@ -0,0 +1,66 @@ +import { PricingPlans } from "@/components/dashboard/pricing-plans"; +import SubmissionCardInPlanPage from "@/components/payment/submission-card-in-plan-page"; +import { Card } from "@/components/ui/card"; +import { Separator } from "@/components/ui/separator"; +import { siteConfig } from "@/config/site"; +import { currentUser } from "@/lib/auth"; +import { constructMetadata } from "@/lib/metadata"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { itemByIdQuery } from "@/sanity/lib/queries"; +import type { ItemInfo } from "@/types"; +import type { Metadata } from "next"; +import { notFound, redirect } from "next/navigation"; + +export async function generateMetadata({ + params, +}: { + params: { id: string }; +}): Promise { + return constructMetadata({ + title: "Submit your product (2/3)", + description: "Submit your product (2/3) Choose pricing plan", + canonicalUrl: `${siteConfig.url}/payment/${params.id}`, + }); +} + +export default async function PlanPage({ params }: { params: { id: string } }) { + const user = await currentUser(); + if (!user) { + console.error("PlanPage, user not found"); + return redirect("/auth/login"); + } + + const { id } = params; + console.log("PlanPage, itemId:", id); + const item = await sanityFetch({ + query: itemByIdQuery, + params: { id: id }, + disableCache: true, + }); + + if (!item) { + console.error("PlanPage, item not found"); + return notFound(); + } + // console.log('PlanPage, item:', item); + + // redirect to dashboard if the item is not submitted by the user + if (item.submitter._id !== user.id) { + console.error("PlanPage, user not match"); + return redirect("/dashboard"); + } + + return ( + +
+ +
+ + + +
+ +
+
+ ); +} diff --git a/src/app/(website)/(protected)/(submit)/publish/[id]/layout.tsx b/src/app/(website)/(protected)/(submit)/publish/[id]/layout.tsx new file mode 100644 index 0000000..2f962e5 --- /dev/null +++ b/src/app/(website)/(protected)/(submit)/publish/[id]/layout.tsx @@ -0,0 +1,20 @@ +import { DashboardSubmitHeader } from "@/components/dashboard/dashboard-submit-header"; +import { SubmitStepper } from "@/components/submit/submit-stepper"; + +export default async function PublishLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+ + + + +
{children}
+
+ ); +} diff --git a/src/app/(website)/(protected)/(submit)/publish/[id]/loading.tsx b/src/app/(website)/(protected)/(submit)/publish/[id]/loading.tsx new file mode 100644 index 0000000..a977d30 --- /dev/null +++ b/src/app/(website)/(protected)/(submit)/publish/[id]/loading.tsx @@ -0,0 +1,5 @@ +import { SubmissionCardInPublishPageSkeleton } from "@/components/publish/submission-card-in-publish-page"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(protected)/(submit)/publish/[id]/page.tsx b/src/app/(website)/(protected)/(submit)/publish/[id]/page.tsx new file mode 100644 index 0000000..25a3707 --- /dev/null +++ b/src/app/(website)/(protected)/(submit)/publish/[id]/page.tsx @@ -0,0 +1,82 @@ +import SubmissionCardInPublishPage from "@/components/publish/submission-card-in-publish-page"; +import ConfettiEffect from "@/components/shared/confetti-effect"; +import { siteConfig } from "@/config/site"; +import { currentUser } from "@/lib/auth"; +import { constructMetadata } from "@/lib/metadata"; +import { FreePlanStatus, PricePlans, ProPlanStatus } from "@/lib/submission"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { itemByIdQuery } from "@/sanity/lib/queries"; +import type { ItemInfo } from "@/types"; +import type { Metadata } from "next"; +import { notFound, redirect } from "next/navigation"; + +export async function generateMetadata({ + params, +}: { + params: { id: string }; +}): Promise { + return constructMetadata({ + title: "Submit your product (3/3)", + description: "Submit your product (3/3) Review and publish product", + canonicalUrl: `${siteConfig.url}/publish/${params.id}`, + }); +} + +export default async function PublishPage({ + params, + searchParams, +}: { + params: { id: string }; + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + const user = await currentUser(); + if (!user) { + console.error("PublishPage, user not found"); + return redirect("/auth/login"); + } + + const { id } = params; + const { pay } = searchParams as { [key: string]: string }; + const showConfetti = pay === "success"; + // console.log('PublishPage, itemId:', id); + const item = await sanityFetch({ + query: itemByIdQuery, + params: { id: id }, + disableCache: true, + }); + + if (!item) { + console.error("PublishPage, item not found"); + return notFound(); + } + // console.log("PublishPage, item:", item); + + // redirect to dashboard if the item is not submitted by the user + if (item.submitter._id !== user.id) { + console.error("PublishPage, user not match"); + return redirect("/dashboard"); + } + + // check status, redirect to the corresponding page if the status is not right + if ( + item.pricePlan === PricePlans.FREE && + item.freePlanStatus !== FreePlanStatus.APPROVED + ) { + return redirect("/dashboard"); + } + if ( + item.pricePlan === PricePlans.PRO && + item.proPlanStatus !== ProPlanStatus.SUCCESS + ) { + return redirect("/dashboard"); + } + + return ( +
+ {/* show confetti if the payment is successful */} + {showConfetti && } + + +
+ ); +} diff --git a/src/app/(website)/(protected)/(submit)/submit/layout.tsx b/src/app/(website)/(protected)/(submit)/submit/layout.tsx new file mode 100644 index 0000000..fe3e532 --- /dev/null +++ b/src/app/(website)/(protected)/(submit)/submit/layout.tsx @@ -0,0 +1,20 @@ +import { DashboardSubmitHeader } from "@/components/dashboard/dashboard-submit-header"; +import { SubmitStepper } from "@/components/submit/submit-stepper"; + +export default async function SubmitLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+ + + + +
{children}
+
+ ); +} diff --git a/src/app/(website)/(protected)/(submit)/submit/loading.tsx b/src/app/(website)/(protected)/(submit)/submit/loading.tsx new file mode 100644 index 0000000..e393028 --- /dev/null +++ b/src/app/(website)/(protected)/(submit)/submit/loading.tsx @@ -0,0 +1,5 @@ +import { SubmitFormSkeleton } from "@/components/submit/submit-form"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(protected)/(submit)/submit/page.tsx b/src/app/(website)/(protected)/(submit)/submit/page.tsx new file mode 100644 index 0000000..c31ea88 --- /dev/null +++ b/src/app/(website)/(protected)/(submit)/submit/page.tsx @@ -0,0 +1,28 @@ +import { SubmitForm } from "@/components/submit/submit-form"; +import { siteConfig } from "@/config/site"; +import { constructMetadata } from "@/lib/metadata"; +import type { + CategoryListQueryResult, + TagListQueryResult, +} from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { categoryListQuery, tagListQuery } from "@/sanity/lib/queries"; + +export const metadata = constructMetadata({ + title: "Submit your product (1/3)", + description: "Submit your product (1/3) – Enter product details", + canonicalUrl: `${siteConfig.url}/submit`, +}); + +export default async function SubmitPage() { + const [categoryList, tagList] = await Promise.all([ + sanityFetch({ + query: categoryListQuery, + }), + sanityFetch({ + query: tagListQuery, + }), + ]); + + return ; +} diff --git a/src/app/(website)/(protected)/dashboard/layout.tsx b/src/app/(website)/(protected)/dashboard/layout.tsx new file mode 100644 index 0000000..a87ca3c --- /dev/null +++ b/src/app/(website)/(protected)/dashboard/layout.tsx @@ -0,0 +1,32 @@ +import { DashboardButton } from "@/components/dashboard/dashboard-button"; +import { DashboardHeader } from "@/components/dashboard/dashboard-header"; +import { Button } from "@/components/ui/button"; +import { UploadIcon } from "lucide-react"; +import Link from "next/link"; + +export default async function DashboardLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+ +
+ + + +
+
+ +
{children}
+
+ ); +} diff --git a/src/app/(website)/(protected)/dashboard/loading.tsx b/src/app/(website)/(protected)/dashboard/loading.tsx new file mode 100644 index 0000000..149e0cd --- /dev/null +++ b/src/app/(website)/(protected)/dashboard/loading.tsx @@ -0,0 +1,5 @@ +import { SubmissionListSkeleton } from "@/components/dashboard/submission-list"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(protected)/dashboard/page.tsx b/src/app/(website)/(protected)/dashboard/page.tsx new file mode 100644 index 0000000..7901f22 --- /dev/null +++ b/src/app/(website)/(protected)/dashboard/page.tsx @@ -0,0 +1,61 @@ +import EmptySubmission from "@/components/dashboard/submission-empty"; +import SubmissionList from "@/components/dashboard/submission-list"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getSubmissions } from "@/data/submission"; +import { currentUser } from "@/lib/auth"; +import { SUBMISSIONS_PER_PAGE } from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "Dashboard", + description: "Overview of submissions", + canonicalUrl: `${siteConfig.url}/dashboard`, +}); + +export default async function DashboardPage({ + searchParams, +}: { + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + const user = await currentUser(); + const userId = user?.id; + // console.log('DashboardPage, user:', user); + + console.log("DashboardPage, searchParams", searchParams); + const { page } = searchParams as { [key: string]: string }; + const currentPage = page ? Number(page) : 1; + const { submissions, totalCount } = await getSubmissions({ + userId, + currentPage, + }); + const totalPages = Math.ceil(totalCount / SUBMISSIONS_PER_PAGE); + console.log( + "DashboardPage, totalCount", + totalCount, + ", totalPages", + totalPages, + ); + // console.log('DashboardPage, submissions:', submissions); + + return ( +
+ {/* when no submissions are found */} + {submissions?.length === 0 && } + + {/* when submissions are found */} + {submissions && submissions.length > 0 && ( +
+ + +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/(protected)/edit/[id]/layout.tsx b/src/app/(website)/(protected)/edit/[id]/layout.tsx new file mode 100644 index 0000000..5d6bd57 --- /dev/null +++ b/src/app/(website)/(protected)/edit/[id]/layout.tsx @@ -0,0 +1,17 @@ +import { DashboardHeader } from "@/components/dashboard/dashboard-header"; + +export default async function EditLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+ + +
{children}
+
+ ); +} diff --git a/src/app/(website)/(protected)/edit/[id]/loading.tsx b/src/app/(website)/(protected)/edit/[id]/loading.tsx new file mode 100644 index 0000000..ceb897b --- /dev/null +++ b/src/app/(website)/(protected)/edit/[id]/loading.tsx @@ -0,0 +1,5 @@ +import { EditFormSkeleton } from "@/components/edit/edit-form"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(protected)/edit/[id]/page.tsx b/src/app/(website)/(protected)/edit/[id]/page.tsx new file mode 100644 index 0000000..cb6df67 --- /dev/null +++ b/src/app/(website)/(protected)/edit/[id]/page.tsx @@ -0,0 +1,66 @@ +import { EditForm } from "@/components/edit/edit-form"; +import { siteConfig } from "@/config/site"; +import { currentUser } from "@/lib/auth"; +import { constructMetadata } from "@/lib/metadata"; +import type { + CategoryListQueryResult, + TagListQueryResult, +} from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { + categoryListQuery, + itemFullInfoByIdQuery, + tagListQuery, +} from "@/sanity/lib/queries"; +import type { ItemFullInfo } from "@/types"; +import type { Metadata } from "next"; +import { notFound, redirect } from "next/navigation"; + +export async function generateMetadata({ + params, +}: { + params: { id: string }; +}): Promise { + return constructMetadata({ + title: "Edit product information", + description: "Edit product information", + canonicalUrl: `${siteConfig.url}/edit/${params.id}`, + }); +} + +interface EditPageProps { + params: { id: string }; +} + +export default async function EditPage({ params }: EditPageProps) { + const user = await currentUser(); + if (!user) { + console.error("EditPage, user not found"); + return redirect("/auth/login"); + } + + const [item, categoryList, tagList] = await Promise.all([ + sanityFetch({ + query: itemFullInfoByIdQuery, + params: { id: params.id }, + }), + sanityFetch({ + query: categoryListQuery, + }), + sanityFetch({ + query: tagListQuery, + }), + ]); + + if (!item) { + console.error("EditPage, item not found"); + return notFound(); + } + // redirect to dashboard if the item is not submitted by the user + if (item.submitter._id !== user.id) { + console.error("EditPage, user not match"); + return redirect("/dashboard"); + } + + return ; +} diff --git a/src/app/(website)/(protected)/layout.tsx b/src/app/(website)/(protected)/layout.tsx new file mode 100644 index 0000000..cc1739f --- /dev/null +++ b/src/app/(website)/(protected)/layout.tsx @@ -0,0 +1,32 @@ +import Container from "@/components/container"; +import { Footer } from "@/components/layout/footer"; +import { Navbar } from "@/components/layout/navbar"; +import { dashboardConfig } from "@/config/dashboard"; +import { currentUser } from "@/lib/auth"; +import { redirect } from "next/navigation"; + +interface ProtectedLayoutProps { + children: React.ReactNode; +} + +export default async function ProtectedLayout({ + children, +}: ProtectedLayoutProps) { + const user = await currentUser(); + // console.log(`ProtectedLayout, user:`, user); + if (!user) { + return redirect("/auth/login"); + } + + return ( +
+ + +
+ {children} +
+ +
+
+ ); +} diff --git a/src/app/(website)/(protected)/settings/layout.tsx b/src/app/(website)/(protected)/settings/layout.tsx new file mode 100644 index 0000000..2e6406a --- /dev/null +++ b/src/app/(website)/(protected)/settings/layout.tsx @@ -0,0 +1,13 @@ +import { DashboardHeader } from "@/components/dashboard/dashboard-header"; + +export default function SettingsLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+ + +
{children}
+
+ ); +} diff --git a/src/app/(website)/(protected)/settings/loading.tsx b/src/app/(website)/(protected)/settings/loading.tsx new file mode 100644 index 0000000..29135e6 --- /dev/null +++ b/src/app/(website)/(protected)/settings/loading.tsx @@ -0,0 +1,5 @@ +import { SettingsFormSkeleton } from "@/components/settings/settings-form"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(protected)/settings/page.tsx b/src/app/(website)/(protected)/settings/page.tsx new file mode 100644 index 0000000..dfd0584 --- /dev/null +++ b/src/app/(website)/(protected)/settings/page.tsx @@ -0,0 +1,34 @@ +import { UserLinkForm } from "@/components/settings/user-link-form"; +import { UserNameForm } from "@/components/settings/user-name-form"; +import { UserPasswordForm } from "@/components/settings/user-password-form"; +import { Card, CardContent } from "@/components/ui/card"; +import { siteConfig } from "@/config/site"; +import { currentUser } from "@/lib/auth"; +import { constructMetadata } from "@/lib/metadata"; +import { redirect } from "next/navigation"; + +export const metadata = constructMetadata({ + title: "Settings", + description: "Manage account settings", + canonicalUrl: `${siteConfig.url}/settings`, +}); + +export default async function SettingsPage() { + const user = await currentUser(); + // console.log("SettingsPage, user:", user); + + if (!user) { + console.error("SettingsPage, user not found"); + return redirect("/auth/login"); + } + + return ( + + + + + + + + ); +} diff --git a/src/app/(website)/(public)/(home)/layout.tsx b/src/app/(website)/(public)/(home)/layout.tsx new file mode 100644 index 0000000..b0df617 --- /dev/null +++ b/src/app/(website)/(public)/(home)/layout.tsx @@ -0,0 +1,34 @@ +import Container from "@/components/container"; +import { HomeCategoryList } from "@/components/home/home-category-list"; +import HomeHero from "@/components/home/home-hero"; +import { HomeSearchFilter } from "@/components/home/home-search-filter"; +import { NewsletterCard } from "@/components/newsletter/newsletter-card"; + +export default function HomeLayout({ + children, +}: { children: React.ReactNode }) { + return ( + + + +
+ {/* left sidebar: category list */} +
+
+ +
+
+ + {/* right content: item grid */} +
+
+ + {children} +
+
+
+ + +
+ ); +} diff --git a/src/app/(website)/(public)/(home)/loading.tsx b/src/app/(website)/(public)/(home)/loading.tsx new file mode 100644 index 0000000..0f80e89 --- /dev/null +++ b/src/app/(website)/(public)/(home)/loading.tsx @@ -0,0 +1,5 @@ +import { ItemGridSkeleton } from "@/components/item/item-grid"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(public)/(home)/page.tsx b/src/app/(website)/(public)/(home)/page.tsx new file mode 100644 index 0000000..0b9b9d5 --- /dev/null +++ b/src/app/(website)/(public)/(home)/page.tsx @@ -0,0 +1,81 @@ +import ItemGrid from "@/components/item/item-grid"; +import EmptyGrid from "@/components/shared/empty-grid"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getItems } from "@/data/item"; +import { + DEFAULT_SORT, + ITEMS_PER_PAGE, + SORT_FILTER_LIST, +} from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; +import type { SponsorItemListQueryResult } from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { sponsorItemListQuery } from "@/sanity/lib/queries"; + +export const metadata = constructMetadata({ + title: "", + canonicalUrl: `${siteConfig.url}/`, +}); + +export default async function HomePage({ + searchParams, +}: { + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + console.log("HomePage, searchParams", searchParams); + + const sponsorItems = + (await sanityFetch({ + query: sponsorItemListQuery, + })) || []; + // console.log("HomePage, sponsorItems", sponsorItems); + const showSponsor = true; + const hasSponsorItem = showSponsor && sponsorItems.length > 0; + + const { + category, + tag, + sort, + page, + q: query, + f: filter, + } = searchParams as { [key: string]: string }; + const { sortKey, reverse } = + SORT_FILTER_LIST.find((item) => item.slug === sort) || DEFAULT_SORT; + const currentPage = page ? Number(page) : 1; + const { items, totalCount } = await getItems({ + category, + tag, + sortKey, + reverse, + query, + filter, + currentPage, + hasSponsorItem, + }); + const totalPages = Math.ceil(totalCount / ITEMS_PER_PAGE); + console.log("HomePage, totalCount", totalCount, ", totalPages", totalPages); + + return ( +
+ {/* when no items are found */} + {items?.length === 0 && } + + {/* when items are found */} + {items && items.length > 0 && ( +
+ + +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/(public)/(test)/home2/layout.tsx b/src/app/(website)/(public)/(test)/home2/layout.tsx new file mode 100644 index 0000000..b893469 --- /dev/null +++ b/src/app/(website)/(public)/(test)/home2/layout.tsx @@ -0,0 +1,24 @@ +import Container from "@/components/container"; +import HomeHero from "@/components/home2/home2-hero"; +import { NewsletterCard } from "@/components/newsletter/newsletter-card"; +import { siteConfig } from "@/config/site"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "", + canonicalUrl: `${siteConfig.url}/`, +}); + +export default function HomeLayout({ + children, +}: { children: React.ReactNode }) { + return ( + + + + {children} + + + + ); +} diff --git a/src/app/(website)/(public)/(test)/home2/loading.tsx b/src/app/(website)/(public)/(test)/home2/loading.tsx new file mode 100644 index 0000000..f4a1a99 --- /dev/null +++ b/src/app/(website)/(public)/(test)/home2/loading.tsx @@ -0,0 +1,16 @@ +import { BlogGridSkeleton } from "@/components/blog/blog-grid"; +import Container from "@/components/container"; +import { ItemGridSkeleton } from "@/components/item/item-grid"; + +export default function Loading() { + return ( +
+ {/* home content */} + + + + + +
+ ); +} diff --git a/src/app/(website)/(public)/(test)/home2/page.tsx b/src/app/(website)/(public)/(test)/home2/page.tsx new file mode 100644 index 0000000..aa37416 --- /dev/null +++ b/src/app/(website)/(public)/(test)/home2/page.tsx @@ -0,0 +1,12 @@ +import { HomeContent } from "@/components/home2/home2-content"; +import { siteConfig } from "@/config/site"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "", + canonicalUrl: `${siteConfig.url}/`, +}); + +export default async function LandingPage() { + return ; +} diff --git a/src/app/(website)/(public)/(test)/home3/layout.tsx b/src/app/(website)/(public)/(test)/home3/layout.tsx new file mode 100644 index 0000000..02138c0 --- /dev/null +++ b/src/app/(website)/(public)/(test)/home3/layout.tsx @@ -0,0 +1,22 @@ +import Container from "@/components/container"; +import HomeHeroSponsor from "@/components/home3/home3-hero-sponsor"; +import { HomeSearchFilter } from "@/components/home3/home3-search-filter"; +import { NewsletterCard } from "@/components/newsletter/newsletter-card"; + +export default function HomeLayout({ + children, +}: { children: React.ReactNode }) { + return ( + + + +
+ + + {children} +
+ + +
+ ); +} diff --git a/src/app/(website)/(public)/(test)/home3/loading.tsx b/src/app/(website)/(public)/(test)/home3/loading.tsx new file mode 100644 index 0000000..0f80e89 --- /dev/null +++ b/src/app/(website)/(public)/(test)/home3/loading.tsx @@ -0,0 +1,5 @@ +import { ItemGridSkeleton } from "@/components/item/item-grid"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(public)/(test)/home3/page.tsx b/src/app/(website)/(public)/(test)/home3/page.tsx new file mode 100644 index 0000000..af12a54 --- /dev/null +++ b/src/app/(website)/(public)/(test)/home3/page.tsx @@ -0,0 +1,85 @@ +import ItemGrid from "@/components/item/item-grid"; +import EmptyGrid from "@/components/shared/empty-grid"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getItems } from "@/data/item"; +import { + DEFAULT_SORT, + ITEMS_PER_PAGE, + SORT_FILTER_LIST, +} from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; +import type { SponsorItemListQueryResult } from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { sponsorItemListQuery } from "@/sanity/lib/queries"; + +export const metadata = constructMetadata({ + title: "", + canonicalUrl: `${siteConfig.url}/`, +}); + +export default async function HomePage({ + searchParams, +}: { + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + console.log("HomePage, searchParams", searchParams); + + // Option 1: use these code if you want to show sponsor items in the item grid + // const sponsorItems = (await sanityFetch({ + // query: sponsorItemListQuery, + // })) || []; + // const showSponsor = true; + // const hasSponsorItem = showSponsor && sponsorItems.length > 0; + + // Option 2: use these code if you want to show sponsor items in the hero section + const sponsorItems = []; + const showSponsor = false; + const hasSponsorItem = false; + + const { + category, + tag, + sort, + page, + q: query, + f: filter, + } = searchParams as { [key: string]: string }; + const { sortKey, reverse } = + SORT_FILTER_LIST.find((item) => item.slug === sort) || DEFAULT_SORT; + const currentPage = page ? Number(page) : 1; + const { items, totalCount } = await getItems({ + category, + tag, + sortKey, + reverse, + query, + filter, + currentPage, + hasSponsorItem, + }); + const totalPages = Math.ceil(totalCount / ITEMS_PER_PAGE); + console.log("HomePage, totalCount", totalCount, ", totalPages", totalPages); + + return ( +
+ {/* when no items are found */} + {items?.length === 0 && } + + {/* when items are found */} + {items && items.length > 0 && ( +
+ + +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/(public)/(test)/loading/page.tsx b/src/app/(website)/(public)/(test)/loading/page.tsx new file mode 100644 index 0000000..4bb157b --- /dev/null +++ b/src/app/(website)/(public)/(test)/loading/page.tsx @@ -0,0 +1,27 @@ +// import Loading from "../../[slug]/loading"; +// import Loading from "../../(home)/loading"; +// import Loading from "@/app/(website)/loading"; +// import Loading from "@/app/(website)/(protected)/(submit)/payment/[id]/loading"; +// import Loading from "@/app/(website)/(protected)/(submit)/publish/[id]/loading"; +// import Loading from "@/app/(website)/(protected)/(submit)/submit/loading"; +// import Loading from "@/app/(website)/(protected)/dashboard/loading"; +// import Loading from "@/app/(website)/(protected)/edit/[id]/loading"; +// import Loading from "@/app/(website)/(protected)/settings/loading"; +// import Loading from "@/app/(website)/(public)/category/loading"; +// import Loading from "@/app/(website)/(public)/item/[slug]/loading"; +// import Loading from "@/app/(website)/(public)/blog/(blog)/loading"; +// import Loading from "@/app/(website)/(public)/blog/[slug]/loading"; +// import Loading from "@/app/(website)/(public)/collection/loading"; +import Container from "@/components/container"; +import Loading from "../home2/loading"; + +/** + * This is a loading page for testing purposes. + */ +export default function LoadingDemo() { + return ( + + + + ); +} diff --git a/src/app/(website)/(public)/[slug]/layout.tsx b/src/app/(website)/(public)/[slug]/layout.tsx new file mode 100644 index 0000000..61ef0c5 --- /dev/null +++ b/src/app/(website)/(public)/[slug]/layout.tsx @@ -0,0 +1,11 @@ +import Container from "@/components/container"; + +export default function CustomPageLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+ {children} +
+ ); +} diff --git a/src/app/(website)/(public)/[slug]/loading.tsx b/src/app/(website)/(public)/[slug]/loading.tsx new file mode 100644 index 0000000..656edb2 --- /dev/null +++ b/src/app/(website)/(public)/[slug]/loading.tsx @@ -0,0 +1,38 @@ +import { Skeleton } from "@/components/ui/skeleton"; + +export default function Loading() { + return ; +} + +function CustomPageSkeleton() { + return ( +
+
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + +
+
+ ); +} diff --git a/src/app/(website)/(public)/[slug]/page.tsx b/src/app/(website)/(public)/[slug]/page.tsx new file mode 100644 index 0000000..b94f848 --- /dev/null +++ b/src/app/(website)/(public)/[slug]/page.tsx @@ -0,0 +1,65 @@ +import { CustomMdx } from "@/components/shared/custom-mdx"; +import { siteConfig } from "@/config/site"; +import { portableTextToMarkdown } from "@/lib/mdx"; +import { constructMetadata } from "@/lib/metadata"; +import type { PageQueryResult } from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { pageQuery } from "@/sanity/lib/queries"; +import type { Metadata } from "next"; +import { notFound } from "next/navigation"; +export async function generateMetadata({ + params, +}: { + params: { slug: string }; +}): Promise { + const page = await sanityFetch({ + query: pageQuery, + params: { slug: params.slug }, + }); + if (!page) { + console.warn(`generateMetadata, page not found for slug: ${params.slug}`); + return; + } + + return constructMetadata({ + title: page.title, + description: page.excerpt, + canonicalUrl: `${siteConfig.url}/${params.slug}`, + }); +} + +interface CustomPageProps { + params: { slug: string }; +} + +export default async function CustomPage({ params }: CustomPageProps) { + console.log(`CustomPage, params: ${JSON.stringify(params)}`); + const page = await sanityFetch({ + query: pageQuery, + params: { slug: params.slug }, + }); + + if (!page) { + return notFound(); + } + + console.log(`CustomPage, page title: ${page.title}`); + // console.log('CustomPage, page body: ', page.body); + const markdownContent = portableTextToMarkdown(page.body); + // console.log("markdownContent", markdownContent); + + return ( +
+
+

{page.title}

+ {page.excerpt && ( +

{page.excerpt}

+ )} +
+
+
+ {markdownContent && } +
+
+ ); +} diff --git a/src/app/(website)/(public)/blog/(blog)/category/[slug]/loading.tsx b/src/app/(website)/(public)/blog/(blog)/category/[slug]/loading.tsx new file mode 100644 index 0000000..029f260 --- /dev/null +++ b/src/app/(website)/(public)/blog/(blog)/category/[slug]/loading.tsx @@ -0,0 +1,5 @@ +import { BlogGridSkeleton } from "@/components/blog/blog-grid"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(public)/blog/(blog)/category/[slug]/page.tsx b/src/app/(website)/(public)/blog/(blog)/category/[slug]/page.tsx new file mode 100644 index 0000000..4ac50b4 --- /dev/null +++ b/src/app/(website)/(public)/blog/(blog)/category/[slug]/page.tsx @@ -0,0 +1,84 @@ +import BlogGrid from "@/components/blog/blog-grid"; +import EmptyGrid from "@/components/shared/empty-grid"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getBlogs } from "@/data/blog"; +import { POSTS_PER_PAGE } from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; +import type { BlogCategoryMetadateQueryResult } from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { blogCategoryMetadateQuery } from "@/sanity/lib/queries"; +import type { Metadata } from "next"; + +export async function generateMetadata({ + params, +}: { + params: { slug: string }; +}): Promise { + const category = await sanityFetch({ + query: blogCategoryMetadateQuery, + params: { slug: params.slug }, + }); + if (!category) { + console.warn( + `generateMetadata, category not found for slug: ${params.slug}`, + ); + return; + } + + const ogImageUrl = new URL(`${siteConfig.url}/api/og`); + ogImageUrl.searchParams.append("title", category.name); + ogImageUrl.searchParams.append("description", category.description || ""); + ogImageUrl.searchParams.append("type", "Blog Category"); + + return constructMetadata({ + title: `${category.name}`, + description: category.description, + canonicalUrl: `${siteConfig.url}/blog/category/${params.slug}`, + // image: ogImageUrl.toString(), + }); +} + +export default async function BlogCategoryPage({ + params, + searchParams, +}: { + params: { slug: string }; + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + // console.log('BlogCategoryPage, searchParams', searchParams); + const { page } = searchParams as { [key: string]: string }; + const currentPage = page ? Number(page) : 1; + const { posts, totalCount } = await getBlogs({ + category: params.slug, + currentPage, + }); + const totalPages = Math.ceil(totalCount / POSTS_PER_PAGE); + console.log( + "BlogCategoryPage, totalCount", + totalCount, + ", totalPages", + totalPages, + ); + + return ( +
+ {/* when no posts are found */} + {posts?.length === 0 && } + + {/* when posts are found */} + {posts && posts?.length > 0 && ( +
+ + +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/(public)/blog/(blog)/layout.tsx b/src/app/(website)/(public)/blog/(blog)/layout.tsx new file mode 100644 index 0000000..d80b83a --- /dev/null +++ b/src/app/(website)/(public)/blog/(blog)/layout.tsx @@ -0,0 +1,29 @@ +import { BlogCategoryFilter } from "@/components/blog/blog-category-filter"; +import Container from "@/components/container"; +import { NewsletterCard } from "@/components/newsletter/newsletter-card"; +import { HeaderSection } from "@/components/shared/header-section"; + +export default async function BlogListLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+
+ + + +
+ + {children} + + + + +
+ ); +} diff --git a/src/app/(website)/(public)/blog/(blog)/loading.tsx b/src/app/(website)/(public)/blog/(blog)/loading.tsx new file mode 100644 index 0000000..029f260 --- /dev/null +++ b/src/app/(website)/(public)/blog/(blog)/loading.tsx @@ -0,0 +1,5 @@ +import { BlogGridSkeleton } from "@/components/blog/blog-grid"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(public)/blog/(blog)/page.tsx b/src/app/(website)/(public)/blog/(blog)/page.tsx new file mode 100644 index 0000000..07f654c --- /dev/null +++ b/src/app/(website)/(public)/blog/(blog)/page.tsx @@ -0,0 +1,49 @@ +import BlogGrid from "@/components/blog/blog-grid"; +import EmptyGrid from "@/components/shared/empty-grid"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getBlogs } from "@/data/blog"; +import { POSTS_PER_PAGE } from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "Blog", + description: "Read our latest blog posts", + canonicalUrl: `${siteConfig.url}/blog`, +}); + +export default async function BlogIndexPage({ + searchParams, +}: { + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + console.log("BlogIndexPage, searchParams", searchParams); + const { page } = searchParams as { [key: string]: string }; + const currentPage = page ? Number(page) : 1; + const { posts, totalCount } = await getBlogs({ currentPage }); + const totalPages = Math.ceil(totalCount / POSTS_PER_PAGE); + console.log( + "BlogIndexPage, totalCount", + totalCount, + ", totalPages", + totalPages, + ); + + return ( +
+ {/* when no posts are found */} + {posts?.length === 0 && } + + {/* when posts are found */} + {posts && posts?.length > 0 && ( +
+ + +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/(public)/blog/[slug]/layout.tsx b/src/app/(website)/(public)/blog/[slug]/layout.tsx new file mode 100644 index 0000000..1527603 --- /dev/null +++ b/src/app/(website)/(public)/blog/[slug]/layout.tsx @@ -0,0 +1,17 @@ +import Container from "@/components/container"; +import { NewsletterCard } from "@/components/newsletter/newsletter-card"; +import type React from "react"; + +export default function BlogPostLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+ {children} + + + + +
+ ); +} diff --git a/src/app/(website)/(public)/blog/[slug]/loading.tsx b/src/app/(website)/(public)/blog/[slug]/loading.tsx new file mode 100644 index 0000000..85a335b --- /dev/null +++ b/src/app/(website)/(public)/blog/[slug]/loading.tsx @@ -0,0 +1,84 @@ +import { BlogGridSkeleton } from "@/components/blog/blog-grid"; +import { Skeleton } from "@/components/ui/skeleton"; + +export default function Loading() { + return ( +
+ {/* Content section */} +
+ {/* Left column */} +
+ {/* Basic information */} +
+ {/* blog post image */} + + + {/* blog post title */} + + + {/* blog post description */} + +
+ + {/* blog post content */} +
+ +
+ +
+ {/* */} +
+
+ + {/* Right column (sidebar) */} +
+
+ {/* author info */} +
+ +
+ +
+ + +
+
+
+ + {/* categories */} +
+ +
+ {[...Array(3)].map((_, index) => ( + // biome-ignore lint/suspicious/noArrayIndexKey: + + ))} +
+
+ + {/* table of contents */} +
+ +
+ {[...Array(5)].map((_, index) => ( + // biome-ignore lint/suspicious/noArrayIndexKey: + + ))} +
+
+
+
+
+ + {/* Footer section shows related posts */} +
+
+ + +
+ + +
+
+ ); +} diff --git a/src/app/(website)/(public)/blog/[slug]/page.tsx b/src/app/(website)/(public)/blog/[slug]/page.tsx new file mode 100644 index 0000000..b53e6f7 --- /dev/null +++ b/src/app/(website)/(public)/blog/[slug]/page.tsx @@ -0,0 +1,193 @@ +import AllPostsButton from "@/components/blog/all-posts-button"; +import BlogCustomMdx from "@/components/blog/blog-custom-mdx"; +import BlogGrid from "@/components/blog/blog-grid"; +import { BlogToc } from "@/components/blog/blog-toc"; +import { UserAvatar } from "@/components/shared/user-avatar"; +import { siteConfig } from "@/config/site"; +import { urlForImage } from "@/lib/image"; +import { portableTextToMarkdown } from "@/lib/mdx"; +import { constructMetadata } from "@/lib/metadata"; +import { getTableOfContents } from "@/lib/toc"; +import { getLocaleDate } from "@/lib/utils"; +import type { + BlogPostMetadataQueryResult, + BlogPostQueryResult, +} from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { blogPostMetadataQuery, blogPostQuery } from "@/sanity/lib/queries"; +import { FileTextIcon } from "lucide-react"; +import type { Metadata } from "next"; +import Image from "next/image"; +import Link from "next/link"; +import { notFound } from "next/navigation"; + +export async function generateMetadata({ + params, +}: { + params: { slug: string }; +}): Promise { + const post = await sanityFetch({ + query: blogPostMetadataQuery, + params: { slug: params.slug }, + }); + if (!post) { + console.warn(`generateMetadata, post not found for slug: ${params.slug}`); + return; + } + + const imageProps = post?.image ? urlForImage(post?.image) : null; + + return constructMetadata({ + title: `${post.title}`, + description: post.excerpt, + canonicalUrl: `${siteConfig.url}/blog/${params.slug}`, + image: imageProps?.src, + }); +} + +interface PostPageProps { + params: { slug: string }; +} + +export default async function PostPage({ params }: PostPageProps) { + const slug = params.slug; + const queryParams = { slug }; + const post = await sanityFetch({ + query: blogPostQuery, + params: queryParams, + }); + if (!post) { + console.error("PostPage, post not found"); + return notFound(); + } + + // console.log("PostPage, post", post); + const imageProps = post?.image ? urlForImage(post?.image) : null; + const imageBlurDataURL = post?.image?.blurDataURL || null; + const publishDate = post.publishDate || post._createdAt; + const date = getLocaleDate(publishDate); + const markdownContent = portableTextToMarkdown(post.body); + // console.log("markdownContent", markdownContent); + + const toc = await getTableOfContents(markdownContent); + + return ( +
+ {/* Content section */} +
+ {/* Left column */} +
+ {/* Basic information */} +
+ {/* blog post image */} +
+ {imageProps && ( + {post.image?.alt + )} +
+ + {/* blog post title */} +

{post.title}

+ + {/* blog post description */} +

{post.excerpt}

+
+ + {/* blog post content */} +
+ {markdownContent && } +
+ +
+ +
+
+ + {/* Right column (sidebar) */} +
+
+ {/* author info */} +
+

Publisher

+
+
+ +
+
+ {post.author?.link ? ( + + {post.author.name} + + ) : ( + {post.author.name} + )} + +

{date}

+
+
+
+ + {/* categories */} +
+

Categories

+
    + {post.categories?.map((category) => ( +
  • + + {category.name} + +
  • + ))} +
+
+ + {/* table of contents */} +
+

Table of Contents

+
+ +
+
+
+
+
+ + {/* Footer section shows related posts */} + {post.relatedPosts && post.relatedPosts.length > 0 && ( +
+
+ +

+ More Posts +

+
+ + +
+ )} +
+ ); +} diff --git a/src/app/(website)/(public)/category/[slug]/page.tsx b/src/app/(website)/(public)/category/[slug]/page.tsx new file mode 100644 index 0000000..b394c78 --- /dev/null +++ b/src/app/(website)/(public)/category/[slug]/page.tsx @@ -0,0 +1,107 @@ +import ItemGrid from "@/components/item/item-grid"; +import EmptyGrid from "@/components/shared/empty-grid"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getItems } from "@/data/item"; +import { + DEFAULT_SORT, + ITEMS_PER_PAGE, + SORT_FILTER_LIST, +} from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; +import type { + CategoryQueryResult, + SponsorItemListQueryResult, +} from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { categoryQuery, sponsorItemListQuery } from "@/sanity/lib/queries"; +import type { Metadata } from "next"; + +export async function generateMetadata({ + params, +}: { + params: { slug: string }; +}): Promise { + const category = await sanityFetch({ + query: categoryQuery, + params: { slug: params.slug }, + }); + if (!category) { + console.warn( + `generateMetadata, category not found for slug: ${params.slug}`, + ); + return; + } + + const ogImageUrl = new URL(`${siteConfig.url}/api/og`); + ogImageUrl.searchParams.append("title", category.name); + ogImageUrl.searchParams.append("description", category.description || ""); + ogImageUrl.searchParams.append("type", "Category"); + + return constructMetadata({ + title: `${category.name}`, + description: category.description, + canonicalUrl: `${siteConfig.url}/category/${params.slug}`, + // image: ogImageUrl.toString(), + }); +} + +export default async function CategoryPage({ + params, + searchParams, +}: { + params: { slug: string }; + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + const sponsorItems = + (await sanityFetch({ + query: sponsorItemListQuery, + })) || []; + // console.log("CategoryPage, sponsorItems", sponsorItems); + const showSponsor = true; + const hasSponsorItem = showSponsor && sponsorItems.length > 0; + + const { sort, page } = searchParams as { [key: string]: string }; + const { sortKey, reverse } = + SORT_FILTER_LIST.find((item) => item.slug === sort) || DEFAULT_SORT; + const currentPage = page ? Number(page) : 1; + const { items, totalCount } = await getItems({ + category: params.slug, + sortKey, + reverse, + currentPage, + hasSponsorItem, + }); + const totalPages = Math.ceil(totalCount / ITEMS_PER_PAGE); + console.log( + "CategoryPage, totalCount", + totalCount, + ", totalPages", + totalPages, + ); + + return ( +
+ {/* when no items are found */} + {items?.length === 0 && } + + {/* when items are found */} + {items && items.length > 0 && ( +
+ + +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/(public)/category/layout.tsx b/src/app/(website)/(public)/category/layout.tsx new file mode 100644 index 0000000..4cf0b15 --- /dev/null +++ b/src/app/(website)/(public)/category/layout.tsx @@ -0,0 +1,28 @@ +import { CategoryFilter } from "@/components/category/category-filter"; +import Container from "@/components/container"; +import { HeaderSection } from "@/components/shared/header-section"; + +export default function CategoryLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+
+
+ + +
+ +
+
+
+ + {children} +
+ ); +} diff --git a/src/app/(website)/(public)/category/loading.tsx b/src/app/(website)/(public)/category/loading.tsx new file mode 100644 index 0000000..0f80e89 --- /dev/null +++ b/src/app/(website)/(public)/category/loading.tsx @@ -0,0 +1,5 @@ +import { ItemGridSkeleton } from "@/components/item/item-grid"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(public)/category/page.tsx b/src/app/(website)/(public)/category/page.tsx new file mode 100644 index 0000000..a8015ce --- /dev/null +++ b/src/app/(website)/(public)/category/page.tsx @@ -0,0 +1,73 @@ +import ItemGrid from "@/components/item/item-grid"; +import EmptyGrid from "@/components/shared/empty-grid"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getItems } from "@/data/item"; +import { + DEFAULT_SORT, + ITEMS_PER_PAGE, + SORT_FILTER_LIST, +} from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; +import type { SponsorItemListQueryResult } from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { sponsorItemListQuery } from "@/sanity/lib/queries"; +export const metadata = constructMetadata({ + title: "Category", + description: "Explore by category", + canonicalUrl: `${siteConfig.url}/category`, +}); + +export default async function CategoryIndexPage({ + searchParams, +}: { + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + const sponsorItems = + (await sanityFetch({ + query: sponsorItemListQuery, + })) || []; + // console.log("CategoryIndexPage, sponsorItems", sponsorItems); + const showSponsor = true; + const hasSponsorItem = showSponsor && sponsorItems.length > 0; + + const { sort, page } = searchParams as { [key: string]: string }; + const { sortKey, reverse } = + SORT_FILTER_LIST.find((item) => item.slug === sort) || DEFAULT_SORT; + const currentPage = page ? Number(page) : 1; + const { items, totalCount } = await getItems({ + sortKey, + reverse, + currentPage, + hasSponsorItem, + }); + const totalPages = Math.ceil(totalCount / ITEMS_PER_PAGE); + console.log( + "CategoryIndexPage, totalCount", + totalCount, + ", totalPages", + totalPages, + ); + + return ( +
+ {/* when no items are found */} + {items?.length === 0 && } + + {/* when items are found */} + {items && items.length > 0 && ( +
+ + +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/(public)/collection/[slug]/loading.tsx b/src/app/(website)/(public)/collection/[slug]/loading.tsx new file mode 100644 index 0000000..be29973 --- /dev/null +++ b/src/app/(website)/(public)/collection/[slug]/loading.tsx @@ -0,0 +1,24 @@ +import Container from "@/components/container"; +import { ItemGridSkeleton } from "@/components/item/item-grid"; +import { HeaderSection } from "@/components/shared/header-section"; + +export default function Loading() { + return ( +
+
+
+ +
+
+ + + + +
+ ); +} diff --git a/src/app/(website)/(public)/collection/[slug]/page.tsx b/src/app/(website)/(public)/collection/[slug]/page.tsx new file mode 100644 index 0000000..1f1f8c5 --- /dev/null +++ b/src/app/(website)/(public)/collection/[slug]/page.tsx @@ -0,0 +1,136 @@ +import Container from "@/components/container"; +import ItemGrid from "@/components/item/item-grid"; +import EmptyGrid from "@/components/shared/empty-grid"; +import { HeaderSection } from "@/components/shared/header-section"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getItems } from "@/data/item"; +import { + DEFAULT_SORT, + ITEMS_PER_PAGE, + SORT_FILTER_LIST, +} from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; +import type { + CollectionQueryResult, + SponsorItemListQueryResult, +} from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { collectionQuery, sponsorItemListQuery } from "@/sanity/lib/queries"; +import type { Metadata } from "next"; +import { notFound } from "next/navigation"; + +export async function generateMetadata({ + params, +}: { + params: { slug: string }; +}): Promise { + const collection = await sanityFetch({ + query: collectionQuery, + params: { slug: params.slug }, + }); + if (!collection) { + console.warn( + `generateMetadata, collection not found for slug: ${params.slug}`, + ); + return; + } + + const ogImageUrl = new URL(`${siteConfig.url}/api/og`); + ogImageUrl.searchParams.append("title", collection.name); + ogImageUrl.searchParams.append("description", collection.description || ""); + ogImageUrl.searchParams.append("type", "Collection"); + + return constructMetadata({ + title: `${collection.name}`, + description: collection.description, + canonicalUrl: `${siteConfig.url}/collection/${params.slug}`, + // image: ogImageUrl.toString(), + }); +} + +export default async function CollectionPage({ + params, + searchParams, +}: { + params: { slug: string }; + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + const collection = await sanityFetch({ + query: collectionQuery, + params: { slug: params.slug }, + }); + if (!collection) { + console.warn( + `CollectionPage, collection not found for slug: ${params.slug}`, + ); + return notFound(); + } + + const sponsorItems = + (await sanityFetch({ + query: sponsorItemListQuery, + })) || []; + // console.log("CollectionPage, sponsorItems", sponsorItems); + const showSponsor = true; + const hasSponsorItem = showSponsor && sponsorItems.length > 0; + + const { sort, page } = searchParams as { [key: string]: string }; + const { sortKey, reverse } = + SORT_FILTER_LIST.find((item) => item.slug === sort) || DEFAULT_SORT; + const currentPage = page ? Number(page) : 1; + const { items, totalCount } = await getItems({ + collection: params.slug, + sortKey, + reverse, + currentPage, + hasSponsorItem, + }); + const totalPages = Math.ceil(totalCount / ITEMS_PER_PAGE); + console.log( + "CollectionPage, totalCount", + totalCount, + ", totalPages", + totalPages, + ); + + return ( +
+
+
+ +
+
+ + +
+ {/* when no items are found */} + {items?.length === 0 && } + + {/* when items are found */} + {items && items.length > 0 && ( +
+ + +
+ +
+
+ )} +
+
+
+ ); +} diff --git a/src/app/(website)/(public)/collection/loading.tsx b/src/app/(website)/(public)/collection/loading.tsx new file mode 100644 index 0000000..b91c9fb --- /dev/null +++ b/src/app/(website)/(public)/collection/loading.tsx @@ -0,0 +1,24 @@ +import { CollectionGridSkeleton } from "@/components/collection/collection-grid"; +import Container from "@/components/container"; +import { HeaderSection } from "@/components/shared/header-section"; + +export default function Loading() { + return ( +
+
+
+ +
+
+ + + + +
+ ); +} diff --git a/src/app/(website)/(public)/collection/page.tsx b/src/app/(website)/(public)/collection/page.tsx new file mode 100644 index 0000000..4d78779 --- /dev/null +++ b/src/app/(website)/(public)/collection/page.tsx @@ -0,0 +1,74 @@ +import CollectionGrid from "@/components/collection/collection-grid"; +import Container from "@/components/container"; +import EmptyGrid from "@/components/shared/empty-grid"; +import { HeaderSection } from "@/components/shared/header-section"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getCollections } from "@/data/collection"; +import { COLLECTIONS_PER_PAGE } from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "Collection", + description: "Explore by collection", + canonicalUrl: `${siteConfig.url}/collection`, +}); + +/** + * https://www.uneed.best/alternatives + * https://bestdirectories.org/collections + */ +export default async function CollectionIndexPage({ + searchParams, +}: { + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + const { page } = searchParams as { [key: string]: string }; + const currentPage = page ? Number(page) : 1; + const { collections, totalCount } = await getCollections({ + currentPage, + }); + const totalPages = Math.ceil(totalCount / COLLECTIONS_PER_PAGE); + console.log( + "CollectionIndexPage, totalCount", + totalCount, + ", totalPages", + totalPages, + ); + + return ( +
+
+
+ +
+
+ + +
+ {/* when no items are found */} + {collections?.length === 0 && } + + {/* when items are found */} + {collections && collections.length > 0 && ( +
+ + +
+ +
+
+ )} +
+
+
+ ); +} diff --git a/src/app/(website)/(public)/item/[slug]/layout.tsx b/src/app/(website)/(public)/item/[slug]/layout.tsx new file mode 100644 index 0000000..9de9ddf --- /dev/null +++ b/src/app/(website)/(public)/item/[slug]/layout.tsx @@ -0,0 +1,17 @@ +import Container from "@/components/container"; +import { NewsletterCard } from "@/components/newsletter/newsletter-card"; +import type React from "react"; + +export default function ItemLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+ {children} + + + + +
+ ); +} diff --git a/src/app/(website)/(public)/item/[slug]/loading.tsx b/src/app/(website)/(public)/item/[slug]/loading.tsx new file mode 100644 index 0000000..f5717a5 --- /dev/null +++ b/src/app/(website)/(public)/item/[slug]/loading.tsx @@ -0,0 +1,123 @@ +import Container from "@/components/container"; +import { ItemGridSkeleton } from "@/components/item/item-grid"; +import { Skeleton } from "@/components/ui/skeleton"; + +export default function Loading() { + return ( +
+ {/* Header section */} +
+ {/* Left column */} +
+ {/* Basic information */} + + + {/* name and description */} +
+
+ + +
+
+ + {/* action buttons */} + {/*
+ +
*/} +
+ + {/* Right column */} +
+ {/* image */} +
+ +
+
+
+ + {/* Content section */} +
+ {/* Left column */} +
+ {/* Detailed content */} +
+ {/*

+ Introduction +

*/} + +
+ +
+ {/* */} +
+
+ + {/* Right column */} +
+
+
+ {/* information */} +
+ {/*

+ Information +

*/} +
    + {[...Array(2)].map((_, index) => ( + // biome-ignore lint/suspicious/noArrayIndexKey: +
  • + + +
  • + ))} +
+
+ + {/* categories */} +
+ {/*

+ Categories +

*/} +
+ {[...Array(3)].map((_, index) => ( + // biome-ignore lint/suspicious/noArrayIndexKey: + + ))} +
+
+ + {/* tags */} +
+ {/*

+ Tags +

*/} +
+ {[...Array(5)].map((_, index) => ( + // biome-ignore lint/suspicious/noArrayIndexKey: + + ))} +
+
+
+
+
+
+ + {/* Footer section shows related items */} +
+
+ + + {/*

+ More Related +

*/} +
+ +
+ +
+
+
+ ); +} diff --git a/src/app/(website)/(public)/item/[slug]/page.tsx b/src/app/(website)/(public)/item/[slug]/page.tsx new file mode 100644 index 0000000..078677e --- /dev/null +++ b/src/app/(website)/(public)/item/[slug]/page.tsx @@ -0,0 +1,318 @@ +import ItemBreadCrumb from "@/components/item/item-bread-crumb"; +import SponsorItemCard from "@/components/item/item-card-sponsor"; +import ItemCustomMdx from "@/components/item/item-custom-mdx"; +import ItemGrid from "@/components/item/item-grid"; +import BackButton from "@/components/shared/back-button"; +import { UserAvatar } from "@/components/shared/user-avatar"; +import { Button } from "@/components/ui/button"; +import { siteConfig } from "@/config/site"; +import { urlForIcon, urlForImage } from "@/lib/image"; +import { constructMetadata } from "@/lib/metadata"; +import { cn, getItemTargetLinkInWebsite, getLocaleDate } from "@/lib/utils"; +import type { + ItemInfoBySlugQueryResult, + SponsorItemListQueryResult, +} from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { + itemFullInfoBySlugQuery, + itemInfoBySlugQuery, + sponsorItemListQuery, +} from "@/sanity/lib/queries"; +import type { ItemFullInfo } from "@/types"; +import { GlobeIcon, HashIcon, LayoutGridIcon } from "lucide-react"; +import type { Metadata } from "next"; +import Image from "next/image"; +import Link from "next/link"; +import { notFound } from "next/navigation"; + +export async function generateMetadata({ + params, +}: { + params: { slug: string }; +}): Promise { + const item = await sanityFetch({ + query: itemInfoBySlugQuery, + params: { slug: params.slug }, + }); + if (!item) { + console.warn(`generateMetadata, item not found for slug: ${params.slug}`); + return; + } + + const imageProps = item?.image ? urlForImage(item?.image) : null; + return constructMetadata({ + title: `${item.name}`, + description: item.description, + canonicalUrl: `${siteConfig.url}/item/${params.slug}`, + image: imageProps?.src, + }); +} + +interface ItemPageProps { + params: { slug: string }; +} + +export default async function ItemPage({ params }: ItemPageProps) { + // if you do not support sponsor item, you can use this code + // const item = await sanityFetch({ + // query: itemFullInfoBySlugQuery, + // params: { slug: params.slug }, + // }); + + // if you support sponsor item, you can use this code + const [item, sponsorItems] = await Promise.all([ + sanityFetch({ + query: itemFullInfoBySlugQuery, + params: { slug: params.slug }, + }), + sanityFetch({ + query: sponsorItemListQuery, + }), + ]); + + if (!item) { + console.error("ItemPage, item not found"); + return notFound(); + } + + const imageProps = item?.image ? urlForImage(item?.image) : null; + const imageBlurDataURL = item?.image?.blurDataURL || null; + const iconProps = item?.icon ? urlForIcon(item.icon) : null; + const iconBlurDataURL = item?.icon?.blurDataURL || null; + const publishDate = item.publishDate || item._createdAt; + const date = getLocaleDate(publishDate); + const itemLink = getItemTargetLinkInWebsite(item); + const sponsorItem = sponsorItems?.length + ? sponsorItems[Math.floor(Math.random() * sponsorItems.length)] + : null; + + return ( +
+ {/* Header section */} +
+ {/* Left column */} +
+ {/* Basic information */} + + + {/* icon + name + description */} +
+
+
+ {iconProps && ( + {item.icon.alt + )} +

+ {item.name} +

+
+

+ {item.description} +

+
+
+ + {/* action buttons */} +
+ +
+
+ + {/* Right column */} +
+ {/* image */} +
+ + {imageProps && ( + {item.image?.alt + )} +
+ + Visit Website + +
+ +
+
+
+ + {/* Content section */} +
+ {/* Left column */} +
+ {/* Detailed content */} +
+

Introduction

+ +
+ +
+ +
+
+ + {/* Right column */} +
+
+
+ {/* information */} +
+

Information

+
    + {item.submitter && ( +
  • + Publisher +
    + + + {(item.submitter.link && ( + + {item.submitter.name} + + )) || {item.submitter.name}} +
    +
  • + )} + +
  • + Website + + {new URL(item.link).hostname} + +
  • + +
  • + + Published date + + {date} +
  • +
+
+ + {/* categories */} +
+

Categories

+
    + {item.categories?.map((category) => ( +
  • + + {category.name} + +
  • + ))} +
+
+ + {/* tags */} +
+

Tags

+
    + {item.tags?.map((tag) => ( +
  • + + + {tag.name} + +
  • + ))} +
+
+ + {/* sponsor */} + {sponsorItem && } +
+
+
+
+ + {/* Footer section shows related items */} + {item.related && item.related.length > 0 && ( +
+
+ +

+ More Products +

+
+ +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/(public)/layout.tsx b/src/app/(website)/(public)/layout.tsx new file mode 100644 index 0000000..fec5c73 --- /dev/null +++ b/src/app/(website)/(public)/layout.tsx @@ -0,0 +1,24 @@ +import { BannerAd } from "@/components/layout/banner-ad"; +import { Footer } from "@/components/layout/footer"; +import { Navbar } from "@/components/layout/navbar"; +import { marketingConfig } from "@/config/marketing"; + +interface MarketingLayoutProps { + children: React.ReactNode; +} + +export default async function MarketingLayout({ + children, +}: MarketingLayoutProps) { + return ( +
+ {/*
+ + +
*/} + +
{children}
+
+
+ ); +} diff --git a/src/app/(website)/(public)/pricing/page.tsx b/src/app/(website)/(public)/pricing/page.tsx new file mode 100644 index 0000000..8a5b781 --- /dev/null +++ b/src/app/(website)/(public)/pricing/page.tsx @@ -0,0 +1,57 @@ +import Container from "@/components/container"; +import { PricingPlans } from "@/components/dashboard/pricing-plans"; +import { PricingFaq } from "@/components/pricing/pricing-faq"; +import { HeaderSection } from "@/components/shared/header-section"; +import { siteConfig } from "@/config/site"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "Pricing", + description: "Choose a pricing plan for submitting your product", + canonicalUrl: `${siteConfig.url}/pricing`, +}); + +export default async function PricingPage() { + return ( + +
+
+ + +
+ +
+ + {/* add tips only for Mkdirs demo directory website */} + {siteConfig.name === "Directory" && ( +

+ This is in TEST environment. +
+ You can use Stripe test card to simulate the paid submission + process. +
+ Stripe test card number: 4242 4242 4242 4242 +

+ )} +
+ +
+ + +
+ +
+
+
+
+ ); +} diff --git a/src/app/(website)/(public)/search/layout.tsx b/src/app/(website)/(public)/search/layout.tsx new file mode 100644 index 0000000..4e9ef2d --- /dev/null +++ b/src/app/(website)/(public)/search/layout.tsx @@ -0,0 +1,28 @@ +import Container from "@/components/container"; +import { SearchFilter } from "@/components/search/search-filter"; +import { HeaderSection } from "@/components/shared/header-section"; + +export default function SearchLayout({ + children, +}: { children: React.ReactNode }) { + return ( +
+
+
+ + +
+ +
+
+
+ + {children} +
+ ); +} diff --git a/src/app/(website)/(public)/search/loading.tsx b/src/app/(website)/(public)/search/loading.tsx new file mode 100644 index 0000000..0f80e89 --- /dev/null +++ b/src/app/(website)/(public)/search/loading.tsx @@ -0,0 +1,5 @@ +import { ItemGridSkeleton } from "@/components/item/item-grid"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(public)/search/page.tsx b/src/app/(website)/(public)/search/page.tsx new file mode 100644 index 0000000..8ce0c67 --- /dev/null +++ b/src/app/(website)/(public)/search/page.tsx @@ -0,0 +1,83 @@ +import ItemGrid from "@/components/item/item-grid"; +import EmptyGrid from "@/components/shared/empty-grid"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getItems } from "@/data/item"; +import { + DEFAULT_SORT, + ITEMS_PER_PAGE, + SORT_FILTER_LIST, +} from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; +import type { SponsorItemListQueryResult } from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { sponsorItemListQuery } from "@/sanity/lib/queries"; + +export const metadata = constructMetadata({ + title: "Search", + description: "Search for your needs", + canonicalUrl: `${siteConfig.url}/search`, +}); + +export default async function SearchPage({ + searchParams, +}: { + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + console.log("SearchPage, searchParams", searchParams); + + const sponsorItems = + (await sanityFetch({ + query: sponsorItemListQuery, + })) || []; + // console.log("SearchPage, sponsorItems", sponsorItems); + const showSponsor = true; + const hasSponsorItem = showSponsor && sponsorItems.length > 0; + + const { + category, + tag, + sort, + page, + q: query, + f: filter, + } = searchParams as { [key: string]: string }; + const { sortKey, reverse } = + SORT_FILTER_LIST.find((item) => item.slug === sort) || DEFAULT_SORT; + const currentPage = page ? Number(page) : 1; + const { items, totalCount } = await getItems({ + category, + tag, + sortKey, + reverse, + query, + filter, + currentPage, + hasSponsorItem, + }); + const totalPages = Math.ceil(totalCount / ITEMS_PER_PAGE); + console.log("SearchPage, totalCount", totalCount, ", totalPages", totalPages); + // console.log('SearchPage, items', items); + + return ( +
+ {/* when no items are found */} + {items?.length === 0 && } + + {/* when items are found */} + {items && items.length > 0 && ( +
+ + +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/(public)/tag/[slug]/page.tsx b/src/app/(website)/(public)/tag/[slug]/page.tsx new file mode 100644 index 0000000..43f8cbc --- /dev/null +++ b/src/app/(website)/(public)/tag/[slug]/page.tsx @@ -0,0 +1,99 @@ +import ItemGrid from "@/components/item/item-grid"; +import EmptyGrid from "@/components/shared/empty-grid"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getItems } from "@/data/item"; +import { + DEFAULT_SORT, + ITEMS_PER_PAGE, + SORT_FILTER_LIST, +} from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; +import type { + SponsorItemListQueryResult, + TagQueryResult, +} from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { sponsorItemListQuery, tagQuery } from "@/sanity/lib/queries"; +import type { Metadata } from "next"; + +export async function generateMetadata({ + params, +}: { + params: { slug: string }; +}): Promise { + const tag = await sanityFetch({ + query: tagQuery, + params: { slug: params.slug }, + }); + if (!tag) { + console.warn(`generateMetadata, tag not found for slug: ${params.slug}`); + return; + } + + const ogImageUrl = new URL(`${siteConfig.url}/api/og`); + ogImageUrl.searchParams.append("title", tag.name); + ogImageUrl.searchParams.append("description", tag.description || ""); + ogImageUrl.searchParams.append("type", "Tag"); + + return constructMetadata({ + title: `${tag.name}`, + description: tag.description, + canonicalUrl: `${siteConfig.url}/tag/${params.slug}`, + // image: ogImageUrl.toString(), + }); +} + +export default async function TagPage({ + params, + searchParams, +}: { + params: { slug: string }; + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + const sponsorItems = + (await sanityFetch({ + query: sponsorItemListQuery, + })) || []; + // console.log("TagPage, sponsorItems", sponsorItems); + const showSponsor = true; + const hasSponsorItem = showSponsor && sponsorItems.length > 0; + + const { sort, page } = searchParams as { [key: string]: string }; + const { sortKey, reverse } = + SORT_FILTER_LIST.find((item) => item.slug === sort) || DEFAULT_SORT; + const currentPage = page ? Number(page) : 1; + const { items, totalCount } = await getItems({ + tag: params.slug, + sortKey, + reverse, + currentPage, + }); + const totalPages = Math.ceil(totalCount / ITEMS_PER_PAGE); + console.log("TagPage, totalCount", totalCount, ", totalPages", totalPages); + + return ( +
+ {/* when no items are found */} + {items?.length === 0 && } + + {/* when items are found */} + {items && items.length > 0 && ( +
+ + +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/(public)/tag/layout.tsx b/src/app/(website)/(public)/tag/layout.tsx new file mode 100644 index 0000000..80e1527 --- /dev/null +++ b/src/app/(website)/(public)/tag/layout.tsx @@ -0,0 +1,26 @@ +import Container from "@/components/container"; +import { HeaderSection } from "@/components/shared/header-section"; +import { TagFilter } from "@/components/tag/tag-filter"; + +export default function TagLayout({ children }: { children: React.ReactNode }) { + return ( +
+
+
+ + +
+ +
+
+
+ + {children} +
+ ); +} diff --git a/src/app/(website)/(public)/tag/loading.tsx b/src/app/(website)/(public)/tag/loading.tsx new file mode 100644 index 0000000..0f80e89 --- /dev/null +++ b/src/app/(website)/(public)/tag/loading.tsx @@ -0,0 +1,5 @@ +import { ItemGridSkeleton } from "@/components/item/item-grid"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/(public)/tag/page.tsx b/src/app/(website)/(public)/tag/page.tsx new file mode 100644 index 0000000..3c31d0a --- /dev/null +++ b/src/app/(website)/(public)/tag/page.tsx @@ -0,0 +1,74 @@ +import ItemGrid from "@/components/item/item-grid"; +import EmptyGrid from "@/components/shared/empty-grid"; +import CustomPagination from "@/components/shared/pagination"; +import { siteConfig } from "@/config/site"; +import { getItems } from "@/data/item"; +import { + DEFAULT_SORT, + ITEMS_PER_PAGE, + SORT_FILTER_LIST, +} from "@/lib/constants"; +import { constructMetadata } from "@/lib/metadata"; +import type { SponsorItemListQueryResult } from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { sponsorItemListQuery } from "@/sanity/lib/queries"; + +export const metadata = constructMetadata({ + title: "Tag", + description: "Explore by tags", + canonicalUrl: `${siteConfig.url}/tag`, +}); + +export default async function TagIndexPage({ + searchParams, +}: { + searchParams?: { [key: string]: string | string[] | undefined }; +}) { + const sponsorItems = + (await sanityFetch({ + query: sponsorItemListQuery, + })) || []; + // console.log("TagIndexPage, sponsorItems", sponsorItems); + const showSponsor = true; + const hasSponsorItem = showSponsor && sponsorItems.length > 0; + + const { sort, page } = searchParams as { [key: string]: string }; + const { sortKey, reverse } = + SORT_FILTER_LIST.find((item) => item.slug === sort) || DEFAULT_SORT; + const currentPage = page ? Number(page) : 1; + const { items, totalCount } = await getItems({ + sortKey, + reverse, + currentPage, + hasSponsorItem, + }); + const totalPages = Math.ceil(totalCount / ITEMS_PER_PAGE); + console.log( + "TagIndexPage, totalCount", + totalCount, + ", totalPages", + totalPages, + ); + + return ( +
+ {/* when no items are found */} + {items?.length === 0 && } + + {/* when items are found */} + {items && items.length > 0 && ( +
+ + +
+ +
+
+ )} +
+ ); +} diff --git a/src/app/(website)/auth/error/page.tsx b/src/app/(website)/auth/error/page.tsx new file mode 100644 index 0000000..314cf9d --- /dev/null +++ b/src/app/(website)/auth/error/page.tsx @@ -0,0 +1,15 @@ +import { ErrorCard } from "@/components/auth/error-card"; +import { siteConfig } from "@/config/site"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "Auth Error", + description: "Auth Error", + canonicalUrl: `${siteConfig.url}/auth/error`, +}); + +const AuthErrorPage = () => { + return ; +}; + +export default AuthErrorPage; diff --git a/src/app/(website)/auth/layout.tsx b/src/app/(website)/auth/layout.tsx new file mode 100644 index 0000000..7db59ab --- /dev/null +++ b/src/app/(website)/auth/layout.tsx @@ -0,0 +1,37 @@ +import BackButtonSmall from "@/components/shared/back-button-small"; +import Image from "next/image"; + +/** + * auth layout is different from other public layouts, + * so auth directory is not put in (public) directory. + * + * https://ui.shadcn.com/blocks#authentication-04 + */ +export default function AuthLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( +
+
+ {/* auth form */} +
+ +
{children}
+
+ + {/* brand image */} +
+ Image +
+
+
+ ); +} diff --git a/src/app/(website)/auth/loading.tsx b/src/app/(website)/auth/loading.tsx new file mode 100644 index 0000000..d730bb7 --- /dev/null +++ b/src/app/(website)/auth/loading.tsx @@ -0,0 +1,5 @@ +import { Loader2Icon } from "lucide-react"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/auth/login/page.tsx b/src/app/(website)/auth/login/page.tsx new file mode 100644 index 0000000..183c561 --- /dev/null +++ b/src/app/(website)/auth/login/page.tsx @@ -0,0 +1,15 @@ +import { LoginForm } from "@/components/auth/login-form"; +import { siteConfig } from "@/config/site"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "Login", + description: "Login to your account", + canonicalUrl: `${siteConfig.url}/auth/login`, +}); + +const LoginPage = () => { + return ; +}; + +export default LoginPage; diff --git a/src/app/(website)/auth/new-password/page.tsx b/src/app/(website)/auth/new-password/page.tsx new file mode 100644 index 0000000..20e1744 --- /dev/null +++ b/src/app/(website)/auth/new-password/page.tsx @@ -0,0 +1,15 @@ +import { NewPasswordForm } from "@/components/auth/new-password-form"; +import { siteConfig } from "@/config/site"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "New Password", + description: "Set a new password", + canonicalUrl: `${siteConfig.url}/auth/new-password`, +}); + +const NewPasswordPage = () => { + return ; +}; + +export default NewPasswordPage; diff --git a/src/app/(website)/auth/new-verification/page.tsx b/src/app/(website)/auth/new-verification/page.tsx new file mode 100644 index 0000000..92cb654 --- /dev/null +++ b/src/app/(website)/auth/new-verification/page.tsx @@ -0,0 +1,15 @@ +import { NewVerificationForm } from "@/components/auth/new-verification-form"; +import { siteConfig } from "@/config/site"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "New Verification", + description: "New Verification", + canonicalUrl: `${siteConfig.url}/auth/new-verification`, +}); + +const NewVerificationPage = () => { + return ; +}; + +export default NewVerificationPage; diff --git a/src/app/(website)/auth/register/page.tsx b/src/app/(website)/auth/register/page.tsx new file mode 100644 index 0000000..6a5388c --- /dev/null +++ b/src/app/(website)/auth/register/page.tsx @@ -0,0 +1,15 @@ +import { RegisterForm } from "@/components/auth/register-form"; +import { siteConfig } from "@/config/site"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "Register", + description: "Create an account to get started", + canonicalUrl: `${siteConfig.url}/auth/register`, +}); + +const RegisterPage = () => { + return ; +}; + +export default RegisterPage; diff --git a/src/app/(website)/auth/reset/page.tsx b/src/app/(website)/auth/reset/page.tsx new file mode 100644 index 0000000..43b12a8 --- /dev/null +++ b/src/app/(website)/auth/reset/page.tsx @@ -0,0 +1,15 @@ +import { ResetForm } from "@/components/auth/reset-form"; +import { siteConfig } from "@/config/site"; +import { constructMetadata } from "@/lib/metadata"; + +export const metadata = constructMetadata({ + title: "Reset Password", + description: "Reset your password", + canonicalUrl: `${siteConfig.url}/auth/reset`, +}); + +const ResetPage = () => { + return ; +}; + +export default ResetPage; diff --git a/src/app/(website)/error.tsx b/src/app/(website)/error.tsx new file mode 100644 index 0000000..ae24007 --- /dev/null +++ b/src/app/(website)/error.tsx @@ -0,0 +1,54 @@ +"use client"; + +import { Logo } from "@/components/logo"; +import { Button } from "@/components/ui/button"; +import { Loader2Icon } from "lucide-react"; +import { useRouter } from "next/navigation"; +import { useTransition } from "react"; + +/** + * Learned how to recover from a server component error in Next.js from @asidorenko_ + * + * https://x.com/asidorenko_/status/1841547623712407994 + */ +export default function ErrorPage({ reset }: { reset: () => void }) { + const router = useRouter(); + const [isPending, startTransition] = useTransition(); + + return ( +
+ + +

Oops! Something went wrong!

+ +
+ + + +
+
+ ); +} diff --git a/src/app/(website)/layout.tsx b/src/app/(website)/layout.tsx new file mode 100644 index 0000000..4a367da --- /dev/null +++ b/src/app/(website)/layout.tsx @@ -0,0 +1,64 @@ +import "@/styles/globals.css"; + +import { + fontBricolageGrotesque as fontBricolage, + fontSourceSans, + fontSourceSerif, + fontWorkSans, +} from "@/assets/fonts"; +import { auth } from "@/auth"; +import { Analytics } from "@/components/analytics/analytics"; +import { TailwindIndicator } from "@/components/tailwind-indicator"; +import { Toaster } from "@/components/ui/sonner"; +import { constructMetadata } from "@/lib/metadata"; +import { cn } from "@/lib/utils"; +import { SessionProvider } from "next-auth/react"; +import { ThemeProvider } from "next-themes"; + +export const metadata = constructMetadata(); + +interface RootLayoutProps { + children: React.ReactNode; +} + +export default async function RootLayout({ children }: RootLayoutProps) { + // https://youtu.be/1MTyCvS05V4?t=21464 + const session = await auth(); + + return ( + + + + + + {children} + + {/* https://sonner.emilkowal.ski/toaster */} + + + + + + + + + + ); +} diff --git a/src/app/(website)/loading.tsx b/src/app/(website)/loading.tsx new file mode 100644 index 0000000..d730bb7 --- /dev/null +++ b/src/app/(website)/loading.tsx @@ -0,0 +1,5 @@ +import { Loader2Icon } from "lucide-react"; + +export default function Loading() { + return ; +} diff --git a/src/app/(website)/not-found.tsx b/src/app/(website)/not-found.tsx new file mode 100644 index 0000000..8e4e8b1 --- /dev/null +++ b/src/app/(website)/not-found.tsx @@ -0,0 +1,21 @@ +import { Logo } from "@/components/logo"; +import { Button } from "@/components/ui/button"; +import Link from "next/link"; + +export default function NotFound() { + return ( +
+ + +

404

+ +

+ Sorry, the page you are looking for does not exist. +

+ + +
+ ); +} diff --git a/src/app/api/auth/[...nextauth]/route.ts b/src/app/api/auth/[...nextauth]/route.ts new file mode 100644 index 0000000..5a28f48 --- /dev/null +++ b/src/app/api/auth/[...nextauth]/route.ts @@ -0,0 +1,28 @@ +import { handlers } from "@/auth"; +import { NextRequest } from "next/server"; + +/** + * https://authjs.dev/getting-started/installation?framework=Next.js + */ +export const { GET, POST } = handlers; + +/** + * in case you want to debug the auth process + */ +// const handler = async (request: NextRequest) => { +// console.log('Handling auth request:', request.url); +// // console.log('Request cookies:', request.headers.get('cookie')); + +// const result = await handlers.GET(request); + +// // console.log('Auth response:', result); +// // const setCookieHeader = result.headers?.get('Set-Cookie'); +// // if (setCookieHeader) { +// // console.log('Set-Cookie header:', setCookieHeader); +// // } else { +// // console.log('No Set-Cookie header found'); +// // } + +// return result; +// }; +// export { handler as GET, handler as POST }; diff --git a/src/app/api/disable-draft/route.ts b/src/app/api/disable-draft/route.ts new file mode 100644 index 0000000..1a26cc0 --- /dev/null +++ b/src/app/api/disable-draft/route.ts @@ -0,0 +1,14 @@ +import { draftMode } from "next/headers"; +import type { NextRequest } from "next/server"; +import { NextResponse } from "next/server"; + +/** + * Disable draft mode + * + * https://www.sanity.io/docs/preview-url-secret#nextjs-app-router + */ +export async function GET(request: NextRequest) { + draftMode().disable(); + const url = new URL(request.nextUrl); + return NextResponse.redirect(new URL("/", url.origin)); +} diff --git a/src/app/api/draft/route.tsx b/src/app/api/draft/route.tsx new file mode 100644 index 0000000..4b58466 --- /dev/null +++ b/src/app/api/draft/route.tsx @@ -0,0 +1,35 @@ +import { sanityClient } from "@/sanity/lib/client"; +import { token } from "@/sanity/lib/token"; +import { validatePreviewUrl } from "@sanity/preview-url-secret"; +import { draftMode } from "next/headers"; +import { redirect } from "next/navigation"; + +/** + * 1. Draft Mode + * https://www.sanity.io/docs/draft-mode + * During runtime, switch between an optimized production mode and + * an authorized mode to fetch draft content and render edit overlays. + * + * 2. Presentation Tool + * https://www.sanity.io/docs/configuring-the-presentation-tool + * This file is used to allow Presentation to set the app in Draft Mode, which will load Visual Editing + * and query draft content and preview the content as it will appear once everything is published + * + * 3. Preview URL Secret + * https://www.sanity.io/docs/preview-url-secret#nextjs-app-router + */ +const clientWithToken = sanityClient.withConfig({ token }); + +export async function GET(request: Request) { + const { isValid, redirectTo = "/" } = await validatePreviewUrl( + clientWithToken, + request.url, + ); + if (!isValid) { + return new Response("invalid secret", { status: 401 }); + } + + draftMode().enable(); + + redirect(redirectTo); +} diff --git a/src/app/api/og/route.tsx b/src/app/api/og/route.tsx new file mode 100644 index 0000000..77626b4 --- /dev/null +++ b/src/app/api/og/route.tsx @@ -0,0 +1,75 @@ +import { ogImageSchema } from "@/lib/schemas"; +import { ImageResponse } from "next/og"; + +// export const runtime = "edge"; + +/** + * og image route + * + * 1. official doc + * https://nextjs.org/docs/app/api-reference/file-conventions/metadata/opengraph-image + * + * 2. related articles + * https://dev.to/paulund/auto-generate-open-graph-images-in-nextjs-41cm + * https://stronglytyped.uk/articles/open-graph-images-nextjs-app-router + * + * 3. test url + * http://localhost:3000/api/og?title=Lifestyle&description=blog+category+of+lifestyle&type=Blog+Category + */ +export function GET(req: Request) { + try { + const url = new URL(req.url); + const parsedValues = ogImageSchema.parse( + Object.fromEntries(url.searchParams), + ); + + const { mode, title, description, type } = parsedValues; + const paint = mode === "dark" ? "#fff" : "#000"; + // console.log('og image', { title, description, type }); + + return new ImageResponse( +
+
+ {type ? ( +
+ {type} +
+ ) : null} +
+ {title} +
+ {description ? ( +
+ {description} +
+ ) : null} +
+
, + { + width: 1200, + height: 630, + }, + ); + } catch (error) { + error instanceof Error + ? console.log(`${error.message}`) + : console.log(error); + return new Response("Failed to generate the image", { + status: 500, + }); + } +} diff --git a/src/app/api/send-email/route.ts b/src/app/api/send-email/route.ts new file mode 100644 index 0000000..f8e329a --- /dev/null +++ b/src/app/api/send-email/route.ts @@ -0,0 +1,74 @@ +import { getItemInfoById } from '@/data/item'; +import { sendApprovalEmail, sendRejectionEmail } from '@/lib/mail'; +import { PricePlans } from '@/lib/submission'; +import { getDashboardLink, getItemLinkInWebsite } from '@/lib/utils'; +import { headers } from 'next/headers'; +import { NextResponse } from 'next/server'; + +function isValidOrigin(requestHeaders: Headers): boolean { + const origin = requestHeaders.get('origin'); + const referer = requestHeaders.get('referer'); + console.log('isValidOrigin, origin', origin); + console.log('isValidOrigin, referer', referer); + + const allowedDomains = [ + process.env.NEXT_PUBLIC_APP_URL, + 'http://localhost:3000' + ].filter(Boolean); + + return allowedDomains.some(domain => + origin?.includes(domain as string) || + referer?.includes(domain as string) + ); +} + +export async function POST(request: Request) { + try { + // check if the request is from a valid origin + const headersList = headers(); + if (!isValidOrigin(headersList)) { + return NextResponse.json( + { message: 'Unauthorized request origin' }, + { status: 403 } + ); + } + + const { itemId } = await request.json(); + const item = await getItemInfoById(itemId); + if (!item || !item.submitter) { + return NextResponse.json( + { message: 'Item not found' }, + { status: 404 } + ); + } + + console.log(`SendEmail, itemName: ${item.name}, + userName: ${item.submitter.name}, + userEmail: ${item.submitter.email}`); + + // only send email for items in free plan and is approved or rejected + if (item.pricePlan === PricePlans.FREE) { + if (item.freePlanStatus === "approved") { + const itemLink = getItemLinkInWebsite(item.slug.current); + await sendApprovalEmail(item.submitter.name, item.submitter.email, itemLink); + } else if (item.freePlanStatus === "rejected") { + const dashboardLink = getDashboardLink(); + await sendRejectionEmail(item.submitter.name, item.submitter.email, dashboardLink); + } else { + console.warn(`SendEmail, item ${item.name} is not approved or rejected`); + return NextResponse.json({ message: 'No email sent' }, { status: 200 }); + } + } else { + console.warn(`SendEmail, item ${item.name} is not free plan`); + return NextResponse.json({ message: 'No email sent' }, { status: 200 }); + } + + return NextResponse.json({ message: 'Email sent successfully' }, { status: 200 }); + } catch (error) { + console.error('Error sending email:', error); + return NextResponse.json( + { message: 'Failed to send email' }, + { status: 500 } + ); + } +} diff --git a/src/app/api/upload-image/route.ts b/src/app/api/upload-image/route.ts new file mode 100644 index 0000000..3c0f7e1 --- /dev/null +++ b/src/app/api/upload-image/route.ts @@ -0,0 +1,23 @@ +import { sanityClient } from "@/sanity/lib/client"; +import type { NextRequest } from "next/server"; +import { NextResponse } from "next/server"; + +export async function POST(request: NextRequest) { + try { + const formData = await request.formData(); + const file = formData.get("file") as File; + + if (!file) { + return NextResponse.json({ error: "No file uploaded" }, { status: 400 }); + } + + const asset = await sanityClient.assets.upload("image", file); + return NextResponse.json({ asset }); + } catch (error) { + console.error("Error uploading image:", error); + return NextResponse.json( + { error: "Failed to upload image" }, + { status: 500 }, + ); + } +} diff --git a/src/app/api/webhook/route.ts b/src/app/api/webhook/route.ts new file mode 100644 index 0000000..ec12c77 --- /dev/null +++ b/src/app/api/webhook/route.ts @@ -0,0 +1,133 @@ +import { getOrderByUserIdAndItemId } from "@/data/order"; +import { getUserById } from "@/data/user"; +import { sendMessageToDiscord } from "@/lib/discord"; +import { sendPaymentSuccessEmail } from "@/lib/mail"; +import { stripe } from "@/lib/stripe"; +import { PricePlans, ProPlanStatus, SponsorPlanStatus } from "@/lib/submission"; +import { getItemLinkInWebsite } from "@/lib/utils"; +import { sanityClient } from "@/sanity/lib/client"; +import { headers } from "next/headers"; +import type Stripe from "stripe"; + +/** + * Stripe webhook handler + * This file handles webhook events from Stripe. It verifies the signature + * of each request to ensure that the request is coming from Stripe. It also + * handles the checkout.session.completed event type by creating a new purchase record in the database. + * + * https://github.com/mickasmt/next-saas-stripe-starter/blob/main/app/api/webhooks/stripe/route.ts + * https://github.com/javayhu/lms-studio-antonio/blob/main/app/api/webhook/route.ts + */ +export async function POST(req: Request) { + const body = await req.text(); + const signature = headers().get("Stripe-Signature") as string; + + let event: Stripe.Event; + + try { + event = stripe.webhooks.constructEvent( + body, + signature, + process.env.STRIPE_WEBHOOK_SECRET, + ); + } catch (error) { + console.error("Stripe webhook error:", error); + return new Response(`Webhook Error: ${error.message}`, { status: 400 }); + } + + // console.log('stripe webhook event:', event); + console.log("stripe webhook event.type:", event.type); + + if (event.type === "checkout.session.completed") { + console.log("checkout.session.completed event"); + const session = event.data.object as Stripe.Checkout.Session; + const customerId = session.customer as string; + const amount = session.amount_total ? session.amount_total / 100 : 0; + + const userId = session?.metadata?.userId; + const itemId = session?.metadata?.itemId; + const priceId = session?.metadata?.priceId; + const pricePlan = session?.metadata?.pricePlan; + // console.log('session:', session); + console.log( + `checkout.session.completed, userId: ${userId}, itemId: ${itemId}, priceId: ${priceId}, pricePlan: ${pricePlan}`, + ); + + // check if order already exists, if so, return + const order = await getOrderByUserIdAndItemId(userId, itemId); + if (order) { + console.log( + `checkout.session.completed, order already exists: ${order._id}`, + ); + return new Response(null, { status: 200 }); + } + + const user = await getUserById(session?.metadata?.userId); + // console.log('user:', user); + + if (user) { + const result = await sanityClient.create({ + _type: "order", + user: { + _type: "reference", + _ref: user._id, + }, + item: { + _type: "reference", + _ref: itemId, + }, + status: "success", + date: new Date().toISOString(), + }); + + if (!result) { + console.log("checkout.session.completed, create order failed"); + return new Response(null, { status: 500 }); + } + + // update order & status of item + const res = await sanityClient + .patch(itemId) + .set({ + paid: true, + featured: true, + pricePlan: pricePlan, // pro or sponsor + sponsor: pricePlan === PricePlans.SPONSOR, + proPlanStatus: + pricePlan === PricePlans.PRO + ? ProPlanStatus.SUCCESS + : ProPlanStatus.SUBMITTING, + sponsorPlanStatus: + pricePlan === PricePlans.SPONSOR + ? SponsorPlanStatus.SUCCESS + : SponsorPlanStatus.SUBMITTING, + order: { + _type: "reference", + _ref: result._id, + }, + }) + .commit(); + + if (!res) { + console.log("checkout.session.completed, update item failed"); + return new Response(null, { status: 500 }); + } + + // send thank you email to user + console.log(`checkout.session.completed, item: ${JSON.stringify(res)}`); + const itemLink = getItemLinkInWebsite(res.slug.current); + console.log(`checkout.session.completed, userName: ${user.name}, + userEmail: ${user.email}, + itemLink: ${itemLink}`); + await sendPaymentSuccessEmail(user.name, user.email, itemLink); + + // send message to discord + await sendMessageToDiscord(session.id, customerId, user.name, amount); + } else { + console.log("checkout.session.completed, user not found"); + return new Response(null, { status: 404 }); + } + } + + return new Response(null, { status: 200 }); +} diff --git a/src/app/robots.ts b/src/app/robots.ts new file mode 100644 index 0000000..43b9bc8 --- /dev/null +++ b/src/app/robots.ts @@ -0,0 +1,15 @@ +import { siteConfig } from "@/config/site"; +import type { MetadataRoute } from "next"; + +/** + * https://nextjs.org/docs/app/api-reference/file-conventions/metadata/robots + */ +export default function robots(): MetadataRoute.Robots { + return { + rules: { + userAgent: "*", + allow: "/", + }, + sitemap: `${siteConfig.url}/sitemap.xml`, + }; +} diff --git a/src/app/sitemap.ts b/src/app/sitemap.ts new file mode 100644 index 0000000..ee1a8c2 --- /dev/null +++ b/src/app/sitemap.ts @@ -0,0 +1,286 @@ +import { COLLECTIONS_PER_PAGE, ITEMS_PER_PAGE } from "@/lib/constants"; +import type { + BlogCategoryListQueryForSitemapResult, + BlogListQueryForSitemapResult, + CategoryListQueryForSitemapResult, + CollectionListQueryForSitemapResult, + ItemListQueryForSitemapResult, + PageListQueryForSitemapResult, + TagListQueryForSitemapResult, +} from "@/sanity.types"; +import { sanityFetch } from "@/sanity/lib/fetch"; +import { + blogCategoryListQueryForSitemap, + blogListQueryForSitemap, + categoryListQueryForSitemap, + collectionListQueryForSitemap, + itemListQueryForSitemap, + pageListQueryForSitemap, + tagListQueryForSitemap, +} from "@/sanity/lib/queries"; +import collection from "@/sanity/schemas/documents/directory/collection"; +import type { MetadataRoute } from "next"; + +const site_url = process.env.NEXT_PUBLIC_APP_URL; + +/** + * Google's limit is 50,000 URLs per sitemap + * + * https://nextjs.org/docs/app/api-reference/functions/generate-sitemaps + * https://nextjs.org/docs/app/api-reference/file-conventions/metadata/sitemap + */ +export default async function sitemap(): Promise { + console.log("sitemap start"); + + const sitemapList: MetadataRoute.Sitemap = []; // final result + + const sitemapRoutes: MetadataRoute.Sitemap = [ + { + url: "", // home + lastModified: new Date(), + }, + { + url: "search", + lastModified: new Date(), + }, + { + url: "category", + lastModified: new Date(), + }, + { + url: "tag", + lastModified: new Date(), + }, + { + url: "collection", + lastModified: new Date(), + }, + { + url: "blog", + lastModified: new Date(), + }, + { + url: "pricing", + lastModified: new Date(), + }, + { + url: "auth/login", + lastModified: new Date(), + }, + { + url: "auth/register", + lastModified: new Date(), + }, + { + url: "about", + lastModified: new Date(), + }, + { + url: "privacy", + lastModified: new Date(), + }, + { + url: "terms", + lastModified: new Date(), + }, + ]; + + for (const route of sitemapRoutes) { + // console.log(`sitemap, url:${site_url}/${route.url}`); + sitemapList.push({ + url: `${site_url}/${route.url}`, + lastModified: new Date(route.lastModified).toISOString(), + }); + } + + const [ + itemListQueryResult, + categoryListQueryResult, + tagListQueryResult, + collectionListQueryResult, + blogListQueryResult, + blogCategoryListQueryResult, + pageListQueryResult, + ] = await Promise.all([ + sanityFetch({ + query: itemListQueryForSitemap, + }), + sanityFetch({ + query: categoryListQueryForSitemap, + }), + sanityFetch({ + query: tagListQueryForSitemap, + }), + sanityFetch({ + query: collectionListQueryForSitemap, + }), + sanityFetch({ + query: blogListQueryForSitemap, + }), + sanityFetch({ + query: blogCategoryListQueryForSitemap, + }), + sanityFetch({ + query: pageListQueryForSitemap, + }), + ]); + + console.log("sitemap, itemListQueryResult size:", itemListQueryResult.length); + console.log( + "sitemap, categoryListQueryResult size:", + categoryListQueryResult.length, + ); + console.log("sitemap, tagListQueryResult size:", tagListQueryResult.length); + console.log("sitemap, blogListQueryResult size:", blogListQueryResult.length); + console.log( + "sitemap, blogCategoryListQueryResult size:", + blogCategoryListQueryResult.length, + ); + console.log("sitemap, pageListQueryResult size:", pageListQueryResult.length); + + for (const item of itemListQueryResult) { + if (item.slug) { + const routeUrl = `/item/${item.slug}`; + // console.log(`sitemap, url:${site_url}${routeUrl}`); + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(item._updatedAt).toISOString(), + }); + } else { + console.warn(`sitemap, item slug invalid, id:${item._id}`); + } + } + + const pageCount = Math.ceil(itemListQueryResult.length / ITEMS_PER_PAGE); + console.log(`sitemap, item count:${itemListQueryResult.length}, pageCount:${pageCount}`); + for (let i = 2; i <= pageCount; i++) { + const routeUrl = `/?page=${i}`; + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date().toISOString(), + }); + } + + for (const category of categoryListQueryResult) { + if (category.slug) { + const routeUrl = `/category/${category.slug}`; + // console.log(`sitemap, url:${site_url}${routeUrl}`); + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(category._updatedAt).toISOString(), + }); + + const pageCount = Math.ceil(category.count / ITEMS_PER_PAGE); + console.log(`sitemap, category:${category.slug}, count:${category.count}, pageCount:${pageCount}`); + for (let i = 2; i <= pageCount; i++) { + const routeUrl = `/category/${category.slug}?page=${i}`; + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(category._updatedAt).toISOString(), + }); + } + } else { + console.warn(`sitemap, category slug invalid, id:${category._id}`); + } + } + + for (const tag of tagListQueryResult) { + if (tag.slug) { + const routeUrl = `/tag/${tag.slug}`; + // console.log(`sitemap, url:${site_url}${routeUrl}`); + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(tag._updatedAt).toISOString(), + }); + + const pageCount = Math.ceil(tag.count / ITEMS_PER_PAGE); + console.log(`sitemap, tag:${tag.slug}, count:${tag.count}, pageCount:${pageCount}`); + for (let i = 2; i <= pageCount; i++) { + const routeUrl = `/tag/${tag.slug}?page=${i}`; + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(tag._updatedAt).toISOString(), + }); + } + } else { + console.warn(`sitemap, tag slug invalid, id:${tag._id}`); + } + } + + for (const collection of collectionListQueryResult) { + if (collection.slug) { + const routeUrl = `/collection/${collection.slug}`; + // console.log(`sitemap, url:${site_url}${routeUrl}`); + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(collection._updatedAt).toISOString(), + }); + + const pageCount = Math.ceil(collection.count / COLLECTIONS_PER_PAGE); + console.log(`sitemap, collection:${collection.slug}, count:${collection.count}, pageCount:${pageCount}`); + for (let i = 2; i <= pageCount; i++) { + const routeUrl = `/collection/${collection.slug}?page=${i}`; + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(collection._updatedAt).toISOString(), + }); + } + } else { + console.warn(`sitemap, collection slug invalid, id:${collection._id}`); + } + } + + for (const blog of blogListQueryResult) { + if (blog.slug) { + const routeUrl = `/blog/${blog.slug}`; + // console.log(`sitemap, url:${site_url}${routeUrl}`); + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(blog._updatedAt).toISOString(), + }); + } else { + console.warn(`sitemap, blog post slug invalid, id:${blog._id}`); + } + } + + for (const blogCategory of blogCategoryListQueryResult) { + if (blogCategory.slug) { + const routeUrl = `/blog/category/${blogCategory.slug}`; + // console.log(`sitemap, url:${site_url}${routeUrl}`); + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(blogCategory._updatedAt).toISOString(), + }); + + const pageCount = Math.ceil(blogCategory.count / ITEMS_PER_PAGE); + console.log(`sitemap, blog category:${blogCategory.slug}, count:${blogCategory.count}, pageCount:${pageCount}`); + for (let i = 2; i <= pageCount; i++) { + const routeUrl = `/blog/category/${blogCategory.slug}?page=${i}`; + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(blogCategory._updatedAt).toISOString(), + }); + } + } else { + console.warn( + `sitemap, blog category slug invalid, id:${blogCategory._id}`, + ); + } + } + + for (const page of pageListQueryResult) { + if (page.slug) { + const routeUrl = `/page/${page.slug}`; + // console.log(`sitemap, url:${site_url}${routeUrl}`); + sitemapList.push({ + url: `${site_url}${routeUrl}`, + lastModified: new Date(page._updatedAt).toISOString(), + }); + } else { + console.warn(`sitemap, page slug invalid, id:${page._id}`); + } + } + + console.log("sitemap end, size:", sitemapList.length); + return sitemapList; +} diff --git a/src/assets/fonts/bricolage-grotesque-v7-latin-regular.woff2 b/src/assets/fonts/bricolage-grotesque-v7-latin-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8981203a7c349b177c4d73d5541c3c2f40553ae0 GIT binary patch literal 22528 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/source-serif-4-v8-latin-regular.woff2 b/src/assets/fonts/source-serif-4-v8-latin-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..bab3088c4d960de804bbf403ed47bc90ecf3b35f GIT binary patch literal 20044 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 literal 0 HcmV?d00001 diff --git a/src/assets/fonts/work-sans-v19-latin-regular.woff2 b/src/assets/fonts/work-sans-v19-latin-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a701d033994d72ac5a74c590392adfdc3908eefb GIT binary patch literal 20000 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 literal 0 HcmV?d00001 diff --git a/src/auth.config.ts b/src/auth.config.ts new file mode 100644 index 0000000..e0eb9ee --- /dev/null +++ b/src/auth.config.ts @@ -0,0 +1,76 @@ +import { getUserByEmail } from "@/data/user"; +import { SHOW_QUERY_LOGS } from "@/lib/constants"; +import { LoginSchema } from "@/lib/schemas"; +import { AuthError, type NextAuthConfig } from "next-auth"; +import Credentials from "next-auth/providers/credentials"; +import GitHub from "next-auth/providers/github"; +import Google from "next-auth/providers/google"; +import { verifyPassword } from "./lib/password"; + +/** + * https://github.com/javayhu/nextjs-14-auth-v5-tutorial/blob/main/auth.config.ts + * authConfig is used in middleware.ts and support edge runtime + */ +export default { + // https://authjs.dev/getting-started/migrating-to-v5#environment-variables + // https://authjs.dev/getting-started/deployment#auth_trust_host + // The AUTH_TRUST_HOST environment variable serves the same purpose as setting trustHost: true in your Auth.js configuration. + // This is necessary when running Auth.js behind a proxy. + // When set to true we will trust the X-Forwarded-Host and X-Forwarded-Proto headers + // passed to the app by the proxy to auto-detect the host URL (AUTH_URL) + // trustHost: true, + providers: [ + // https://authjs.dev/getting-started/authentication/oauth + GitHub, + Google, + // https://authjs.dev/getting-started/authentication/credentials + // https://youtu.be/1MTyCvS05V4?t=11279 + // Credentials won't affect the edge compatibility because it won't run on the edge + Credentials({ + authorize: async (credentials) => { + // called when user attempts to sign in with credentials + if (SHOW_QUERY_LOGS) { + console.log("authorize, credentials:", credentials); + } + + const validatedFields = LoginSchema.safeParse(credentials); + if (!validatedFields.success) { + console.error("authorize error: credentials invalid"); + return null; + } + + // @sanity-typegen-ignore + if (!credentials?.email) { + console.error("authorize error: email invalid"); + return null; + } + const user = await getUserByEmail(credentials.email as string); + if (!user || !user.password) { + console.error("authorize error: user not found or password invalid"); + return null; + } + + // https://youtu.be/1MTyCvS05V4?t=9695 + // bcryptjs is not compatible with nextjs edge runtime, so we use verifyPassword instead + const passwordsMatch = await verifyPassword( + credentials?.password as string, + user.password, + ); + if (passwordsMatch) { + const userWithRole = { + ...user, + id: user._id, + role: user.role, + }; + if (SHOW_QUERY_LOGS) { + console.log("authorize, user:", userWithRole); + } + return userWithRole; + } + console.error("authorize error: passwords do not match"); + // Return `null` to indicate that the credentials are invalid + return null; + }, + }), + ], +} satisfies NextAuthConfig; diff --git a/src/auth.ts b/src/auth.ts new file mode 100644 index 0000000..0df54a6 --- /dev/null +++ b/src/auth.ts @@ -0,0 +1,111 @@ +import authConfig from "@/auth.config"; +import { getAccountByUserId } from "@/data/account"; +import { getUserById } from "@/data/user"; +import { SHOW_QUERY_LOGS } from "@/lib/constants"; +import { sanityClient } from "@/sanity/lib/client"; +import { SanityAdapter } from "@/sanity/sanity-adapter"; +import type { UserRole } from "@/types/user-role"; +import NextAuth from "next-auth"; + +/** + * https://authjs.dev/getting-started/installation#configure + * providers for authorization, adapters for user data persistence + * + * https://github.com/javayhu/nextjs-14-auth-v5-tutorial/blob/main/auth.ts + */ +export const { + handlers, + auth, + signIn, + signOut, + //unstable update in Beta version + unstable_update, +} = NextAuth({ + ...authConfig, + pages: { + signIn: "/auth/login", + error: "/auth/error", + }, + // https://authjs.dev/guides/creating-a-database-adapter + adapter: SanityAdapter(sanityClient), + // https://authjs.dev/concepts/session-strategies + session: { strategy: "jwt" }, + // https://authjs.dev/concepts/callbacks + callbacks: { + // https://authjs.dev/concepts/callbacks#signin + // https://youtu.be/1MTyCvS05V4?t=10341 + signIn: async ({ user, account }) => { + // console.log('auth callbacks signIn, start, user:', user); + if (account?.provider !== "credentials") return true; + + const existingUser = await getUserById(user.id); + + // prevent signIn without email verification + if (!existingUser?.emailVerified) { + console.log("auth callbacks signIn, user not verified"); + return false; + } + + // console.log('auth callbacks signIn, end, user:', existingUser); + return true; + }, + + // https://authjs.dev/concepts/session-strategies#jwt-session + // https://authjs.dev/reference/nextjs#jwt + // This callback is called whenever a JSON Web Token is created (i.e. at sign in) + // or updated (i.e whenever a session is accessed in the client). + // Anything you return here will be saved in the JWT and forwarded to the session callback. + jwt: async ({ token }) => { + if (SHOW_QUERY_LOGS) { + console.log("auth callbacks jwt, start, token:", token); + } + if (!token.sub) return token; + + const existingUser = await getUserById(token.sub); + + if (!existingUser) return token; + + const existingAccount = await getAccountByUserId(existingUser._id); + + token.isOAuth = !!existingAccount; + token.name = existingUser.name; + token.email = existingUser.email; + token.link = existingUser.link; + token.role = existingUser.role; + if (SHOW_QUERY_LOGS) { + console.log("auth callbacks jwt, end, token:", token); + } + return token; + }, + + // https://github.com/javayhu/nextjs-14-auth-v5-tutorial/blob/main/auth.ts#L68 + // role and isOAuth are added to the token, so we can pass them to the session + session: async ({ session, token }) => { + if (SHOW_QUERY_LOGS) { + console.log("auth callbacks session, start, token:", token); + } + if (token.sub && session.user) { + session.user.id = token.sub; + } + + // https://github.com/javayhu/nextjs-14-auth-v5-tutorial/blob/main/auth.ts#L59 + if (token.role && session.user) { + session.user.role = token.role as UserRole; + } + if (token.link && session.user) { + session.user.link = token.link as string; + } + + if (session.user) { + session.user.name = token.name; + session.user.email = token.email ?? ""; + session.user.isOAuth = token.isOAuth as boolean; + } + + if (SHOW_QUERY_LOGS) { + console.log("auth callbacks session, end, session:", session); + } + return session; + }, + }, +}); diff --git a/src/components/analytics/analytics.tsx b/src/components/analytics/analytics.tsx new file mode 100644 index 0000000..ba3b77f --- /dev/null +++ b/src/components/analytics/analytics.tsx @@ -0,0 +1,26 @@ +import GoogleAnalytics from "./google-analytics"; +import OpenPanelAnalytics from "./open-panel-analytics"; +import { PlausibleAnalytics } from "./plausible-analytics"; +import { UmamiAnalytics } from "./umami-analytics"; + +export function Analytics() { + if (process.env.NODE_ENV !== "production") { + return null; + } + + return ( + <> + {/* openpanel analytics */} + + + {/* google analytics */} + + + {/* umami analytics */} + + + {/* plausible analytics */} + + + ); +} diff --git a/src/components/analytics/google-analytics.tsx b/src/components/analytics/google-analytics.tsx new file mode 100644 index 0000000..941258f --- /dev/null +++ b/src/components/analytics/google-analytics.tsx @@ -0,0 +1,22 @@ +"use client"; + +import { GoogleAnalytics as NextGoogleAnalytics } from "@next/third-parties/google"; + +/** + * Google Analytics + * + * https://analytics.google.com + * https://nextjs.org/docs/app/building-your-application/optimizing/third-party-libraries#google-analytics + */ +export default function GoogleAnalytics() { + if (process.env.NODE_ENV !== "production") { + return null; + } + + const analyticsId = process.env.NEXT_PUBLIC_GOOGLE_ANALYTICS_ID; + if (!analyticsId) { + return null; + } + + return ; +} diff --git a/src/components/analytics/open-panel-analytics.tsx b/src/components/analytics/open-panel-analytics.tsx new file mode 100644 index 0000000..d83f9fe --- /dev/null +++ b/src/components/analytics/open-panel-analytics.tsx @@ -0,0 +1,26 @@ +import { OpenPanelComponent } from "@openpanel/nextjs"; + +/** + * OpenPanel Analytics (https://openpanel.dev) + * + * https://docs.openpanel.dev/docs/sdks/nextjs#options + */ +export default function OpenPanelAnalytics() { + if (process.env.NODE_ENV !== "production") { + return null; + } + + const clientId = process.env.NEXT_PUBLIC_OPENPANEL_CLIENT_ID; + if (!clientId) { + return null; + } + + return ( + + ); +} diff --git a/src/components/analytics/plausible-analytics.tsx b/src/components/analytics/plausible-analytics.tsx new file mode 100644 index 0000000..bb881ff --- /dev/null +++ b/src/components/analytics/plausible-analytics.tsx @@ -0,0 +1,32 @@ +'use client'; + +import Script from 'next/script'; + +/** + * Plausible Analytics + * + * NOTICE: + * If you do not check `404 error pages` when you set up Plausible Analytics, + * you do not need to add new script to this component. + * + * https://plausible.io + */ +export function PlausibleAnalytics() { + if (process.env.NODE_ENV !== 'production') { + return null; + } + + const domain = process.env.NEXT_PUBLIC_PLAUSIBLE_DOMAIN as string; + if (!domain) { + return null; + } + + const script = process.env.NEXT_PUBLIC_PLAUSIBLE_SCRIPT as string; + if (!script) { + return null; + } + + return ( +