diff --git a/innungsapp/CLAUDE.md b/innungsapp/CLAUDE.md
new file mode 100644
index 0000000..75ba4a0
--- /dev/null
+++ b/innungsapp/CLAUDE.md
@@ -0,0 +1,116 @@
+# CLAUDE.md
+
+This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
+
+## Project Overview
+
+**InnungsApp** is a multi-tenant SaaS platform for German trade guilds (Innungen). It consists of:
+- **Admin Dashboard**: Next.js 15 web app for guild administrators
+- **Mobile App**: Expo React Native app for guild members (iOS + Android)
+- **Shared Package**: Prisma ORM schema, types, and utilities
+
+## Commands
+
+All commands run from `innungsapp/` root unless noted.
+
+```bash
+# Development
+pnpm install # Install all workspace dependencies
+pnpm dev # Start all apps in parallel (Turborepo)
+
+# Per-app dev
+pnpm --filter admin dev # Admin only (Next.js on :3000)
+pnpm --filter mobile dev # Mobile only (Expo)
+cd apps/mobile && npx expo run:android
+cd apps/mobile && npx expo run:ios
+
+# Type checking & linting
+pnpm type-check # tsc --noEmit across all apps
+pnpm lint # ESLint across all apps
+
+# Database (Prisma via shared package)
+pnpm db:generate # Regenerate Prisma client after schema changes
+pnpm db:migrate # Run migrations (dev)
+pnpm db:push # Push schema without migration (prototype)
+pnpm db:studio # Open Prisma Studio
+pnpm db:seed # Seed with test data
+pnpm db:reset # Drop + re-migrate + re-seed
+
+# Deployment
+vercel --cwd apps/admin # Deploy admin to Vercel
+cd apps/mobile && eas build --platform all --profile production
+cd apps/mobile && eas submit --platform all
+```
+
+## Architecture
+
+### Monorepo Structure
+- **pnpm Workspaces + Turborepo** — `apps/admin`, `apps/mobile`, `packages/shared`
+- `packages/shared` exports Prisma client, schema types, and shared utilities
+- Both apps import from `@innungsapp/shared`
+
+### Data Flow
+```
+Mobile App (Expo)
+ │
+ ▼ HTTP (tRPC)
+Admin App (Next.js API Routes)
+ │
+ ▼ Prisma ORM
+PostgreSQL Database
+```
+
+The mobile app calls the admin app's tRPC API (`/api/trpc`). There is no separate backend — the Next.js app serves both the admin UI and the API.
+
+### tRPC Procedure Hierarchy
+Three protection levels in `apps/admin/server/trpc.ts`:
+- `publicProcedure` — No auth
+- `protectedProcedure` — Session required
+- `memberProcedure` — Session + valid org membership (injects `orgId` and `role`)
+
+Routers are in `apps/admin/server/routers/`: `members`, `news`, `termine`, `stellen`, `organizations`.
+
+### Multi-Tenancy
+Every resource (member, news, event, job listing) is scoped to an `Organization`. The `memberProcedure` extracts `orgId` from the session and all queries filter by it. Org plan types: `pilot`, `standard`, `pro`, `verband`.
+
+### Authentication
+- **better-auth** with magic links (email-based, passwordless)
+- Admin creates a member → email invitation sent via SMTP → member sets up account
+- Session stored in DB; mobile app persists session token in AsyncStorage
+- Auth handler: `apps/admin/app/api/auth/[...all]/route.ts`
+
+### Mobile Routing (Expo Router)
+File-based routing with two route groups:
+- `(auth)/` — Login, check-email (unauthenticated)
+- `(app)/` — Tab navigation: home, members, news, stellen, termine, profil (requires session)
+
+Zustand (`store/auth.store.ts`) holds auth state; React Query handles server state via tRPC.
+
+### Admin Routing (Next.js App Router)
+- `/login` — Magic link login
+- `/dashboard` — Protected layout with sidebar
+- `/dashboard/mitglieder` — Member CRUD
+- `/dashboard/news` — News management
+- `/dashboard/termine` — Event management
+- `/dashboard/stellen` — Job listings
+- `/dashboard/einstellungen` — Org settings (AVV acceptance)
+
+File uploads are stored locally in `apps/admin/uploads/` and served via `/api/uploads/[...path]`.
+
+### Environment Variables
+Required in `apps/admin/.env` (see `.env.example`):
+- `DATABASE_URL` — PostgreSQL connection
+- `BETTER_AUTH_SECRET` / `BETTER_AUTH_URL` — Auth config
+- `SMTP_*` — Email for magic links
+- `NEXT_PUBLIC_APP_URL` — Admin public URL
+- `EXPO_PUBLIC_API_URL` — Mobile points to admin API
+- `UPLOAD_DIR` / `UPLOAD_MAX_SIZE_MB` — File storage
+
+## Key Conventions
+
+- **Styling**: Tailwind CSS in admin; NativeWind v4 (Tailwind syntax) in mobile
+- **Validation**: Zod schemas defined inline with tRPC procedures
+- **Dates**: `date-fns` for formatting
+- **Icons**: `lucide-react` (admin), `@expo/vector-icons` (mobile)
+- **Schema changes**: Always run `pnpm db:generate` after editing `packages/shared/prisma/schema.prisma`
+- **tRPC client (mobile)**: configured in `apps/mobile/lib/trpc.ts`, uses `superjson` transformer
diff --git a/innungsapp/README.md b/innungsapp/README.md
new file mode 100644
index 0000000..c3c097d
--- /dev/null
+++ b/innungsapp/README.md
@@ -0,0 +1,137 @@
+# InnungsApp
+
+Die digitale Plattform für Innungen — News, Mitgliederverzeichnis, Termine und Lehrlingsbörse.
+
+## Stack
+
+| Schicht | Technologie |
+|---|---|
+| **Monorepo** | pnpm Workspaces + Turborepo |
+| **Mobile App** | Expo (React Native) + Expo Router |
+| **Admin Dashboard** | Next.js 15 (App Router) |
+| **API** | tRPC v11 |
+| **Auth** | better-auth (Magic Links) |
+| **Datenbank** | PostgreSQL + Prisma ORM |
+| **Styling Mobile** | NativeWind v4 (Tailwind CSS) |
+| **Styling Admin** | Tailwind CSS |
+| **State Management** | Zustand (Mobile) + React Query (beide Apps) |
+
+## Projekt-Struktur
+
+```
+innungsapp/
+├── apps/
+│ ├── mobile/ # Expo React Native App (iOS + Android)
+│ └── admin/ # Next.js Admin Dashboard
+├── packages/
+│ └── shared/ # TypeScript-Typen + Prisma Client
+└── ...
+```
+
+## Setup
+
+### Voraussetzungen
+
+- Node.js >= 20
+- pnpm >= 9
+- PostgreSQL-Datenbank
+- SMTP-Server (für Magic Links)
+
+### 1. Abhängigkeiten installieren
+
+```bash
+pnpm install
+```
+
+### 2. Umgebungsvariablen
+
+```bash
+cp .env.example apps/admin/.env.local
+# .env.local befüllen (DATABASE_URL, BETTER_AUTH_SECRET, SMTP_*)
+```
+
+### 3. Datenbank einrichten
+
+```bash
+# Prisma Client generieren
+pnpm db:generate
+
+# Migrationen anwenden
+pnpm db:migrate
+
+# Demo-Daten einspielen (optional)
+pnpm db:seed
+```
+
+### 4. Entwicklung starten
+
+```bash
+# Admin Dashboard (http://localhost:3000)
+pnpm --filter @innungsapp/admin dev
+
+# Mobile App (Expo DevTools)
+pnpm --filter @innungsapp/mobile dev
+```
+
+Oder alles parallel:
+```bash
+pnpm dev
+```
+
+## Datenbank-Schema
+
+Das Schema befindet sich in `packages/shared/prisma/schema.prisma`.
+
+Wichtige Tabellen:
+- `organizations` — Innungen (Multi-Tenancy)
+- `members` — Mitglieder (verknüpft mit Auth-User nach Einladung)
+- `user_roles` — Berechtigungen (admin | member)
+- `news`, `news_reads`, `news_attachments` — News-System
+- `termine`, `termin_anmeldungen` — Terminverwaltung
+- `stellen` — Lehrlingsbörse (öffentlich lesbar)
+
+## Auth-Flow
+
+1. **Admin einrichten:** Seed-Daten oder manuell in der DB
+2. **Mitglied einladen:** Admin erstellt Mitglied → "Einladung senden" → Magic Link per E-Mail
+3. **Mitglied loggt ein:** Magic Link → Session → App-Zugang
+
+## API (tRPC)
+
+Alle API-Endpunkte sind typsicher über tRPC definiert:
+
+- `organizations.*` — Org-Einstellungen, Stats, AVV
+- `members.*` — CRUD, Einladungen
+- `news.*` — CRUD, Lesestatus, Push-Benachrichtigungen
+- `termine.*` — CRUD, Anmeldungen
+- `stellen.*` — Public + Auth-geschützte Endpunkte
+
+## Deployment
+
+### Admin (Vercel)
+
+```bash
+# Umgebungsvariablen in Vercel setzen:
+# DATABASE_URL, BETTER_AUTH_SECRET, BETTER_AUTH_URL, SMTP_*
+
+# Deploy
+vercel --cwd apps/admin
+```
+
+### Mobile (EAS Build)
+
+```bash
+cd apps/mobile
+eas build --platform all --profile production
+eas submit --platform all
+```
+
+## DSGVO / AVV
+
+- AVV-Akzeptanz in Admin → Einstellungen (Pflichtfeld vor Go-Live)
+- Alle personenbezogenen Daten in EU-Region (Datenbankserver in Deutschland empfohlen)
+- Keine Daten an Dritte außer Expo Push API (anonymisierte Token)
+
+## Roadmap
+
+Siehe `innung-app-mvp.md` für die vollständige Roadmap.
diff --git a/innungsapp/apps/admin/app/api/push-token/route.ts b/innungsapp/apps/admin/app/api/push-token/route.ts
new file mode 100644
index 0000000..53cbc7e
--- /dev/null
+++ b/innungsapp/apps/admin/app/api/push-token/route.ts
@@ -0,0 +1,23 @@
+import { NextRequest, NextResponse } from 'next/server'
+import { auth } from '@/lib/auth'
+import { prisma } from '@innungsapp/shared'
+
+export async function POST(req: NextRequest) {
+ const session = await auth.api.getSession({ headers: req.headers })
+ if (!session?.user) {
+ return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
+ }
+
+ const { token } = await req.json()
+ if (!token || typeof token !== 'string') {
+ return NextResponse.json({ error: 'Invalid token' }, { status: 400 })
+ }
+
+ // Store push token on the member record
+ await prisma.member.updateMany({
+ where: { userId: session.user.id },
+ data: { pushToken: token },
+ })
+
+ return NextResponse.json({ success: true })
+}
diff --git a/innungsapp/apps/admin/app/dashboard/mitglieder/[id]/page.tsx b/innungsapp/apps/admin/app/dashboard/mitglieder/[id]/page.tsx
new file mode 100644
index 0000000..16a7f9d
--- /dev/null
+++ b/innungsapp/apps/admin/app/dashboard/mitglieder/[id]/page.tsx
@@ -0,0 +1,155 @@
+'use client'
+
+import { use } from 'react'
+import { useRouter } from 'next/navigation'
+import { trpc } from '@/lib/trpc-client'
+import Link from 'next/link'
+import { useState, useEffect } from 'react'
+import { SPARTEN, MEMBER_STATUS_LABELS } from '@innungsapp/shared'
+
+export default function MitgliedEditPage({
+ params,
+}: {
+ params: Promise<{ id: string }>
+}) {
+ const { id } = use(params)
+ const router = useRouter()
+ const { data: member, isLoading } = trpc.members.byId.useQuery({ id })
+ const updateMutation = trpc.members.update.useMutation({
+ onSuccess: () => router.push('/dashboard/mitglieder'),
+ })
+ const resendMutation = trpc.members.resendInvite.useMutation()
+
+ const [form, setForm] = useState({
+ name: '',
+ betrieb: '',
+ sparte: '',
+ ort: '',
+ telefon: '',
+ email: '',
+ status: 'aktiv' as 'aktiv' | 'ruhend' | 'ausgetreten',
+ istAusbildungsbetrieb: false,
+ seit: undefined as number | undefined,
+ })
+
+ useEffect(() => {
+ if (member) {
+ setForm({
+ name: member.name,
+ betrieb: member.betrieb,
+ sparte: member.sparte,
+ ort: member.ort,
+ telefon: member.telefon ?? '',
+ email: member.email,
+ status: member.status,
+ istAusbildungsbetrieb: member.istAusbildungsbetrieb,
+ seit: member.seit ?? undefined,
+ })
+ }
+ }, [member])
+
+ if (isLoading) return
Wird geladen...
+ if (!member) return null
+
+ function handleSubmit(e: React.FormEvent) {
+ e.preventDefault()
+ updateMutation.mutate({ id, data: form })
+ }
+
+ const inputClass =
+ 'w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-brand-500'
+
+ return (
+
+
+
+ ← Zurück
+
+
Mitglied bearbeiten
+
+
+ {/* Invite Status */}
+
+
+
App-Zugang
+
+ {member.userId
+ ? '✓ Mitglied hat sich eingeloggt'
+ : 'Noch nicht eingeladen / eingeloggt'}
+
+
+ {!member.userId && (
+
+ )}
+
+
+
+
+ )
+}
diff --git a/innungsapp/apps/admin/package.json b/innungsapp/apps/admin/package.json
index 0f2c212..fd45088 100644
--- a/innungsapp/apps/admin/package.json
+++ b/innungsapp/apps/admin/package.json
@@ -2,6 +2,9 @@
"name": "@innungsapp/admin",
"version": "0.1.0",
"private": true,
+ "exports": {
+ ".": "./server/routers/index.ts"
+ },
"scripts": {
"dev": "next dev",
"build": "next build",
diff --git a/innungsapp/apps/mobile/.cache/react-native-css-interop/android.js b/innungsapp/apps/mobile/.cache/react-native-css-interop/android.js
new file mode 100644
index 0000000..e69de29
diff --git a/innungsapp/apps/mobile/.cache/react-native-css-interop/ios.js b/innungsapp/apps/mobile/.cache/react-native-css-interop/ios.js
new file mode 100644
index 0000000..e69de29
diff --git a/innungsapp/apps/mobile/.cache/react-native-css-interop/macos.js b/innungsapp/apps/mobile/.cache/react-native-css-interop/macos.js
new file mode 100644
index 0000000..e69de29
diff --git a/innungsapp/apps/mobile/.cache/react-native-css-interop/native.js b/innungsapp/apps/mobile/.cache/react-native-css-interop/native.js
new file mode 100644
index 0000000..e69de29
diff --git a/innungsapp/apps/mobile/.cache/react-native-css-interop/windows.js b/innungsapp/apps/mobile/.cache/react-native-css-interop/windows.js
new file mode 100644
index 0000000..e69de29
diff --git a/innungsapp/apps/mobile/.gitignore b/innungsapp/apps/mobile/.gitignore
new file mode 100644
index 0000000..5873d9a
--- /dev/null
+++ b/innungsapp/apps/mobile/.gitignore
@@ -0,0 +1,6 @@
+
+# @generated expo-cli sync-2b81b286409207a5da26e14c78851eb30d8ccbdb
+# The following patterns were generated by expo-cli
+
+expo-env.d.ts
+# @end expo-cli
\ No newline at end of file
diff --git a/innungsapp/apps/mobile/app.json b/innungsapp/apps/mobile/app.json
index 7a7d792..52d7c97 100644
--- a/innungsapp/apps/mobile/app.json
+++ b/innungsapp/apps/mobile/app.json
@@ -26,7 +26,10 @@
"backgroundColor": "#E63946"
},
"package": "de.innungsapp.mobile",
- "permissions": ["RECEIVE_BOOT_COMPLETED", "SCHEDULE_EXACT_ALARM"]
+ "permissions": [
+ "RECEIVE_BOOT_COMPLETED",
+ "SCHEDULE_EXACT_ALARM"
+ ]
},
"web": {
"bundler": "metro",
@@ -50,10 +53,11 @@
{
"calendarPermission": "Die App benötigt Zugriff auf Ihren Kalender."
}
- ]
+ ],
+ "expo-web-browser"
],
"experiments": {
"typedRoutes": true
}
}
-}
+}
diff --git a/innungsapp/apps/mobile/app/(app)/_layout.tsx b/innungsapp/apps/mobile/app/(app)/_layout.tsx
index 0ee6f30..b9c16da 100644
--- a/innungsapp/apps/mobile/app/(app)/_layout.tsx
+++ b/innungsapp/apps/mobile/app/(app)/_layout.tsx
@@ -1,11 +1,7 @@
-import { Tabs } from 'expo-router'
-import { useAuthStore } from '@/store/auth.store'
-import { Redirect } from 'expo-router'
+import { Tabs, Redirect } from 'expo-router'
import { Platform } from 'react-native'
-
-function TabIcon({ emoji }: { emoji: string }) {
- return null // Replaced by tabBarIcon in options
-}
+import { Ionicons } from '@expo/vector-icons'
+import { useAuthStore } from '@/store/auth.store'
export default function AppLayout() {
const session = useAuthStore((s) => s.session)
@@ -17,62 +13,75 @@ export default function AppLayout() {
return (
(
- /* Replace with actual icons after @expo/vector-icons setup */
-
+ title: 'Start',
+ tabBarIcon: ({ color, focused }) => (
+
),
- headerShown: false,
}}
/>
,
- headerShown: false,
+ title: 'Aktuelles',
+ tabBarIcon: ({ color, focused }) => (
+
+ ),
}}
/>
,
- headerShown: false,
+ tabBarIcon: ({ color, focused }) => (
+
+ ),
}}
/>
,
- headerShown: false,
+ tabBarIcon: ({ color, focused }) => (
+
+ ),
}}
/>
,
- headerShown: false,
+ tabBarIcon: ({ color, focused }) => (
+
+ ),
}}
/>
+
+
+
+
+
+
)
}
diff --git a/innungsapp/apps/mobile/app/(app)/home/index.tsx b/innungsapp/apps/mobile/app/(app)/home/index.tsx
new file mode 100644
index 0000000..07bd375
--- /dev/null
+++ b/innungsapp/apps/mobile/app/(app)/home/index.tsx
@@ -0,0 +1,464 @@
+import { View, Text, ScrollView, TouchableOpacity, TextInput, StyleSheet, Platform, Image } from 'react-native'
+import { SafeAreaView } from 'react-native-safe-area-context'
+import { Ionicons } from '@expo/vector-icons'
+import { useRouter } from 'expo-router'
+import { format } from 'date-fns'
+import { de } from 'date-fns/locale'
+import { NEWS_KATEGORIE_LABELS } from '@innungsapp/shared/types'
+import { useNewsList } from '@/hooks/useNews'
+import { useTermineListe } from '@/hooks/useTermine'
+import { useNewsReadStore } from '@/store/news.store'
+
+// Helper to truncate text
+function getNewsExcerpt(value: string) {
+ const normalized = value
+ .replace(/[#*_`>-]/g, ' ')
+ .replace(/\s+/g, ' ')
+ .trim()
+ return normalized.length > 85 ? `${normalized.slice(0, 85)}...` : normalized
+}
+
+export default function HomeScreen() {
+ const router = useRouter()
+ const { data: newsItems = [] } = useNewsList()
+ const { data: termine = [] } = useTermineListe(true)
+ const readIds = useNewsReadStore((s) => s.readIds)
+
+ const latestNews = newsItems.slice(0, 2)
+ const upcomingEvents = termine.slice(0, 3)
+ const unreadCount = newsItems.filter((item) => !(item.isRead || readIds.has(item.id))).length
+
+ const QUICK_ACTIONS = [
+ { label: 'Mitglieder', icon: 'people', color: '#003B7E', bg: '#E0F2FE', route: '/(app)/members' },
+ { label: 'Termine', icon: 'calendar', color: '#B45309', bg: '#FEF3C7', route: '/(app)/termine' },
+ { label: 'Stellen', icon: 'briefcase', color: '#059669', bg: '#D1FAE5', route: '/(app)/stellen' },
+ { label: 'Profil', icon: 'person', color: '#4F46E5', bg: '#E0E7FF', route: '/(app)/profil' },
+ ]
+
+ return (
+
+ {/* Decorative Background Element */}
+
+
+
+
+ {/* Header Section */}
+
+
+
+ I
+
+
+ Willkommen zurück,
+ Demo Admin
+
+
+
+
+
+ {unreadCount > 0 && (
+
+ {unreadCount}
+
+ )}
+
+
+
+ {/* Search Bar */}
+
+
+
+
+
+ {/* Quick Actions Grid */}
+
+ Schnellzugriff
+
+ {QUICK_ACTIONS.map((action, i) => (
+ router.push(action.route as never)}
+ >
+
+
+
+ {action.label}
+
+ ))}
+
+
+
+ {/* News Section */}
+
+
+ Aktuelles
+ router.push('/(app)/news' as never)}>
+ Alle anzeigen
+
+
+
+
+ {latestNews.map((item) => (
+ router.push(`/(app)/news/${item.id}` as never)}
+ >
+
+
+
+ {NEWS_KATEGORIE_LABELS[item.kategorie]}
+
+
+
+ {item.publishedAt ? format(item.publishedAt, 'dd. MMM', { locale: de }) : 'Entwurf'}
+
+
+
+ {item.title}
+ {getNewsExcerpt(item.body)}
+
+ ))}
+
+
+
+ {/* Upcoming Events */}
+
+
+ Anstehende Termine
+ router.push('/(app)/termine' as never)}>
+ Kalender
+
+
+
+
+ {upcomingEvents.map((event, index) => (
+ router.push(`/(app)/termine/${event.id}` as never)}
+ activeOpacity={0.7}
+ >
+
+ {format(event.datum, 'MMM', { locale: de })}
+ {format(event.datum, 'dd')}
+
+
+
+ {event.titel}
+
+ {event.uhrzeit} • {event.ort}
+
+
+
+
+
+ ))}
+
+
+
+
+
+
+ )
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: '#F8FAFC', // Slate-50
+ },
+ bgDecoration: {
+ position: 'absolute',
+ top: -100,
+ left: 0,
+ right: 0,
+ height: 400,
+ backgroundColor: '#003B7E', // Primary brand color
+ opacity: 0.05,
+ transform: [{ scaleX: 1.5 }, { scaleY: 1 }],
+ borderBottomLeftRadius: 200,
+ borderBottomRightRadius: 200,
+ },
+ safeArea: {
+ flex: 1,
+ },
+ scrollContent: {
+ padding: 20,
+ paddingBottom: 40,
+ gap: 24,
+ },
+
+ // Header
+ header: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ marginTop: 4,
+ },
+ headerLeft: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 12,
+ },
+ avatar: {
+ width: 44,
+ height: 44,
+ borderRadius: 14,
+ backgroundColor: '#003B7E',
+ alignItems: 'center',
+ justifyContent: 'center',
+ shadowColor: '#003B7E',
+ shadowOffset: { width: 0, height: 4 },
+ shadowOpacity: 0.2,
+ shadowRadius: 8,
+ elevation: 4,
+ },
+ avatarText: {
+ color: '#FFFFFF',
+ fontSize: 20,
+ fontWeight: '700',
+ },
+ greeting: {
+ fontSize: 13,
+ color: '#64748B',
+ fontWeight: '500',
+ },
+ username: {
+ fontSize: 18,
+ fontWeight: '700',
+ color: '#0F172A',
+ },
+ notificationBtn: {
+ width: 40,
+ height: 40,
+ borderRadius: 20,
+ backgroundColor: '#FFFFFF',
+ alignItems: 'center',
+ justifyContent: 'center',
+ borderWidth: 1,
+ borderColor: '#E2E8F0',
+ shadowColor: '#000',
+ shadowOffset: { width: 0, height: 2 },
+ shadowOpacity: 0.05,
+ shadowRadius: 4,
+ elevation: 1,
+ },
+ badge: {
+ position: 'absolute',
+ top: -2,
+ right: -2,
+ backgroundColor: '#EF4444',
+ width: 16,
+ height: 16,
+ borderRadius: 8,
+ alignItems: 'center',
+ justifyContent: 'center',
+ borderWidth: 1.5,
+ borderColor: '#FFFFFF',
+ },
+ badgeText: {
+ color: '#FFF',
+ fontSize: 9,
+ fontWeight: 'bold',
+ },
+
+ // Search
+ searchContainer: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ backgroundColor: '#FFFFFF',
+ borderWidth: 1,
+ borderColor: '#E2E8F0',
+ borderRadius: 16,
+ paddingHorizontal: 14,
+ paddingVertical: 12,
+ gap: 10,
+ shadowColor: '#000',
+ shadowOffset: { width: 0, height: 2 },
+ shadowOpacity: 0.03,
+ shadowRadius: 4,
+ elevation: 1,
+ },
+ searchInput: {
+ flex: 1,
+ fontSize: 15,
+ color: '#0F172A',
+ },
+
+ // Sections
+ section: {
+ gap: 12,
+ },
+ sectionHeader: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ },
+ sectionTitle: {
+ fontSize: 18,
+ fontWeight: '700',
+ color: '#0F172A',
+ },
+ linkText: {
+ fontSize: 14,
+ fontWeight: '600',
+ color: '#003B7E',
+ },
+
+ // Grid
+ grid: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ gap: 12,
+ },
+ gridItem: {
+ width: '48%', // Approx half with gap
+ backgroundColor: '#FFFFFF',
+ padding: 16,
+ borderRadius: 20,
+ alignItems: 'center',
+ justifyContent: 'center',
+ gap: 10,
+ borderWidth: 1,
+ borderColor: '#E2E8F0',
+ shadowColor: '#000',
+ shadowOffset: { width: 0, height: 2 },
+ shadowOpacity: 0.02,
+ shadowRadius: 8,
+ elevation: 2,
+ },
+ gridIcon: {
+ width: 48,
+ height: 48,
+ borderRadius: 14,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ gridLabel: {
+ fontSize: 14,
+ fontWeight: '600',
+ color: '#334155',
+ },
+
+ // News Cards
+ cardsColumn: {
+ gap: 12,
+ },
+ newsCard: {
+ backgroundColor: '#FFFFFF',
+ padding: 16,
+ borderRadius: 18,
+ borderWidth: 1,
+ borderColor: '#E2E8F0',
+ shadowColor: '#000',
+ shadowOffset: { width: 0, height: 2 },
+ shadowOpacity: 0.04,
+ shadowRadius: 6,
+ elevation: 2,
+ },
+ newsHeader: {
+ flexDirection: 'row',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ marginBottom: 8,
+ },
+ categoryBadge: {
+ paddingHorizontal: 8,
+ paddingVertical: 4,
+ backgroundColor: '#F1F5F9',
+ borderRadius: 8,
+ },
+ categoryText: {
+ fontSize: 10,
+ fontWeight: '700',
+ color: '#475569',
+ textTransform: 'uppercase',
+ },
+ dateText: {
+ fontSize: 12,
+ color: '#94A3B8',
+ },
+ newsTitle: {
+ fontSize: 16,
+ fontWeight: '700',
+ color: '#0F172A',
+ marginBottom: 6,
+ lineHeight: 22,
+ },
+ newsBody: {
+ fontSize: 14,
+ color: '#64748B',
+ lineHeight: 20,
+ },
+
+ // Events List
+ eventsList: {
+ backgroundColor: '#FFFFFF',
+ borderRadius: 20,
+ borderWidth: 1,
+ borderColor: '#E2E8F0',
+ paddingVertical: 4,
+ },
+ eventRow: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ padding: 12,
+ gap: 14,
+ },
+ eventBorder: {
+ borderBottomWidth: 1,
+ borderBottomColor: '#F1F5F9',
+ },
+ dateBox: {
+ width: 50,
+ height: 50,
+ borderRadius: 14,
+ backgroundColor: '#F8FAFC',
+ alignItems: 'center',
+ justifyContent: 'center',
+ borderWidth: 1,
+ borderColor: '#E2E8F0',
+ },
+ dateMonth: {
+ fontSize: 10,
+ fontWeight: '700',
+ textTransform: 'uppercase',
+ color: '#64748B',
+ marginBottom: -2,
+ },
+ dateDay: {
+ fontSize: 18,
+ fontWeight: '800',
+ color: '#0F172A',
+ },
+ eventInfo: {
+ flex: 1,
+ gap: 2,
+ },
+ eventTitle: {
+ fontSize: 15,
+ fontWeight: '700',
+ color: '#0F172A',
+ },
+ eventMeta: {
+ fontSize: 12,
+ color: '#64748B',
+ fontWeight: '500',
+ },
+})
+
diff --git a/innungsapp/apps/mobile/app/(app)/members/[id].tsx b/innungsapp/apps/mobile/app/(app)/members/[id].tsx
index d91199b..86c98ea 100644
--- a/innungsapp/apps/mobile/app/(app)/members/[id].tsx
+++ b/innungsapp/apps/mobile/app/(app)/members/[id].tsx
@@ -1,107 +1,238 @@
import {
- View,
- Text,
- ScrollView,
- TouchableOpacity,
- Linking,
- ActivityIndicator,
+ View, Text, ScrollView, TouchableOpacity, Linking, ActivityIndicator, StyleSheet,
} from 'react-native'
import { SafeAreaView } from 'react-native-safe-area-context'
import { useLocalSearchParams, useRouter } from 'expo-router'
-import { trpc } from '@/lib/trpc'
+import { Ionicons } from '@expo/vector-icons'
+import { useMemberDetail } from '@/hooks/useMembers'
import { Avatar } from '@/components/ui/Avatar'
export default function MemberDetailScreen() {
const { id } = useLocalSearchParams<{ id: string }>()
const router = useRouter()
- const { data: member, isLoading } = trpc.members.byId.useQuery({ id })
+ const { data: member, isLoading } = useMemberDetail(id)
if (isLoading) {
return (
-
-
+
+
)
}
-
if (!member) return null
+ const fields = [
+ member.sparte ? ['SPARTE', member.sparte] : null,
+ member.ort ? ['ORT', member.ort] : null,
+ member.seit ? ['MITGLIED SEIT', String(member.seit)] : null,
+ ].filter(Boolean) as [string, string][]
+
return (
-
- {/* Header */}
-
- router.back()} className="mr-3">
- ← Zurück
+
+ {/* Nav */}
+
+ router.back()} style={styles.backBtn} activeOpacity={0.7}>
+
+ Zurück
+
-
- {/* Profile Header */}
-
-
- {member.name}
- {member.betrieb}
+
+ {/* Hero */}
+
+
+ {member.name}
+ {member.betrieb}
{member.istAusbildungsbetrieb && (
-
-
- 🎓 Ausbildungsbetrieb
-
+
+
+ Ausbildungsbetrieb
)}
+
+
{/* Details */}
-
-
-
- {member.seit && (
-
- )}
+
+ {fields.map(([label, value], idx) => (
+
+ {label}
+ {value}
+
+ ))}
- {/* Contact Buttons */}
-
+ {/* Actions */}
+
{member.telefon && (
Linking.openURL(`tel:${member.telefon}`)}
- className="bg-brand-500 rounded-2xl py-4 flex-row items-center justify-center gap-2"
+ style={styles.btnPrimary}
+ activeOpacity={0.82}
>
- 📞
-
- Anrufen
-
+
+ Anrufen
)}
- Linking.openURL(
- `mailto:${member.email}?subject=InnungsApp%20Anfrage`
- )
- }
- className="bg-white border border-gray-200 rounded-2xl py-4 flex-row items-center justify-center gap-2"
+ onPress={() => Linking.openURL(`mailto:${member.email}`)}
+ style={styles.btnSecondary}
+ activeOpacity={0.8}
>
- ✉️
-
- E-Mail senden
-
+
+ E-Mail senden
-
-
)
}
-function InfoRow({ label, value }: { label: string; value: string }) {
- return (
-
- {label}
- {value}
-
- )
-}
+const styles = StyleSheet.create({
+ safeArea: {
+ flex: 1,
+ backgroundColor: '#F8FAFC',
+ },
+ loadingContainer: {
+ flex: 1,
+ backgroundColor: '#FFFFFF',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ navBar: {
+ backgroundColor: '#FFFFFF',
+ paddingHorizontal: 16,
+ paddingVertical: 12,
+ },
+ backBtn: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 2,
+ },
+ backText: {
+ fontSize: 14,
+ fontWeight: '600',
+ color: '#003B7E',
+ },
+ divider: {
+ height: 1,
+ backgroundColor: '#E2E8F0',
+ },
+ hero: {
+ backgroundColor: '#FFFFFF',
+ alignItems: 'center',
+ paddingVertical: 32,
+ paddingHorizontal: 24,
+ },
+ heroName: {
+ fontSize: 21,
+ fontWeight: '800',
+ color: '#0F172A',
+ letterSpacing: -0.4,
+ marginTop: 14,
+ textAlign: 'center',
+ },
+ heroCompany: {
+ fontSize: 14,
+ color: '#475569',
+ marginTop: 3,
+ textAlign: 'center',
+ },
+ ausbildungPill: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 5,
+ backgroundColor: '#F0FDF4',
+ paddingHorizontal: 12,
+ paddingVertical: 6,
+ borderRadius: 99,
+ marginTop: 10,
+ },
+ ausbildungText: {
+ fontSize: 12,
+ color: '#15803D',
+ fontWeight: '600',
+ },
+ card: {
+ backgroundColor: '#FFFFFF',
+ marginHorizontal: 16,
+ marginTop: 16,
+ borderRadius: 16,
+ overflow: 'hidden',
+ shadowColor: '#1C1917',
+ shadowOffset: { width: 0, height: 1 },
+ shadowOpacity: 0.05,
+ shadowRadius: 8,
+ elevation: 1,
+ },
+ fieldRow: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ paddingHorizontal: 16,
+ paddingVertical: 13,
+ },
+ fieldRowBorder: {
+ borderBottomWidth: 1,
+ borderBottomColor: '#F9F9F9',
+ },
+ fieldLabel: {
+ fontSize: 10,
+ fontWeight: '700',
+ color: '#64748B',
+ letterSpacing: 0.8,
+ width: 110,
+ },
+ fieldValue: {
+ flex: 1,
+ fontSize: 14,
+ fontWeight: '500',
+ color: '#0F172A',
+ },
+ actions: {
+ marginHorizontal: 16,
+ marginTop: 16,
+ marginBottom: 32,
+ gap: 10,
+ },
+ btnPrimary: {
+ backgroundColor: '#003B7E',
+ borderRadius: 14,
+ paddingVertical: 15,
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'center',
+ gap: 8,
+ shadowColor: '#003B7E',
+ shadowOffset: { width: 0, height: 4 },
+ shadowOpacity: 0.24,
+ shadowRadius: 10,
+ elevation: 5,
+ },
+ btnPrimaryText: {
+ color: '#FFFFFF',
+ fontSize: 15,
+ fontWeight: '600',
+ letterSpacing: 0.2,
+ },
+ btnSecondary: {
+ backgroundColor: '#FFFFFF',
+ borderRadius: 14,
+ paddingVertical: 15,
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'center',
+ gap: 8,
+ borderWidth: 1,
+ borderColor: '#E2E8F0',
+ },
+ btnSecondaryText: {
+ color: '#0F172A',
+ fontSize: 15,
+ fontWeight: '600',
+ },
+})
diff --git a/innungsapp/apps/mobile/app/(app)/members/index.tsx b/innungsapp/apps/mobile/app/(app)/members/index.tsx
index 0bbad1e..c1ae345 100644
--- a/innungsapp/apps/mobile/app/(app)/members/index.tsx
+++ b/innungsapp/apps/mobile/app/(app)/members/index.tsx
@@ -1,14 +1,10 @@
import {
- View,
- Text,
- FlatList,
- TextInput,
- TouchableOpacity,
- RefreshControl,
+ View, Text, FlatList, TextInput, TouchableOpacity, RefreshControl, StyleSheet,
} from 'react-native'
import { SafeAreaView } from 'react-native-safe-area-context'
import { useRouter } from 'expo-router'
-import { trpc } from '@/lib/trpc'
+import { Ionicons } from '@expo/vector-icons'
+import { useMembersList } from '@/hooks/useMembers'
import { useMembersFilterStore } from '@/store/members.store'
import { MemberCard } from '@/components/members/MemberCard'
import { EmptyState } from '@/components/ui/EmptyState'
@@ -20,78 +16,70 @@ export default function MembersScreen() {
const nurAusbildungsbetriebe = useMembersFilterStore((s) => s.nurAusbildungsbetriebe)
const setSearch = useMembersFilterStore((s) => s.setSearch)
const setNurAusbildungsbetriebe = useMembersFilterStore((s) => s.setNurAusbildungsbetriebe)
-
- const { data, isLoading, refetch, isRefetching } = trpc.members.list.useQuery({
- search: search || undefined,
- ausbildungsbetrieb: nurAusbildungsbetriebe || undefined,
- status: 'aktiv',
- })
+ const { data, isLoading, refetch, isRefetching } = useMembersList()
return (
-
+
{/* Header */}
-
- Mitglieder
+
+
+ Mitglieder
+ {data && (
+ {data.length} gesamt
+ )}
+
- {/* Search */}
-
- 🔍
+ {/* Search bar */}
+
+
- {/* Filter: Ausbildungsbetriebe */}
+ {/* Training filter */}
setNurAusbildungsbetriebe(!nurAusbildungsbetriebe)}
- className="flex-row items-center gap-2 py-1"
+ style={styles.toggleRow}
+ activeOpacity={0.7}
>
-
+
{nurAusbildungsbetriebe && (
- ✓
+
)}
- Nur Ausbildungsbetriebe
+ Nur Ausbildungsbetriebe
- {/* List */}
+
+
{isLoading ? (
) : (
item.id}
- contentContainerStyle={{ padding: 12, gap: 8 }}
+ contentContainerStyle={styles.list}
refreshControl={
-
+
}
renderItem={({ item }) => (
router.push(`/(app)/members/${item.id}`)}
+ onPress={() => router.push(`/(app)/members/${item.id}` as never)}
/>
)}
ListEmptyComponent={
}
/>
@@ -99,3 +87,81 @@ export default function MembersScreen() {
)
}
+
+const styles = StyleSheet.create({
+ safeArea: {
+ flex: 1,
+ backgroundColor: '#F8FAFC',
+ },
+ header: {
+ backgroundColor: '#FFFFFF',
+ paddingHorizontal: 20,
+ paddingTop: 18,
+ paddingBottom: 14,
+ },
+ titleRow: {
+ flexDirection: 'row',
+ alignItems: 'baseline',
+ justifyContent: 'space-between',
+ marginBottom: 14,
+ },
+ screenTitle: {
+ fontSize: 28,
+ fontWeight: '800',
+ color: '#0F172A',
+ letterSpacing: -0.5,
+ },
+ countText: {
+ fontSize: 13,
+ color: '#64748B',
+ fontWeight: '500',
+ },
+ searchBar: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ backgroundColor: '#F4F4F5',
+ borderRadius: 14,
+ paddingHorizontal: 12,
+ paddingVertical: 11,
+ gap: 8,
+ marginBottom: 10,
+ },
+ searchInput: {
+ flex: 1,
+ fontSize: 14,
+ color: '#0F172A',
+ },
+ toggleRow: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 8,
+ paddingTop: 2,
+ },
+ checkbox: {
+ width: 18,
+ height: 18,
+ borderRadius: 5,
+ borderWidth: 1.5,
+ borderColor: '#D4D4D8',
+ backgroundColor: '#FFFFFF',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ checkboxActive: {
+ backgroundColor: '#003B7E',
+ borderColor: '#003B7E',
+ },
+ toggleLabel: {
+ fontSize: 13,
+ color: '#52525B',
+ fontWeight: '500',
+ },
+ divider: {
+ height: 1,
+ backgroundColor: '#E2E8F0',
+ },
+ list: {
+ padding: 16,
+ gap: 10,
+ },
+})
diff --git a/innungsapp/apps/mobile/app/(app)/news/[id].tsx b/innungsapp/apps/mobile/app/(app)/news/[id].tsx
index 0d901db..819042c 100644
--- a/innungsapp/apps/mobile/app/(app)/news/[id].tsx
+++ b/innungsapp/apps/mobile/app/(app)/news/[id].tsx
@@ -1,87 +1,383 @@
import {
- View,
- Text,
- ScrollView,
- TouchableOpacity,
- ActivityIndicator,
+ View, Text, ScrollView, TouchableOpacity, ActivityIndicator,
+ StyleSheet, Platform,
} from 'react-native'
import { SafeAreaView } from 'react-native-safe-area-context'
import { useLocalSearchParams, useRouter } from 'expo-router'
import { useEffect } from 'react'
-import { trpc } from '@/lib/trpc'
-import { useNewsReadStore } from '@/store/news.store'
+import { Ionicons } from '@expo/vector-icons'
+import { useNewsDetail } from '@/hooks/useNews'
import { AttachmentRow } from '@/components/news/AttachmentRow'
import { Badge } from '@/components/ui/Badge'
-import { NEWS_KATEGORIE_LABELS } from '@innungsapp/shared'
+import { NEWS_KATEGORIE_LABELS } from '@innungsapp/shared/types'
import { format } from 'date-fns'
import { de } from 'date-fns/locale'
+// ---------------------------------------------------------------------------
+// Lightweight markdown renderer (headings, bold, bullets, paragraphs)
+// ---------------------------------------------------------------------------
+function MarkdownBody({ source }: { source: string }) {
+ const blocks = source.split(/\n\n+/)
+ return (
+
+ {blocks.map((block, i) => {
+ const trimmed = block.trim()
+ if (!trimmed) return null
+
+ // H2 ##
+ if (trimmed.startsWith('## ')) {
+ return (
+
+ {trimmed.slice(3)}
+
+ )
+ }
+ // H3 ###
+ if (trimmed.startsWith('### ')) {
+ return (
+
+ {trimmed.slice(4)}
+
+ )
+ }
+ // H1 #
+ if (trimmed.startsWith('# ')) {
+ return (
+
+ {trimmed.slice(2)}
+
+ )
+ }
+ // Bullet list
+ if (trimmed.startsWith('- ')) {
+ const items = trimmed.split('\n').filter(Boolean)
+ return (
+
+ {items.map((line, j) => {
+ const text = line.replace(/^-\s+/, '')
+ return (
+
+
+ {renderInline(text)}
+
+ )
+ })}
+
+ )
+ }
+ // Paragraph (with inline bold)
+ return (
+
+ {renderInline(trimmed)}
+
+ )
+ })}
+
+ )
+}
+
+/** Render **bold** inline within a Text node */
+function renderInline(text: string): React.ReactNode[] {
+ const parts = text.split(/(\*\*.*?\*\*)/)
+ return parts.map((part, i) => {
+ if (part.startsWith('**') && part.endsWith('**')) {
+ return (
+
+ {part.slice(2, -2)}
+
+ )
+ }
+ return {part}
+ })
+}
+
+// ---------------------------------------------------------------------------
+// Screen
+// ---------------------------------------------------------------------------
export default function NewsDetailScreen() {
const { id } = useLocalSearchParams<{ id: string }>()
const router = useRouter()
- const markRead = useNewsReadStore((s) => s.markRead)
- const markReadMutation = trpc.news.markRead.useMutation()
+ const { data: news, isLoading, onOpen } = useNewsDetail(id)
- const { data: news, isLoading } = trpc.news.byId.useQuery({ id })
-
- useEffect(() => {
- if (news) {
- markRead(id)
- markReadMutation.mutate({ newsId: id })
- }
- }, [news?.id])
+ useEffect(() => { if (news) onOpen() }, [news?.id])
if (isLoading) {
return (
-
-
+
+
)
}
-
if (!news) return null
+ const initials = (news.author?.name ?? 'I')
+ .split(' ')
+ .map((n) => n.charAt(0))
+ .slice(0, 2)
+ .join('')
+
return (
-
- {/* Header */}
-
- router.back()} className="mr-3">
- ← Zurück
+
+ {/* Nav bar */}
+
+ router.back()}
+ style={styles.backBtn}
+ activeOpacity={0.7}
+ >
+
+ Neuigkeiten
-
- {news.title}
-
-
-
+
+ {/* ── Hero header ────────────────────────────────────────── */}
+
+
-
- {news.title}
-
+ {news.title}
-
- {news.author?.name ?? 'InnungsApp'} ·{' '}
- {news.publishedAt
- ? format(new Date(news.publishedAt), 'dd. MMMM yyyy', { locale: de })
- : ''}
-
+ {/* Author + date row */}
+
+
+ {initials}
+
+
+ {news.author?.name ?? 'Innung'}
+ {news.publishedAt && (
+
+ {format(new Date(news.publishedAt), 'dd. MMMM yyyy', { locale: de })}
+
+ )}
+
+
+
- {/* Simple Markdown renderer — plain text for MVP */}
-
- {news.body.replace(/^#+\s/gm, '').replace(/\*\*(.*?)\*\*/g, '$1')}
-
+ {/* ── Separator ──────────────────────────────────────────── */}
+
- {/* Attachments */}
+ {/* ── Article body ───────────────────────────────────────── */}
+
+
+ {/* ── Attachments ────────────────────────────────────────── */}
{news.attachments.length > 0 && (
-
- Anhänge
- {news.attachments.map((a) => (
-
- ))}
+
+
+
+
+ ANHÄNGE ({news.attachments.length})
+
+
+
+ {news.attachments.map((a, idx) => (
+
+ {idx > 0 && }
+
+
+ ))}
+
)}
+
+ {/* Bottom spacer */}
+
)
}
+
+// ---------------------------------------------------------------------------
+// Styles
+// ---------------------------------------------------------------------------
+const styles = StyleSheet.create({
+ safeArea: {
+ flex: 1,
+ backgroundColor: '#FAFAFA',
+ },
+ loadingContainer: {
+ flex: 1,
+ backgroundColor: '#FAFAFA',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ // Nav
+ navBar: {
+ backgroundColor: '#FAFAFA',
+ paddingHorizontal: 16,
+ paddingVertical: 10,
+ borderBottomWidth: StyleSheet.hairlineWidth,
+ borderBottomColor: '#E2E8F0',
+ },
+ backBtn: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 2,
+ alignSelf: 'flex-start',
+ },
+ backText: {
+ fontSize: 15,
+ fontWeight: '600',
+ color: '#003B7E',
+ },
+ // Hero
+ hero: {
+ backgroundColor: '#FFFFFF',
+ paddingHorizontal: 20,
+ paddingTop: 22,
+ paddingBottom: 20,
+ gap: 12,
+ },
+ heroTitle: {
+ fontSize: 24,
+ fontWeight: '800',
+ color: '#0F172A',
+ letterSpacing: -0.5,
+ lineHeight: 32,
+ marginTop: 4,
+ },
+ metaRow: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 10,
+ marginTop: 4,
+ },
+ avatarCircle: {
+ width: 38,
+ height: 38,
+ borderRadius: 19,
+ backgroundColor: '#003B7E',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ avatarText: {
+ color: '#FFFFFF',
+ fontSize: 13,
+ fontWeight: '700',
+ letterSpacing: 0.5,
+ },
+ authorName: {
+ fontSize: 14,
+ fontWeight: '600',
+ color: '#0F172A',
+ lineHeight: 18,
+ },
+ dateText: {
+ fontSize: 12,
+ color: '#94A3B8',
+ marginTop: 1,
+ },
+ heroSeparator: {
+ height: 4,
+ backgroundColor: '#F1F5F9',
+ },
+ // Scroll
+ scrollContent: {
+ flexGrow: 1,
+ },
+ // Attachments
+ attachmentsSection: {
+ marginHorizontal: 20,
+ marginTop: 28,
+ },
+ attachmentsHeader: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 6,
+ marginBottom: 10,
+ },
+ attachmentsLabel: {
+ fontSize: 11,
+ fontWeight: '700',
+ color: '#64748B',
+ letterSpacing: 0.8,
+ },
+ attachmentsCard: {
+ backgroundColor: '#FFFFFF',
+ borderRadius: 16,
+ paddingHorizontal: 16,
+ overflow: 'hidden',
+ ...Platform.select({
+ ios: {
+ shadowColor: '#1C1917',
+ shadowOffset: { width: 0, height: 2 },
+ shadowOpacity: 0.06,
+ shadowRadius: 10,
+ },
+ android: { elevation: 2 },
+ }),
+ },
+ attachmentsDivider: {
+ height: StyleSheet.hairlineWidth,
+ backgroundColor: '#F1F5F9',
+ },
+})
+
+// Markdown styles
+const md = StyleSheet.create({
+ container: {
+ backgroundColor: '#FFFFFF',
+ paddingHorizontal: 20,
+ paddingTop: 22,
+ paddingBottom: 8,
+ gap: 14,
+ },
+ h1: {
+ fontSize: 22,
+ fontWeight: '800',
+ color: '#0F172A',
+ letterSpacing: -0.3,
+ lineHeight: 30,
+ },
+ h2: {
+ fontSize: 18,
+ fontWeight: '700',
+ color: '#0F172A',
+ letterSpacing: -0.2,
+ lineHeight: 26,
+ marginTop: 8,
+ paddingBottom: 6,
+ borderBottomWidth: 2,
+ borderBottomColor: '#EFF6FF',
+ },
+ h3: {
+ fontSize: 16,
+ fontWeight: '700',
+ color: '#1E293B',
+ lineHeight: 24,
+ marginTop: 4,
+ },
+ paragraph: {
+ fontSize: 16,
+ color: '#334155',
+ lineHeight: 28,
+ letterSpacing: 0.1,
+ },
+ list: {
+ gap: 8,
+ },
+ listItem: {
+ flexDirection: 'row',
+ alignItems: 'flex-start',
+ gap: 10,
+ },
+ bullet: {
+ width: 6,
+ height: 6,
+ borderRadius: 3,
+ backgroundColor: '#003B7E',
+ marginTop: 10,
+ flexShrink: 0,
+ },
+ listText: {
+ flex: 1,
+ fontSize: 16,
+ color: '#334155',
+ lineHeight: 28,
+ },
+})
diff --git a/innungsapp/apps/mobile/app/(app)/news/index.tsx b/innungsapp/apps/mobile/app/(app)/news/index.tsx
index 3271f70..d97517a 100644
--- a/innungsapp/apps/mobile/app/(app)/news/index.tsx
+++ b/innungsapp/apps/mobile/app/(app)/news/index.tsx
@@ -1,100 +1,157 @@
import {
- View,
- Text,
- FlatList,
- TouchableOpacity,
- RefreshControl,
- ScrollView,
+ View, Text, FlatList, TouchableOpacity, RefreshControl, ScrollView, StyleSheet,
} from 'react-native'
import { SafeAreaView } from 'react-native-safe-area-context'
import { useState } from 'react'
-import { trpc } from '@/lib/trpc'
import { useRouter } from 'expo-router'
+import { useNewsList } from '@/hooks/useNews'
import { NewsCard } from '@/components/news/NewsCard'
import { EmptyState } from '@/components/ui/EmptyState'
import { LoadingSpinner } from '@/components/ui/LoadingSpinner'
-import { NEWS_KATEGORIE_LABELS } from '@innungsapp/shared'
-const FILTER_OPTIONS = [
+const FILTERS = [
{ value: undefined, label: 'Alle' },
{ value: 'Wichtig', label: 'Wichtig' },
- { value: 'Pruefung', label: 'Prüfung' },
- { value: 'Foerderung', label: 'Förderung' },
+ { value: 'Pruefung', label: 'Pruefung' },
+ { value: 'Foerderung', label: 'Foerderung' },
{ value: 'Veranstaltung', label: 'Veranstaltung' },
]
export default function NewsScreen() {
const router = useRouter()
const [kategorie, setKategorie] = useState(undefined)
- const { data, isLoading, refetch, isRefetching } = trpc.news.list.useQuery({
- kategorie: kategorie as never,
- })
+ const { data, isLoading, refetch, isRefetching } = useNewsList(kategorie)
+
+ const unreadCount = data?.filter((n) => !n.isRead).length ?? 0
return (
-
- {/* Header */}
-
- News
+
+
+
+ Aktuelles
+ {unreadCount > 0 && (
+
+ {unreadCount} neu
+
+ )}
+
+
+
+ {FILTERS.map((opt) => {
+ const active = kategorie === opt.value
+ return (
+ setKategorie(opt.value)}
+ style={[styles.chip, active && styles.chipActive]}
+ activeOpacity={0.85}
+ >
+
+ {opt.label}
+
+
+ )
+ })}
+
- {/* Kategorie Filter */}
-
- {FILTER_OPTIONS.map((opt) => (
- setKategorie(opt.value)}
- className={`px-4 py-1.5 rounded-full border ${
- kategorie === opt.value
- ? 'bg-brand-500 border-brand-500'
- : 'bg-white border-gray-200'
- }`}
- >
-
- {opt.label}
-
-
- ))}
-
+
- {/* List */}
{isLoading ? (
) : (
item.id}
- contentContainerStyle={{ padding: 12, gap: 8 }}
+ contentContainerStyle={styles.list}
refreshControl={
-
+
}
renderItem={({ item }) => (
router.push(`/(app)/news/${item.id}`)}
+ onPress={() => router.push(`/(app)/news/${item.id}` as never)}
/>
)}
ListEmptyComponent={
-
+
}
/>
)}
)
}
+
+const styles = StyleSheet.create({
+ safeArea: {
+ flex: 1,
+ backgroundColor: '#F8FAFC',
+ },
+ header: {
+ backgroundColor: '#FFFFFF',
+ paddingHorizontal: 20,
+ paddingTop: 14,
+ paddingBottom: 0,
+ },
+ titleRow: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'space-between',
+ marginBottom: 14,
+ },
+ screenTitle: {
+ fontSize: 28,
+ fontWeight: '800',
+ color: '#0F172A',
+ letterSpacing: -0.5,
+ },
+ unreadBadge: {
+ backgroundColor: '#EFF6FF',
+ paddingHorizontal: 10,
+ paddingVertical: 4,
+ borderRadius: 99,
+ },
+ unreadBadgeText: {
+ color: '#003B7E',
+ fontSize: 12,
+ fontWeight: '700',
+ },
+ filterScroll: {
+ paddingBottom: 14,
+ gap: 8,
+ paddingRight: 20,
+ },
+ chip: {
+ paddingHorizontal: 14,
+ paddingVertical: 7,
+ borderRadius: 99,
+ borderWidth: 1,
+ borderColor: '#E2E8F0',
+ backgroundColor: '#FFFFFF',
+ },
+ chipActive: {
+ backgroundColor: '#003B7E',
+ borderColor: '#003B7E',
+ },
+ chipLabel: {
+ fontSize: 13,
+ fontWeight: '600',
+ color: '#64748B',
+ },
+ chipLabelActive: {
+ color: '#FFFFFF',
+ },
+ divider: {
+ height: 1,
+ backgroundColor: '#E2E8F0',
+ },
+ list: {
+ padding: 16,
+ gap: 10,
+ paddingBottom: 30,
+ },
+})
diff --git a/innungsapp/apps/mobile/app/(app)/profil/index.tsx b/innungsapp/apps/mobile/app/(app)/profil/index.tsx
index 5c2ab28..01e348d 100644
--- a/innungsapp/apps/mobile/app/(app)/profil/index.tsx
+++ b/innungsapp/apps/mobile/app/(app)/profil/index.tsx
@@ -1,97 +1,330 @@
-import {
- View,
- Text,
- ScrollView,
- TouchableOpacity,
- Linking,
- ActivityIndicator,
-} from 'react-native'
+import { View, Text, ScrollView, TouchableOpacity, Alert, StyleSheet } from 'react-native'
import { SafeAreaView } from 'react-native-safe-area-context'
-import { trpc } from '@/lib/trpc'
+import { Ionicons } from '@expo/vector-icons'
import { useAuth } from '@/hooks/useAuth'
-import { Avatar } from '@/components/ui/Avatar'
+import { MOCK_MEMBER_ME } from '@/lib/mock-data'
+
+type Item = {
+ label: string
+ icon: React.ComponentProps['name']
+ badge?: string
+}
+
+const MENU_ITEMS: Item[] = [
+ { label: 'Persoenliche Daten', icon: 'person-outline' },
+ { label: 'Betriebsdaten', icon: 'business-outline', badge: 'Aktiv' },
+ { label: 'Mitteilungen', icon: 'notifications-outline', badge: '2' },
+ { label: 'Sicherheit & Login', icon: 'shield-checkmark-outline' },
+ { label: 'Hilfe & Support', icon: 'help-circle-outline' },
+]
export default function ProfilScreen() {
const { signOut } = useAuth()
- const { data: member, isLoading } = trpc.members.me.useQuery()
+ const member = MOCK_MEMBER_ME
+
+ const initials = member.name
+ .split(' ')
+ .slice(0, 2)
+ .map((chunk) => chunk[0]?.toUpperCase() ?? '')
+ .join('')
+
+ const openPlaceholder = () => {
+ Alert.alert('Hinweis', 'Dieser Bereich folgt in einer naechsten Version.')
+ }
return (
-
-
- Mein Profil
-
-
-
- {isLoading ? (
-
-
+
+
+
+
+ {initials}
+
+
+
- ) : member ? (
- <>
- {/* Profile */}
-
-
- {member.name}
- {member.betrieb}
- {member.org.name}
+ {member.name}
+ Innungsgeschaeftsfuehrer
+
+
+ Admin-Status
-
- {/* Member Details */}
-
-
- {member.telefon && }
-
-
- {member.seit && }
+
+ Verifiziert
-
-
-
- Änderungen an Ihren Daten nehmen Sie über die Innungsgeschäftsstelle vor.
-
-
- >
- ) : null}
-
- {/* Links */}
-
- Linking.openURL('https://innungsapp.de/datenschutz')}
- className="flex-row items-center justify-between px-4 py-3.5 border-b border-gray-50"
- >
- Datenschutzerklärung
- ›
-
- Linking.openURL('https://innungsapp.de/impressum')}
- className="flex-row items-center justify-between px-4 py-3.5"
- >
- Impressum
- ›
-
+
- {/* Logout */}
-
-
- Abmelden
-
+ Mein Account
+
+ {MENU_ITEMS.map((item, index) => (
+
+
+
+
+
+ {item.label}
+
+
+ {item.badge ? (
+
+ {item.badge}
+
+ ) : null}
+
+
+
+ ))}
-
+ Unterstuetzung
+
+ Probleme oder Fragen?
+
+ Unser Support-Team hilft Ihnen gerne bei technischen Schwierigkeiten weiter.
+
+
+ Support kontaktieren
+
+
+
+
+ void signOut()}>
+
+ Abmelden
+
+
+ InnungsApp Version 2.4.0
)
}
-function InfoRow({ label, value }: { label: string; value: string }) {
- return (
-
- {label}
- {value}
-
- )
-}
+const styles = StyleSheet.create({
+ safeArea: {
+ flex: 1,
+ backgroundColor: '#F8FAFC',
+ },
+ content: {
+ paddingHorizontal: 18,
+ paddingBottom: 30,
+ gap: 14,
+ },
+ hero: {
+ backgroundColor: '#FFFFFF',
+ alignItems: 'center',
+ paddingTop: 24,
+ paddingBottom: 18,
+ borderRadius: 22,
+ borderWidth: 1,
+ borderColor: '#E2E8F0',
+ marginTop: 8,
+ },
+ avatarWrap: {
+ position: 'relative',
+ },
+ avatarText: {
+ width: 94,
+ height: 94,
+ borderRadius: 47,
+ backgroundColor: '#DBEAFE',
+ borderWidth: 4,
+ borderColor: '#FFFFFF',
+ overflow: 'hidden',
+ textAlign: 'center',
+ textAlignVertical: 'center',
+ color: '#003B7E',
+ fontSize: 34,
+ fontWeight: '800',
+ includeFontPadding: false,
+ },
+ settingsBtn: {
+ position: 'absolute',
+ right: 0,
+ bottom: 2,
+ width: 30,
+ height: 30,
+ borderRadius: 15,
+ backgroundColor: '#FFFFFF',
+ borderWidth: 1,
+ borderColor: '#E2E8F0',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ name: {
+ marginTop: 14,
+ fontSize: 24,
+ fontWeight: '800',
+ color: '#0F172A',
+ },
+ role: {
+ marginTop: 2,
+ fontSize: 12,
+ fontWeight: '700',
+ letterSpacing: 0.5,
+ color: '#64748B',
+ textTransform: 'uppercase',
+ },
+ badgesRow: {
+ marginTop: 10,
+ flexDirection: 'row',
+ gap: 8,
+ },
+ statusBadge: {
+ backgroundColor: '#DCFCE7',
+ borderRadius: 999,
+ paddingHorizontal: 10,
+ paddingVertical: 4,
+ },
+ statusBadgeText: {
+ color: '#166534',
+ fontSize: 11,
+ fontWeight: '700',
+ },
+ verifyBadge: {
+ backgroundColor: '#DBEAFE',
+ },
+ verifyBadgeText: {
+ color: '#1D4ED8',
+ },
+ sectionTitle: {
+ marginTop: 2,
+ paddingLeft: 2,
+ fontSize: 11,
+ textTransform: 'uppercase',
+ letterSpacing: 1.1,
+ color: '#94A3B8',
+ fontWeight: '800',
+ },
+ menuCard: {
+ backgroundColor: '#FFFFFF',
+ borderRadius: 18,
+ borderWidth: 1,
+ borderColor: '#E2E8F0',
+ overflow: 'hidden',
+ },
+ menuRow: {
+ paddingHorizontal: 14,
+ paddingVertical: 12,
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'space-between',
+ },
+ menuRowBorder: {
+ borderBottomWidth: 1,
+ borderBottomColor: '#F1F5F9',
+ },
+ menuLeft: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 12,
+ },
+ menuIcon: {
+ width: 36,
+ height: 36,
+ borderRadius: 11,
+ backgroundColor: '#F1F5F9',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ menuLabel: {
+ fontSize: 14,
+ fontWeight: '700',
+ color: '#1E293B',
+ },
+ menuRight: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 7,
+ },
+ rowBadge: {
+ paddingHorizontal: 8,
+ paddingVertical: 3,
+ borderRadius: 999,
+ },
+ rowBadgeActive: {
+ backgroundColor: '#DCFCE7',
+ },
+ rowBadgeAlert: {
+ backgroundColor: '#EF4444',
+ },
+ rowBadgeText: {
+ fontSize: 10,
+ fontWeight: '700',
+ color: '#FFFFFF',
+ },
+ supportCard: {
+ borderRadius: 18,
+ backgroundColor: '#003B7E',
+ padding: 16,
+ overflow: 'hidden',
+ position: 'relative',
+ },
+ supportTitle: {
+ color: '#FFFFFF',
+ fontSize: 18,
+ fontWeight: '800',
+ marginBottom: 4,
+ maxWidth: 180,
+ },
+ supportText: {
+ color: '#BFDBFE',
+ fontSize: 12,
+ lineHeight: 18,
+ marginBottom: 12,
+ maxWidth: 240,
+ },
+ supportBtn: {
+ alignSelf: 'flex-start',
+ backgroundColor: 'rgba(255,255,255,0.15)',
+ borderWidth: 1,
+ borderColor: 'rgba(255,255,255,0.25)',
+ borderRadius: 10,
+ paddingHorizontal: 12,
+ paddingVertical: 8,
+ },
+ supportBtnText: {
+ color: '#FFFFFF',
+ fontSize: 12,
+ fontWeight: '700',
+ textTransform: 'uppercase',
+ letterSpacing: 0.6,
+ },
+ supportIcon: {
+ position: 'absolute',
+ right: -10,
+ bottom: -12,
+ },
+ logoutBtn: {
+ marginTop: 4,
+ backgroundColor: '#FEF2F2',
+ borderRadius: 14,
+ borderWidth: 1,
+ borderColor: '#FECACA',
+ paddingVertical: 14,
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'center',
+ gap: 8,
+ },
+ logoutText: {
+ color: '#B91C1C',
+ fontSize: 14,
+ fontWeight: '800',
+ textTransform: 'uppercase',
+ letterSpacing: 0.8,
+ },
+ footer: {
+ textAlign: 'center',
+ marginTop: 4,
+ fontSize: 10,
+ fontWeight: '700',
+ letterSpacing: 1,
+ color: '#94A3B8',
+ textTransform: 'uppercase',
+ },
+})
diff --git a/innungsapp/apps/mobile/app/(app)/stellen/[id].tsx b/innungsapp/apps/mobile/app/(app)/stellen/[id].tsx
index 25df29b..2781155 100644
--- a/innungsapp/apps/mobile/app/(app)/stellen/[id].tsx
+++ b/innungsapp/apps/mobile/app/(app)/stellen/[id].tsx
@@ -1,94 +1,335 @@
import {
- View,
- Text,
- ScrollView,
- TouchableOpacity,
- Linking,
- ActivityIndicator,
+ View, Text, ScrollView, TouchableOpacity, Linking, ActivityIndicator, StyleSheet, Platform
} from 'react-native'
import { SafeAreaView } from 'react-native-safe-area-context'
-import { useLocalSearchParams, useRouter } from 'expo-router'
-import { trpc } from '@/lib/trpc'
+import { useLocalSearchParams, useRouter, Stack } from 'expo-router'
+import { Ionicons } from '@expo/vector-icons'
+import { useStelleDetail } from '@/hooks/useStellen'
+import { Button } from '@/components/ui/Button'
+
+const SPARTE_COLOR: Record = {
+ elektro: '#1D4ED8', sanitär: '#0E7490', it: '#7C3AED',
+ info: '#7C3AED', heizung: '#D97706', maler: '#059669',
+}
+function getSparteColor(sparte: string): string {
+ const lower = sparte.toLowerCase()
+ for (const [k, v] of Object.entries(SPARTE_COLOR)) {
+ if (lower.includes(k)) return v
+ }
+ return '#003B7E'
+}
export default function StelleDetailScreen() {
const { id } = useLocalSearchParams<{ id: string }>()
const router = useRouter()
- const { data: stelle, isLoading } = trpc.stellen.byId.useQuery({ id })
+ const { data: stelle, isLoading } = useStelleDetail(id)
if (isLoading) {
return (
-
-
-
+
+
+
)
}
-
if (!stelle) return null
- const betreffVorlage = `Bewerbung als Auszubildender bei ${stelle.member.betrieb}`
- const bewerbungsUrl = `mailto:${stelle.kontaktEmail}?subject=${encodeURIComponent(betreffVorlage)}`
+ const color = getSparteColor(stelle.sparte)
+ const initial = stelle.sparte.charAt(0).toUpperCase()
+ const bewerbungsUrl = `mailto:${stelle.kontaktEmail}?subject=${encodeURIComponent(`Bewerbung als Auszubildender bei ${stelle.member.betrieb}`)}`
return (
-
-
- router.back()} className="mr-3">
- ← Zurück
-
-
-
-
+ <>
+
+
{/* Header */}
-
-
- 🎓
-
- {stelle.member.betrieb}
- {stelle.member.ort}
- {stelle.org.name}
-
-
- {/* Details */}
-
-
-
- {stelle.lehrjahr && }
- {stelle.verguetung && }
-
-
- {stelle.beschreibung && (
-
- Über die Stelle
- {stelle.beschreibung}
-
- )}
-
- {/* CTA */}
-
- Linking.openURL(bewerbungsUrl)}
- className="bg-brand-500 rounded-2xl py-4 flex-row items-center justify-center gap-2"
- >
- ✉️
- Jetzt bewerben
+
+ router.back()} style={styles.backButton}>
+
+
+
+
+
- {stelle.kontaktName && (
-
- Ansprechperson: {stelle.kontaktName}
-
- )}
-
-
-
+
+
+ {/* Header Card */}
+
+
+ {initial}
+
+ Auszubildender {stelle.sparte}
+ {stelle.member.betrieb}
+
+
+
+
+ {stelle.member.ort} · {stelle.org.name}
+
+
+
+
+ {/* Key Facts */}
+ Eckdaten
+
+
+
+
+
+
+ Anzahl Stellen
+ {stelle.stellenAnz}
+
+
+
+ {stelle.lehrjahr && (
+
+
+
+
+
+ Lehrjahr
+ {stelle.lehrjahr}
+
+
+ )}
+
+ {stelle.verguetung && (
+
+
+
+
+
+ Vergütung
+ {stelle.verguetung}
+
+
+ )}
+
+
+ {/* Description */}
+ {stelle.beschreibung && (
+
+ Beschreibung
+ {stelle.beschreibung}
+
+ )}
+
+ {/* Contact */}
+ {stelle.kontaktName && (
+
+ Ansprechpartner
+
+
+ {stelle.kontaktName.charAt(0)}
+
+
+ {stelle.kontaktName}
+ Recruiting
+
+
+
+ )}
+
+
+
+ {/* Footer */}
+
+
+
+
+ >
)
}
-function DetailRow({ label, value }: { label: string; value: string }) {
- return (
-
- {label}
- {value}
-
- )
-}
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: '#F8FAFC',
+ },
+ loadingContainer: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ header: {
+ paddingHorizontal: 16,
+ paddingVertical: 12,
+ flexDirection: 'row',
+ alignItems: 'center',
+ backgroundColor: '#F8FAFC',
+ },
+ backButton: {
+ padding: 8,
+ borderRadius: 12,
+ backgroundColor: '#FFFFFF',
+ shadowColor: '#000',
+ shadowOffset: { width: 0, height: 1 },
+ shadowOpacity: 0.05,
+ shadowRadius: 2,
+ elevation: 1,
+ },
+ headerSpacer: {
+ flex: 1,
+ },
+ shareButton: {
+ padding: 8,
+ },
+ scrollContent: {
+ padding: 24,
+ paddingBottom: 40,
+ },
+ heroCard: {
+ alignItems: 'center',
+ marginBottom: 32,
+ },
+ logoBox: {
+ width: 80,
+ height: 80,
+ borderRadius: 24,
+ justifyContent: 'center',
+ alignItems: 'center',
+ marginBottom: 16,
+ },
+ logoText: {
+ fontSize: 32,
+ fontWeight: '800',
+ },
+ jobTitle: {
+ fontSize: 24,
+ fontWeight: '800',
+ color: '#0F172A',
+ textAlign: 'center',
+ marginBottom: 8,
+ letterSpacing: -0.5,
+ },
+ companyName: {
+ fontSize: 16,
+ fontWeight: '600',
+ color: '#64748B',
+ marginBottom: 16,
+ },
+ locationBadge: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ backgroundColor: '#F1F5F9',
+ paddingHorizontal: 12,
+ paddingVertical: 6,
+ borderRadius: 99,
+ gap: 6,
+ },
+ locationText: {
+ fontSize: 13,
+ color: '#475569',
+ fontWeight: '500',
+ },
+ sectionHeader: {
+ fontSize: 18,
+ fontWeight: '700',
+ color: '#0F172A',
+ marginBottom: 16,
+ },
+ factsContainer: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ gap: 12,
+ marginBottom: 32,
+ },
+ factItem: {
+ flex: 1,
+ minWidth: '45%',
+ backgroundColor: '#FFFFFF',
+ padding: 16,
+ borderRadius: 16,
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 12,
+ shadowColor: '#64748B',
+ shadowOffset: { width: 0, height: 2 },
+ shadowOpacity: 0.03,
+ shadowRadius: 8,
+ elevation: 1,
+ },
+ factIconBox: {
+ width: 36,
+ height: 36,
+ borderRadius: 10,
+ backgroundColor: '#EFF6FF',
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ factLabel: {
+ fontSize: 11,
+ color: '#94A3B8',
+ fontWeight: '600',
+ textTransform: 'uppercase',
+ marginBottom: 2,
+ },
+ factValue: {
+ fontSize: 14,
+ fontWeight: '700',
+ color: '#0F172A',
+ },
+ section: {
+ marginBottom: 32,
+ },
+ description: {
+ fontSize: 16,
+ lineHeight: 26,
+ color: '#334155',
+ },
+ contactBox: {
+ backgroundColor: '#FFFFFF',
+ padding: 20,
+ borderRadius: 20,
+ marginBottom: 32,
+ },
+ contactTitle: {
+ fontSize: 14,
+ fontWeight: '700',
+ color: '#94A3B8',
+ textTransform: 'uppercase',
+ marginBottom: 16,
+ letterSpacing: 0.5,
+ },
+ contactRow: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 12,
+ },
+ avatarPlaceholder: {
+ width: 48,
+ height: 48,
+ borderRadius: 24,
+ backgroundColor: '#F1F5F9',
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ avatarInitials: {
+ fontSize: 18,
+ fontWeight: '700',
+ color: '#64748B',
+ },
+ contactName: {
+ fontSize: 16,
+ fontWeight: '700',
+ color: '#0F172A',
+ },
+ contactRole: {
+ fontSize: 13,
+ color: '#64748B',
+ },
+ footer: {
+ position: 'absolute',
+ bottom: 0,
+ left: 0,
+ right: 0,
+ backgroundColor: '#FFFFFF',
+ padding: 20,
+ paddingBottom: Platform.OS === 'ios' ? 32 : 20,
+ borderTopWidth: 1,
+ borderTopColor: '#F1F5F9',
+ },
+})
diff --git a/innungsapp/apps/mobile/app/(app)/stellen/index.tsx b/innungsapp/apps/mobile/app/(app)/stellen/index.tsx
index 3f1bf21..8aa4cd6 100644
--- a/innungsapp/apps/mobile/app/(app)/stellen/index.tsx
+++ b/innungsapp/apps/mobile/app/(app)/stellen/index.tsx
@@ -1,70 +1,60 @@
-import {
- View,
- Text,
- FlatList,
- TouchableOpacity,
- RefreshControl,
-} from 'react-native'
+import { View, Text, FlatList, RefreshControl, StyleSheet } from 'react-native'
import { SafeAreaView } from 'react-native-safe-area-context'
import { useRouter } from 'expo-router'
-import { trpc } from '@/lib/trpc'
+import { useStellenListe } from '@/hooks/useStellen'
import { StelleCard } from '@/components/stellen/StelleCard'
import { EmptyState } from '@/components/ui/EmptyState'
import { LoadingSpinner } from '@/components/ui/LoadingSpinner'
-import { useAuth } from '@/hooks/useAuth'
export default function StellenScreen() {
const router = useRouter()
- const { isAuthenticated } = useAuth()
- const { data, isLoading, refetch, isRefetching } = trpc.stellen.listPublic.useQuery({})
+ const { data, isLoading, refetch, isRefetching } = useStellenListe()
+
+ const totalStellen = data?.reduce((sum, s) => sum + s.stellenAnz, 0) ?? 0
return (
-
+
{/* Header */}
-
-
-
- Lehrlingsbörse
-
- {data?.length ?? 0} Angebote
-
+
+
+
+ Lehrlingsbörse
+ Ausbildungsplätze in deiner Innung
- {isAuthenticated && (
- router.push('/(app)/stellen/neu')}
- className="bg-brand-500 px-4 py-2 rounded-xl"
- >
- + Stelle anbieten
-
+
+ {/* Counter */}
+ {totalStellen > 0 && (
+
+ {totalStellen}
+ Stellen
+
)}
+
+
{isLoading ? (
) : (
item.id}
- contentContainerStyle={{ padding: 12, gap: 8 }}
+ contentContainerStyle={styles.list}
refreshControl={
-
+
}
renderItem={({ item }) => (
router.push(`/(app)/stellen/${item.id}`)}
+ onPress={() => router.push(`/(app)/stellen/${item.id}` as never)}
/>
)}
ListEmptyComponent={
}
/>
@@ -72,3 +62,69 @@ export default function StellenScreen() {
)
}
+
+const styles = StyleSheet.create({
+ safeArea: {
+ flex: 1,
+ backgroundColor: '#F8FAFC',
+ },
+ header: {
+ backgroundColor: '#FFFFFF',
+ paddingHorizontal: 20,
+ paddingTop: 18,
+ paddingBottom: 16,
+ },
+ titleRow: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'space-between',
+ },
+ titleBlock: {
+ flex: 1,
+ },
+ screenTitle: {
+ fontSize: 26,
+ fontWeight: '800',
+ color: '#0F172A',
+ letterSpacing: -0.5,
+ },
+ subtitle: {
+ fontSize: 13,
+ color: '#64748B',
+ marginTop: 2,
+ },
+ counter: {
+ backgroundColor: '#003B7E',
+ borderRadius: 14,
+ paddingHorizontal: 14,
+ paddingVertical: 8,
+ alignItems: 'center',
+ minWidth: 56,
+ shadowColor: '#003B7E',
+ shadowOffset: { width: 0, height: 3 },
+ shadowOpacity: 0.25,
+ shadowRadius: 8,
+ elevation: 4,
+ },
+ counterNumber: {
+ color: '#FFFFFF',
+ fontSize: 22,
+ fontWeight: '800',
+ lineHeight: 24,
+ },
+ counterLabel: {
+ color: 'rgba(255,255,255,0.75)',
+ fontSize: 9,
+ fontWeight: '600',
+ letterSpacing: 0.5,
+ },
+ divider: {
+ height: 1,
+ backgroundColor: '#E2E8F0',
+ },
+ list: {
+ padding: 16,
+ gap: 10,
+ },
+})
+
diff --git a/innungsapp/apps/mobile/app/(app)/termine/[id].tsx b/innungsapp/apps/mobile/app/(app)/termine/[id].tsx
index 6308c40..1923f66 100644
--- a/innungsapp/apps/mobile/app/(app)/termine/[id].tsx
+++ b/innungsapp/apps/mobile/app/(app)/termine/[id].tsx
@@ -1,152 +1,379 @@
import {
- View,
- Text,
- ScrollView,
- TouchableOpacity,
- Linking,
- ActivityIndicator,
- Alert,
+ View, Text, ScrollView, TouchableOpacity, Linking, ActivityIndicator, Alert, StyleSheet, Platform,
} from 'react-native'
import { SafeAreaView } from 'react-native-safe-area-context'
-import { useLocalSearchParams, useRouter } from 'expo-router'
-import { trpc } from '@/lib/trpc'
+import { useLocalSearchParams, useRouter, Stack } from 'expo-router'
+import { Ionicons } from '@expo/vector-icons'
+import { useTerminDetail, useToggleAnmeldung } from '@/hooks/useTermine'
import { AnmeldeButton } from '@/components/termine/AnmeldeButton'
import { Badge } from '@/components/ui/Badge'
-import { TERMIN_TYP_LABELS } from '@innungsapp/shared'
+import { TERMIN_TYP_LABELS } from '@innungsapp/shared/types'
import { format } from 'date-fns'
import { de } from 'date-fns/locale'
-import * as Calendar from 'expo-calendar'
export default function TerminDetailScreen() {
const { id } = useLocalSearchParams<{ id: string }>()
const router = useRouter()
- const { data: termin, isLoading } = trpc.termine.byId.useQuery({ id })
- const toggleMutation = trpc.termine.toggleAnmeldung.useMutation({
- onSuccess: () => {
- // Invalidate queries
- },
- })
-
- async function addToCalendar() {
- if (!termin) return
- const { status } = await Calendar.requestCalendarPermissionsAsync()
- if (status !== 'granted') {
- Alert.alert('Keine Berechtigung', 'Bitte erlauben Sie den Kalender-Zugriff in den Einstellungen.')
- return
- }
-
- const calendars = await Calendar.getCalendarsAsync(Calendar.EntityTypes.EVENT)
- const defaultCal = calendars.find((c) => c.isPrimary) ?? calendars[0]
-
- if (!defaultCal) {
- Alert.alert('Kein Kalender', 'Es wurde kein Kalender gefunden.')
- return
- }
-
- const startDate = new Date(termin.datum)
- if (termin.uhrzeit) {
- const [h, m] = termin.uhrzeit.split(':').map(Number)
- startDate.setHours(h, m)
- }
-
- await Calendar.createEventAsync(defaultCal.id, {
- title: termin.titel,
- startDate,
- endDate: startDate,
- location: termin.adresse ?? termin.ort ?? undefined,
- notes: termin.beschreibung ?? undefined,
- })
-
- Alert.alert('Termin gespeichert', 'Der Termin wurde in Ihren Kalender eingetragen.')
- }
+ const { data: termin, isLoading } = useTerminDetail(id)
+ const { mutate, isPending } = useToggleAnmeldung()
if (isLoading) {
return (
-
-
-
+
+
+
)
}
-
if (!termin) return null
- const datumFormatted = format(new Date(termin.datum), 'EEEE, dd. MMMM yyyy', { locale: de })
+ const datum = new Date(termin.datum)
+ const isPast = datum < new Date()
return (
-
-
- router.back()} className="mr-3">
- ← Zurück
-
-
-
-
-
-
- {termin.titel}
- {datumFormatted}
- {termin.uhrzeit && (
-
- {termin.uhrzeit}{termin.endeUhrzeit ? ` – ${termin.endeUhrzeit}` : ''} Uhr
-
- )}
-
-
-
- {termin.ort && (
-
- termin.adresse &&
- Linking.openURL(
- `https://maps.google.com/?q=${encodeURIComponent(termin.adresse)}`
- )
- }
- className="flex-row items-center px-4 py-3 border-b border-gray-50"
- >
- 📍
-
- {termin.ort}
- {termin.adresse && (
- {termin.adresse}
- )}
-
-
- )}
-
- 👥
-
- {termin.teilnehmerAnzahl} Anmeldungen
- {termin.maxTeilnehmer ? ` / ${termin.maxTeilnehmer} Plätze` : ''}
-
-
-
-
- {termin.beschreibung && (
-
- Beschreibung
- {termin.beschreibung}
-
- )}
-
- {/* Actions */}
-
- toggleMutation.mutate({ terminId: id })}
- isLoading={toggleMutation.isPending}
- />
-
- 📅
- Zum Kalender hinzufügen
+ <>
+
+
+ {/* Header */}
+
+ router.back()} style={styles.backButton}>
+
+
+
+
+
-
-
-
+
+ {/* Date Badge */}
+
+
+
+
+
+ {format(datum, 'EEEE, d. MMMM yyyy', { locale: de })}
+
+
+
+ {termin.titel}
+
+
+
+ {termin.isAngemeldet && (
+
+
+ Angemeldet
+
+ )}
+
+
+ {/* Info Card */}
+
+ {/* Time */}
+ {termin.uhrzeit && (
+
+
+
+
+
+ Uhrzeit
+
+ {termin.uhrzeit}
+ {termin.endeUhrzeit ? ` – ${termin.endeUhrzeit}` : ''} Uhr
+
+
+
+ )}
+
+ {termin.uhrzeit && termin.ort && }
+
+ {/* Location */}
+ {termin.ort && (
+
+ termin.adresse &&
+ Linking.openURL(`https://maps.google.com/?q=${encodeURIComponent(termin.adresse)}`)
+ }
+ activeOpacity={termin.adresse ? 0.7 : 1}
+ >
+
+
+
+
+ Ort
+ {termin.ort}
+ {termin.adresse && (
+ {termin.adresse}
+ )}
+
+ {termin.adresse && (
+
+ )}
+
+ )}
+
+ {(termin.uhrzeit || termin.ort) && (termin.teilnehmerAnzahl !== undefined) && }
+
+ {/* Participants */}
+
+
+
+
+
+ Teilnehmer
+
+ {termin.teilnehmerAnzahl} Anmeldungen
+
+ {termin.maxTeilnehmer && (
+ {termin.maxTeilnehmer} Plätze verfügbar
+ )}
+
+
+
+
+ {/* Description */}
+ {termin.beschreibung && (
+
+ Beschreibung
+ {termin.beschreibung}
+
+ )}
+
+
+
+ {/* Bottom Action Bar – only for upcoming events */}
+ {isPast ? (
+
+
+ Vergangener Termin – keine Anmeldung möglich
+
+ ) : (
+
+
+ mutate({ terminId: id })}
+ isLoading={isPending}
+ />
+
+ Alert.alert('Kalender', 'Funktion folgt in Kürze')}
+ >
+
+
+
+ )}
+
+
+ >
)
}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ backgroundColor: '#F8FAFC',
+ },
+ loadingContainer: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ header: {
+ paddingHorizontal: 16,
+ paddingVertical: 12,
+ flexDirection: 'row',
+ alignItems: 'center',
+ backgroundColor: '#F8FAFC',
+ },
+ backButton: {
+ padding: 8,
+ borderRadius: 12,
+ backgroundColor: '#FFFFFF',
+ shadowColor: '#000',
+ shadowOffset: { width: 0, height: 1 },
+ shadowOpacity: 0.05,
+ shadowRadius: 2,
+ elevation: 1,
+ },
+ headerSpacer: {
+ flex: 1,
+ },
+ shareButton: {
+ padding: 8,
+ },
+ scrollContent: {
+ padding: 24,
+ paddingBottom: 100,
+ },
+ dateline: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ marginBottom: 12,
+ gap: 8,
+ },
+ calendarIcon: {
+ width: 32,
+ height: 32,
+ borderRadius: 8,
+ backgroundColor: '#EFF6FF',
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ dateText: {
+ fontSize: 15,
+ fontWeight: '600',
+ color: '#003B7E',
+ },
+ title: {
+ fontSize: 28,
+ fontWeight: '800',
+ color: '#0F172A',
+ lineHeight: 34,
+ marginBottom: 16,
+ letterSpacing: -0.5,
+ },
+ badgesRow: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 12,
+ marginBottom: 32,
+ },
+ registeredBadge: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 6,
+ paddingHorizontal: 10,
+ paddingVertical: 4,
+ backgroundColor: '#ECFDF5',
+ borderRadius: 6,
+ borderWidth: 1,
+ borderColor: '#A7F3D0',
+ },
+ registeredText: {
+ fontSize: 12,
+ fontWeight: '600',
+ color: '#047857',
+ },
+ card: {
+ backgroundColor: '#FFFFFF',
+ borderRadius: 20,
+ padding: 20,
+ shadowColor: '#64748B',
+ shadowOffset: { width: 0, height: 4 },
+ shadowOpacity: 0.04,
+ shadowRadius: 12,
+ elevation: 2,
+ marginBottom: 32,
+ },
+ infoRow: {
+ flexDirection: 'row',
+ alignItems: 'flex-start',
+ gap: 16,
+ },
+ iconBox: {
+ width: 40,
+ height: 40,
+ borderRadius: 10,
+ backgroundColor: '#F1F5F9',
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+ infoContent: {
+ flex: 1,
+ paddingTop: 2,
+ },
+ infoLabel: {
+ fontSize: 12,
+ fontWeight: '600',
+ color: '#94A3B8',
+ marginBottom: 2,
+ textTransform: 'uppercase',
+ letterSpacing: 0.5,
+ },
+ infoValue: {
+ fontSize: 16,
+ fontWeight: '600',
+ color: '#0F172A',
+ lineHeight: 22,
+ },
+ infoSub: {
+ fontSize: 14,
+ color: '#64748B',
+ marginTop: 2,
+ lineHeight: 20,
+ },
+ divider: {
+ height: 1,
+ backgroundColor: '#F1F5F9',
+ marginVertical: 16,
+ marginLeft: 56,
+ },
+ section: {
+ marginBottom: 24,
+ },
+ sectionTitle: {
+ fontSize: 18,
+ fontWeight: '700',
+ color: '#0F172A',
+ marginBottom: 12,
+ },
+ description: {
+ fontSize: 16,
+ lineHeight: 26,
+ color: '#334155',
+ },
+ actionBar: {
+ position: 'absolute',
+ bottom: 0,
+ left: 0,
+ right: 0,
+ backgroundColor: '#FFFFFF',
+ paddingHorizontal: 20,
+ paddingVertical: 16,
+ paddingBottom: Platform.OS === 'ios' ? 32 : 16,
+ flexDirection: 'row',
+ gap: 12,
+ borderTopWidth: 1,
+ borderTopColor: '#F1F5F9',
+ shadowColor: '#000',
+ shadowOffset: { width: 0, height: -4 },
+ shadowOpacity: 0.02,
+ shadowRadius: 8,
+ elevation: 4,
+ },
+ pastBar: {
+ position: 'absolute',
+ bottom: 0,
+ left: 0,
+ right: 0,
+ backgroundColor: '#F8FAFC',
+ paddingHorizontal: 20,
+ paddingVertical: 14,
+ paddingBottom: Platform.OS === 'ios' ? 28 : 14,
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 8,
+ borderTopWidth: 1,
+ borderTopColor: '#E2E8F0',
+ },
+ pastBarText: {
+ fontSize: 13,
+ color: '#94A3B8',
+ fontWeight: '500',
+ },
+ actionButtonContainer: {
+ flex: 1,
+ },
+ calendarButton: {
+ width: 52,
+ height: 52,
+ borderRadius: 14,
+ backgroundColor: '#F1F5F9',
+ justifyContent: 'center',
+ alignItems: 'center',
+ },
+})
diff --git a/innungsapp/apps/mobile/app/(app)/termine/index.tsx b/innungsapp/apps/mobile/app/(app)/termine/index.tsx
index 25f31f9..913f8f6 100644
--- a/innungsapp/apps/mobile/app/(app)/termine/index.tsx
+++ b/innungsapp/apps/mobile/app/(app)/termine/index.tsx
@@ -1,78 +1,78 @@
import {
- View,
- Text,
- FlatList,
- TouchableOpacity,
- RefreshControl,
+ View, Text, FlatList, TouchableOpacity, RefreshControl, StyleSheet,
} from 'react-native'
import { SafeAreaView } from 'react-native-safe-area-context'
import { useState } from 'react'
import { useRouter } from 'expo-router'
-import { trpc } from '@/lib/trpc'
+import { useTermineListe, useToggleAnmeldung } from '@/hooks/useTermine'
import { TerminCard } from '@/components/termine/TerminCard'
import { EmptyState } from '@/components/ui/EmptyState'
import { LoadingSpinner } from '@/components/ui/LoadingSpinner'
+type Tab = 'kommend' | 'vergangen'
+
export default function TermineScreen() {
const router = useRouter()
- const [tab, setTab] = useState<'kommend' | 'vergangen'>('kommend')
-
- const { data, isLoading, refetch, isRefetching } = trpc.termine.list.useQuery({
- upcoming: tab === 'kommend',
- })
+ const [tab, setTab] = useState('kommend')
+ const { data, isLoading, refetch, isRefetching } = useTermineListe(tab === 'kommend')
+ const { mutate, isPending } = useToggleAnmeldung()
return (
-
+
{/* Header */}
-
- Termine
- {/* Tabs */}
-
- {(['kommend', 'vergangen'] as const).map((t) => (
- setTab(t)}
- className={`flex-1 py-2 rounded-lg items-center ${
- tab === t ? 'bg-white shadow-sm' : ''
- }`}
- >
-
+ Termine
+
+ {/* Segment control */}
+
+ {(['kommend', 'vergangen'] as Tab[]).map((t) => {
+ const active = tab === t
+ return (
+ setTab(t)}
+ style={[styles.segment, active && styles.segmentActive]}
+ activeOpacity={0.8}
>
- {t === 'kommend' ? 'Bevorstehend' : 'Vergangen'}
-
-
- ))}
+
+ {t === 'kommend' ? 'Bevorstehend' : 'Vergangen'}
+
+
+ )
+ })}
+
+
{isLoading ? (
) : (
item.id}
- contentContainerStyle={{ padding: 12, gap: 8 }}
+ contentContainerStyle={styles.list}
refreshControl={
-
+
}
renderItem={({ item }) => (
router.push(`/(app)/termine/${item.id}`)}
+ isPast={tab === 'vergangen'}
+ onPress={() => router.push(`/(app)/termine/${item.id}` as never)}
+ onToggleAnmeldung={() => mutate({ terminId: item.id })}
+ isToggling={isPending}
/>
)}
ListEmptyComponent={
}
/>
@@ -80,3 +80,61 @@ export default function TermineScreen() {
)
}
+
+const styles = StyleSheet.create({
+ safeArea: {
+ flex: 1,
+ backgroundColor: '#F8FAFC',
+ },
+ header: {
+ backgroundColor: '#FFFFFF',
+ paddingHorizontal: 20,
+ paddingTop: 18,
+ paddingBottom: 14,
+ },
+ screenTitle: {
+ fontSize: 28,
+ fontWeight: '800',
+ color: '#0F172A',
+ letterSpacing: -0.5,
+ marginBottom: 14,
+ },
+ segmentContainer: {
+ flexDirection: 'row',
+ backgroundColor: '#F4F4F5',
+ borderRadius: 14,
+ padding: 3,
+ gap: 3,
+ },
+ segment: {
+ flex: 1,
+ paddingVertical: 9,
+ borderRadius: 11,
+ alignItems: 'center',
+ },
+ segmentActive: {
+ backgroundColor: '#FFFFFF',
+ shadowColor: '#000',
+ shadowOffset: { width: 0, height: 1 },
+ shadowOpacity: 0.08,
+ shadowRadius: 4,
+ elevation: 2,
+ },
+ segmentLabel: {
+ fontSize: 13,
+ fontWeight: '500',
+ color: '#64748B',
+ },
+ segmentLabelActive: {
+ color: '#0F172A',
+ fontWeight: '600',
+ },
+ divider: {
+ height: 1,
+ backgroundColor: '#E2E8F0',
+ },
+ list: {
+ padding: 16,
+ gap: 10,
+ },
+})
diff --git a/innungsapp/apps/mobile/app/(auth)/check-email.tsx b/innungsapp/apps/mobile/app/(auth)/check-email.tsx
index 8834b82..b307e1b 100644
--- a/innungsapp/apps/mobile/app/(auth)/check-email.tsx
+++ b/innungsapp/apps/mobile/app/(auth)/check-email.tsx
@@ -1,44 +1,106 @@
-import { View, Text, TouchableOpacity } from 'react-native'
+import { View, Text, TouchableOpacity, StyleSheet } from 'react-native'
import { useRouter, useLocalSearchParams } from 'expo-router'
import { SafeAreaView } from 'react-native-safe-area-context'
+import { Ionicons } from '@expo/vector-icons'
export default function CheckEmailScreen() {
const router = useRouter()
const { email } = useLocalSearchParams<{ email: string }>()
return (
-
-
- {/* Envelope Illustration */}
-
- 📧
+
+
+
+
-
- Schau in dein Postfach
-
-
- Wir haben einen Login-Link an
-
-
- {email}
-
-
- Klicken Sie auf den Link in der E-Mail, um sich einzuloggen.
- Der Link ist 24 Stunden gültig.
+ E-Mail pruefen
+ Wir haben einen Login-Link gesendet an:
+
+
+ {email}
+
+
+
+ Bitte oeffnen Sie den Link in Ihrer E-Mail, um sich anzumelden.
-
- router.back()}
- className="py-3 items-center"
- >
-
- ← Andere E-Mail verwenden
-
-
-
+ router.back()}
+ style={styles.backBtn}
+ activeOpacity={0.8}
+ >
+
+ Andere E-Mail verwenden
+
)
}
+
+const styles = StyleSheet.create({
+ safeArea: {
+ flex: 1,
+ backgroundColor: '#FFFFFF',
+ },
+ content: {
+ flex: 1,
+ justifyContent: 'center',
+ alignItems: 'center',
+ paddingHorizontal: 28,
+ },
+ iconBox: {
+ width: 88,
+ height: 88,
+ backgroundColor: '#DCFCE7',
+ borderRadius: 44,
+ alignItems: 'center',
+ justifyContent: 'center',
+ marginBottom: 24,
+ },
+ title: {
+ fontSize: 24,
+ fontWeight: '800',
+ color: '#0F172A',
+ textAlign: 'center',
+ marginBottom: 10,
+ },
+ body: {
+ fontSize: 14,
+ color: '#64748B',
+ textAlign: 'center',
+ marginBottom: 6,
+ },
+ emailBox: {
+ backgroundColor: '#F8FAFC',
+ borderWidth: 1,
+ borderColor: '#E2E8F0',
+ borderRadius: 14,
+ paddingHorizontal: 16,
+ paddingVertical: 10,
+ marginBottom: 16,
+ },
+ emailText: {
+ fontSize: 15,
+ fontWeight: '700',
+ color: '#0F172A',
+ },
+ hint: {
+ fontSize: 13,
+ color: '#64748B',
+ textAlign: 'center',
+ lineHeight: 19,
+ paddingHorizontal: 8,
+ },
+ backBtn: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 4,
+ marginTop: 28,
+ },
+ backText: {
+ fontSize: 14,
+ fontWeight: '700',
+ color: '#003B7E',
+ },
+})
diff --git a/innungsapp/apps/mobile/app/(auth)/login.tsx b/innungsapp/apps/mobile/app/(auth)/login.tsx
index dbbd6db..741acec 100644
--- a/innungsapp/apps/mobile/app/(auth)/login.tsx
+++ b/innungsapp/apps/mobile/app/(auth)/login.tsx
@@ -1,16 +1,12 @@
import {
- View,
- Text,
- TextInput,
- TouchableOpacity,
- KeyboardAvoidingView,
- Platform,
- ActivityIndicator,
+ View, Text, TextInput, TouchableOpacity,
+ KeyboardAvoidingView, Platform, ActivityIndicator, StyleSheet,
} from 'react-native'
import { useState } from 'react'
import { useRouter } from 'expo-router'
-import { authClient } from '@/lib/auth-client'
import { SafeAreaView } from 'react-native-safe-area-context'
+import { Ionicons } from '@expo/vector-icons'
+import { authClient } from '@/lib/auth-client'
export default function LoginScreen() {
const router = useRouter()
@@ -18,16 +14,16 @@ export default function LoginScreen() {
const [loading, setLoading] = useState(false)
const [error, setError] = useState('')
+ const canSubmit = email.trim().length > 0 && !loading
+
async function handleSendLink() {
if (!email.trim()) return
setLoading(true)
setError('')
-
const result = await authClient.signIn.magicLink({
email: email.trim().toLowerCase(),
- callbackURL: '/news',
+ callbackURL: '/home',
})
-
setLoading(false)
if (result.error) {
setError(result.error.message ?? 'Ein Fehler ist aufgetreten.')
@@ -37,33 +33,28 @@ export default function LoginScreen() {
}
return (
-
+
-
- {/* Logo */}
-
-
- I
+
+
+
+ I
- InnungsApp
-
- Die digitale Plattform Ihrer Innung
-
+ InnungsApp
+ Ihre Kreishandwerkerschaft digital
- {/* Form */}
-
-
-
- E-Mail-Adresse
-
+
+ Email-Adresse
+
+
{error ? (
-
- {error}
+
+ {error}
) : null}
{loading ? (
-
+
) : (
-
- Magic Link senden
-
+
+ Login-Link senden
+
+
)}
-
-
- Kein Passwort nötig — Zugang nur per Admin-Einladung
-
+
+
+ Noch kein Zugang? Kontaktieren Sie Ihre Innungsgeschaeftsstelle.
+
)
}
+
+const styles = StyleSheet.create({
+ safeArea: {
+ flex: 1,
+ backgroundColor: '#FFFFFF',
+ },
+ keyboardView: {
+ flex: 1,
+ },
+ content: {
+ flex: 1,
+ justifyContent: 'center',
+ paddingHorizontal: 24,
+ },
+ logoSection: {
+ alignItems: 'center',
+ marginBottom: 40,
+ },
+ logoBox: {
+ width: 64,
+ height: 64,
+ backgroundColor: '#003B7E',
+ borderRadius: 18,
+ alignItems: 'center',
+ justifyContent: 'center',
+ marginBottom: 16,
+ },
+ logoLetter: {
+ color: '#FFFFFF',
+ fontSize: 30,
+ fontWeight: '900',
+ },
+ appName: {
+ fontSize: 30,
+ fontWeight: '800',
+ color: '#0F172A',
+ letterSpacing: -0.6,
+ marginBottom: 4,
+ },
+ tagline: {
+ fontSize: 14,
+ color: '#64748B',
+ textAlign: 'center',
+ },
+ form: {
+ gap: 12,
+ },
+ inputLabel: {
+ fontSize: 14,
+ fontWeight: '700',
+ color: '#334155',
+ },
+ inputWrap: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ backgroundColor: '#F8FAFC',
+ borderRadius: 14,
+ borderWidth: 1,
+ borderColor: '#E2E8F0',
+ paddingHorizontal: 12,
+ gap: 8,
+ },
+ input: {
+ flex: 1,
+ paddingVertical: 13,
+ color: '#0F172A',
+ fontSize: 15,
+ },
+ errorBox: {
+ backgroundColor: '#FEF2F2',
+ borderWidth: 1,
+ borderColor: '#FECACA',
+ borderRadius: 12,
+ paddingHorizontal: 14,
+ paddingVertical: 10,
+ },
+ errorText: {
+ color: '#B91C1C',
+ fontSize: 13,
+ },
+ submitBtn: {
+ backgroundColor: '#003B7E',
+ borderRadius: 14,
+ paddingVertical: 14,
+ alignItems: 'center',
+ marginTop: 4,
+ },
+ submitBtnDisabled: {
+ backgroundColor: '#CBD5E1',
+ },
+ submitContent: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 6,
+ },
+ submitLabel: {
+ color: '#FFFFFF',
+ fontWeight: '700',
+ fontSize: 15,
+ },
+ hint: {
+ marginTop: 24,
+ textAlign: 'center',
+ color: '#64748B',
+ fontSize: 13,
+ lineHeight: 18,
+ },
+})
diff --git a/innungsapp/apps/mobile/app/_layout.tsx b/innungsapp/apps/mobile/app/_layout.tsx
index cdea344..09c30b6 100644
--- a/innungsapp/apps/mobile/app/_layout.tsx
+++ b/innungsapp/apps/mobile/app/_layout.tsx
@@ -1,12 +1,7 @@
import '../global.css'
import { useEffect } from 'react'
-import { Stack } from 'expo-router'
-import { SplashScreen } from 'expo-router'
-import { QueryClientProvider } from '@tanstack/react-query'
-import { queryClient } from '@/lib/trpc'
-import { TRPCProvider } from '@/lib/trpc'
+import { Stack, SplashScreen } from 'expo-router'
import { useAuthStore } from '@/store/auth.store'
-import { setupPushNotifications } from '@/lib/notifications'
SplashScreen.preventAutoHideAsync()
@@ -18,20 +13,14 @@ export default function RootLayout() {
initAuth().finally(() => SplashScreen.hideAsync())
}, [initAuth])
- useEffect(() => {
- setupPushNotifications().catch(console.error)
- }, [])
-
if (!isInitialized) return null
return (
-
-
-
-
-
-
-
-
+
+
+
+
+
+
)
}
diff --git a/innungsapp/apps/mobile/app/index.tsx b/innungsapp/apps/mobile/app/index.tsx
index 5024e36..30143c6 100644
--- a/innungsapp/apps/mobile/app/index.tsx
+++ b/innungsapp/apps/mobile/app/index.tsx
@@ -3,5 +3,8 @@ import { useAuthStore } from '@/store/auth.store'
export default function Index() {
const session = useAuthStore((s) => s.session)
- return
+ if (session) {
+ return
+ }
+ return
}
diff --git a/innungsapp/apps/mobile/assets/adaptive-icon.png b/innungsapp/apps/mobile/assets/adaptive-icon.png
new file mode 100644
index 0000000..a0debf4
Binary files /dev/null and b/innungsapp/apps/mobile/assets/adaptive-icon.png differ
diff --git a/innungsapp/apps/mobile/assets/favicon.png b/innungsapp/apps/mobile/assets/favicon.png
new file mode 100644
index 0000000..a0debf4
Binary files /dev/null and b/innungsapp/apps/mobile/assets/favicon.png differ
diff --git a/innungsapp/apps/mobile/assets/icon.png b/innungsapp/apps/mobile/assets/icon.png
new file mode 100644
index 0000000..a0debf4
Binary files /dev/null and b/innungsapp/apps/mobile/assets/icon.png differ
diff --git a/innungsapp/apps/mobile/assets/notification-icon.png b/innungsapp/apps/mobile/assets/notification-icon.png
new file mode 100644
index 0000000..a0debf4
Binary files /dev/null and b/innungsapp/apps/mobile/assets/notification-icon.png differ
diff --git a/innungsapp/apps/mobile/assets/splash.png b/innungsapp/apps/mobile/assets/splash.png
new file mode 100644
index 0000000..a0debf4
Binary files /dev/null and b/innungsapp/apps/mobile/assets/splash.png differ
diff --git a/innungsapp/apps/mobile/components/members/MemberCard.tsx b/innungsapp/apps/mobile/components/members/MemberCard.tsx
new file mode 100644
index 0000000..9af9f97
--- /dev/null
+++ b/innungsapp/apps/mobile/components/members/MemberCard.tsx
@@ -0,0 +1,115 @@
+import { View, Text, TouchableOpacity, StyleSheet } from 'react-native'
+import { Ionicons } from '@expo/vector-icons'
+import { Avatar } from '@/components/ui/Avatar'
+
+interface MemberCardProps {
+ member: {
+ id: string
+ name: string
+ betrieb: string
+ sparte: string
+ ort: string
+ istAusbildungsbetrieb: boolean
+ avatarUrl: string | null
+ }
+ onPress: () => void
+}
+
+export function MemberCard({ member, onPress }: MemberCardProps) {
+ return (
+
+
+
+
+
+ {member.name}
+
+
+ {member.betrieb}
+
+
+
+ {member.sparte}
+
+ ·
+ {member.ort}
+ {member.istAusbildungsbetrieb && (
+
+ Ausbildung
+
+ )}
+
+
+
+
+
+ )
+}
+
+const styles = StyleSheet.create({
+ card: {
+ backgroundColor: '#FFFFFF',
+ borderRadius: 16,
+ padding: 14,
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 12,
+ shadowColor: '#1C1917',
+ shadowOffset: { width: 0, height: 2 },
+ shadowOpacity: 0.08,
+ shadowRadius: 12,
+ elevation: 3,
+ },
+ info: {
+ flex: 1,
+ minWidth: 0,
+ },
+ name: {
+ fontSize: 15,
+ fontWeight: '600',
+ color: '#0F172A',
+ letterSpacing: -0.2,
+ },
+ company: {
+ fontSize: 13,
+ color: '#475569',
+ marginTop: 2,
+ },
+ tagsRow: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ flexWrap: 'wrap',
+ gap: 6,
+ marginTop: 6,
+ },
+ tag: {
+ backgroundColor: '#F4F4F5',
+ paddingHorizontal: 8,
+ paddingVertical: 2,
+ borderRadius: 99,
+ },
+ tagText: {
+ fontSize: 11,
+ color: '#475569',
+ fontWeight: '500',
+ },
+ separator: {
+ fontSize: 11,
+ color: '#D4D4D8',
+ },
+ location: {
+ fontSize: 11,
+ color: '#64748B',
+ },
+ ausbildungTag: {
+ backgroundColor: '#F0FDF4',
+ paddingHorizontal: 8,
+ paddingVertical: 2,
+ borderRadius: 99,
+ },
+ ausbildungText: {
+ fontSize: 11,
+ color: '#15803D',
+ fontWeight: '600',
+ },
+})
diff --git a/innungsapp/apps/mobile/components/news/AttachmentRow.tsx b/innungsapp/apps/mobile/components/news/AttachmentRow.tsx
new file mode 100644
index 0000000..0829eee
--- /dev/null
+++ b/innungsapp/apps/mobile/components/news/AttachmentRow.tsx
@@ -0,0 +1,105 @@
+import { TouchableOpacity, Text, View, StyleSheet, Platform } from 'react-native'
+import { Ionicons } from '@expo/vector-icons'
+import * as WebBrowser from 'expo-web-browser'
+
+interface Attachment {
+ id: string
+ name: string
+ storagePath: string
+ sizeBytes: number | null
+ mimeType?: string | null
+}
+
+const API_URL = process.env.EXPO_PUBLIC_API_URL ?? 'http://localhost:3000'
+
+function getFileIcon(mimeType?: string | null): keyof typeof Ionicons.glyphMap {
+ if (!mimeType) return 'document-outline'
+ if (mimeType.includes('pdf')) return 'document-text-outline'
+ if (mimeType.startsWith('image/')) return 'image-outline'
+ if (mimeType.includes('spreadsheet') || mimeType.includes('excel')) return 'grid-outline'
+ if (mimeType.includes('word') || mimeType.includes('document')) return 'document-outline'
+ return 'attach-outline'
+}
+
+function formatSize(bytes: number): string {
+ if (bytes < 1024) return `${bytes} B`
+ if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`
+}
+
+export function AttachmentRow({ attachment }: { attachment: Attachment }) {
+ const url = `${API_URL}/uploads/${attachment.storagePath}`
+ const icon = getFileIcon(attachment.mimeType)
+
+ return (
+ WebBrowser.openBrowserAsync(url)}
+ style={styles.row}
+ activeOpacity={0.75}
+ >
+
+
+
+
+
+
+ {attachment.name}
+
+ {attachment.sizeBytes != null && (
+ {formatSize(attachment.sizeBytes)}
+ )}
+
+
+
+
+ Öffnen
+
+
+ )
+}
+
+const styles = StyleSheet.create({
+ row: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 12,
+ paddingVertical: 13,
+ },
+ iconBox: {
+ width: 42,
+ height: 42,
+ borderRadius: 12,
+ backgroundColor: '#EFF6FF',
+ alignItems: 'center',
+ justifyContent: 'center',
+ flexShrink: 0,
+ },
+ info: {
+ flex: 1,
+ },
+ name: {
+ fontSize: 13,
+ fontWeight: '600',
+ color: '#0F172A',
+ lineHeight: 18,
+ },
+ meta: {
+ fontSize: 11,
+ color: '#94A3B8',
+ marginTop: 2,
+ },
+ openChip: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 4,
+ backgroundColor: '#EFF6FF',
+ paddingHorizontal: 11,
+ paddingVertical: 6,
+ borderRadius: 99,
+ },
+ openText: {
+ fontSize: 12,
+ color: '#003B7E',
+ fontWeight: '600',
+ },
+})
diff --git a/innungsapp/apps/mobile/components/news/NewsCard.tsx b/innungsapp/apps/mobile/components/news/NewsCard.tsx
new file mode 100644
index 0000000..8fe847f
--- /dev/null
+++ b/innungsapp/apps/mobile/components/news/NewsCard.tsx
@@ -0,0 +1,133 @@
+import { View, Text, TouchableOpacity, StyleSheet } from 'react-native'
+import { Ionicons } from '@expo/vector-icons'
+import { Badge } from '@/components/ui/Badge'
+import { NEWS_KATEGORIE_LABELS } from '@innungsapp/shared/types'
+import { format } from 'date-fns'
+import { de } from 'date-fns/locale'
+import { useNewsReadStore } from '@/store/news.store'
+
+interface NewsCardProps {
+ news: {
+ id: string
+ title: string
+ kategorie: string
+ publishedAt: Date | null
+ isRead: boolean
+ author: { name: string } | null
+ }
+ onPress: () => void
+}
+
+export function NewsCard({ news, onPress }: NewsCardProps) {
+ const localReadIds = useNewsReadStore((s) => s.readIds)
+ const isRead = news.isRead || localReadIds.has(news.id)
+
+ return (
+
+ {!isRead && (
+
+ Neu
+
+ )}
+
+
+
+
+
+ {news.publishedAt
+ ? format(new Date(news.publishedAt), 'dd. MMM', { locale: de })
+ : 'Entwurf'}
+
+
+
+
+ {news.title}
+
+
+
+
+ {news.author?.name ?? 'Innung'}
+
+
+
+
+
+ )
+}
+
+const styles = StyleSheet.create({
+ card: {
+ backgroundColor: '#FFFFFF',
+ borderWidth: 1,
+ borderColor: '#E2E8F0',
+ borderRadius: 16,
+ flexDirection: 'row',
+ alignItems: 'center',
+ padding: 14,
+ shadowColor: '#0F172A',
+ shadowOffset: { width: 0, height: 1 },
+ shadowOpacity: 0.06,
+ shadowRadius: 10,
+ elevation: 2,
+ position: 'relative',
+ },
+ newBadge: {
+ position: 'absolute',
+ right: 30,
+ top: 8,
+ borderRadius: 999,
+ backgroundColor: '#EF4444',
+ paddingHorizontal: 8,
+ paddingVertical: 2,
+ zIndex: 2,
+ },
+ newBadgeText: {
+ color: '#FFFFFF',
+ fontSize: 10,
+ fontWeight: '700',
+ },
+ content: {
+ flex: 1,
+ marginRight: 10,
+ },
+ topRow: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'space-between',
+ marginBottom: 8,
+ },
+ dateText: {
+ fontSize: 11,
+ color: '#94A3B8',
+ fontWeight: '600',
+ },
+ titleUnread: {
+ fontSize: 15,
+ fontWeight: '700',
+ color: '#0F172A',
+ lineHeight: 21,
+ marginBottom: 8,
+ },
+ titleRead: {
+ fontSize: 14,
+ fontWeight: '500',
+ color: '#475569',
+ lineHeight: 20,
+ marginBottom: 8,
+ },
+ metaRow: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 6,
+ },
+ dot: {
+ width: 4,
+ height: 4,
+ borderRadius: 2,
+ backgroundColor: '#CBD5E1',
+ },
+ authorText: {
+ fontSize: 11,
+ color: '#64748B',
+ },
+})
diff --git a/innungsapp/apps/mobile/components/stellen/StelleCard.tsx b/innungsapp/apps/mobile/components/stellen/StelleCard.tsx
new file mode 100644
index 0000000..f0b3612
--- /dev/null
+++ b/innungsapp/apps/mobile/components/stellen/StelleCard.tsx
@@ -0,0 +1,162 @@
+import { View, Text, TouchableOpacity, StyleSheet } from 'react-native'
+import { Ionicons } from '@expo/vector-icons'
+
+const SPARTE_COLOR: Record = {
+ elektro: '#1D4ED8',
+ sanit: '#0F766E',
+ it: '#4338CA',
+ heizung: '#B45309',
+ maler: '#15803D',
+ info: '#4338CA',
+}
+
+function getSparteColor(sparte: string): string {
+ const lower = sparte.toLowerCase()
+ for (const [key, color] of Object.entries(SPARTE_COLOR)) {
+ if (lower.includes(key)) return color
+ }
+ return '#003B7E'
+}
+
+interface StelleCardProps {
+ stelle: {
+ id: string
+ sparte: string
+ stellenAnz: number
+ verguetung: string | null
+ lehrjahr: string | null
+ member: { betrieb: string; ort: string }
+ org: { name: string }
+ }
+ onPress: () => void
+}
+
+export function StelleCard({ stelle, onPress }: StelleCardProps) {
+ const color = getSparteColor(stelle.sparte)
+ const initial = stelle.sparte.charAt(0).toUpperCase()
+
+ return (
+
+
+
+ {initial}
+
+
+
+
+ {stelle.member.betrieb}
+
+ {stelle.sparte}
+
+
+
+
+ {stelle.stellenAnz} Stelle{stelle.stellenAnz > 1 ? 'n' : ''}
+
+
+ {stelle.lehrjahr ? (
+
+ {stelle.lehrjahr}
+
+ ) : null}
+ {stelle.verguetung ? (
+
+ {stelle.verguetung}
+
+ ) : null}
+
+
+
+
+ {stelle.member.ort}
+
+
+
+
+
+
+ )
+}
+
+const styles = StyleSheet.create({
+ card: {
+ backgroundColor: '#FFFFFF',
+ borderRadius: 16,
+ borderWidth: 1,
+ borderColor: '#E2E8F0',
+ padding: 14,
+ shadowColor: '#0F172A',
+ shadowOffset: { width: 0, height: 1 },
+ shadowOpacity: 0.06,
+ shadowRadius: 8,
+ elevation: 2,
+ },
+ row: {
+ flexDirection: 'row',
+ alignItems: 'flex-start',
+ gap: 12,
+ },
+ iconBox: {
+ width: 48,
+ height: 48,
+ borderRadius: 14,
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ iconLetter: {
+ fontSize: 22,
+ fontWeight: '800',
+ },
+ content: {
+ flex: 1,
+ gap: 4,
+ },
+ company: {
+ fontSize: 15,
+ fontWeight: '700',
+ color: '#0F172A',
+ letterSpacing: -0.2,
+ },
+ sparte: {
+ fontSize: 12,
+ color: '#64748B',
+ },
+ chips: {
+ flexDirection: 'row',
+ flexWrap: 'wrap',
+ gap: 6,
+ marginTop: 4,
+ },
+ chipBrand: {
+ backgroundColor: '#EFF6FF',
+ paddingHorizontal: 8,
+ paddingVertical: 3,
+ borderRadius: 99,
+ },
+ chipBrandText: {
+ fontSize: 11,
+ color: '#003B7E',
+ fontWeight: '700',
+ },
+ chip: {
+ backgroundColor: '#F1F5F9',
+ paddingHorizontal: 8,
+ paddingVertical: 3,
+ borderRadius: 99,
+ },
+ chipText: {
+ fontSize: 11,
+ color: '#475569',
+ fontWeight: '500',
+ },
+ locationRow: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 4,
+ marginTop: 2,
+ },
+ location: {
+ fontSize: 11,
+ color: '#64748B',
+ },
+})
diff --git a/innungsapp/apps/mobile/components/termine/AnmeldeButton.tsx b/innungsapp/apps/mobile/components/termine/AnmeldeButton.tsx
new file mode 100644
index 0000000..1a0ea41
--- /dev/null
+++ b/innungsapp/apps/mobile/components/termine/AnmeldeButton.tsx
@@ -0,0 +1,67 @@
+import { TouchableOpacity, Text, ActivityIndicator, StyleSheet } from 'react-native'
+
+interface AnmeldeButtonProps {
+ terminId: string
+ isAngemeldet: boolean
+ onToggle: () => void
+ isLoading: boolean
+}
+
+export function AnmeldeButton({ isAngemeldet, onToggle, isLoading }: AnmeldeButtonProps) {
+ return (
+
+ {isLoading ? (
+
+ ) : (
+
+ {isAngemeldet ? '✓ Angemeldet – Abmelden' : 'Jetzt anmelden'}
+
+ )}
+
+ )
+}
+
+const styles = StyleSheet.create({
+ btn: {
+ borderRadius: 14,
+ paddingVertical: 15,
+ flexDirection: 'row',
+ alignItems: 'center',
+ justifyContent: 'center',
+ },
+ btnRegister: {
+ backgroundColor: '#003B7E',
+ shadowColor: '#003B7E',
+ shadowOffset: { width: 0, height: 4 },
+ shadowOpacity: 0.24,
+ shadowRadius: 10,
+ elevation: 5,
+ },
+ btnRegistered: {
+ backgroundColor: '#F4F4F5',
+ borderWidth: 1,
+ borderColor: '#E2E8F0',
+ },
+ disabled: {
+ opacity: 0.5,
+ },
+ label: {
+ fontSize: 15,
+ fontWeight: '600',
+ color: '#FFFFFF',
+ letterSpacing: 0.2,
+ },
+ labelRegistered: {
+ color: '#52525B',
+ },
+})
+
diff --git a/innungsapp/apps/mobile/components/termine/TerminCard.tsx b/innungsapp/apps/mobile/components/termine/TerminCard.tsx
new file mode 100644
index 0000000..047a379
--- /dev/null
+++ b/innungsapp/apps/mobile/components/termine/TerminCard.tsx
@@ -0,0 +1,253 @@
+import { View, Text, TouchableOpacity, ActivityIndicator, StyleSheet } from 'react-native'
+import { Ionicons } from '@expo/vector-icons'
+import { Badge } from '@/components/ui/Badge'
+import { TERMIN_TYP_LABELS } from '@innungsapp/shared/types'
+import { format } from 'date-fns'
+import { de } from 'date-fns/locale'
+
+interface TerminCardProps {
+ termin: {
+ id: string
+ titel: string
+ datum: Date
+ uhrzeit: string | null
+ ort: string | null
+ typ: string
+ isAngemeldet: boolean
+ teilnehmerAnzahl: number
+ }
+ onPress: () => void
+ onToggleAnmeldung?: () => void
+ isToggling?: boolean
+ isPast?: boolean
+}
+
+export function TerminCard({
+ termin,
+ onPress,
+ onToggleAnmeldung,
+ isToggling = false,
+ isPast = false,
+}: TerminCardProps) {
+ const datum = new Date(termin.datum)
+
+ return (
+
+ {/* Date column */}
+
+
+ {format(datum, 'dd')}
+
+
+ {format(datum, 'MMM', { locale: de }).toUpperCase()}
+
+ {!isPast && termin.isAngemeldet && }
+ {isPast && (
+
+ vorbei
+
+ )}
+
+
+ {/* Divider */}
+
+
+ {/* Content */}
+
+
+
+ {termin.titel}
+
+
+ {termin.uhrzeit && (
+
+
+
+ {termin.uhrzeit} Uhr
+
+
+ )}
+ {termin.ort && (
+
+
+
+ {termin.ort}
+
+
+ )}
+
+
+ {/* Registration status chip — only for upcoming events */}
+ {!isPast && termin.isAngemeldet && onToggleAnmeldung && (
+ {
+ e.stopPropagation?.()
+ onToggleAnmeldung()
+ }}
+ style={styles.registeredChip}
+ disabled={isToggling}
+ activeOpacity={0.75}
+ >
+ {isToggling ? (
+
+ ) : (
+
+ )}
+
+ Angemeldet · Abmelden
+
+
+ )}
+
+
+ {/* Chevron */}
+
+
+
+
+ )
+}
+
+const styles = StyleSheet.create({
+ card: {
+ backgroundColor: '#FFFFFF',
+ borderRadius: 16,
+ flexDirection: 'row',
+ alignItems: 'center',
+ overflow: 'hidden',
+ shadowColor: '#1C1917',
+ shadowOffset: { width: 0, height: 2 },
+ shadowOpacity: 0.08,
+ shadowRadius: 12,
+ elevation: 3,
+ },
+ cardPast: {
+ shadowOpacity: 0.04,
+ elevation: 1,
+ },
+ dateColumn: {
+ width: 64,
+ alignItems: 'center',
+ justifyContent: 'center',
+ paddingVertical: 18,
+ backgroundColor: '#EFF6FF',
+ },
+ dateColumnPast: {
+ backgroundColor: '#F4F4F5',
+ },
+ dayNumber: {
+ fontSize: 28,
+ fontWeight: '800',
+ color: '#003B7E',
+ lineHeight: 30,
+ },
+ dayNumberPast: {
+ color: '#94A3B8',
+ },
+ monthLabel: {
+ fontSize: 10,
+ fontWeight: '700',
+ color: '#003B7E',
+ letterSpacing: 1,
+ opacity: 0.75,
+ marginTop: 1,
+ },
+ monthLabelPast: {
+ color: '#94A3B8',
+ opacity: 1,
+ },
+ registeredDot: {
+ width: 6,
+ height: 6,
+ borderRadius: 3,
+ backgroundColor: '#059669',
+ marginTop: 6,
+ },
+ pastBadge: {
+ marginTop: 6,
+ backgroundColor: '#E2E8F0',
+ borderRadius: 99,
+ paddingHorizontal: 6,
+ paddingVertical: 2,
+ },
+ pastBadgeText: {
+ fontSize: 9,
+ fontWeight: '700',
+ color: '#94A3B8',
+ letterSpacing: 0.5,
+ textTransform: 'uppercase',
+ },
+ divider: {
+ width: 1,
+ alignSelf: 'stretch',
+ marginVertical: 14,
+ backgroundColor: '#F0EDED',
+ },
+ dividerPast: {
+ backgroundColor: '#F4F4F5',
+ },
+ content: {
+ flex: 1,
+ paddingHorizontal: 14,
+ paddingVertical: 14,
+ gap: 8,
+ },
+ title: {
+ fontSize: 15,
+ fontWeight: '600',
+ color: '#0F172A',
+ letterSpacing: -0.2,
+ lineHeight: 21,
+ marginTop: 2,
+ },
+ titlePast: {
+ color: '#94A3B8',
+ fontWeight: '500',
+ },
+ metaRow: {
+ flexDirection: 'column',
+ gap: 4,
+ marginTop: 4,
+ },
+ metaItem: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 4,
+ },
+ metaText: {
+ fontSize: 12,
+ color: '#64748B',
+ },
+ metaTextPast: {
+ color: '#94A3B8',
+ },
+ registeredChip: {
+ flexDirection: 'row',
+ alignItems: 'center',
+ gap: 5,
+ marginTop: 4,
+ alignSelf: 'flex-start',
+ backgroundColor: '#ECFDF5',
+ borderRadius: 99,
+ paddingHorizontal: 10,
+ paddingVertical: 5,
+ borderWidth: 1,
+ borderColor: '#A7F3D0',
+ },
+ registeredChipText: {
+ fontSize: 12,
+ fontWeight: '600',
+ color: '#047857',
+ },
+ abmeldenText: {
+ color: '#DC2626',
+ fontWeight: '600',
+ },
+ chevronWrap: {
+ paddingRight: 12,
+ },
+})
diff --git a/innungsapp/apps/mobile/components/ui/Avatar.tsx b/innungsapp/apps/mobile/components/ui/Avatar.tsx
new file mode 100644
index 0000000..cd9e249
--- /dev/null
+++ b/innungsapp/apps/mobile/components/ui/Avatar.tsx
@@ -0,0 +1,93 @@
+import { View, Text, Image, ViewStyle, ImageStyle } from 'react-native'
+
+const AVATAR_PALETTES = [
+ { bg: '#003B7E', text: '#FFFFFF' },
+ { bg: '#1D4ED8', text: '#FFFFFF' },
+ { bg: '#059669', text: '#FFFFFF' },
+ { bg: '#4338CA', text: '#FFFFFF' },
+ { bg: '#B45309', text: '#FFFFFF' },
+ { bg: '#0F766E', text: '#FFFFFF' },
+]
+
+function getInitials(name: string): string {
+ return name
+ .split(' ')
+ .slice(0, 2)
+ .map((w) => w[0]?.toUpperCase() ?? '')
+ .join('')
+}
+
+function getPalette(name: string) {
+ const index = name.charCodeAt(0) % AVATAR_PALETTES.length
+ return AVATAR_PALETTES[index]
+}
+
+interface AvatarProps {
+ name: string
+ imageUrl?: string
+ size?: number
+ shadow?: boolean
+}
+
+export function Avatar({ name, imageUrl, size = 48, shadow = false }: AvatarProps) {
+ const initials = getInitials(name)
+ const palette = getPalette(name)
+
+ const viewShadowStyle: ViewStyle = shadow
+ ? {
+ shadowColor: '#000',
+ shadowOffset: { width: 0, height: 2 },
+ shadowOpacity: 0.12,
+ shadowRadius: 8,
+ elevation: 3,
+ }
+ : {}
+
+ const imageShadowStyle: ImageStyle = shadow
+ ? {
+ shadowColor: '#000',
+ shadowOffset: { width: 0, height: 2 },
+ shadowOpacity: 0.12,
+ shadowRadius: 8,
+ }
+ : {}
+
+ if (imageUrl) {
+ return (
+
+ )
+ }
+
+ return (
+
+
+ {initials}
+
+
+ )
+}
diff --git a/innungsapp/apps/mobile/components/ui/Badge.tsx b/innungsapp/apps/mobile/components/ui/Badge.tsx
new file mode 100644
index 0000000..b36ee0e
--- /dev/null
+++ b/innungsapp/apps/mobile/components/ui/Badge.tsx
@@ -0,0 +1,46 @@
+import { View, Text, StyleSheet } from 'react-native'
+
+const BADGE_CONFIG: Record = {
+ Wichtig: { bg: '#FEE2E2', color: '#B91C1C' },
+ Pruefung: { bg: '#DBEAFE', color: '#1D4ED8' },
+ Foerderung: { bg: '#DCFCE7', color: '#15803D' },
+ Veranstaltung: { bg: '#E0E7FF', color: '#4338CA' },
+ Allgemein: { bg: '#F1F5F9', color: '#475569' },
+ Versammlung: { bg: '#E0E7FF', color: '#4338CA' },
+ Kurs: { bg: '#DCFCE7', color: '#15803D' },
+ Event: { bg: '#FEF3C7', color: '#B45309' },
+ Sonstiges: { bg: '#F1F5F9', color: '#475569' },
+}
+
+interface BadgeProps {
+ label: string
+ kategorie?: string
+ typ?: string
+}
+
+export function Badge({ label, kategorie, typ }: BadgeProps) {
+ const cfg =
+ (kategorie && BADGE_CONFIG[kategorie]) ||
+ (typ && BADGE_CONFIG[typ]) ||
+ { bg: '#F1F5F9', color: '#475569' }
+
+ return (
+
+ {label}
+
+ )
+}
+
+const styles = StyleSheet.create({
+ pill: {
+ alignSelf: 'flex-start',
+ paddingHorizontal: 10,
+ paddingVertical: 4,
+ borderRadius: 99,
+ },
+ label: {
+ fontSize: 11,
+ fontWeight: '700',
+ letterSpacing: 0.2,
+ },
+})
diff --git a/innungsapp/apps/mobile/components/ui/Button.tsx b/innungsapp/apps/mobile/components/ui/Button.tsx
index ceb0ab5..b141247 100644
--- a/innungsapp/apps/mobile/components/ui/Button.tsx
+++ b/innungsapp/apps/mobile/components/ui/Button.tsx
@@ -1,47 +1,69 @@
-import { TouchableOpacity, Text, ActivityIndicator } from 'react-native'
+import { Text, TouchableOpacity, ActivityIndicator } from 'react-native'
+import { cn } from '../../lib/utils'
interface ButtonProps {
label: string
onPress: () => void
- variant?: 'primary' | 'secondary' | 'ghost'
+ variant?: 'primary' | 'secondary' | 'ghost' | 'destructive' | 'outline'
+ size?: 'default' | 'sm' | 'lg'
loading?: boolean
disabled?: boolean
- icon?: string
+ className?: string
}
export function Button({
label,
onPress,
variant = 'primary',
+ size = 'default',
loading,
disabled,
- icon,
+ className,
}: ButtonProps) {
- const base = 'rounded-2xl py-4 flex-row items-center justify-center gap-2'
- const variants = {
- primary: `${base} bg-brand-500`,
- secondary: `${base} bg-white border border-gray-200`,
- ghost: `${base}`,
- }
- const textVariants = {
- primary: 'text-white font-semibold text-base',
- secondary: 'text-gray-900 font-semibold text-base',
- ghost: 'text-brand-500 font-semibold text-base',
- }
+ const isDisabled = disabled || loading
return (
{loading ? (
-
+
) : (
- <>
- {icon && {icon}}
- {label}
- >
+
+ {label}
+
)}
)
diff --git a/innungsapp/apps/mobile/components/ui/Card.tsx b/innungsapp/apps/mobile/components/ui/Card.tsx
index fd4b1b1..1719af9 100644
--- a/innungsapp/apps/mobile/components/ui/Card.tsx
+++ b/innungsapp/apps/mobile/components/ui/Card.tsx
@@ -1,25 +1,39 @@
-import { View, TouchableOpacity } from 'react-native'
+import { View, TouchableOpacity, ViewStyle } from 'react-native'
+import { cn } from '../../lib/utils'
+
+// Keep shadow style for now as it's often better handled natively than via Tailwind utilities for cross-platform consistency
+// OR use nativewind shadow classes if configured properly. Let's use Tailwind classes for shadow to align with the system if possible,
+// but often standard CSS shadows don't map perfectly to RN shadow props (elevation vs shadowOffset).
+// For specific "card" feel, we might want to keep a consistent shadow.
+// However, the prompt asked for "10x better" design.
interface CardProps {
children: React.ReactNode
onPress?: () => void
className?: string
+ noPadding?: boolean
}
-export function Card({ children, onPress, className = '' }: CardProps) {
+export function Card({ children, onPress, className = '', noPadding = false }: CardProps) {
+ const baseClasses = cn(
+ 'bg-card rounded-xl border border-border shadow-sm',
+ !noPadding && 'p-4',
+ className
+ )
+
if (onPress) {
return (
{children}
)
}
return (
-
+
{children}
)
diff --git a/innungsapp/apps/mobile/components/ui/EmptyState.tsx b/innungsapp/apps/mobile/components/ui/EmptyState.tsx
new file mode 100644
index 0000000..b8eb785
--- /dev/null
+++ b/innungsapp/apps/mobile/components/ui/EmptyState.tsx
@@ -0,0 +1,59 @@
+import { Ionicons } from '@expo/vector-icons'
+import { View, Text, StyleSheet } from 'react-native'
+
+interface EmptyStateProps {
+ icon: keyof typeof Ionicons.glyphMap
+ title: string
+ subtitle: string
+}
+
+export function EmptyState({ icon, title, subtitle }: EmptyStateProps) {
+ return (
+
+
+
+
+ {title}
+ {subtitle}
+
+ )
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ paddingVertical: 80,
+ paddingHorizontal: 32,
+ },
+ iconBox: {
+ width: 72,
+ height: 72,
+ backgroundColor: '#FFFFFF',
+ borderRadius: 22,
+ alignItems: 'center',
+ justifyContent: 'center',
+ marginBottom: 18,
+ shadowColor: '#1C1917',
+ shadowOffset: { width: 0, height: 2 },
+ shadowOpacity: 0.06,
+ shadowRadius: 10,
+ elevation: 2,
+ },
+ title: {
+ fontSize: 17,
+ fontWeight: '700',
+ color: '#0F172A',
+ textAlign: 'center',
+ letterSpacing: -0.2,
+ },
+ subtitle: {
+ fontSize: 13,
+ color: '#64748B',
+ textAlign: 'center',
+ marginTop: 6,
+ lineHeight: 19,
+ },
+})
+
diff --git a/innungsapp/apps/mobile/components/ui/LoadingSpinner.tsx b/innungsapp/apps/mobile/components/ui/LoadingSpinner.tsx
new file mode 100644
index 0000000..b7671f9
--- /dev/null
+++ b/innungsapp/apps/mobile/components/ui/LoadingSpinner.tsx
@@ -0,0 +1,9 @@
+import { View, ActivityIndicator } from 'react-native'
+
+export function LoadingSpinner() {
+ return (
+
+
+
+ )
+}
diff --git a/innungsapp/apps/mobile/eas.json b/innungsapp/apps/mobile/eas.json
new file mode 100644
index 0000000..2a3f7fe
--- /dev/null
+++ b/innungsapp/apps/mobile/eas.json
@@ -0,0 +1,36 @@
+{
+ "cli": {
+ "version": ">= 10.0.0"
+ },
+ "build": {
+ "development": {
+ "developmentClient": true,
+ "distribution": "internal",
+ "env": {
+ "EXPO_PUBLIC_API_URL": "http://localhost:3000"
+ }
+ },
+ "preview": {
+ "distribution": "internal",
+ "android": {
+ "buildType": "apk"
+ }
+ },
+ "production": {
+ "autoIncrement": true
+ }
+ },
+ "submit": {
+ "production": {
+ "ios": {
+ "appleId": "YOUR_APPLE_ID",
+ "ascAppId": "YOUR_APP_STORE_CONNECT_APP_ID",
+ "appleTeamId": "YOUR_APPLE_TEAM_ID"
+ },
+ "android": {
+ "serviceAccountKeyPath": "./google-service-account.json",
+ "track": "internal"
+ }
+ }
+ }
+}
diff --git a/innungsapp/apps/mobile/eslint.config.js b/innungsapp/apps/mobile/eslint.config.js
new file mode 100644
index 0000000..ba708ed
--- /dev/null
+++ b/innungsapp/apps/mobile/eslint.config.js
@@ -0,0 +1,10 @@
+// https://docs.expo.dev/guides/using-eslint/
+const { defineConfig } = require('eslint/config');
+const expoConfig = require("eslint-config-expo/flat");
+
+module.exports = defineConfig([
+ expoConfig,
+ {
+ ignores: ["dist/*"],
+ }
+]);
diff --git a/innungsapp/apps/mobile/global.css b/innungsapp/apps/mobile/global.css
index b5c61c9..6d68c87 100644
--- a/innungsapp/apps/mobile/global.css
+++ b/innungsapp/apps/mobile/global.css
@@ -1,3 +1,67 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
+
+@layer base {
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 222.2 84% 4.9%;
+
+ --card: 0 0% 100%;
+ --card-foreground: 222.2 84% 4.9%;
+
+ --popover: 0 0% 100%;
+ --popover-foreground: 222.2 84% 4.9%;
+
+ --primary: 221.2 83.2% 53.3%;
+ --primary-foreground: 210 40% 98%;
+
+ --secondary: 210 40% 96.1%;
+ --secondary-foreground: 222.2 47.4% 11.2%;
+
+ --muted: 210 40% 96.1%;
+ --muted-foreground: 215.4 16.3% 46.9%;
+
+ --accent: 210 40% 96.1%;
+ --accent-foreground: 222.2 47.4% 11.2%;
+
+ --destructive: 0 84.2% 60.2%;
+ --destructive-foreground: 210 40% 98%;
+
+ --border: 214.3 31.8% 91.4%;
+ --input: 214.3 31.8% 91.4%;
+ --ring: 221.2 83.2% 53.3%;
+
+ --radius: 0.75rem;
+ }
+
+ .dark {
+ --background: 222.2 84% 4.9%;
+ --foreground: 210 40% 98%;
+
+ --card: 222.2 84% 4.9%;
+ --card-foreground: 210 40% 98%;
+
+ --popover: 222.2 84% 4.9%;
+ --popover-foreground: 210 40% 98%;
+
+ --primary: 217.2 91.2% 59.8%;
+ --primary-foreground: 222.2 47.4% 11.2%;
+
+ --secondary: 217.2 32.6% 17.5%;
+ --secondary-foreground: 210 40% 98%;
+
+ --muted: 217.2 32.6% 17.5%;
+ --muted-foreground: 215 20.2% 65.1%;
+
+ --accent: 217.2 32.6% 17.5%;
+ --accent-foreground: 210 40% 98%;
+
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 210 40% 98%;
+
+ --border: 217.2 32.6% 17.5%;
+ --input: 217.2 32.6% 17.5%;
+ --ring: 224.3 76.3% 48%;
+ }
+}
diff --git a/innungsapp/apps/mobile/hooks/useAuth.ts b/innungsapp/apps/mobile/hooks/useAuth.ts
index 293bc40..a798f4f 100644
--- a/innungsapp/apps/mobile/hooks/useAuth.ts
+++ b/innungsapp/apps/mobile/hooks/useAuth.ts
@@ -2,7 +2,7 @@ import { useAuthStore } from '@/store/auth.store'
import { useRouter } from 'expo-router'
export function useAuth() {
- const { session, orgId, role, signOut } = useAuthStore()
+ const { session, signOut } = useAuthStore()
const router = useRouter()
async function handleSignOut() {
@@ -12,10 +12,10 @@ export function useAuth() {
return {
session,
- orgId,
- role,
- isAuthenticated: !!session,
- isAdmin: role === 'admin',
+ orgId: 'org-1',
+ role: 'member' as const,
+ isAuthenticated: true, // Mock: immer eingeloggt
+ isAdmin: false,
signOut: handleSignOut,
}
}
diff --git a/innungsapp/apps/mobile/hooks/useMembers.ts b/innungsapp/apps/mobile/hooks/useMembers.ts
index 2b73828..dde8c41 100644
--- a/innungsapp/apps/mobile/hooks/useMembers.ts
+++ b/innungsapp/apps/mobile/hooks/useMembers.ts
@@ -1,19 +1,31 @@
-import { trpc } from '@/lib/trpc'
+import { MOCK_MEMBERS } from '@/lib/mock-data'
import { useMembersFilterStore } from '@/store/members.store'
export function useMembersList() {
const search = useMembersFilterStore((s) => s.search)
- const nurAusbildungsbetriebe = useMembersFilterStore(
- (s) => s.nurAusbildungsbetriebe
- )
+ const nurAusbildungsbetriebe = useMembersFilterStore((s) => s.nurAusbildungsbetriebe)
- return trpc.members.list.useQuery({
- search: search || undefined,
- ausbildungsbetrieb: nurAusbildungsbetriebe || undefined,
- status: 'aktiv',
- })
+ let data = MOCK_MEMBERS.filter((m) => m.status === 'aktiv')
+
+ if (search) {
+ const q = search.toLowerCase()
+ data = data.filter(
+ (m) =>
+ m.name.toLowerCase().includes(q) ||
+ m.betrieb.toLowerCase().includes(q) ||
+ m.ort.toLowerCase().includes(q) ||
+ m.sparte.toLowerCase().includes(q)
+ )
+ }
+
+ if (nurAusbildungsbetriebe) {
+ data = data.filter((m) => m.istAusbildungsbetrieb)
+ }
+
+ return { data, isLoading: false, refetch: () => {}, isRefetching: false }
}
export function useMemberDetail(id: string) {
- return trpc.members.byId.useQuery({ id })
+ const data = MOCK_MEMBERS.find((m) => m.id === id) ?? null
+ return { data, isLoading: false }
}
diff --git a/innungsapp/apps/mobile/hooks/useNews.ts b/innungsapp/apps/mobile/hooks/useNews.ts
index 4e2be42..22acf81 100644
--- a/innungsapp/apps/mobile/hooks/useNews.ts
+++ b/innungsapp/apps/mobile/hooks/useNews.ts
@@ -1,22 +1,28 @@
-import { trpc } from '@/lib/trpc'
+import { useState } from 'react'
+import { MOCK_NEWS } from '@/lib/mock-data'
import { useNewsReadStore } from '@/store/news.store'
export function useNewsList(kategorie?: string) {
- return trpc.news.list.useQuery({
- kategorie: kategorie as never,
- })
+ const localReadIds = useNewsReadStore((s) => s.readIds)
+ const filtered = kategorie
+ ? MOCK_NEWS.filter((n) => n.kategorie === kategorie)
+ : MOCK_NEWS
+
+ const data = filtered.map((n) => ({
+ ...n,
+ isRead: n.isRead || localReadIds.has(n.id),
+ }))
+
+ return { data, isLoading: false, refetch: () => {}, isRefetching: false }
}
export function useNewsDetail(id: string) {
const markRead = useNewsReadStore((s) => s.markRead)
- const markReadMutation = trpc.news.markRead.useMutation()
-
- const query = trpc.news.byId.useQuery({ id })
+ const news = MOCK_NEWS.find((n) => n.id === id) ?? null
function onOpen() {
markRead(id)
- markReadMutation.mutate({ newsId: id })
}
- return { ...query, onOpen }
+ return { data: news, isLoading: false, onOpen }
}
diff --git a/innungsapp/apps/mobile/hooks/useStellen.ts b/innungsapp/apps/mobile/hooks/useStellen.ts
index 8eb33cd..cec09ec 100644
--- a/innungsapp/apps/mobile/hooks/useStellen.ts
+++ b/innungsapp/apps/mobile/hooks/useStellen.ts
@@ -1,12 +1,13 @@
-import { trpc } from '@/lib/trpc'
+import { MOCK_STELLEN } from '@/lib/mock-data'
export function useStellenListe(opts?: { sparte?: string; lehrjahr?: string }) {
- return trpc.stellen.listPublic.useQuery({
- sparte: opts?.sparte,
- lehrjahr: opts?.lehrjahr,
- })
+ let data = MOCK_STELLEN.filter((s) => s.aktiv)
+ if (opts?.sparte) data = data.filter((s) => s.sparte === opts.sparte)
+ if (opts?.lehrjahr) data = data.filter((s) => s.lehrjahr === opts.lehrjahr)
+ return { data, isLoading: false, refetch: () => {}, isRefetching: false }
}
export function useStelleDetail(id: string) {
- return trpc.stellen.byId.useQuery({ id })
+ const data = MOCK_STELLEN.find((s) => s.id === id) ?? null
+ return { data, isLoading: false }
}
diff --git a/innungsapp/apps/mobile/hooks/useTermine.ts b/innungsapp/apps/mobile/hooks/useTermine.ts
index 27216db..63df69a 100644
--- a/innungsapp/apps/mobile/hooks/useTermine.ts
+++ b/innungsapp/apps/mobile/hooks/useTermine.ts
@@ -1,19 +1,33 @@
-import { trpc } from '@/lib/trpc'
+import { useState } from 'react'
+import { MOCK_TERMINE } from '@/lib/mock-data'
export function useTermineListe(upcoming = true) {
- return trpc.termine.list.useQuery({ upcoming })
+ const now = new Date()
+ const data = MOCK_TERMINE.filter((t) =>
+ upcoming ? t.datum >= now : t.datum < now
+ ).sort((a, b) =>
+ upcoming ? a.datum.getTime() - b.datum.getTime() : b.datum.getTime() - a.datum.getTime()
+ )
+ return { data, isLoading: false, refetch: () => {}, isRefetching: false }
}
export function useTerminDetail(id: string) {
- return trpc.termine.byId.useQuery({ id })
+ const data = MOCK_TERMINE.find((t) => t.id === id) ?? null
+ return { data, isLoading: false }
}
export function useToggleAnmeldung() {
- const utils = trpc.useUtils()
- return trpc.termine.toggleAnmeldung.useMutation({
- onSuccess: () => {
- utils.termine.list.invalidate()
- utils.termine.byId.invalidate()
- },
- })
+ const [isPending, setIsPending] = useState(false)
+
+ function mutate({ terminId }: { terminId: string }) {
+ setIsPending(true)
+ const termin = MOCK_TERMINE.find((t) => t.id === terminId)
+ if (termin) {
+ termin.isAngemeldet = !termin.isAngemeldet
+ termin.teilnehmerAnzahl += termin.isAngemeldet ? 1 : -1
+ }
+ setTimeout(() => setIsPending(false), 300)
+ }
+
+ return { mutate, isPending }
}
diff --git a/innungsapp/apps/mobile/lib/mock-data.ts b/innungsapp/apps/mobile/lib/mock-data.ts
new file mode 100644
index 0000000..207f7db
--- /dev/null
+++ b/innungsapp/apps/mobile/lib/mock-data.ts
@@ -0,0 +1,311 @@
+// Mock-Daten für Entwicklung ohne Backend
+
+export const MOCK_ORG = {
+ id: 'org-1',
+ name: 'Innung Elektrotechnik Stuttgart',
+ slug: 'innung-elektro-stuttgart',
+ plan: 'pilot',
+ primaryColor: '#003B7E',
+}
+
+export const MOCK_MEMBER_ME = {
+ id: 'member-1',
+ orgId: 'org-1',
+ userId: 'user-1',
+ name: 'Demo Admin',
+ betrieb: 'Innungsgeschäftsstelle',
+ sparte: 'Elektrotechnik',
+ ort: 'Stuttgart',
+ telefon: '+49 711 123456',
+ email: 'admin@demo.de',
+ status: 'aktiv' as const,
+ istAusbildungsbetrieb: false,
+ seit: 2020,
+ avatarUrl: null,
+ pushToken: null,
+ createdAt: new Date('2024-01-01'),
+ updatedAt: new Date('2024-01-01'),
+ org: MOCK_ORG,
+}
+
+export const MOCK_MEMBERS = [
+ {
+ id: 'member-1',
+ orgId: 'org-1',
+ userId: 'user-1',
+ name: 'Klaus Müller',
+ betrieb: 'Elektro Müller GmbH',
+ sparte: 'Elektrotechnik',
+ ort: 'Stuttgart',
+ telefon: '+49 711 123456',
+ email: 'mueller@elektro-mueller.de',
+ status: 'aktiv' as const,
+ istAusbildungsbetrieb: true,
+ seit: 2015,
+ avatarUrl: null,
+ pushToken: null,
+ createdAt: new Date('2024-01-01'),
+ updatedAt: new Date('2024-01-01'),
+ },
+ {
+ id: 'member-2',
+ orgId: 'org-1',
+ userId: null,
+ name: 'Maria Schmidt',
+ betrieb: 'Schmidt Elektrik',
+ sparte: 'Elektrotechnik',
+ ort: 'Ludwigsburg',
+ telefon: '+49 7141 987654',
+ email: 'schmidt@schmidt-elektrik.de',
+ status: 'aktiv' as const,
+ istAusbildungsbetrieb: false,
+ seit: 2018,
+ avatarUrl: null,
+ pushToken: null,
+ createdAt: new Date('2024-01-01'),
+ updatedAt: new Date('2024-01-01'),
+ },
+ {
+ id: 'member-3',
+ orgId: 'org-1',
+ userId: null,
+ name: 'Thomas Weber',
+ betrieb: 'Weber & Söhne Elektro',
+ sparte: 'Informationstechnik',
+ ort: 'Esslingen',
+ telefon: '+49 711 555123',
+ email: 'weber@weber-elektro.de',
+ status: 'aktiv' as const,
+ istAusbildungsbetrieb: true,
+ seit: 2012,
+ avatarUrl: null,
+ pushToken: null,
+ createdAt: new Date('2024-01-01'),
+ updatedAt: new Date('2024-01-01'),
+ },
+ {
+ id: 'member-4',
+ orgId: 'org-1',
+ userId: null,
+ name: 'Anna Bauer',
+ betrieb: 'Bauer Elektrotechnik',
+ sparte: 'Elektrotechnik',
+ ort: 'Stuttgart',
+ telefon: '+49 711 444567',
+ email: 'bauer@bauer-elektro.de',
+ status: 'aktiv' as const,
+ istAusbildungsbetrieb: false,
+ seit: 2021,
+ avatarUrl: null,
+ pushToken: null,
+ createdAt: new Date('2024-01-01'),
+ updatedAt: new Date('2024-01-01'),
+ },
+ {
+ id: 'member-5',
+ orgId: 'org-1',
+ userId: null,
+ name: 'Peter Hoffmann',
+ betrieb: 'Hoffmann Elektro-Service',
+ sparte: 'Sanitär',
+ ort: 'Böblingen',
+ telefon: '+49 7031 123789',
+ email: 'hoffmann@elektro-service.de',
+ status: 'aktiv' as const,
+ istAusbildungsbetrieb: true,
+ seit: 2010,
+ avatarUrl: null,
+ pushToken: null,
+ createdAt: new Date('2024-01-01'),
+ updatedAt: new Date('2024-01-01'),
+ },
+]
+
+export const MOCK_NEWS = [
+ {
+ id: 'news-1',
+ orgId: 'org-1',
+ authorId: 'member-1',
+ title: 'Wichtige Änderungen bei der Gesellenprüfung 2025',
+ body: `## Änderungen ab Herbst 2025\n\nDie Prüfungsordnung wurde angepasst. Folgende Änderungen sind zu beachten:\n\n- Prüfungsteil A (Gesellenstück) wird auf 2 Tage ausgeweitet\n- Neue digitale Komponenten in Prüfungsteil B\n- Anmeldeschluss ist der 15. September 2025\n\nWeitere Details entnehmen Sie dem beigefügten Rundschreiben.`,
+ kategorie: 'Pruefung' as const,
+ publishedAt: new Date('2025-09-01'),
+ createdAt: new Date('2025-09-01'),
+ isRead: false,
+ author: { name: 'Klaus Müller' },
+ attachments: [
+ {
+ id: 'att-1',
+ newsId: 'news-1',
+ name: 'Prüfungsordnung_2025.pdf',
+ storagePath: 'pruefungsordnung.pdf',
+ mimeType: 'application/pdf',
+ sizeBytes: 245000,
+ createdAt: new Date('2025-09-01'),
+ },
+ ],
+ },
+ {
+ id: 'news-2',
+ orgId: 'org-1',
+ authorId: 'member-1',
+ title: 'Förderung für Ausbildungsbetriebe: Jetzt beantragen!',
+ body: `## Neue Fördergelder verfügbar\n\nDas Land Baden-Württemberg stellt für das Jahr 2025 zusätzliche Fördermittel für Ausbildungsbetriebe bereit.\n\nFörderhöhe: Bis zu 3.000 € pro Auszubildenden\n\nAnträge bis 31. März 2025 einreichen.`,
+ kategorie: 'Foerderung' as const,
+ publishedAt: new Date('2025-08-15'),
+ createdAt: new Date('2025-08-15'),
+ isRead: true,
+ author: { name: 'Maria Schmidt' },
+ attachments: [],
+ },
+ {
+ id: 'news-3',
+ orgId: 'org-1',
+ authorId: 'member-1',
+ title: 'Innungsversammlung Winter 2025 — Einladung',
+ body: `## Einladung zur Winterversammlung\n\nWir laden herzlich zur jährlichen Winterversammlung ein.\n\nDatum: 3. Dezember 2025\nUhrzeit: 19:00 Uhr\nOrt: Gasthof Zum Lamm, Stuttgart\n\nTagesordnung:\n1. Jahresrückblick\n2. Vorstandswahlen\n3. Verschiedenes`,
+ kategorie: 'Veranstaltung' as const,
+ publishedAt: new Date('2025-11-01'),
+ createdAt: new Date('2025-11-01'),
+ isRead: false,
+ author: { name: 'Klaus Müller' },
+ attachments: [],
+ },
+ {
+ id: 'news-4',
+ orgId: 'org-1',
+ authorId: 'member-1',
+ title: 'Neue Tarifvereinbarung ab Januar 2026',
+ body: `## Tarifeinigung im Elektrohandwerk\n\nDie Tarifverhandlungen wurden erfolgreich abgeschlossen. Ab Januar 2026 gelten folgende Sätze:\n\n- Gesellenlohn: +4,2 %\n- Ausbildungsvergütung: +5,0 %`,
+ kategorie: 'Wichtig' as const,
+ publishedAt: new Date('2025-10-20'),
+ createdAt: new Date('2025-10-20'),
+ isRead: false,
+ author: { name: 'Klaus Müller' },
+ attachments: [],
+ },
+ {
+ id: 'news-5',
+ orgId: 'org-1',
+ authorId: 'member-1',
+ title: 'Mitgliederrundschreiben Oktober 2025',
+ body: `## Allgemeine Informationen\n\nLiebe Innungsmitglieder,\n\nin dieser Ausgabe informieren wir Sie über aktuelle Themen aus dem Elektrohandwerk.`,
+ kategorie: 'Allgemein' as const,
+ publishedAt: new Date('2025-10-01'),
+ createdAt: new Date('2025-10-01'),
+ isRead: true,
+ author: { name: 'Klaus Müller' },
+ attachments: [],
+ },
+]
+
+export const MOCK_TERMINE = [
+ {
+ id: 'termin-1',
+ orgId: 'org-1',
+ titel: 'Herbst-Gesellenprüfung 2025',
+ datum: new Date('2025-11-15'),
+ uhrzeit: '08:00',
+ endeDatum: new Date('2025-11-16'),
+ endeUhrzeit: '17:00',
+ ort: 'Berufsschule Stuttgart-Mitte',
+ adresse: 'Neckarstraße 22, 70190 Stuttgart',
+ typ: 'Pruefung' as const,
+ beschreibung: 'Praktische und theoretische Gesellenprüfung für Elektrotechniker.',
+ maxTeilnehmer: 30,
+ createdAt: new Date('2025-09-01'),
+ isAngemeldet: false,
+ teilnehmerAnzahl: 18,
+ anmeldungen: [],
+ },
+ {
+ id: 'termin-2',
+ orgId: 'org-1',
+ titel: 'Innungsversammlung Winter 2025',
+ datum: new Date('2025-12-03'),
+ uhrzeit: '19:00',
+ endeDatum: null,
+ endeUhrzeit: '21:00',
+ ort: 'Gasthof Zum Lamm',
+ adresse: 'Marktplatz 5, 70173 Stuttgart',
+ typ: 'Versammlung' as const,
+ beschreibung: 'Jährliche Winterversammlung mit Jahresrückblick und Vorstandswahlen.',
+ maxTeilnehmer: null,
+ createdAt: new Date('2025-10-01'),
+ isAngemeldet: true,
+ teilnehmerAnzahl: 42,
+ anmeldungen: [],
+ },
+ {
+ id: 'termin-3',
+ orgId: 'org-1',
+ titel: 'Weiterbildung: Photovoltaik & Elektromobilität',
+ datum: new Date('2026-02-20'),
+ uhrzeit: '09:00',
+ endeDatum: null,
+ endeUhrzeit: '17:00',
+ ort: 'Handwerkskammer Stuttgart',
+ adresse: 'Heilbronner Straße 43, 70191 Stuttgart',
+ typ: 'Kurs' as const,
+ beschreibung: 'Zertifizierter Lehrgang für PV-Anlagen und E-Mobilität. Anmeldung erforderlich.',
+ maxTeilnehmer: 20,
+ createdAt: new Date('2025-12-01'),
+ isAngemeldet: false,
+ teilnehmerAnzahl: 14,
+ anmeldungen: [],
+ },
+]
+
+export const MOCK_STELLEN = [
+ {
+ id: 'stelle-1',
+ orgId: 'org-1',
+ memberId: 'member-1',
+ sparte: 'Elektrotechnik',
+ stellenAnz: 2,
+ verguetung: '620-750 € / Monat',
+ lehrjahr: 'beliebig',
+ beschreibung: 'Wir suchen motivierte Auszubildende für unser erfolgreiches Elektroinstallationsunternehmen. Moderner Fuhrpark, faire Vergütung, Übernahmechancen.',
+ kontaktEmail: 'mueller@elektro-mueller.de',
+ kontaktName: 'Klaus Müller',
+ aktiv: true,
+ createdAt: new Date('2025-09-01'),
+ updatedAt: new Date('2025-09-01'),
+ member: { betrieb: 'Elektro Müller GmbH', ort: 'Stuttgart' },
+ org: { name: 'Innung Elektrotechnik Stuttgart', slug: 'innung-elektro-stuttgart' },
+ },
+ {
+ id: 'stelle-2',
+ orgId: 'org-1',
+ memberId: 'member-3',
+ sparte: 'Informationstechnik',
+ stellenAnz: 1,
+ verguetung: '650-800 € / Monat',
+ lehrjahr: '1. Lehrjahr',
+ beschreibung: 'Weber & Söhne sucht einen Auszubildenden im Bereich IT-Systemelektronik. Gute Übernahmechancen nach erfolgreichem Abschluss.',
+ kontaktEmail: 'weber@weber-elektro.de',
+ kontaktName: 'Thomas Weber',
+ aktiv: true,
+ createdAt: new Date('2025-10-01'),
+ updatedAt: new Date('2025-10-01'),
+ member: { betrieb: 'Weber & Söhne Elektro', ort: 'Esslingen' },
+ org: { name: 'Innung Elektrotechnik Stuttgart', slug: 'innung-elektro-stuttgart' },
+ },
+ {
+ id: 'stelle-3',
+ orgId: 'org-1',
+ memberId: 'member-5',
+ sparte: 'Sanitär',
+ stellenAnz: 3,
+ verguetung: '580-700 € / Monat',
+ lehrjahr: 'beliebig',
+ beschreibung: 'Familienbetrieb sucht Auszubildende für Sanitär- und Heizungsinstallation.',
+ kontaktEmail: 'hoffmann@elektro-service.de',
+ kontaktName: 'Peter Hoffmann',
+ aktiv: true,
+ createdAt: new Date('2025-11-01'),
+ updatedAt: new Date('2025-11-01'),
+ member: { betrieb: 'Hoffmann Elektro-Service', ort: 'Böblingen' },
+ org: { name: 'Innung Elektrotechnik Stuttgart', slug: 'innung-elektro-stuttgart' },
+ },
+]
diff --git a/innungsapp/apps/mobile/lib/notifications.ts b/innungsapp/apps/mobile/lib/notifications.ts
index 0b62a78..63b7c8b 100644
--- a/innungsapp/apps/mobile/lib/notifications.ts
+++ b/innungsapp/apps/mobile/lib/notifications.ts
@@ -8,6 +8,8 @@ Notifications.setNotificationHandler({
shouldShowAlert: true,
shouldPlaySound: true,
shouldSetBadge: true,
+ shouldShowBanner: true,
+ shouldShowList: true,
}),
})
diff --git a/innungsapp/apps/mobile/lib/theme.config.ts b/innungsapp/apps/mobile/lib/theme.config.ts
new file mode 100644
index 0000000..061d215
--- /dev/null
+++ b/innungsapp/apps/mobile/lib/theme.config.ts
@@ -0,0 +1,43 @@
+export const themeConfig = {
+ colors: {
+ // Brand Colors
+ primary: '#2563EB', // Vibrant Blue
+ primaryForeground: '#FFFFFF',
+
+ // UI Colors
+ background: '#FFFFFF',
+ foreground: '#0F172A', // Slate 900
+
+ card: '#FFFFFF',
+ cardForeground: '#0F172A',
+
+ popover: '#FFFFFF',
+ popoverForeground: '#0F172A',
+
+ secondary: '#F1F5F9', // Slate 100
+ secondaryForeground: '#0F172A',
+
+ muted: '#F1F5F9',
+ mutedForeground: '#64748B', // Slate 500
+
+ accent: '#F1F5F9',
+ accentForeground: '#0F172A',
+
+ destructive: '#EF4444', // Red 500
+ destructiveForeground: '#FFFFFF',
+
+ border: '#E2E8F0', // Slate 200
+ input: '#E2E8F0',
+ ring: '#2563EB',
+ },
+ layout: {
+ radius: {
+ small: 4,
+ medium: 8,
+ large: 12,
+ xl: 16,
+ '2xl': 24,
+ full: 9999,
+ }
+ }
+} as const;
diff --git a/innungsapp/apps/mobile/lib/trpc.ts b/innungsapp/apps/mobile/lib/trpc.tsx
similarity index 85%
rename from innungsapp/apps/mobile/lib/trpc.ts
rename to innungsapp/apps/mobile/lib/trpc.tsx
index 5e77025..e5dfaf1 100644
--- a/innungsapp/apps/mobile/lib/trpc.ts
+++ b/innungsapp/apps/mobile/lib/trpc.tsx
@@ -36,9 +36,11 @@ const trpcClient = trpc.createClient({
})
export function TRPCProvider({ children }: { children: ReactNode }) {
- return createElement(
- trpc.Provider,
- { client: trpcClient, queryClient },
- createElement(QueryClientProvider, { client: queryClient }, children)
+ return (
+
+
+ {children}
+
+
)
}
diff --git a/innungsapp/apps/mobile/lib/utils.ts b/innungsapp/apps/mobile/lib/utils.ts
new file mode 100644
index 0000000..defdf50
--- /dev/null
+++ b/innungsapp/apps/mobile/lib/utils.ts
@@ -0,0 +1,6 @@
+import { type ClassValue, clsx } from 'clsx';
+import { twMerge } from 'tailwind-merge';
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs));
+}
diff --git a/innungsapp/apps/mobile/metro.config.js b/innungsapp/apps/mobile/metro.config.js
index f4ceb6b..581a98a 100644
--- a/innungsapp/apps/mobile/metro.config.js
+++ b/innungsapp/apps/mobile/metro.config.js
@@ -1,6 +1,43 @@
+const path = require('path')
+const { createRequire } = require('module')
const { getDefaultConfig } = require('expo/metro-config')
-const { withNativeWind } = require('nativewind/metro')
-const config = getDefaultConfig(__dirname)
+const projectRoot = __dirname
+const workspaceRoot = path.resolve(projectRoot, '../..')
+const appRequire = createRequire(path.join(projectRoot, 'package.json'))
+const reactEntry = appRequire.resolve('react')
+const reactJsxRuntime = appRequire.resolve('react/jsx-runtime')
+const reactJsxDevRuntime = appRequire.resolve('react/jsx-dev-runtime')
+const reactRoot = path.dirname(appRequire.resolve('react/package.json'))
+const reactNativeRoot = path.dirname(appRequire.resolve('react-native/package.json'))
-module.exports = withNativeWind(config, { input: './global.css' })
+const config = getDefaultConfig(projectRoot)
+
+// Monorepo: Metro muss die Workspace-Pakete finden
+config.watchFolders = [workspaceRoot]
+config.resolver.nodeModulesPaths = [
+ path.resolve(projectRoot, 'node_modules'),
+ path.resolve(workspaceRoot, 'node_modules'),
+]
+config.resolver.extraNodeModules = {
+ ...(config.resolver.extraNodeModules || {}),
+ react: reactRoot,
+ 'react-native': reactNativeRoot,
+}
+const originalResolveRequest = config.resolver.resolveRequest
+config.resolver.resolveRequest = (context, moduleName, platform) => {
+ if (moduleName === 'react') {
+ return { type: 'sourceFile', filePath: reactEntry }
+ }
+ if (moduleName === 'react/jsx-runtime') {
+ return { type: 'sourceFile', filePath: reactJsxRuntime }
+ }
+ if (moduleName === 'react/jsx-dev-runtime') {
+ return { type: 'sourceFile', filePath: reactJsxDevRuntime }
+ }
+
+ const resolver = originalResolveRequest ?? context.resolveRequest
+ return resolver(context, moduleName, platform)
+}
+
+module.exports = config
diff --git a/innungsapp/apps/mobile/metro/react-native-css-interop-metro.js b/innungsapp/apps/mobile/metro/react-native-css-interop-metro.js
new file mode 100644
index 0000000..3740921
--- /dev/null
+++ b/innungsapp/apps/mobile/metro/react-native-css-interop-metro.js
@@ -0,0 +1,289 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.withCssInterop = withCssInterop;
+const fs_1 = __importDefault(require("fs"));
+const promises_1 = __importDefault(require("fs/promises"));
+const path_1 = __importDefault(require("path"));
+const module_1 = require("module");
+const nativewindRequire = (0, module_1.createRequire)(require.resolve("nativewind/metro"));
+const connect_1 = __importDefault(nativewindRequire("connect"));
+const debug_1 = nativewindRequire("debug");
+const css_to_rn_1 = nativewindRequire("react-native-css-interop/dist/css-to-rn");
+const expo_1 = nativewindRequire("react-native-css-interop/dist/metro/expo");
+let haste;
+let virtualModulesPossible = undefined;
+const virtualModules = new Map();
+const outputDirectory = path_1.default.resolve(__dirname, "../.cache/react-native-css-interop");
+const isRadonIDE = "REACT_NATIVE_IDE_LIB_PATH" in process.env;
+function withCssInterop(config, options) {
+ return typeof config === "function"
+ ? async function WithCSSInterop() {
+ return getConfig(await config(), options);
+ }
+ : getConfig(config, options);
+}
+function getConfig(config, options) {
+ const debug = (0, debug_1.debug)(options.parent?.name || "react-native-css-interop");
+ debug("withCssInterop");
+ debug(`outputDirectory ${outputDirectory}`);
+ debug(`isRadonIDE: ${isRadonIDE}`);
+ (0, expo_1.expoColorSchemeWarning)();
+ const originalResolver = config.resolver?.resolveRequest;
+ const originalGetTransformOptions = config.transformer?.getTransformOptions;
+ const originalMiddleware = config.server?.enhanceMiddleware;
+ const poisonPillPath = "./interop-poison.pill";
+ fs_1.default.mkdirSync(outputDirectory, { recursive: true });
+ fs_1.default.writeFileSync(platformPath("ios"), "");
+ fs_1.default.writeFileSync(platformPath("android"), "");
+ fs_1.default.writeFileSync(platformPath("native"), "");
+ fs_1.default.writeFileSync(platformPath("macos"), "");
+ fs_1.default.writeFileSync(platformPath("windows"), "");
+ return {
+ ...config,
+ transformerPath: require.resolve("react-native-css-interop/dist/metro/transformer"),
+ transformer: {
+ ...config.transformer,
+ ...{
+ cssInterop_transformerPath: config.transformerPath,
+ cssInterop_outputDirectory: path_1.default.relative(process.cwd(), outputDirectory),
+ },
+ async getTransformOptions(entryPoints, transformOptions, getDependenciesOf) {
+ debug(`getTransformOptions.dev ${transformOptions.dev}`);
+ debug(`getTransformOptions.platform ${transformOptions.platform}`);
+ debug(`getTransformOptions.virtualModulesPossible ${Boolean(virtualModulesPossible)}`);
+ const platform = transformOptions.platform || "native";
+ const filePath = platformPath(platform);
+ if (virtualModulesPossible) {
+ await virtualModulesPossible;
+ await startCSSProcessor(filePath, platform, transformOptions.dev, options, debug);
+ }
+ const writeToFileSystem = !virtualModulesPossible || !transformOptions.dev;
+ debug(`getTransformOptions.writeToFileSystem ${writeToFileSystem}`);
+ if (writeToFileSystem) {
+ debug(`getTransformOptions.output ${filePath}`);
+ const watchFn = isRadonIDE
+ ? async (css) => {
+ const output = platform === "web"
+ ? css.toString()
+ : getNativeJS((0, css_to_rn_1.cssToReactNativeRuntime)(css, options, debug), debug);
+ await promises_1.default.writeFile(filePath, output);
+ }
+ : undefined;
+ const css = await options.getCSSForPlatform(platform, watchFn);
+ const output = platform === "web"
+ ? css.toString("utf-8")
+ : getNativeJS((0, css_to_rn_1.cssToReactNativeRuntime)(css, options, debug), debug);
+ await promises_1.default.mkdir(outputDirectory, { recursive: true });
+ await promises_1.default.writeFile(filePath, output);
+ if (platform !== "web") {
+ await promises_1.default.writeFile(filePath.replace(/\.js$/, ".map"), "");
+ }
+ debug(`getTransformOptions.finished`);
+ }
+ return Object.assign({}, await originalGetTransformOptions?.(entryPoints, transformOptions, getDependenciesOf));
+ },
+ },
+ server: {
+ ...config.server,
+ enhanceMiddleware: (middleware, metroServer) => {
+ debug(`enhanceMiddleware.setup`);
+ const server = (0, connect_1.default)();
+ const bundler = metroServer.getBundler().getBundler();
+ if (options.forceWriteFileSystem) {
+ debug(`forceWriteFileSystem true`);
+ }
+ else {
+ if (!isRadonIDE) {
+ virtualModulesPossible = bundler
+ .getDependencyGraph()
+ .then(async (graph) => {
+ haste = graph?._haste;
+ if (graph?._fileSystem) {
+ ensureFileSystemPatched(graph._fileSystem);
+ }
+ ensureBundlerPatched(bundler);
+ });
+ server.use(async (_, __, next) => {
+ await virtualModulesPossible;
+ next();
+ });
+ }
+ }
+ return originalMiddleware
+ ? server.use(originalMiddleware(middleware, metroServer))
+ : server.use(middleware);
+ },
+ },
+ resolver: {
+ ...config.resolver,
+ sourceExts: [...(config?.resolver?.sourceExts || []), "css"],
+ resolveRequest: (context, moduleName, platform) => {
+ if (moduleName === poisonPillPath) {
+ return { type: "empty" };
+ }
+ const resolver = originalResolver ?? context.resolveRequest;
+ const resolved = resolver(context, moduleName, platform);
+ if (!("filePath" in resolved && resolved.filePath === options.input)) {
+ return resolved;
+ }
+ platform = platform || "native";
+ const filePath = platformPath(platform);
+ const development = context.isDev || context.dev;
+ const isWebProduction = !development && platform === "web";
+ debug(`resolveRequest.input ${resolved.filePath}`);
+ debug(`resolveRequest.resolvedTo: ${filePath}`);
+ debug(`resolveRequest.development: ${development}`);
+ debug(`resolveRequest.platform: ${platform}`);
+ if (virtualModulesPossible && !isWebProduction) {
+ startCSSProcessor(filePath, platform, development, options, debug);
+ }
+ return {
+ ...resolved,
+ filePath,
+ };
+ },
+ },
+ };
+}
+async function startCSSProcessor(filePath, platform, isDev, { input, getCSSForPlatform, ...options }, debug) {
+ if (virtualModules.has(filePath)) {
+ return;
+ }
+ debug(`virtualModules ${filePath}`);
+ debug(`virtualModules.isDev ${isDev}`);
+ debug(`virtualModules.size ${virtualModules.size}`);
+ options = {
+ cache: {
+ keyframes: new Map(),
+ rules: new Map(),
+ rootVariables: {},
+ universalVariables: {},
+ },
+ ...options,
+ };
+ if (!isDev) {
+ debug(`virtualModules.fastRefresh disabled`);
+ virtualModules.set(filePath, getCSSForPlatform(platform).then((css) => {
+ return platform === "web"
+ ? css
+ : getNativeJS((0, css_to_rn_1.cssToReactNativeRuntime)(css, options), debug);
+ }));
+ }
+ else {
+ debug(`virtualModules.fastRefresh enabled`);
+ virtualModules.set(filePath, getCSSForPlatform(platform, (css) => {
+ debug(`virtualStyles.update ${platform}`);
+ virtualModules.set(filePath, Promise.resolve(platform === "web"
+ ? css
+ : getNativeJS((0, css_to_rn_1.cssToReactNativeRuntime)(css, options), debug)));
+ debug(`virtualStyles.emit ${platform}`);
+ if (haste?.emit) {
+ haste.emit("change", {
+ eventsQueue: [
+ {
+ filePath,
+ metadata: {
+ modifiedTime: Date.now(),
+ size: 1,
+ type: "virtual",
+ },
+ type: "change",
+ },
+ ],
+ });
+ }
+ }).then((css) => {
+ debug(`virtualStyles.initial ${platform}`);
+ return platform === "web"
+ ? css
+ : getNativeJS((0, css_to_rn_1.cssToReactNativeRuntime)(css, options), debug);
+ }));
+ }
+}
+function ensureFileSystemPatched(fs) {
+ if (!fs || typeof fs.getSha1 !== "function") {
+ return fs;
+ }
+ if (!fs.getSha1.__css_interop_patched) {
+ const original_getSha1 = fs.getSha1.bind(fs);
+ fs.getSha1 = (filename) => {
+ if (virtualModules.has(filename)) {
+ return `${filename}-${Date.now()}`;
+ }
+ return original_getSha1(filename);
+ };
+ fs.getSha1.__css_interop_patched = true;
+ }
+ return fs;
+}
+function ensureBundlerPatched(bundler) {
+ if (bundler.transformFile.__css_interop__patched) {
+ return;
+ }
+ const transformFile = bundler.transformFile.bind(bundler);
+ bundler.transformFile = async function (filePath, transformOptions, fileBuffer) {
+ const virtualModule = virtualModules.get(filePath);
+ if (virtualModule) {
+ fileBuffer = Buffer.from(await virtualModule);
+ }
+ return transformFile(filePath, transformOptions, fileBuffer);
+ };
+ bundler.transformFile.__css_interop__patched = true;
+}
+function getNativeJS(data = {}, debug) {
+ debug("Start stringify");
+ const output = `(${stringify(data)})`;
+ debug(`Output size: ${Buffer.byteLength(output, "utf8")} bytes`);
+ return output;
+}
+function platformPath(platform = "native") {
+ return path_1.default.join(outputDirectory, `${platform}.${platform === "web" ? "css" : "js"}`);
+}
+function stringify(data) {
+ switch (typeof data) {
+ case "bigint":
+ case "symbol":
+ case "function":
+ throw new Error(`Cannot stringify ${typeof data}`);
+ case "string":
+ return `"${data}"`;
+ case "number":
+ return `${Math.round(data * 1000) / 1000}`;
+ case "boolean":
+ return `${data}`;
+ case "undefined":
+ return "null";
+ case "object": {
+ if (data === null) {
+ return "null";
+ }
+ else if (Array.isArray(data)) {
+ return `[${data
+ .map((value) => {
+ return value === null || value === undefined
+ ? ""
+ : stringify(value);
+ })
+ .join(",")}]`;
+ }
+ else {
+ return `{${Object.entries(data)
+ .flatMap(([key, value]) => {
+ if (value === null || value === undefined) {
+ return [];
+ }
+ if (key.match(/[^a-zA-Z]/)) {
+ key = `"${key}"`;
+ }
+ value = stringify(value);
+ return [`${key}:${value}`];
+ })
+ .join(",")}}`;
+ }
+ }
+ }
+}
+//# sourceMappingURL=index.js.map
diff --git a/innungsapp/apps/mobile/nativewind-env.d.ts b/innungsapp/apps/mobile/nativewind-env.d.ts
new file mode 100644
index 0000000..c0d8380
--- /dev/null
+++ b/innungsapp/apps/mobile/nativewind-env.d.ts
@@ -0,0 +1,3 @@
+///
+
+// NOTE: This file should not be edited and should be committed with your source code. It is generated by NativeWind.
\ No newline at end of file
diff --git a/innungsapp/apps/mobile/package.json b/innungsapp/apps/mobile/package.json
index 7ae1b24..f141d62 100644
--- a/innungsapp/apps/mobile/package.json
+++ b/innungsapp/apps/mobile/package.json
@@ -11,42 +11,48 @@
"type-check": "tsc --noEmit"
},
"dependencies": {
- "@expo/vector-icons": "^14.0.0",
- "@react-native-async-storage/async-storage": "^2.1.0",
+ "@expo/metro-runtime": "~6.1.2",
+ "@expo/vector-icons": "^15.0.3",
+ "@innungsapp/shared": "workspace:*",
+ "@react-native-async-storage/async-storage": "^2.2.0",
"@tanstack/react-query": "^5.59.0",
"@trpc/client": "^11.0.0",
"@trpc/react-query": "^11.0.0",
"better-auth": "^1.2.0",
- "expo": "~52.0.0",
- "expo-calendar": "~13.0.0",
- "expo-constants": "~17.0.0",
- "expo-dev-client": "~5.0.0",
- "expo-document-picker": "~13.0.0",
- "expo-font": "~13.0.0",
- "expo-haptics": "~14.0.0",
- "expo-linking": "~7.0.0",
- "expo-notifications": "~0.29.0",
- "expo-router": "~4.0.0",
- "expo-splash-screen": "~0.29.0",
- "expo-status-bar": "~2.0.0",
- "expo-system-ui": "~4.0.0",
- "expo-web-browser": "~14.0.0",
- "nativewind": "^4.1.0",
- "react": "18.3.1",
- "react-native": "0.76.1",
- "react-native-safe-area-context": "4.12.0",
- "react-native-screens": "~4.0.0",
- "react-native-reanimated": "~3.16.0",
- "react-native-gesture-handler": "~2.21.0",
- "superjson": "^2.2.1",
- "zustand": "^5.0.0",
+ "clsx": "^2.1.1",
"date-fns": "^3.6.0",
- "zod": "^3.23.0"
+ "expo": "~54.0.33",
+ "expo-calendar": "~15.0.8",
+ "expo-constants": "~18.0.13",
+ "expo-dev-client": "~6.0.20",
+ "expo-document-picker": "~14.0.8",
+ "expo-font": "~14.0.11",
+ "expo-haptics": "~15.0.8",
+ "expo-linking": "~8.0.11",
+ "expo-notifications": "~0.32.16",
+ "expo-router": "~6.0.23",
+ "expo-splash-screen": "~31.0.13",
+ "expo-status-bar": "~3.0.9",
+ "expo-system-ui": "~6.0.9",
+ "expo-web-browser": "~15.0.10",
+ "nativewind": "^4.1.0",
+ "react": "19.1.0",
+ "react-native": "0.81.5",
+ "react-native-gesture-handler": "~2.28.0",
+ "react-native-reanimated": "~4.1.6",
+ "react-native-safe-area-context": "5.6.2",
+ "react-native-screens": "~4.16.0",
+ "superjson": "^2.2.1",
+ "tailwind-merge": "^2.5.0",
+ "zod": "^3.23.0",
+ "zustand": "^5.0.0"
},
"devDependencies": {
"@babel/core": "^7.25.0",
- "@types/react": "~18.3.0",
+ "@innungsapp/admin": "workspace:*",
+ "@types/react": "~19.1.17",
+ "eslint-config-expo": "~10.0.0",
"tailwindcss": "^3.4.0",
- "typescript": "^5.6.0"
+ "typescript": "^5.9.3"
}
}
diff --git a/innungsapp/apps/mobile/store/auth.store.ts b/innungsapp/apps/mobile/store/auth.store.ts
index 670a933..fee4c30 100644
--- a/innungsapp/apps/mobile/store/auth.store.ts
+++ b/innungsapp/apps/mobile/store/auth.store.ts
@@ -1,58 +1,34 @@
import { create } from 'zustand'
-import { authClient } from '@/lib/auth-client'
-import AsyncStorage from '@react-native-async-storage/async-storage'
+import { MOCK_MEMBER_ME } from '@/lib/mock-data'
interface Session {
- user: {
- id: string
- email: string
- name: string
- }
- token?: string
+ user: { id: string; email: string; name: string }
}
interface AuthState {
session: Session | null
- orgId: string | null
- role: 'admin' | 'member' | null
isInitialized: boolean
initialize: () => Promise
- setSession: (session: Session | null) => void
signOut: () => Promise
}
export const useAuthStore = create((set) => ({
- session: null,
- orgId: null,
- role: null,
- isInitialized: false,
+ // Mock: direkt eingeloggt
+ session: {
+ user: {
+ id: MOCK_MEMBER_ME.userId!,
+ email: MOCK_MEMBER_ME.email,
+ name: MOCK_MEMBER_ME.name,
+ },
+ },
+ isInitialized: true,
initialize: async () => {
- try {
- const { data } = await authClient.getSession()
- if (data?.session && data?.user) {
- set({
- session: { user: data.user },
- isInitialized: true,
- })
- // Store token for API requests
- if (data.session.token) {
- await AsyncStorage.setItem('better-auth-session', data.session.token)
- }
- } else {
- await AsyncStorage.removeItem('better-auth-session')
- set({ session: null, orgId: null, role: null, isInitialized: true })
- }
- } catch {
- set({ session: null, isInitialized: true })
- }
+ // Mock: nichts zu tun
+ set({ isInitialized: true })
},
- setSession: (session) => set({ session }),
-
signOut: async () => {
- await authClient.signOut()
- await AsyncStorage.removeItem('better-auth-session')
- set({ session: null, orgId: null, role: null })
+ set({ session: null })
},
}))
diff --git a/innungsapp/apps/mobile/tailwind.config.js b/innungsapp/apps/mobile/tailwind.config.js
index 218b632..3e782ce 100644
--- a/innungsapp/apps/mobile/tailwind.config.js
+++ b/innungsapp/apps/mobile/tailwind.config.js
@@ -3,16 +3,67 @@ module.exports = {
content: ['./app/**/*.{js,jsx,ts,tsx}', './components/**/*.{js,jsx,ts,tsx}'],
presets: [require('nativewind/preset')],
theme: {
+ container: {
+ center: true,
+ padding: "2rem",
+ screens: {
+ "2xl": "1400px",
+ },
+ },
extend: {
colors: {
- brand: {
- 50: '#fff1f1',
- 100: '#ffe1e1',
- 400: '#ff6b6b',
- 500: '#E63946',
- 600: '#d42535',
- 700: '#b21e2c',
+ border: "hsl(var(--border))",
+ input: "hsl(var(--input))",
+ ring: "hsl(var(--ring))",
+ background: "hsl(var(--background))",
+ foreground: "hsl(var(--foreground))",
+ primary: {
+ DEFAULT: "hsl(var(--primary))",
+ foreground: "hsl(var(--primary-foreground))",
},
+ secondary: {
+ DEFAULT: "hsl(var(--secondary))",
+ foreground: "hsl(var(--secondary-foreground))",
+ },
+ destructive: {
+ DEFAULT: "hsl(var(--destructive))",
+ foreground: "hsl(var(--destructive-foreground))",
+ },
+ muted: {
+ DEFAULT: "hsl(var(--muted))",
+ foreground: "hsl(var(--muted-foreground))",
+ },
+ accent: {
+ DEFAULT: "hsl(var(--accent))",
+ foreground: "hsl(var(--accent-foreground))",
+ },
+ popover: {
+ DEFAULT: "hsl(var(--popover))",
+ foreground: "hsl(var(--popover-foreground))",
+ },
+ card: {
+ DEFAULT: "hsl(var(--card))",
+ foreground: "hsl(var(--card-foreground))",
+ },
+ },
+ borderRadius: {
+ lg: "var(--radius)",
+ md: "calc(var(--radius) - 2px)",
+ sm: "calc(var(--radius) - 4px)",
+ },
+ keyframes: {
+ "accordion-down": {
+ from: { height: "0" },
+ to: { height: "var(--radix-accordion-content-height)" },
+ },
+ "accordion-up": {
+ from: { height: "var(--radix-accordion-content-height)" },
+ to: { height: "0" },
+ },
+ },
+ animation: {
+ "accordion-down": "accordion-down 0.2s ease-out",
+ "accordion-up": "accordion-up 0.2s ease-out",
},
},
},
diff --git a/innungsapp/apps/mobile/tsc_output.txt b/innungsapp/apps/mobile/tsc_output.txt
new file mode 100644
index 0000000..490d143
Binary files /dev/null and b/innungsapp/apps/mobile/tsc_output.txt differ
diff --git a/innungsapp/apps/mobile/tsc_output_2.txt b/innungsapp/apps/mobile/tsc_output_2.txt
new file mode 100644
index 0000000..4b4c784
--- /dev/null
+++ b/innungsapp/apps/mobile/tsc_output_2.txt
@@ -0,0 +1,10 @@
+../admin/server/context.ts(2,22): error TS2307: Cannot find module '@/lib/auth' or its corresponding type declarations.
+../admin/server/routers/members.ts(3,22): error TS2307: Cannot find module '@/lib/auth' or its corresponding type declarations.
+../admin/server/routers/members.ts(4,33): error TS2307: Cannot find module '@/lib/email' or its corresponding type declarations.
+../admin/server/routers/news.ts(3,10): error TS2724: '"@/lib/notifications"' has no exported member named 'sendPushNotifications'. Did you mean 'setupPushNotifications'?
+lib/notifications.ts(7,35): error TS2322: Type 'Promise<{ shouldShowAlert: true; shouldPlaySound: true; shouldSetBadge: true; }>' is not assignable to type 'Promise'.
+ Type '{ shouldShowAlert: true; shouldPlaySound: true; shouldSetBadge: true; }' is missing the following properties from type 'NotificationBehavior': shouldShowBanner, shouldShowList
+lib/trpc.ts(41,5): error TS2769: No overload matches this call.
+ The last overload gave the following error.
+ Argument of type '{ client: TRPCClient; }; meta: object; errorShape: { ...; }; transformer: true; }, DecorateCreateRouterOptions<...>>>; queryClient: QueryClient; }' is not assignable to parameter of type 'Attributes & TRPCProviderProps; }; meta: object; errorShape: { ...; }; transformer: true; }, DecorateCreateRouterOptions<...>>, unknown>'.
+ Property 'children' is missing in type '{ client: TRPCClient; }; meta: object; errorShape: { ...; }; transformer: true; }, DecorateCreateRouterOptions<...>>>; queryClient: QueryClient; }' but required in type 'TRPCProviderProps; }; meta: object; errorShape: { ...; }; transformer: true; }, DecorateCreateRouterOptions<...>>, unknown>'.
diff --git a/innungsapp/apps/mobile/tsc_output_utf8.txt b/innungsapp/apps/mobile/tsc_output_utf8.txt
new file mode 100644
index 0000000..03a7e5f
--- /dev/null
+++ b/innungsapp/apps/mobile/tsc_output_utf8.txt
@@ -0,0 +1,32 @@
+../admin/server/context.ts(2,22): error TS2307: Cannot find module '@/lib/auth' or its corresponding type declarations.
+../admin/server/routers/members.ts(3,22): error TS2307: Cannot find module '@/lib/auth' or its corresponding type declarations.
+../admin/server/routers/members.ts(4,33): error TS2307: Cannot find module '@/lib/email' or its corresponding type declarations.
+../admin/server/routers/news.ts(3,10): error TS2724: '"@/lib/notifications"' has no exported member named 'sendPushNotifications'. Did you mean 'setupPushNotifications'?
+../admin/server/routers/news.ts(45,24): error TS7006: Parameter 'n' implicitly has an 'any' type.
+../admin/server/routers/termine.ts(55,27): error TS7006: Parameter 't' implicitly has an 'any' type.
+../admin/server/routers/termine.ts(58,33): error TS7006: Parameter 'a' implicitly has an 'any' type.
+../admin/server/routers/termine.ts(87,36): error TS7006: Parameter 'a' implicitly has an 'any' type.
+../admin/server/routers/termine.ts(115,10): error TS7006: Parameter 'a' implicitly has an 'any' type.
+lib/notifications.ts(7,35): error TS2322: Type 'Promise<{ shouldShowAlert: true; shouldPlaySound: true; shouldSetBadge: true; }>' is not assignable to type 'Promise'.
+ Type '{ shouldShowAlert: true; shouldPlaySound: true; shouldSetBadge: true; }' is missing the following properties from type 'NotificationBehavior': shouldShowBanner, shouldShowList
+lib/trpc.ts(41,5): error TS2769: No overload matches this call.
+ The last overload gave the following error.
+ Argument of type '{ client: TRPCClient | null; code: TRPC_ERROR_CODE_KEY; httpStatus: number; path?: string; stack?: string; }; message: string; code: TRPC_ERROR_CODE_NUMBER; }; transformer:...' is not assignable to parameter of type 'Attributes & TRPCProviderProps | null; code: "PARSE_ERROR" | ... 19 more ... | "CLIENT_CLOSED_REQUEST"; httpStatus: number; path?: string | undefined; stack?: string | unde...'.
+ Property 'children' is missing in type '{ client: TRPCClient | null; code: TRPC_ERROR_CODE_KEY; httpStatus: number; path?: string; stack?: string; }; message: string; code: TRPC_ERROR_CODE_NUMBER; }; transformer:...' but required in type 'TRPCProviderProps | null; code: "PARSE_ERROR" | ... 19 more ... | "CLIENT_CLOSED_REQUEST"; httpStatus: number; path?: string | undefined; stack?: string | undefined; }; mes...'.
+../../packages/shared/src/types/index.ts(3,3): error TS2305: Module '"@prisma/client"' has no exported member 'User'.
+../../packages/shared/src/types/index.ts(4,3): error TS2305: Module '"@prisma/client"' has no exported member 'Session'.
+../../packages/shared/src/types/index.ts(5,3): error TS2305: Module '"@prisma/client"' has no exported member 'Account'.
+../../packages/shared/src/types/index.ts(6,3): error TS2305: Module '"@prisma/client"' has no exported member 'Organization'.
+../../packages/shared/src/types/index.ts(7,3): error TS2305: Module '"@prisma/client"' has no exported member 'Member'.
+../../packages/shared/src/types/index.ts(8,3): error TS2305: Module '"@prisma/client"' has no exported member 'UserRole'.
+../../packages/shared/src/types/index.ts(9,3): error TS2305: Module '"@prisma/client"' has no exported member 'News'.
+../../packages/shared/src/types/index.ts(10,3): error TS2305: Module '"@prisma/client"' has no exported member 'NewsRead'.
+../../packages/shared/src/types/index.ts(11,3): error TS2305: Module '"@prisma/client"' has no exported member 'NewsAttachment'.
+../../packages/shared/src/types/index.ts(12,3): error TS2305: Module '"@prisma/client"' has no exported member 'Stelle'.
+../../packages/shared/src/types/index.ts(13,3): error TS2305: Module '"@prisma/client"' has no exported member 'Termin'.
+../../packages/shared/src/types/index.ts(14,3): error TS2305: Module '"@prisma/client"' has no exported member 'TerminAnmeldung'.
+../../packages/shared/src/types/index.ts(15,3): error TS2305: Module '"@prisma/client"' has no exported member 'Plan'.
+../../packages/shared/src/types/index.ts(16,3): error TS2305: Module '"@prisma/client"' has no exported member 'MemberStatus'.
+../../packages/shared/src/types/index.ts(17,3): error TS2305: Module '"@prisma/client"' has no exported member 'OrgRole'.
+../../packages/shared/src/types/index.ts(18,3): error TS2305: Module '"@prisma/client"' has no exported member 'NewsKategorie'.
+../../packages/shared/src/types/index.ts(19,3): error TS2305: Module '"@prisma/client"' has no exported member 'TerminTyp'.
diff --git a/innungsapp/apps/mobile/tsconfig.json b/innungsapp/apps/mobile/tsconfig.json
index 4a8cc52..f1c8739 100644
--- a/innungsapp/apps/mobile/tsconfig.json
+++ b/innungsapp/apps/mobile/tsconfig.json
@@ -4,8 +4,17 @@
"strict": true,
"baseUrl": ".",
"paths": {
- "@/*": ["./*"]
+ "@/*": [
+ "./*"
+ ]
}
},
- "include": ["**/*.ts", "**/*.tsx", ".expo/types/**/*.d.ts", "expo-env.d.ts"]
+ "include": [
+ "**/*.ts",
+ "**/*.tsx",
+ ".expo/types/**/*.d.ts",
+ ".expo/types/**/*.ts",
+ "expo-env.d.ts",
+ "nativewind-env.d.ts"
+ ]
}
diff --git a/innungsapp/package.json b/innungsapp/package.json
index c0d8d20..f76907f 100644
--- a/innungsapp/package.json
+++ b/innungsapp/package.json
@@ -15,7 +15,8 @@
},
"devDependencies": {
"turbo": "^2.3.0",
- "typescript": "^5.6.0"
+ "typescript": "^5.6.0",
+ "undici": "6.23.0"
},
"packageManager": "pnpm@9.12.0",
"engines": {
diff --git a/innungsapp/pnpm-lock.yaml b/innungsapp/pnpm-lock.yaml
new file mode 100644
index 0000000..d40db00
--- /dev/null
+++ b/innungsapp/pnpm-lock.yaml
@@ -0,0 +1,12497 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ devDependencies:
+ turbo:
+ specifier: ^2.3.0
+ version: 2.8.10
+ typescript:
+ specifier: ^5.6.0
+ version: 5.9.3
+ undici:
+ specifier: 6.23.0
+ version: 6.23.0
+
+ apps/admin:
+ dependencies:
+ '@innungsapp/shared':
+ specifier: workspace:*
+ version: link:../../packages/shared
+ '@tanstack/react-query':
+ specifier: ^5.59.0
+ version: 5.90.21(react@18.3.1)
+ '@trpc/client':
+ specifier: ^11.0.0
+ version: 11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3)
+ '@trpc/react-query':
+ specifier: ^11.0.0
+ version: 11.10.0(@tanstack/react-query@5.90.21(react@18.3.1))(@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.10.0(typescript@5.9.3))(react@18.3.1)(typescript@5.9.3)
+ '@trpc/server':
+ specifier: ^11.0.0
+ version: 11.10.0(typescript@5.9.3)
+ '@uiw/react-md-editor':
+ specifier: ^4.0.4
+ version: 4.0.11(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ better-auth:
+ specifier: ^1.2.0
+ version: 1.4.18(@prisma/client@5.22.0(prisma@5.22.0))(next@15.5.12(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(prisma@5.22.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
+ date-fns:
+ specifier: ^3.6.0
+ version: 3.6.0
+ lucide-react:
+ specifier: ^0.460.0
+ version: 0.460.0(react@18.3.1)
+ next:
+ specifier: ^15.0.0
+ version: 15.5.12(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ nodemailer:
+ specifier: ^6.9.0
+ version: 6.10.1
+ react:
+ specifier: ^18.3.0
+ version: 18.3.1
+ react-dom:
+ specifier: ^18.3.0
+ version: 18.3.1(react@18.3.1)
+ superjson:
+ specifier: ^2.2.1
+ version: 2.2.6
+ tailwind-merge:
+ specifier: ^2.5.0
+ version: 2.6.1
+ zod:
+ specifier: ^3.23.0
+ version: 3.25.76
+ devDependencies:
+ '@types/node':
+ specifier: ^22.0.0
+ version: 22.19.11
+ '@types/nodemailer':
+ specifier: ^6.4.17
+ version: 6.4.22
+ '@types/react':
+ specifier: ^18.3.0
+ version: 18.3.28
+ '@types/react-dom':
+ specifier: ^18.3.0
+ version: 18.3.7(@types/react@18.3.28)
+ autoprefixer:
+ specifier: ^10.4.0
+ version: 10.4.24(postcss@8.5.6)
+ eslint:
+ specifier: ^9.0.0
+ version: 9.39.2(jiti@1.21.7)
+ eslint-config-next:
+ specifier: ^15.0.0
+ version: 15.5.12(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)
+ postcss:
+ specifier: ^8.4.0
+ version: 8.5.6
+ tailwindcss:
+ specifier: ^3.4.0
+ version: 3.4.19(tsx@4.21.0)(yaml@2.8.2)
+ typescript:
+ specifier: ^5.6.0
+ version: 5.9.3
+
+ apps/mobile:
+ dependencies:
+ '@expo/metro-runtime':
+ specifier: ~6.1.2
+ version: 6.1.2(expo@54.0.33)(react-dom@18.3.1(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ '@expo/vector-icons':
+ specifier: ^15.0.3
+ version: 15.0.3(expo-font@14.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ '@innungsapp/shared':
+ specifier: workspace:*
+ version: link:../../packages/shared
+ '@react-native-async-storage/async-storage':
+ specifier: ^2.2.0
+ version: 2.2.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))
+ '@tanstack/react-query':
+ specifier: ^5.59.0
+ version: 5.90.21(react@19.1.0)
+ '@trpc/client':
+ specifier: ^11.0.0
+ version: 11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3)
+ '@trpc/react-query':
+ specifier: ^11.0.0
+ version: 11.10.0(@tanstack/react-query@5.90.21(react@19.1.0))(@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.10.0(typescript@5.9.3))(react@19.1.0)(typescript@5.9.3)
+ better-auth:
+ specifier: ^1.2.0
+ version: 1.4.18(@prisma/client@5.22.0(prisma@5.22.0))(next@15.5.12(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@19.1.0))(react@19.1.0))(prisma@5.22.0)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
+ date-fns:
+ specifier: ^3.6.0
+ version: 3.6.0
+ expo:
+ specifier: ~54.0.33
+ version: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-calendar:
+ specifier: ~15.0.8
+ version: 15.0.8(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))
+ expo-constants:
+ specifier: ~18.0.13
+ version: 18.0.13(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))
+ expo-dev-client:
+ specifier: ~6.0.20
+ version: 6.0.20(expo@54.0.33)
+ expo-document-picker:
+ specifier: ~14.0.8
+ version: 14.0.8(expo@54.0.33)
+ expo-font:
+ specifier: ~14.0.11
+ version: 14.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-haptics:
+ specifier: ~15.0.8
+ version: 15.0.8(expo@54.0.33)
+ expo-linking:
+ specifier: ~8.0.11
+ version: 8.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-notifications:
+ specifier: ~0.32.16
+ version: 0.32.16(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-router:
+ specifier: ~6.0.23
+ version: 6.0.23(@expo/metro-runtime@6.1.2)(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(expo-constants@18.0.13)(expo-linking@8.0.11)(expo@54.0.33)(react-dom@18.3.1(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-reanimated@4.1.6(@babel/core@7.29.0)(react-native-worklets@0.7.4(@babel/core@7.29.0)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-splash-screen:
+ specifier: ~31.0.13
+ version: 31.0.13(expo@54.0.33)
+ expo-status-bar:
+ specifier: ~3.0.9
+ version: 3.0.9(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-system-ui:
+ specifier: ~6.0.9
+ version: 6.0.9(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))
+ expo-web-browser:
+ specifier: ~15.0.10
+ version: 15.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))
+ nativewind:
+ specifier: ^4.1.0
+ version: 4.2.1(react-native-reanimated@4.1.6(@babel/core@7.29.0)(react-native-worklets@0.7.4(@babel/core@7.29.0)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.8.2))
+ react:
+ specifier: 19.1.0
+ version: 19.1.0
+ react-native:
+ specifier: 0.81.5
+ version: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+ react-native-gesture-handler:
+ specifier: ~2.28.0
+ version: 2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-reanimated:
+ specifier: ~4.1.6
+ version: 4.1.6(@babel/core@7.29.0)(react-native-worklets@0.7.4(@babel/core@7.29.0)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-safe-area-context:
+ specifier: 5.6.2
+ version: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-screens:
+ specifier: ~4.16.0
+ version: 4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ superjson:
+ specifier: ^2.2.1
+ version: 2.2.6
+ tailwind-merge:
+ specifier: ^2.5.0
+ version: 2.6.1
+ zod:
+ specifier: ^3.23.0
+ version: 3.25.76
+ zustand:
+ specifier: ^5.0.0
+ version: 5.0.11(@types/react@19.1.17)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0))
+ devDependencies:
+ '@babel/core':
+ specifier: ^7.25.0
+ version: 7.29.0
+ '@innungsapp/admin':
+ specifier: workspace:*
+ version: link:../admin
+ '@types/react':
+ specifier: ~19.1.17
+ version: 19.1.17
+ eslint-config-expo:
+ specifier: ~10.0.0
+ version: 10.0.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)
+ tailwindcss:
+ specifier: ^3.4.0
+ version: 3.4.19(tsx@4.21.0)(yaml@2.8.2)
+ typescript:
+ specifier: ^5.9.3
+ version: 5.9.3
+
+ packages/shared:
+ dependencies:
+ '@prisma/client':
+ specifier: ^5.20.0
+ version: 5.22.0(prisma@5.22.0)
+ devDependencies:
+ prisma:
+ specifier: ^5.20.0
+ version: 5.22.0
+ tsx:
+ specifier: ^4.19.0
+ version: 4.21.0
+ typescript:
+ specifier: ^5.6.0
+ version: 5.9.3
+
+packages:
+
+ '@0no-co/graphql.web@1.2.0':
+ resolution: {integrity: sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==}
+ peerDependencies:
+ graphql: ^14.0.0 || ^15.0.0 || ^16.0.0
+ peerDependenciesMeta:
+ graphql:
+ optional: true
+
+ '@alloc/quick-lru@5.2.0':
+ resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
+ engines: {node: '>=10'}
+
+ '@babel/code-frame@7.10.4':
+ resolution: {integrity: sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==}
+
+ '@babel/code-frame@7.29.0':
+ resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.29.0':
+ resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.29.0':
+ resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.29.1':
+ resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-annotate-as-pure@7.27.3':
+ resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.28.6':
+ resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-create-class-features-plugin@7.28.6':
+ resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-create-regexp-features-plugin@7.28.5':
+ resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-define-polyfill-provider@0.6.6':
+ resolution: {integrity: sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+ '@babel/helper-globals@7.28.0':
+ resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-member-expression-to-functions@7.28.5':
+ resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.28.6':
+ resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.28.6':
+ resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-optimise-call-expression@7.27.1':
+ resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-plugin-utils@7.28.6':
+ resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-remap-async-to-generator@7.27.1':
+ resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-replace-supers@7.28.6':
+ resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
+ resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.27.1':
+ resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.28.5':
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.27.1':
+ resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-wrap-function@7.28.6':
+ resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.28.6':
+ resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/highlight@7.25.9':
+ resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.29.0':
+ resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-proposal-decorators@7.29.0':
+ resolution: {integrity: sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-proposal-export-default-from@7.27.1':
+ resolution: {integrity: sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-async-generators@7.8.4':
+ resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-bigint@7.8.3':
+ resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-class-properties@7.12.13':
+ resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-class-static-block@7.14.5':
+ resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-decorators@7.28.6':
+ resolution: {integrity: sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-dynamic-import@7.8.3':
+ resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-export-default-from@7.28.6':
+ resolution: {integrity: sha512-Svlx1fjJFnNz0LZeUaybRukSxZI3KkpApUmIRzEdXC5k8ErTOz0OD0kNrICi5Vc3GlpP5ZCeRyRO+mfWTSz+iQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-flow@7.28.6':
+ resolution: {integrity: sha512-D+OrJumc9McXNEBI/JmFnc/0uCM2/Y3PEBG3gfV3QIYkKv5pvnpzFrl1kYCrcHJP8nOeFB/SHi1IHz29pNGuew==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-import-attributes@7.28.6':
+ resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-import-meta@7.10.4':
+ resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-json-strings@7.8.3':
+ resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-jsx@7.28.6':
+ resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-logical-assignment-operators@7.10.4':
+ resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3':
+ resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-numeric-separator@7.10.4':
+ resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-object-rest-spread@7.8.3':
+ resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-optional-catch-binding@7.8.3':
+ resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-optional-chaining@7.8.3':
+ resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-private-property-in-object@7.14.5':
+ resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-top-level-await@7.14.5':
+ resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-typescript@7.28.6':
+ resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-arrow-functions@7.27.1':
+ resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-async-generator-functions@7.29.0':
+ resolution: {integrity: sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-async-to-generator@7.28.6':
+ resolution: {integrity: sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-block-scoping@7.28.6':
+ resolution: {integrity: sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-class-properties@7.27.1':
+ resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-class-properties@7.28.6':
+ resolution: {integrity: sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-class-static-block@7.28.6':
+ resolution: {integrity: sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.12.0
+
+ '@babel/plugin-transform-classes@7.28.4':
+ resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-classes@7.28.6':
+ resolution: {integrity: sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-computed-properties@7.28.6':
+ resolution: {integrity: sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-destructuring@7.28.5':
+ resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-export-namespace-from@7.27.1':
+ resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-flow-strip-types@7.27.1':
+ resolution: {integrity: sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-for-of@7.27.1':
+ resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-function-name@7.27.1':
+ resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-literals@7.27.1':
+ resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-logical-assignment-operators@7.28.6':
+ resolution: {integrity: sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-modules-commonjs@7.28.6':
+ resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-named-capturing-groups-regex@7.29.0':
+ resolution: {integrity: sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/plugin-transform-nullish-coalescing-operator@7.27.1':
+ resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-nullish-coalescing-operator@7.28.6':
+ resolution: {integrity: sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-numeric-separator@7.28.6':
+ resolution: {integrity: sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-object-rest-spread@7.28.6':
+ resolution: {integrity: sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-optional-catch-binding@7.28.6':
+ resolution: {integrity: sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-optional-chaining@7.27.1':
+ resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-optional-chaining@7.28.6':
+ resolution: {integrity: sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-parameters@7.27.7':
+ resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-private-methods@7.28.6':
+ resolution: {integrity: sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-private-property-in-object@7.28.6':
+ resolution: {integrity: sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-display-name@7.28.0':
+ resolution: {integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-development@7.27.1':
+ resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-self@7.27.1':
+ resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-source@7.27.1':
+ resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx@7.28.6':
+ resolution: {integrity: sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-pure-annotations@7.27.1':
+ resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-regenerator@7.29.0':
+ resolution: {integrity: sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-runtime@7.29.0':
+ resolution: {integrity: sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-shorthand-properties@7.27.1':
+ resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-spread@7.28.6':
+ resolution: {integrity: sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-sticky-regex@7.27.1':
+ resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-template-literals@7.27.1':
+ resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-typescript@7.28.6':
+ resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-unicode-regex@7.27.1':
+ resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/preset-react@7.28.5':
+ resolution: {integrity: sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/preset-typescript@7.27.1':
+ resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/preset-typescript@7.28.5':
+ resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/runtime@7.28.6':
+ resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/template@7.28.6':
+ resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.29.0':
+ resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.29.0':
+ resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
+ engines: {node: '>=6.9.0'}
+
+ '@better-auth/core@1.4.18':
+ resolution: {integrity: sha512-q+awYgC7nkLEBdx2sW0iJjkzgSHlIxGnOpsN1r/O1+a4m7osJNHtfK2mKJSL1I+GfNyIlxJF8WvD/NLuYMpmcg==}
+ peerDependencies:
+ '@better-auth/utils': 0.3.0
+ '@better-fetch/fetch': 1.1.21
+ better-call: 1.1.8
+ jose: ^6.1.0
+ kysely: ^0.28.5
+ nanostores: ^1.0.1
+
+ '@better-auth/telemetry@1.4.18':
+ resolution: {integrity: sha512-e5rDF8S4j3Um/0LIVATL2in9dL4lfO2fr2v1Wio4qTMRbfxqnUDTa+6SZtwdeJrbc4O+a3c+IyIpjG9Q/6GpfQ==}
+ peerDependencies:
+ '@better-auth/core': 1.4.18
+
+ '@better-auth/utils@0.3.0':
+ resolution: {integrity: sha512-W+Adw6ZA6mgvnSnhOki270rwJ42t4XzSK6YWGF//BbVXL6SwCLWfyzBc1lN2m/4RM28KubdBKQ4X5VMoLRNPQw==}
+
+ '@better-fetch/fetch@1.1.21':
+ resolution: {integrity: sha512-/ImESw0sskqlVR94jB+5+Pxjf+xBwDZF/N5+y2/q4EqD7IARUTSpPfIo8uf39SYpCxyOCtbyYpUrZ3F/k0zT4A==}
+
+ '@egjs/hammerjs@2.0.17':
+ resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==}
+ engines: {node: '>=0.8.0'}
+
+ '@emnapi/core@1.8.1':
+ resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==}
+
+ '@emnapi/runtime@1.8.1':
+ resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==}
+
+ '@emnapi/wasi-threads@1.1.0':
+ resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==}
+
+ '@esbuild/aix-ppc64@0.27.3':
+ resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.27.3':
+ resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.27.3':
+ resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.27.3':
+ resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.27.3':
+ resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.27.3':
+ resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.27.3':
+ resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.27.3':
+ resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.27.3':
+ resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.27.3':
+ resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.27.3':
+ resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.27.3':
+ resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.27.3':
+ resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.27.3':
+ resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.27.3':
+ resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.27.3':
+ resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.27.3':
+ resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.27.3':
+ resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.27.3':
+ resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.27.3':
+ resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.27.3':
+ resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openharmony-arm64@0.27.3':
+ resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/sunos-x64@0.27.3':
+ resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.27.3':
+ resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.27.3':
+ resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.27.3':
+ resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@eslint-community/eslint-utils@4.9.1':
+ resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+ '@eslint-community/regexpp@4.12.2':
+ resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint/config-array@0.21.1':
+ resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/config-helpers@0.4.2':
+ resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/core@0.17.0':
+ resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/eslintrc@3.3.3':
+ resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/js@9.39.2':
+ resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/object-schema@2.1.7':
+ resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/plugin-kit@0.4.1':
+ resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@expo/cli@54.0.23':
+ resolution: {integrity: sha512-km0h72SFfQCmVycH/JtPFTVy69w6Lx1cHNDmfLfQqgKFYeeHTjx7LVDP4POHCtNxFP2UeRazrygJhlh4zz498g==}
+ hasBin: true
+ peerDependencies:
+ expo: '*'
+ expo-router: '*'
+ react-native: '*'
+ peerDependenciesMeta:
+ expo-router:
+ optional: true
+ react-native:
+ optional: true
+
+ '@expo/code-signing-certificates@0.0.6':
+ resolution: {integrity: sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==}
+
+ '@expo/config-plugins@54.0.4':
+ resolution: {integrity: sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==}
+
+ '@expo/config-types@54.0.10':
+ resolution: {integrity: sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==}
+
+ '@expo/config@12.0.13':
+ resolution: {integrity: sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==}
+
+ '@expo/devcert@1.2.1':
+ resolution: {integrity: sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==}
+
+ '@expo/devtools@0.1.8':
+ resolution: {integrity: sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==}
+ peerDependencies:
+ react: '*'
+ react-native: '*'
+ peerDependenciesMeta:
+ react:
+ optional: true
+ react-native:
+ optional: true
+
+ '@expo/env@2.0.8':
+ resolution: {integrity: sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==}
+
+ '@expo/fingerprint@0.15.4':
+ resolution: {integrity: sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==}
+ hasBin: true
+
+ '@expo/image-utils@0.8.8':
+ resolution: {integrity: sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==}
+
+ '@expo/json-file@10.0.8':
+ resolution: {integrity: sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==}
+
+ '@expo/metro-config@54.0.14':
+ resolution: {integrity: sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==}
+ peerDependencies:
+ expo: '*'
+ peerDependenciesMeta:
+ expo:
+ optional: true
+
+ '@expo/metro-runtime@6.1.2':
+ resolution: {integrity: sha512-nvM+Qv45QH7pmYvP8JB1G8JpScrWND3KrMA6ZKe62cwwNiX/BjHU28Ear0v/4bQWXlOY0mv6B8CDIm8JxXde9g==}
+ peerDependencies:
+ expo: '*'
+ react: '*'
+ react-dom: '*'
+ react-native: '*'
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+
+ '@expo/metro@54.2.0':
+ resolution: {integrity: sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==}
+
+ '@expo/osascript@2.3.8':
+ resolution: {integrity: sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==}
+ engines: {node: '>=12'}
+
+ '@expo/package-manager@1.9.10':
+ resolution: {integrity: sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==}
+
+ '@expo/plist@0.4.8':
+ resolution: {integrity: sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==}
+
+ '@expo/prebuild-config@54.0.8':
+ resolution: {integrity: sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==}
+ peerDependencies:
+ expo: '*'
+
+ '@expo/schema-utils@0.1.8':
+ resolution: {integrity: sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==}
+
+ '@expo/sdk-runtime-versions@1.0.0':
+ resolution: {integrity: sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==}
+
+ '@expo/spawn-async@1.7.2':
+ resolution: {integrity: sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==}
+ engines: {node: '>=12'}
+
+ '@expo/sudo-prompt@9.3.2':
+ resolution: {integrity: sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==}
+
+ '@expo/vector-icons@15.0.3':
+ resolution: {integrity: sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==}
+ peerDependencies:
+ expo-font: '>=14.0.4'
+ react: '*'
+ react-native: '*'
+
+ '@expo/ws-tunnel@1.0.6':
+ resolution: {integrity: sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==}
+
+ '@expo/xcpretty@4.4.0':
+ resolution: {integrity: sha512-o2qDlTqJ606h4xR36H2zWTywmZ3v3842K6TU8Ik2n1mfW0S580VHlt3eItVYdLYz+klaPp7CXqanja8eASZjRw==}
+ hasBin: true
+
+ '@humanfs/core@0.19.1':
+ resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.7':
+ resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/retry@0.4.3':
+ resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
+ engines: {node: '>=18.18'}
+
+ '@ide/backoff@1.0.0':
+ resolution: {integrity: sha512-F0YfUDjvT+Mtt/R4xdl2X0EYCHMMiJqNLdxHD++jDT5ydEFIyqbCHh51Qx2E211dgZprPKhV7sHmnXKpLuvc5g==}
+
+ '@img/colour@1.0.0':
+ resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==}
+ engines: {node: '>=18'}
+
+ '@img/sharp-darwin-arm64@0.34.5':
+ resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-darwin-x64@0.34.5':
+ resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
+ cpu: [arm]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-linux-arm64@0.34.5':
+ resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-linux-arm@0.34.5':
+ resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@img/sharp-linux-ppc64@0.34.5':
+ resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@img/sharp-linux-s390x@0.34.5':
+ resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [s390x]
+ os: [linux]
+
+ '@img/sharp-linux-x64@0.34.5':
+ resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-wasm32@0.34.5':
+ resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [wasm32]
+
+ '@img/sharp-win32-arm64@0.34.5':
+ resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@img/sharp-win32-ia32@0.34.5':
+ resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ia32]
+ os: [win32]
+
+ '@img/sharp-win32-x64@0.34.5':
+ resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@isaacs/fs-minipass@4.0.1':
+ resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
+ engines: {node: '>=18.0.0'}
+
+ '@isaacs/ttlcache@1.4.1':
+ resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==}
+ engines: {node: '>=12'}
+
+ '@istanbuljs/load-nyc-config@1.1.0':
+ resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
+ engines: {node: '>=8'}
+
+ '@istanbuljs/schema@0.1.3':
+ resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
+ engines: {node: '>=8'}
+
+ '@jest/create-cache-key-function@29.7.0':
+ resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/environment@29.7.0':
+ resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/fake-timers@29.7.0':
+ resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/schemas@29.6.3':
+ resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/transform@29.7.0':
+ resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/types@29.6.3':
+ resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/source-map@0.3.11':
+ resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==}
+
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+
+ '@napi-rs/wasm-runtime@0.2.12':
+ resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==}
+
+ '@next/env@15.5.12':
+ resolution: {integrity: sha512-pUvdJN1on574wQHjaBfNGDt9Mz5utDSZFsIIQkMzPgNS8ZvT4H2mwOrOIClwsQOb6EGx5M76/CZr6G8i6pSpLg==}
+
+ '@next/eslint-plugin-next@15.5.12':
+ resolution: {integrity: sha512-+ZRSDFTv4aC96aMb5E41rMjysx8ApkryevnvEYZvPZO52KvkqP5rNExLUXJFr9P4s0f3oqNQR6vopCZsPWKDcQ==}
+
+ '@next/swc-darwin-arm64@15.5.12':
+ resolution: {integrity: sha512-RnRjBtH8S8eXCpUNkQ+543DUc7ys8y15VxmFU9HRqlo9BG3CcBUiwNtF8SNoi2xvGCVJq1vl2yYq+3oISBS0Zg==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@next/swc-darwin-x64@15.5.12':
+ resolution: {integrity: sha512-nqa9/7iQlboF1EFtNhWxQA0rQstmYRSBGxSM6g3GxvxHxcoeqVXfGNr9stJOme674m2V7r4E3+jEhhGvSQhJRA==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@next/swc-linux-arm64-gnu@15.5.12':
+ resolution: {integrity: sha512-dCzAjqhDHwmoB2M4eYfVKqXs99QdQxNQVpftvP1eGVppamXh/OkDAwV737Zr0KPXEqRUMN4uCjh6mjO+XtF3Mw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@next/swc-linux-arm64-musl@15.5.12':
+ resolution: {integrity: sha512-+fpGWvQiITgf7PUtbWY1H7qUSnBZsPPLyyq03QuAKpVoTy/QUx1JptEDTQMVvQhvizCEuNLEeghrQUyXQOekuw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@next/swc-linux-x64-gnu@15.5.12':
+ resolution: {integrity: sha512-jSLvgdRRL/hrFAPqEjJf1fFguC719kmcptjNVDJl26BnJIpjL3KH5h6mzR4mAweociLQaqvt4UyzfbFjgAdDcw==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@next/swc-linux-x64-musl@15.5.12':
+ resolution: {integrity: sha512-/uaF0WfmYqQgLfPmN6BvULwxY0dufI2mlN2JbOKqqceZh1G4hjREyi7pg03zjfyS6eqNemHAZPSoP84x17vo6w==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@next/swc-win32-arm64-msvc@15.5.12':
+ resolution: {integrity: sha512-xhsL1OvQSfGmlL5RbOmU+FV120urrgFpYLq+6U8C6KIym32gZT6XF/SDE92jKzzlPWskkbjOKCpqk5m4i8PEfg==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@next/swc-win32-x64-msvc@15.5.12':
+ resolution: {integrity: sha512-Z1Dh6lhFkxvBDH1FoW6OU/L6prYwPSlwjLiZkExIAh8fbP6iI/M7iGTQAJPYJ9YFlWobCZ1PHbchFhFYb2ADkw==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@noble/ciphers@2.1.1':
+ resolution: {integrity: sha512-bysYuiVfhxNJuldNXlFEitTVdNnYUc+XNJZd7Qm2a5j1vZHgY+fazadNFWFaMK/2vye0JVlxV3gHmC0WDfAOQw==}
+ engines: {node: '>= 20.19.0'}
+
+ '@noble/hashes@2.0.1':
+ resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==}
+ engines: {node: '>= 20.19.0'}
+
+ '@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'}
+
+ '@nolyfill/is-core-module@1.0.39':
+ resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==}
+ engines: {node: '>=12.4.0'}
+
+ '@prisma/client@5.22.0':
+ resolution: {integrity: sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA==}
+ engines: {node: '>=16.13'}
+ peerDependencies:
+ prisma: '*'
+ peerDependenciesMeta:
+ prisma:
+ optional: true
+
+ '@prisma/debug@5.22.0':
+ resolution: {integrity: sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ==}
+
+ '@prisma/engines-version@5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2':
+ resolution: {integrity: sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ==}
+
+ '@prisma/engines@5.22.0':
+ resolution: {integrity: sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA==}
+
+ '@prisma/fetch-engine@5.22.0':
+ resolution: {integrity: sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA==}
+
+ '@prisma/get-platform@5.22.0':
+ resolution: {integrity: sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q==}
+
+ '@radix-ui/primitive@1.1.3':
+ resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==}
+
+ '@radix-ui/react-collection@1.1.7':
+ resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==}
+ 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.1.2':
+ resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==}
+ 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.2':
+ resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==}
+ 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.1.15':
+ resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==}
+ 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.1':
+ resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==}
+ 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.1.11':
+ resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==}
+ 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.1.3':
+ resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==}
+ 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.1.7':
+ resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==}
+ 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-id@1.1.1':
+ resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-portal@1.1.9':
+ resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==}
+ 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.1.5':
+ resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==}
+ 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@2.1.3':
+ resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==}
+ 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.11':
+ resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==}
+ 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.2.0':
+ resolution: {integrity: sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-slot@1.2.3':
+ resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-tabs@1.1.13':
+ resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==}
+ 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.1.1':
+ resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==}
+ 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.2.2':
+ resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==}
+ 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-effect-event@0.0.2':
+ resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==}
+ 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.1.1':
+ resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==}
+ 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.1.1':
+ resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@react-native-async-storage/async-storage@2.2.0':
+ resolution: {integrity: sha512-gvRvjR5JAaUZF8tv2Kcq/Gbt3JHwbKFYfmb445rhOj6NUMx3qPLixmDx5pZAyb9at1bYvJ4/eTUipU5aki45xw==}
+ peerDependencies:
+ react-native: ^0.0.0-0 || >=0.65 <1.0
+
+ '@react-native/assets-registry@0.81.5':
+ resolution: {integrity: sha512-705B6x/5Kxm1RKRvSv0ADYWm5JOnoiQ1ufW7h8uu2E6G9Of/eE6hP/Ivw3U5jI16ERqZxiKQwk34VJbB0niX9w==}
+ engines: {node: '>= 20.19.4'}
+
+ '@react-native/babel-plugin-codegen@0.81.5':
+ resolution: {integrity: sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==}
+ engines: {node: '>= 20.19.4'}
+
+ '@react-native/babel-preset@0.81.5':
+ resolution: {integrity: sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==}
+ engines: {node: '>= 20.19.4'}
+ peerDependencies:
+ '@babel/core': '*'
+
+ '@react-native/codegen@0.81.5':
+ resolution: {integrity: sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==}
+ engines: {node: '>= 20.19.4'}
+ peerDependencies:
+ '@babel/core': '*'
+
+ '@react-native/community-cli-plugin@0.81.5':
+ resolution: {integrity: sha512-yWRlmEOtcyvSZ4+OvqPabt+NS36vg0K/WADTQLhrYrm9qdZSuXmq8PmdJWz/68wAqKQ+4KTILiq2kjRQwnyhQw==}
+ engines: {node: '>= 20.19.4'}
+ peerDependencies:
+ '@react-native-community/cli': '*'
+ '@react-native/metro-config': '*'
+ peerDependenciesMeta:
+ '@react-native-community/cli':
+ optional: true
+ '@react-native/metro-config':
+ optional: true
+
+ '@react-native/debugger-frontend@0.81.5':
+ resolution: {integrity: sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==}
+ engines: {node: '>= 20.19.4'}
+
+ '@react-native/dev-middleware@0.81.5':
+ resolution: {integrity: sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==}
+ engines: {node: '>= 20.19.4'}
+
+ '@react-native/gradle-plugin@0.81.5':
+ resolution: {integrity: sha512-hORRlNBj+ReNMLo9jme3yQ6JQf4GZpVEBLxmTXGGlIL78MAezDZr5/uq9dwElSbcGmLEgeiax6e174Fie6qPLg==}
+ engines: {node: '>= 20.19.4'}
+
+ '@react-native/js-polyfills@0.81.5':
+ resolution: {integrity: sha512-fB7M1CMOCIUudTRuj7kzxIBTVw2KXnsgbQ6+4cbqSxo8NmRRhA0Ul4ZUzZj3rFd3VznTL4Brmocv1oiN0bWZ8w==}
+ engines: {node: '>= 20.19.4'}
+
+ '@react-native/normalize-colors@0.81.5':
+ resolution: {integrity: sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==}
+
+ '@react-native/virtualized-lists@0.81.5':
+ resolution: {integrity: sha512-UVXgV/db25OPIvwZySeToXD/9sKKhOdkcWmmf4Jh8iBZuyfML+/5CasaZ1E7Lqg6g3uqVQq75NqIwkYmORJMPw==}
+ engines: {node: '>= 20.19.4'}
+ peerDependencies:
+ '@types/react': ^19.1.0
+ react: '*'
+ react-native: '*'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@react-navigation/bottom-tabs@7.14.0':
+ resolution: {integrity: sha512-oG2VdoInuIyK0o9o90Yo47hTCS+sPyVE7k8eSB37vt3pq3uQxjh8V3xJpsQfOfNlRUXOPB/ejH93nSBlP7ZHmQ==}
+ peerDependencies:
+ '@react-navigation/native': ^7.1.28
+ react: '>= 18.2.0'
+ react-native: '*'
+ react-native-safe-area-context: '>= 4.0.0'
+ react-native-screens: '>= 4.0.0'
+
+ '@react-navigation/core@7.14.0':
+ resolution: {integrity: sha512-tMpzskBzVp0E7CRNdNtJIdXjk54Kwe/TF9ViXAef+YFM1kSfGv4e/B2ozfXE+YyYgmh4WavTv8fkdJz1CNyu+g==}
+ peerDependencies:
+ react: '>= 18.2.0'
+
+ '@react-navigation/elements@2.9.5':
+ resolution: {integrity: sha512-iHZU8rRN1014Upz73AqNVXDvSMZDh5/ktQ1CMe21rdgnOY79RWtHHBp9qOS3VtqlUVYGkuX5GEw5mDt4tKdl0g==}
+ peerDependencies:
+ '@react-native-masked-view/masked-view': '>= 0.2.0'
+ '@react-navigation/native': ^7.1.28
+ react: '>= 18.2.0'
+ react-native: '*'
+ react-native-safe-area-context: '>= 4.0.0'
+ peerDependenciesMeta:
+ '@react-native-masked-view/masked-view':
+ optional: true
+
+ '@react-navigation/native-stack@7.13.0':
+ resolution: {integrity: sha512-5OOp1IKEd5woHl9hGBU0qCAfrQ4+7Tqej0HzDzGQeXzS8tg9gq84x1qUdRvFk5BXbhuAyvJliY9F1/I07d2X0A==}
+ peerDependencies:
+ '@react-navigation/native': ^7.1.28
+ react: '>= 18.2.0'
+ react-native: '*'
+ react-native-safe-area-context: '>= 4.0.0'
+ react-native-screens: '>= 4.0.0'
+
+ '@react-navigation/native@7.1.28':
+ resolution: {integrity: sha512-d1QDn+KNHfHGt3UIwOZvupvdsDdiHYZBEj7+wL2yDVo3tMezamYy60H9s3EnNVE1Ae1ty0trc7F2OKqo/RmsdQ==}
+ peerDependencies:
+ react: '>= 18.2.0'
+ react-native: '*'
+
+ '@react-navigation/routers@7.5.3':
+ resolution: {integrity: sha512-1tJHg4KKRJuQ1/EvJxatrMef3NZXEPzwUIUZ3n1yJ2t7Q97siwRtbynRpQG9/69ebbtiZ8W3ScOZF/OmhvM4Rg==}
+
+ '@rtsao/scc@1.1.0':
+ resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
+
+ '@rushstack/eslint-patch@1.15.0':
+ resolution: {integrity: sha512-ojSshQPKwVvSMR8yT2L/QtUkV5SXi/IfDiJ4/8d6UbTPjiHVmxZzUAzGD8Tzks1b9+qQkZa0isUOvYObedITaw==}
+
+ '@sinclair/typebox@0.27.10':
+ resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==}
+
+ '@sinonjs/commons@3.0.1':
+ resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==}
+
+ '@sinonjs/fake-timers@10.3.0':
+ resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==}
+
+ '@standard-schema/spec@1.1.0':
+ resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
+
+ '@swc/helpers@0.5.15':
+ resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
+
+ '@tanstack/query-core@5.90.20':
+ resolution: {integrity: sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==}
+
+ '@tanstack/react-query@5.90.21':
+ resolution: {integrity: sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg==}
+ peerDependencies:
+ react: ^18 || ^19
+
+ '@trpc/client@11.10.0':
+ resolution: {integrity: sha512-h0s2AwDtuhS8INRb4hlo4z3RKCkarWqlOy+3ffJgrlDxzzW6aLUN+9nDrcN4huPje1Em15tbCOqhIc6oaKYTRw==}
+ peerDependencies:
+ '@trpc/server': 11.10.0
+ typescript: '>=5.7.2'
+
+ '@trpc/react-query@11.10.0':
+ resolution: {integrity: sha512-SKLpwEMU32mpDTCc3msMxb0fx113x4Jsiw0/t+ENY6AtyvhvDMRF1bpWtoNyY6zpX5wN4JCQMhHef8k0T1rJIw==}
+ peerDependencies:
+ '@tanstack/react-query': ^5.80.3
+ '@trpc/client': 11.10.0
+ '@trpc/server': 11.10.0
+ react: '>=18.2.0'
+ typescript: '>=5.7.2'
+
+ '@trpc/server@11.10.0':
+ resolution: {integrity: sha512-zZjTrR6He61e5TiT7e/bQqab/jRcXBZM8Fg78Yoo8uh5pz60dzzbYuONNUCOkafv5ppXVMms4NHYfNZgzw50vg==}
+ peerDependencies:
+ typescript: '>=5.7.2'
+
+ '@tybys/wasm-util@0.10.1':
+ resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
+
+ '@types/babel__core@7.20.5':
+ resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+
+ '@types/babel__generator@7.27.0':
+ resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==}
+
+ '@types/babel__template@7.4.4':
+ resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+
+ '@types/babel__traverse@7.28.0':
+ resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==}
+
+ '@types/debug@4.1.12':
+ resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+
+ '@types/estree-jsx@1.0.5':
+ resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
+
+ '@types/estree@1.0.8':
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+
+ '@types/graceful-fs@4.1.9':
+ resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==}
+
+ '@types/hammerjs@2.0.46':
+ resolution: {integrity: sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==}
+
+ '@types/hast@2.3.10':
+ resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==}
+
+ '@types/hast@3.0.4':
+ resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
+
+ '@types/istanbul-lib-coverage@2.0.6':
+ resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
+
+ '@types/istanbul-lib-report@3.0.3':
+ resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==}
+
+ '@types/istanbul-reports@3.0.4':
+ resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/json5@0.0.29':
+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+
+ '@types/mdast@4.0.4':
+ resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
+
+ '@types/ms@2.1.0':
+ resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
+
+ '@types/node@22.19.11':
+ resolution: {integrity: sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w==}
+
+ '@types/nodemailer@6.4.22':
+ resolution: {integrity: sha512-HV16KRsW7UyZBITE07B62k8PRAKFqRSFXn1T7vslurVjN761tMDBhk5Lbt17ehyTzK6XcyJnAgUpevrvkcVOzw==}
+
+ '@types/prismjs@1.26.6':
+ resolution: {integrity: sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==}
+
+ '@types/prop-types@15.7.15':
+ resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==}
+
+ '@types/react-dom@18.3.7':
+ resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==}
+ peerDependencies:
+ '@types/react': ^18.0.0
+
+ '@types/react@18.3.28':
+ resolution: {integrity: sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==}
+
+ '@types/react@19.1.17':
+ resolution: {integrity: sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA==}
+
+ '@types/stack-utils@2.0.3':
+ resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==}
+
+ '@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/yargs-parser@21.0.3':
+ resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
+
+ '@types/yargs@17.0.35':
+ resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==}
+
+ '@typescript-eslint/eslint-plugin@8.56.0':
+ resolution: {integrity: sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.56.0
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/parser@8.56.0':
+ resolution: {integrity: sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/project-service@8.56.0':
+ resolution: {integrity: sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/scope-manager@8.56.0':
+ resolution: {integrity: sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/tsconfig-utils@8.56.0':
+ resolution: {integrity: sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/type-utils@8.56.0':
+ resolution: {integrity: sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/types@8.56.0':
+ resolution: {integrity: sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/typescript-estree@8.56.0':
+ resolution: {integrity: sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/utils@8.56.0':
+ resolution: {integrity: sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: '>=4.8.4 <6.0.0'
+
+ '@typescript-eslint/visitor-keys@8.56.0':
+ resolution: {integrity: sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@uiw/copy-to-clipboard@1.0.20':
+ resolution: {integrity: sha512-IFQhS62CLNon1YgYJTEzXR2N3WVXg7V1FaBRDLMlzU6JY5X6Hr3OPAcw4WNoKcz2XcFD6XCgwEjlsmj+JA0mWA==}
+
+ '@uiw/react-markdown-preview@5.1.5':
+ resolution: {integrity: sha512-DNOqx1a6gJR7Btt57zpGEKTfHRlb7rWbtctMRO2f82wWcuoJsxPBrM+JWebDdOD0LfD8oe2CQvW2ICQJKHQhZg==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@uiw/react-md-editor@4.0.11':
+ resolution: {integrity: sha512-F0OR5O1v54EkZYvJj3ew0I7UqLiPeU34hMAY4MdXS3hI86rruYi5DHVkG/VuvLkUZW7wIETM2QFtZ459gKIjQA==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@ungap/structured-clone@1.3.0':
+ resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
+
+ '@unrs/resolver-binding-android-arm-eabi@1.11.1':
+ resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==}
+ cpu: [arm]
+ os: [android]
+
+ '@unrs/resolver-binding-android-arm64@1.11.1':
+ resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==}
+ cpu: [arm64]
+ os: [android]
+
+ '@unrs/resolver-binding-darwin-arm64@1.11.1':
+ resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@unrs/resolver-binding-darwin-x64@1.11.1':
+ resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@unrs/resolver-binding-freebsd-x64@1.11.1':
+ resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1':
+ resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==}
+ cpu: [arm]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1':
+ resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==}
+ cpu: [arm]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-arm64-gnu@1.11.1':
+ resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-arm64-musl@1.11.1':
+ resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1':
+ resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1':
+ resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-riscv64-musl@1.11.1':
+ resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-s390x-gnu@1.11.1':
+ resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-x64-gnu@1.11.1':
+ resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==}
+ cpu: [x64]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-x64-musl@1.11.1':
+ resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==}
+ cpu: [x64]
+ os: [linux]
+
+ '@unrs/resolver-binding-wasm32-wasi@1.11.1':
+ resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+
+ '@unrs/resolver-binding-win32-arm64-msvc@1.11.1':
+ resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@unrs/resolver-binding-win32-ia32-msvc@1.11.1':
+ resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@unrs/resolver-binding-win32-x64-msvc@1.11.1':
+ resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==}
+ cpu: [x64]
+ os: [win32]
+
+ '@urql/core@5.2.0':
+ resolution: {integrity: sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==}
+
+ '@urql/exchange-retry@1.3.2':
+ resolution: {integrity: sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==}
+ peerDependencies:
+ '@urql/core': ^5.0.0
+
+ '@xmldom/xmldom@0.8.11':
+ resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==}
+ engines: {node: '>=10.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.15.0:
+ resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ agent-base@7.1.4:
+ resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
+ engines: {node: '>= 14'}
+
+ ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+
+ ajv@8.11.0:
+ resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==}
+
+ anser@1.4.10:
+ resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==}
+
+ ansi-escapes@4.3.2:
+ resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@4.1.1:
+ resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==}
+ engines: {node: '>=6'}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ 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@5.2.0:
+ resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
+ engines: {node: '>=10'}
+
+ 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'}
+
+ arg@5.0.2:
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+
+ argparse@1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ aria-hidden@1.2.6:
+ resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==}
+ engines: {node: '>=10'}
+
+ aria-query@5.3.2:
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+ engines: {node: '>= 0.4'}
+
+ array-buffer-byte-length@1.0.2:
+ resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
+ engines: {node: '>= 0.4'}
+
+ array-includes@3.1.9:
+ resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==}
+ engines: {node: '>= 0.4'}
+
+ array-timsort@1.0.3:
+ resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==}
+
+ array.prototype.findlast@1.2.5:
+ resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.findlastindex@1.2.6:
+ resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.flat@1.3.3:
+ resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.flatmap@1.3.3:
+ resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==}
+ engines: {node: '>= 0.4'}
+
+ array.prototype.tosorted@1.1.4:
+ resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==}
+ engines: {node: '>= 0.4'}
+
+ arraybuffer.prototype.slice@1.0.4:
+ resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
+ engines: {node: '>= 0.4'}
+
+ asap@2.0.6:
+ resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
+
+ assert@2.1.0:
+ resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==}
+
+ ast-types-flow@0.0.8:
+ resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==}
+
+ async-function@1.0.0:
+ resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
+ engines: {node: '>= 0.4'}
+
+ async-limiter@1.0.1:
+ resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==}
+
+ autoprefixer@10.4.24:
+ resolution: {integrity: sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==}
+ 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'}
+
+ axe-core@4.11.1:
+ resolution: {integrity: sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==}
+ engines: {node: '>=4'}
+
+ axobject-query@4.1.0:
+ resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
+ engines: {node: '>= 0.4'}
+
+ babel-jest@29.7.0:
+ resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ '@babel/core': ^7.8.0
+
+ babel-plugin-istanbul@6.1.1:
+ resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
+ engines: {node: '>=8'}
+
+ babel-plugin-jest-hoist@29.6.3:
+ resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ babel-plugin-polyfill-corejs2@0.4.15:
+ resolution: {integrity: sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+ babel-plugin-polyfill-corejs3@0.13.0:
+ resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+ babel-plugin-polyfill-regenerator@0.6.6:
+ resolution: {integrity: sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+
+ babel-plugin-react-compiler@1.0.0:
+ resolution: {integrity: sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==}
+
+ babel-plugin-react-native-web@0.21.2:
+ resolution: {integrity: sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==}
+
+ babel-plugin-syntax-hermes-parser@0.29.1:
+ resolution: {integrity: sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==}
+
+ babel-plugin-transform-flow-enums@0.0.2:
+ resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==}
+
+ babel-preset-current-node-syntax@1.2.0:
+ resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0 || ^8.0.0-0
+
+ babel-preset-expo@54.0.10:
+ resolution: {integrity: sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==}
+ peerDependencies:
+ '@babel/runtime': ^7.20.0
+ expo: '*'
+ react-refresh: '>=0.14.0 <1.0.0'
+ peerDependenciesMeta:
+ '@babel/runtime':
+ optional: true
+ expo:
+ optional: true
+
+ babel-preset-jest@29.6.3:
+ resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ badgin@1.2.3:
+ resolution: {integrity: sha512-NQGA7LcfCpSzIbGRbkgjgdWkjy7HI+Th5VLxTJfW5EeaAf3fnS+xWQaQOCYiny+q6QSvxqoSO04vCx+4u++EJw==}
+
+ bail@2.0.2:
+ resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ balanced-match@4.0.3:
+ resolution: {integrity: sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==}
+ engines: {node: 20 || >=22}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ baseline-browser-mapping@2.9.19:
+ resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==}
+ hasBin: true
+
+ bcp-47-match@2.0.3:
+ resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==}
+
+ better-auth@1.4.18:
+ resolution: {integrity: sha512-bnyifLWBPcYVltH3RhS7CM62MoelEqC6Q+GnZwfiDWNfepXoQZBjEvn4urcERC7NTKgKq5zNBM8rvPvRBa6xcg==}
+ peerDependencies:
+ '@lynx-js/react': '*'
+ '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0
+ '@sveltejs/kit': ^2.0.0
+ '@tanstack/react-start': ^1.0.0
+ '@tanstack/solid-start': ^1.0.0
+ better-sqlite3: ^12.0.0
+ drizzle-kit: '>=0.31.4'
+ drizzle-orm: '>=0.41.0'
+ mongodb: ^6.0.0 || ^7.0.0
+ mysql2: ^3.0.0
+ next: ^14.0.0 || ^15.0.0 || ^16.0.0
+ pg: ^8.0.0
+ prisma: ^5.0.0 || ^6.0.0 || ^7.0.0
+ react: ^18.0.0 || ^19.0.0
+ react-dom: ^18.0.0 || ^19.0.0
+ solid-js: ^1.0.0
+ svelte: ^4.0.0 || ^5.0.0
+ vitest: ^2.0.0 || ^3.0.0 || ^4.0.0
+ vue: ^3.0.0
+ peerDependenciesMeta:
+ '@lynx-js/react':
+ optional: true
+ '@prisma/client':
+ optional: true
+ '@sveltejs/kit':
+ optional: true
+ '@tanstack/react-start':
+ optional: true
+ '@tanstack/solid-start':
+ optional: true
+ better-sqlite3:
+ optional: true
+ drizzle-kit:
+ optional: true
+ drizzle-orm:
+ optional: true
+ mongodb:
+ optional: true
+ mysql2:
+ optional: true
+ next:
+ optional: true
+ pg:
+ optional: true
+ prisma:
+ optional: true
+ react:
+ optional: true
+ react-dom:
+ optional: true
+ solid-js:
+ optional: true
+ svelte:
+ optional: true
+ vitest:
+ optional: true
+ vue:
+ optional: true
+
+ better-call@1.1.8:
+ resolution: {integrity: sha512-XMQ2rs6FNXasGNfMjzbyroSwKwYbZ/T3IxruSS6U2MJRsSYh3wYtG3o6H00ZlKZ/C/UPOAD97tqgQJNsxyeTXw==}
+ peerDependencies:
+ zod: ^4.0.0
+ peerDependenciesMeta:
+ zod:
+ optional: true
+
+ better-opn@3.0.2:
+ resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==}
+ engines: {node: '>=12.0.0'}
+
+ big-integer@1.6.52:
+ resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==}
+ engines: {node: '>=0.6'}
+
+ binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+
+ boolbase@1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+ bplist-creator@0.1.0:
+ resolution: {integrity: sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==}
+
+ bplist-parser@0.3.1:
+ resolution: {integrity: sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==}
+ engines: {node: '>= 5.10.0'}
+
+ bplist-parser@0.3.2:
+ resolution: {integrity: sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==}
+ engines: {node: '>= 5.10.0'}
+
+ brace-expansion@1.1.12:
+ resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
+
+ brace-expansion@2.0.2:
+ resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
+
+ brace-expansion@5.0.2:
+ resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==}
+ engines: {node: 20 || >=22}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ browserslist@4.28.1:
+ resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ bser@2.1.1:
+ resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
+
+ buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+ buffer@5.7.1:
+ resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+
+ bytes@3.1.2:
+ resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+ engines: {node: '>= 0.8'}
+
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
+ call-bind@1.0.8:
+ resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
+ engines: {node: '>= 0.4'}
+
+ call-bound@1.0.4:
+ resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+ engines: {node: '>= 0.4'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ camelcase-css@2.0.1:
+ resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
+ engines: {node: '>= 6'}
+
+ camelcase@5.3.1:
+ resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+ engines: {node: '>=6'}
+
+ camelcase@6.3.0:
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+ engines: {node: '>=10'}
+
+ caniuse-lite@1.0.30001770:
+ resolution: {integrity: sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==}
+
+ 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'}
+
+ character-entities-html4@2.1.0:
+ resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
+
+ character-entities-legacy@3.0.0:
+ resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
+
+ character-entities@2.0.2:
+ resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+
+ 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@3.0.0:
+ resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
+ engines: {node: '>=18'}
+
+ chrome-launcher@0.15.2:
+ resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==}
+ engines: {node: '>=12.13.0'}
+ hasBin: true
+
+ chromium-edge-launcher@0.2.0:
+ resolution: {integrity: sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==}
+
+ ci-info@2.0.0:
+ resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==}
+
+ ci-info@3.9.0:
+ resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
+ engines: {node: '>=8'}
+
+ cli-cursor@2.1.0:
+ resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==}
+ engines: {node: '>=4'}
+
+ 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@1.0.4:
+ resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+ engines: {node: '>=0.8'}
+
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
+ 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==}
+
+ color-string@1.9.1:
+ resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+
+ color@4.2.3:
+ resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
+ engines: {node: '>=12.5.0'}
+
+ comma-separated-tokens@2.0.3:
+ resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
+
+ commander@12.1.0:
+ resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==}
+ engines: {node: '>=18'}
+
+ 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'}
+
+ commander@7.2.0:
+ resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+ engines: {node: '>= 10'}
+
+ comment-json@4.5.1:
+ resolution: {integrity: sha512-taEtr3ozUmOB7it68Jll7s0Pwm+aoiHyXKrEC8SEodL4rNpdfDLqa7PfBlrgFoCNNdR8ImL+muti5IGvktJAAg==}
+ engines: {node: '>= 6'}
+
+ compressible@2.0.18:
+ resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==}
+ engines: {node: '>= 0.6'}
+
+ compression@1.8.1:
+ resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==}
+ engines: {node: '>= 0.8.0'}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ connect@3.7.0:
+ resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==}
+ engines: {node: '>= 0.10.0'}
+
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ copy-anything@4.0.5:
+ resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==}
+ engines: {node: '>=18'}
+
+ core-js-compat@3.48.0:
+ resolution: {integrity: sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==}
+
+ core-util-is@1.0.3:
+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ crypto-random-string@2.0.0:
+ resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==}
+ engines: {node: '>=8'}
+
+ css-selector-parser@3.3.0:
+ resolution: {integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==}
+
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ csstype@3.2.3:
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
+
+ damerau-levenshtein@1.0.8:
+ resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
+
+ data-view-buffer@1.0.2:
+ resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-length@1.0.2:
+ resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
+ engines: {node: '>= 0.4'}
+
+ data-view-byte-offset@1.0.1:
+ resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
+ engines: {node: '>= 0.4'}
+
+ date-fns@3.6.0:
+ resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==}
+
+ debug@2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ decode-named-character-reference@1.3.0:
+ resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==}
+
+ decode-uri-component@0.2.2:
+ resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
+ engines: {node: '>=0.10'}
+
+ deep-extend@0.6.0:
+ resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
+ engines: {node: '>=4.0.0'}
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+ 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==}
+
+ 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'}
+
+ defu@6.1.4:
+ resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
+
+ depd@2.0.0:
+ resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+ engines: {node: '>= 0.8'}
+
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
+ destroy@1.2.0:
+ resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
+ detect-libc@1.0.3:
+ resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
+ engines: {node: '>=0.10'}
+ hasBin: true
+
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+ engines: {node: '>=8'}
+
+ 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==}
+
+ direction@2.0.1:
+ resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==}
+ hasBin: true
+
+ dlv@1.1.3:
+ resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+
+ doctrine@2.1.0:
+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+ engines: {node: '>=0.10.0'}
+
+ dotenv-expand@11.0.7:
+ resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==}
+ engines: {node: '>=12'}
+
+ dotenv@16.4.7:
+ resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==}
+ engines: {node: '>=12'}
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ ee-first@1.1.1:
+ resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+
+ electron-to-chromium@1.5.286:
+ resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+ encodeurl@1.0.2:
+ resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
+ engines: {node: '>= 0.8'}
+
+ encodeurl@2.0.0:
+ resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+ engines: {node: '>= 0.8'}
+
+ entities@6.0.1:
+ resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
+ engines: {node: '>=0.12'}
+
+ env-editor@0.4.2:
+ resolution: {integrity: sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==}
+ engines: {node: '>=8'}
+
+ error-stack-parser@2.1.4:
+ resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==}
+
+ es-abstract@1.24.1:
+ resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==}
+ engines: {node: '>= 0.4'}
+
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-iterator-helpers@1.2.2:
+ resolution: {integrity: sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==}
+ engines: {node: '>= 0.4'}
+
+ es-object-atoms@1.1.1:
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ engines: {node: '>= 0.4'}
+
+ es-set-tostringtag@2.1.0:
+ resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+ engines: {node: '>= 0.4'}
+
+ es-shim-unscopables@1.1.0:
+ resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==}
+ engines: {node: '>= 0.4'}
+
+ es-to-primitive@1.3.0:
+ resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
+ engines: {node: '>= 0.4'}
+
+ esbuild@0.27.3:
+ resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-html@1.0.3:
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+ escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+
+ escape-string-regexp@2.0.0:
+ resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
+ engines: {node: '>=8'}
+
+ 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-config-expo@10.0.0:
+ resolution: {integrity: sha512-/XC/DvniUWTzU7Ypb/cLDhDD4DXqEio4lug1ObD/oQ9Hcx3OVOR8Mkp4u6U4iGoZSJyIQmIk3WVHe/P1NYUXKw==}
+ peerDependencies:
+ eslint: '>=8.10'
+
+ eslint-config-next@15.5.12:
+ resolution: {integrity: sha512-ktW3XLfd+ztEltY5scJNjxjHwtKWk6vU2iwzZqSN09UsbBmMeE/cVlJ1yESg6Yx5LW7p/Z8WzUAgYXGLEmGIpg==}
+ peerDependencies:
+ eslint: ^7.23.0 || ^8.0.0 || ^9.0.0
+ typescript: '>=3.3.1'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ eslint-import-resolver-node@0.3.9:
+ resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
+
+ eslint-import-resolver-typescript@3.10.1:
+ resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ eslint-plugin-import: '*'
+ eslint-plugin-import-x: '*'
+ peerDependenciesMeta:
+ eslint-plugin-import:
+ optional: true
+ eslint-plugin-import-x:
+ optional: true
+
+ eslint-module-utils@2.12.1:
+ resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: '*'
+ eslint-import-resolver-node: '*'
+ eslint-import-resolver-typescript: '*'
+ eslint-import-resolver-webpack: '*'
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ eslint:
+ optional: true
+ eslint-import-resolver-node:
+ optional: true
+ eslint-import-resolver-typescript:
+ optional: true
+ eslint-import-resolver-webpack:
+ optional: true
+
+ eslint-plugin-expo@1.0.0:
+ resolution: {integrity: sha512-qLtunR+cNFtC+jwYCBia5c/PJurMjSLMOV78KrEOyQK02ohZapU4dCFFnS2hfrJuw0zxfsjVkjqg3QBqi933QA==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ eslint: '>=8.10'
+
+ eslint-plugin-import@2.32.0:
+ resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+
+ eslint-plugin-jsx-a11y@6.10.2:
+ resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9
+
+ eslint-plugin-react-hooks@5.2.0:
+ resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0
+
+ eslint-plugin-react@7.37.5:
+ resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
+
+ eslint-scope@8.4.0:
+ resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-visitor-keys@4.2.1:
+ resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint-visitor-keys@5.0.0:
+ resolution: {integrity: sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
+
+ eslint@9.39.2:
+ resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+
+ espree@10.4.0:
+ resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ esprima@4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ esquery@1.7.0:
+ resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ estree-util-is-identifier-name@3.0.0:
+ resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ etag@1.8.1:
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+ engines: {node: '>= 0.6'}
+
+ event-target-shim@5.0.1:
+ resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
+ engines: {node: '>=6'}
+
+ exec-async@2.2.0:
+ resolution: {integrity: sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==}
+
+ expo-application@7.0.8:
+ resolution: {integrity: sha512-qFGyxk7VJbrNOQWBbE09XUuGuvkOgFS9QfToaK2FdagM2aQ+x3CvGV2DuVgl/l4ZxPgIf3b/MNh9xHpwSwn74Q==}
+ peerDependencies:
+ expo: '*'
+
+ expo-asset@12.0.12:
+ resolution: {integrity: sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==}
+ peerDependencies:
+ expo: '*'
+ react: '*'
+ react-native: '*'
+
+ expo-calendar@15.0.8:
+ resolution: {integrity: sha512-i+ojy6zFnWSPb2DYp4L4W4U5iVI+NXnuHr3xysShoV8znNOmixP1TOYuJXt5Lpz+BpHCWseU31gV1E5SSkIKsw==}
+ peerDependencies:
+ expo: '*'
+ react-native: '*'
+
+ expo-constants@18.0.13:
+ resolution: {integrity: sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==}
+ peerDependencies:
+ expo: '*'
+ react-native: '*'
+
+ expo-dev-client@6.0.20:
+ resolution: {integrity: sha512-5XjoVlj1OxakNxy55j/AUaGPrDOlQlB6XdHLLWAw61w5ffSpUDHDnuZzKzs9xY1eIaogOqTOQaAzZ2ddBkdXLA==}
+ peerDependencies:
+ expo: '*'
+
+ expo-dev-launcher@6.0.20:
+ resolution: {integrity: sha512-a04zHEeT9sB0L5EB38fz7sNnUKJ2Ar1pXpcyl60Ki8bXPNCs9rjY7NuYrDkP/irM8+1DklMBqHpyHiLyJ/R+EA==}
+ peerDependencies:
+ expo: '*'
+
+ expo-dev-menu-interface@2.0.0:
+ resolution: {integrity: sha512-BvAMPt6x+vyXpThsyjjOYyjwfjREV4OOpQkZ0tNl+nGpsPfcY9mc6DRACoWnH9KpLzyIt3BOgh3cuy/h/OxQjw==}
+ peerDependencies:
+ expo: '*'
+
+ expo-dev-menu@7.0.18:
+ resolution: {integrity: sha512-4kTdlHrnZCAWCT6tZRQHSSjZ7vECFisL4T+nsG/GJDo/jcHNaOVGV5qPV9wzlTxyMk3YOPggRw4+g7Ownrg5eA==}
+ peerDependencies:
+ expo: '*'
+
+ expo-document-picker@14.0.8:
+ resolution: {integrity: sha512-3tyQKpPqWWFlI8p9RiMX1+T1Zge5mEKeBuXWp1h8PEItFMUDSiOJbQ112sfdC6Hxt8wSxreV9bCRl/NgBdt+fA==}
+ peerDependencies:
+ expo: '*'
+
+ expo-file-system@19.0.21:
+ resolution: {integrity: sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==}
+ peerDependencies:
+ expo: '*'
+ react-native: '*'
+
+ expo-font@14.0.11:
+ resolution: {integrity: sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg==}
+ peerDependencies:
+ expo: '*'
+ react: '*'
+ react-native: '*'
+
+ expo-haptics@15.0.8:
+ resolution: {integrity: sha512-lftutojy8Qs8zaDzzjwM3gKHFZ8bOOEZDCkmh2Ddpe95Ra6kt2izeOfOfKuP/QEh0MZ1j9TfqippyHdRd1ZM9g==}
+ peerDependencies:
+ expo: '*'
+
+ expo-json-utils@0.15.0:
+ resolution: {integrity: sha512-duRT6oGl80IDzH2LD2yEFWNwGIC2WkozsB6HF3cDYNoNNdUvFk6uN3YiwsTsqVM/D0z6LEAQ01/SlYvN+Fw0JQ==}
+
+ expo-keep-awake@15.0.8:
+ resolution: {integrity: sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==}
+ peerDependencies:
+ expo: '*'
+ react: '*'
+
+ expo-linking@8.0.11:
+ resolution: {integrity: sha512-+VSaNL5om3kOp/SSKO5qe6cFgfSIWnnQDSbA7XLs3ECkYzXRquk5unxNS3pg7eK5kNUmQ4kgLI7MhTggAEUBLA==}
+ peerDependencies:
+ react: '*'
+ react-native: '*'
+
+ expo-manifests@1.0.10:
+ resolution: {integrity: sha512-oxDUnURPcL4ZsOBY6X1DGWGuoZgVAFzp6PISWV7lPP2J0r8u1/ucuChBgpK7u1eLGFp6sDIPwXyEUCkI386XSQ==}
+ peerDependencies:
+ expo: '*'
+
+ expo-modules-autolinking@3.0.24:
+ resolution: {integrity: sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==}
+ hasBin: true
+
+ expo-modules-core@3.0.29:
+ resolution: {integrity: sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==}
+ peerDependencies:
+ react: '*'
+ react-native: '*'
+
+ expo-notifications@0.32.16:
+ resolution: {integrity: sha512-QQD/UA6v7LgvwIJ+tS7tSvqJZkdp0nCSj9MxsDk/jU1GttYdK49/5L2LvE/4U0H7sNBz1NZAyhDZozg8xgBLXw==}
+ peerDependencies:
+ expo: '*'
+ react: '*'
+ react-native: '*'
+
+ expo-router@6.0.23:
+ resolution: {integrity: sha512-qCxVAiCrCyu0npky6azEZ6dJDMt77OmCzEbpF6RbUTlfkaCA417LvY14SBkk0xyGruSxy/7pvJOI6tuThaUVCA==}
+ peerDependencies:
+ '@expo/metro-runtime': ^6.1.2
+ '@react-navigation/drawer': ^7.5.0
+ '@testing-library/react-native': '>= 12.0.0'
+ expo: '*'
+ expo-constants: ^18.0.13
+ expo-linking: ^8.0.11
+ react: '*'
+ react-dom: '*'
+ react-native: '*'
+ react-native-gesture-handler: '*'
+ react-native-reanimated: '*'
+ react-native-safe-area-context: '>= 5.4.0'
+ react-native-screens: '*'
+ react-native-web: '*'
+ react-server-dom-webpack: ~19.0.4 || ~19.1.5 || ~19.2.4
+ peerDependenciesMeta:
+ '@react-navigation/drawer':
+ optional: true
+ '@testing-library/react-native':
+ optional: true
+ react-dom:
+ optional: true
+ react-native-gesture-handler:
+ optional: true
+ react-native-reanimated:
+ optional: true
+ react-native-web:
+ optional: true
+ react-server-dom-webpack:
+ optional: true
+
+ expo-server@1.0.5:
+ resolution: {integrity: sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==}
+ engines: {node: '>=20.16.0'}
+
+ expo-splash-screen@31.0.13:
+ resolution: {integrity: sha512-1epJLC1cDlwwj089R2h8cxaU5uk4ONVAC+vzGiTZH4YARQhL4Stlz1MbR6yAS173GMosvkE6CAeihR7oIbCkDA==}
+ peerDependencies:
+ expo: '*'
+
+ expo-status-bar@3.0.9:
+ resolution: {integrity: sha512-xyYyVg6V1/SSOZWh4Ni3U129XHCnFHBTcUo0dhWtFDrZbNp/duw5AGsQfb2sVeU0gxWHXSY1+5F0jnKYC7WuOw==}
+ peerDependencies:
+ react: '*'
+ react-native: '*'
+
+ expo-system-ui@6.0.9:
+ resolution: {integrity: sha512-eQTYGzw1V4RYiYHL9xDLYID3Wsec2aZS+ypEssmF64D38aDrqbDgz1a2MSlHLQp2jHXSs3FvojhZ9FVela1Zcg==}
+ peerDependencies:
+ expo: '*'
+ react-native: '*'
+ react-native-web: '*'
+ peerDependenciesMeta:
+ react-native-web:
+ optional: true
+
+ expo-updates-interface@2.0.0:
+ resolution: {integrity: sha512-pTzAIufEZdVPKql6iMi5ylVSPqV1qbEopz9G6TSECQmnNde2nwq42PxdFBaUEd8IZJ/fdJLQnOT3m6+XJ5s7jg==}
+ peerDependencies:
+ expo: '*'
+
+ expo-web-browser@15.0.10:
+ resolution: {integrity: sha512-fvDhW4bhmXAeWFNFiInmsGCK83PAqAcQaFyp/3pE/jbdKmFKoRCWr46uZGIfN4msLK/OODhaQ/+US7GSJNDHJg==}
+ peerDependencies:
+ expo: '*'
+ react-native: '*'
+
+ expo@54.0.33:
+ resolution: {integrity: sha512-3yOEfAKqo+gqHcV8vKcnq0uA5zxlohnhA3fu4G43likN8ct5ZZ3LjAh9wDdKteEkoad3tFPvwxmXW711S5OHUw==}
+ hasBin: true
+ peerDependencies:
+ '@expo/dom-webview': '*'
+ '@expo/metro-runtime': '*'
+ react: '*'
+ react-native: '*'
+ react-native-webview: '*'
+ peerDependenciesMeta:
+ '@expo/dom-webview':
+ optional: true
+ '@expo/metro-runtime':
+ optional: true
+ react-native-webview:
+ optional: true
+
+ exponential-backoff@3.1.3:
+ resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==}
+
+ extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-glob@3.3.1:
+ resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==}
+ engines: {node: '>=8.6.0'}
+
+ fast-glob@3.3.3:
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+ engines: {node: '>=8.6.0'}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+ fastq@1.20.1:
+ resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==}
+
+ fb-watchman@2.0.2:
+ resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
+
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
+ file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ filter-obj@1.1.0:
+ resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==}
+ engines: {node: '>=0.10.0'}
+
+ finalhandler@1.1.2:
+ resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==}
+ engines: {node: '>= 0.8'}
+
+ 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'}
+
+ flat-cache@4.0.1:
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+ engines: {node: '>=16'}
+
+ flatted@3.3.3:
+ resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
+
+ flow-enums-runtime@0.0.6:
+ resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==}
+
+ fontfaceobserver@2.3.0:
+ resolution: {integrity: sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==}
+
+ for-each@0.3.5:
+ resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
+ engines: {node: '>= 0.4'}
+
+ fraction.js@5.3.4:
+ resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==}
+
+ freeport-async@2.0.0:
+ resolution: {integrity: sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==}
+ engines: {node: '>=8'}
+
+ fresh@0.5.2:
+ resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
+ engines: {node: '>= 0.6'}
+
+ 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]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ function.prototype.name@1.1.8:
+ resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
+ engines: {node: '>= 0.4'}
+
+ functions-have-names@1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+ generator-function@2.0.1:
+ resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==}
+ engines: {node: '>= 0.4'}
+
+ 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.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
+ get-nonce@1.0.1:
+ resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
+ engines: {node: '>=6'}
+
+ get-package-type@0.1.0:
+ resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
+ engines: {node: '>=8.0.0'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ get-symbol-description@1.1.0:
+ resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
+ engines: {node: '>= 0.4'}
+
+ get-tsconfig@4.13.6:
+ resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==}
+
+ getenv@2.0.0:
+ resolution: {integrity: sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==}
+ engines: {node: '>=6'}
+
+ 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@13.0.5:
+ resolution: {integrity: sha512-BzXxZg24Ibra1pbQ/zE7Kys4Ua1ks7Bn6pKLkVPZ9FZe4JQS6/Q7ef3LG1H+k7lUf5l4T3PLSyYyYJVYUvfgTw==}
+ engines: {node: 20 || >=22}
+
+ glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
+
+ global-dirs@0.1.1:
+ resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==}
+ engines: {node: '>=4'}
+
+ globals@14.0.0:
+ resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+ engines: {node: '>=18'}
+
+ globals@16.5.0:
+ resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==}
+ engines: {node: '>=18'}
+
+ globalthis@1.0.4:
+ resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+ engines: {node: '>= 0.4'}
+
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ has-bigints@1.1.0:
+ resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
+ engines: {node: '>= 0.4'}
+
+ 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.2.0:
+ resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
+ engines: {node: '>= 0.4'}
+
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ 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.3:
+ resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==}
+
+ hast-util-has-property@3.0.0:
+ resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==}
+
+ 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@3.1.1:
+ resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==}
+
+ hast-util-parse-selector@4.0.0:
+ resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
+
+ hast-util-raw@9.1.0:
+ resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==}
+
+ hast-util-select@6.0.4:
+ resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==}
+
+ hast-util-to-html@9.0.5:
+ resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==}
+
+ hast-util-to-jsx-runtime@2.3.6:
+ resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==}
+
+ hast-util-to-parse5@8.0.1:
+ resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==}
+
+ 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@7.2.0:
+ resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==}
+
+ hastscript@9.0.1:
+ resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==}
+
+ hermes-estree@0.29.1:
+ resolution: {integrity: sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==}
+
+ hermes-estree@0.32.0:
+ resolution: {integrity: sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==}
+
+ hermes-parser@0.29.1:
+ resolution: {integrity: sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==}
+
+ hermes-parser@0.32.0:
+ resolution: {integrity: sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==}
+
+ hoist-non-react-statics@3.3.2:
+ resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
+
+ hosted-git-info@7.0.2:
+ resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+
+ html-url-attributes@3.0.1:
+ resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==}
+
+ html-void-elements@3.0.0:
+ resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
+
+ http-errors@2.0.1:
+ resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
+ engines: {node: '>= 0.8'}
+
+ https-proxy-agent@7.0.6:
+ resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
+ engines: {node: '>= 14'}
+
+ 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'}
+
+ ignore@7.0.5:
+ resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
+ engines: {node: '>= 4'}
+
+ image-size@1.2.1:
+ resolution: {integrity: sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==}
+ engines: {node: '>=16.x'}
+ hasBin: true
+
+ import-fresh@3.3.1:
+ resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
+ engines: {node: '>=6'}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ 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.2.7:
+ resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==}
+
+ internal-slot@1.1.0:
+ resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
+ engines: {node: '>= 0.4'}
+
+ invariant@2.2.4:
+ resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
+
+ is-alphabetical@2.0.1:
+ resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
+
+ is-alphanumerical@2.0.1:
+ resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==}
+
+ is-arguments@1.2.0:
+ resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==}
+ engines: {node: '>= 0.4'}
+
+ is-array-buffer@3.0.5:
+ resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
+ engines: {node: '>= 0.4'}
+
+ is-arrayish@0.3.4:
+ resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==}
+
+ is-async-function@2.1.1:
+ resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
+ engines: {node: '>= 0.4'}
+
+ is-bigint@1.1.0:
+ resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
+ engines: {node: '>= 0.4'}
+
+ is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+
+ is-boolean-object@1.2.2:
+ resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
+ engines: {node: '>= 0.4'}
+
+ is-bun-module@2.0.0:
+ resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==}
+
+ is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+
+ is-core-module@2.16.1:
+ resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
+ engines: {node: '>= 0.4'}
+
+ is-data-view@1.0.2:
+ resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
+ engines: {node: '>= 0.4'}
+
+ is-date-object@1.1.0:
+ resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
+ engines: {node: '>= 0.4'}
+
+ is-decimal@2.0.1:
+ resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
+
+ 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-finalizationregistry@1.1.1:
+ resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
+ engines: {node: '>= 0.4'}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-generator-function@1.1.2:
+ resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==}
+ engines: {node: '>= 0.4'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-hexadecimal@2.0.1:
+ resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
+
+ is-map@2.0.3:
+ resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+ engines: {node: '>= 0.4'}
+
+ is-nan@1.3.2:
+ resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==}
+ engines: {node: '>= 0.4'}
+
+ is-negative-zero@2.0.3:
+ resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
+ engines: {node: '>= 0.4'}
+
+ is-number-object@1.1.1:
+ resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
+ engines: {node: '>= 0.4'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ is-plain-obj@2.1.0:
+ resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==}
+ engines: {node: '>=8'}
+
+ is-plain-obj@4.1.0:
+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+ engines: {node: '>=12'}
+
+ is-regex@1.2.1:
+ resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
+ engines: {node: '>= 0.4'}
+
+ is-set@2.0.3:
+ resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+ engines: {node: '>= 0.4'}
+
+ is-shared-array-buffer@1.0.4:
+ resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
+ engines: {node: '>= 0.4'}
+
+ is-string@1.1.1:
+ resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
+ engines: {node: '>= 0.4'}
+
+ is-symbol@1.1.1:
+ resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
+ engines: {node: '>= 0.4'}
+
+ is-typed-array@1.1.15:
+ resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
+ engines: {node: '>= 0.4'}
+
+ is-weakmap@2.0.2:
+ resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+ engines: {node: '>= 0.4'}
+
+ is-weakref@1.1.1:
+ resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
+ engines: {node: '>= 0.4'}
+
+ is-weakset@2.0.4:
+ resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
+ engines: {node: '>= 0.4'}
+
+ is-what@5.5.0:
+ resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==}
+ engines: {node: '>=18'}
+
+ is-wsl@2.2.0:
+ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+ engines: {node: '>=8'}
+
+ isarray@2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ istanbul-lib-coverage@3.2.2:
+ resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
+ engines: {node: '>=8'}
+
+ istanbul-lib-instrument@5.2.1:
+ resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==}
+ engines: {node: '>=8'}
+
+ iterator.prototype@1.1.5:
+ resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==}
+ engines: {node: '>= 0.4'}
+
+ jest-environment-node@29.7.0:
+ resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-get-type@29.6.3:
+ resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-haste-map@29.7.0:
+ resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-message-util@29.7.0:
+ resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-mock@29.7.0:
+ resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-regex-util@29.6.3:
+ resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-util@29.7.0:
+ resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-validate@29.7.0:
+ resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-worker@29.7.0:
+ resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jimp-compact@0.16.1:
+ resolution: {integrity: sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==}
+
+ jiti@1.21.7:
+ resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
+ hasBin: true
+
+ jose@6.1.3:
+ resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==}
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-yaml@3.14.2:
+ resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==}
+ hasBin: true
+
+ js-yaml@4.1.1:
+ resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
+ hasBin: true
+
+ jsc-safe-url@0.2.4:
+ resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==}
+
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+ json5@1.0.2:
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+ hasBin: true
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsx-ast-utils@3.3.5:
+ resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
+ engines: {node: '>=4.0'}
+
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+ kleur@3.0.3:
+ resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
+ engines: {node: '>=6'}
+
+ kysely@0.28.11:
+ resolution: {integrity: sha512-zpGIFg0HuoC893rIjYX1BETkVWdDnzTzF5e0kWXJFg5lE0k1/LfNWBejrcnOFu8Q2Rfq/hTDTU7XLUM8QOrpzg==}
+ engines: {node: '>=20.0.0'}
+
+ lan-network@0.1.7:
+ resolution: {integrity: sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==}
+ hasBin: true
+
+ language-subtag-registry@0.3.23:
+ resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==}
+
+ language-tags@1.0.9:
+ resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==}
+ engines: {node: '>=0.10'}
+
+ leven@3.1.0:
+ resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
+ engines: {node: '>=6'}
+
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
+ lighthouse-logger@1.4.2:
+ resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==}
+
+ lightningcss-android-arm64@1.31.1:
+ resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [android]
+
+ lightningcss-darwin-arm64@1.27.0:
+ resolution: {integrity: sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ lightningcss-darwin-arm64@1.31.1:
+ resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ lightningcss-darwin-x64@1.27.0:
+ resolution: {integrity: sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ lightningcss-darwin-x64@1.31.1:
+ resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ lightningcss-freebsd-x64@1.27.0:
+ resolution: {integrity: sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ lightningcss-freebsd-x64@1.31.1:
+ resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ lightningcss-linux-arm-gnueabihf@1.27.0:
+ resolution: {integrity: sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ lightningcss-linux-arm-gnueabihf@1.31.1:
+ resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ lightningcss-linux-arm64-gnu@1.27.0:
+ resolution: {integrity: sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-arm64-gnu@1.31.1:
+ resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-arm64-musl@1.27.0:
+ resolution: {integrity: sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-arm64-musl@1.31.1:
+ resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-x64-gnu@1.27.0:
+ resolution: {integrity: sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-linux-x64-gnu@1.31.1:
+ resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-linux-x64-musl@1.27.0:
+ resolution: {integrity: sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-linux-x64-musl@1.31.1:
+ resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-win32-arm64-msvc@1.27.0:
+ resolution: {integrity: sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ lightningcss-win32-arm64-msvc@1.31.1:
+ resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ lightningcss-win32-x64-msvc@1.27.0:
+ resolution: {integrity: sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ lightningcss-win32-x64-msvc@1.31.1:
+ resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ lightningcss@1.27.0:
+ resolution: {integrity: sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ==}
+ engines: {node: '>= 12.0.0'}
+
+ lightningcss@1.31.1:
+ resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==}
+ engines: {node: '>= 12.0.0'}
+
+ lilconfig@3.1.3:
+ resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
+ engines: {node: '>=14'}
+
+ lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ 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.debounce@4.0.8:
+ resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ lodash.throttle@4.1.1:
+ resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==}
+
+ log-symbols@2.2.0:
+ resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==}
+ engines: {node: '>=4'}
+
+ 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
+
+ lru-cache@10.4.3:
+ resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
+ lru-cache@11.2.6:
+ resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==}
+ engines: {node: 20 || >=22}
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+ lucide-react@0.460.0:
+ resolution: {integrity: sha512-BVtq/DykVeIvRTJvRAgCsOwaGL8Un3Bxh8MbDxMhEWlZay3T4IpEKDEpwt5KZ0KJMHzgm6jrltxlT5eXOWXDHg==}
+ peerDependencies:
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc
+
+ makeerror@1.0.12:
+ resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
+
+ markdown-table@3.0.4:
+ resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
+
+ marky@1.3.0:
+ resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==}
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ mdast-util-find-and-replace@3.0.2:
+ resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==}
+
+ 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.1.0:
+ resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==}
+
+ 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.1.0:
+ resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==}
+
+ mdast-util-mdx-expression@2.0.1:
+ resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==}
+
+ mdast-util-mdx-jsx@3.2.0:
+ resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==}
+
+ 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.1:
+ resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==}
+
+ 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==}
+
+ memoize-one@5.2.1:
+ resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==}
+
+ merge-options@3.0.4:
+ resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==}
+ 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'}
+
+ metro-babel-transformer@0.83.3:
+ resolution: {integrity: sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==}
+ engines: {node: '>=20.19.4'}
+
+ metro-cache-key@0.83.3:
+ resolution: {integrity: sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==}
+ engines: {node: '>=20.19.4'}
+
+ metro-cache@0.83.3:
+ resolution: {integrity: sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==}
+ engines: {node: '>=20.19.4'}
+
+ metro-config@0.83.3:
+ resolution: {integrity: sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==}
+ engines: {node: '>=20.19.4'}
+
+ metro-core@0.83.3:
+ resolution: {integrity: sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==}
+ engines: {node: '>=20.19.4'}
+
+ metro-file-map@0.83.3:
+ resolution: {integrity: sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==}
+ engines: {node: '>=20.19.4'}
+
+ metro-minify-terser@0.83.3:
+ resolution: {integrity: sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==}
+ engines: {node: '>=20.19.4'}
+
+ metro-resolver@0.83.3:
+ resolution: {integrity: sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==}
+ engines: {node: '>=20.19.4'}
+
+ metro-runtime@0.83.3:
+ resolution: {integrity: sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==}
+ engines: {node: '>=20.19.4'}
+
+ metro-source-map@0.83.3:
+ resolution: {integrity: sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==}
+ engines: {node: '>=20.19.4'}
+
+ metro-symbolicate@0.83.3:
+ resolution: {integrity: sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==}
+ engines: {node: '>=20.19.4'}
+ hasBin: true
+
+ metro-transform-plugins@0.83.3:
+ resolution: {integrity: sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==}
+ engines: {node: '>=20.19.4'}
+
+ metro-transform-worker@0.83.3:
+ resolution: {integrity: sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==}
+ engines: {node: '>=20.19.4'}
+
+ metro@0.83.3:
+ resolution: {integrity: sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==}
+ engines: {node: '>=20.19.4'}
+ hasBin: true
+
+ micromark-core-commonmark@2.0.3:
+ resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==}
+
+ 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.1:
+ resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==}
+
+ 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-factory-destination@2.0.1:
+ resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==}
+
+ micromark-factory-label@2.0.1:
+ resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==}
+
+ micromark-factory-space@2.0.1:
+ resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==}
+
+ micromark-factory-title@2.0.1:
+ resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==}
+
+ micromark-factory-whitespace@2.0.1:
+ resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==}
+
+ micromark-util-character@2.1.1:
+ resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==}
+
+ micromark-util-chunked@2.0.1:
+ resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==}
+
+ micromark-util-classify-character@2.0.1:
+ resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==}
+
+ micromark-util-combine-extensions@2.0.1:
+ resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==}
+
+ micromark-util-decode-numeric-character-reference@2.0.2:
+ resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==}
+
+ micromark-util-decode-string@2.0.1:
+ resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==}
+
+ micromark-util-encode@2.0.1:
+ resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
+
+ micromark-util-html-tag-name@2.0.1:
+ resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==}
+
+ micromark-util-normalize-identifier@2.0.1:
+ resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==}
+
+ micromark-util-resolve-all@2.0.1:
+ resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==}
+
+ micromark-util-sanitize-uri@2.0.1:
+ resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
+
+ micromark-util-subtokenize@2.1.0:
+ resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==}
+
+ micromark-util-symbol@2.0.1:
+ resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
+
+ micromark-util-types@2.0.2:
+ resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==}
+
+ micromark@4.0.2:
+ resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==}
+
+ 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-db@1.54.0:
+ resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+
+ mime@1.6.0:
+ resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ mimic-fn@1.2.0:
+ resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==}
+ engines: {node: '>=4'}
+
+ minimatch@10.2.1:
+ resolution: {integrity: sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==}
+ engines: {node: 20 || >=22}
+
+ minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+ minimatch@9.0.5:
+ resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ 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.1.0:
+ resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==}
+ engines: {node: '>= 18'}
+
+ mkdirp@1.0.4:
+ resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ 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==}
+
+ nanoid@3.3.11:
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ nanostores@1.1.0:
+ resolution: {integrity: sha512-yJBmDJr18xy47dbNVlHcgdPrulSn1nhSE6Ns9vTG+Nx9VPT6iV1MD6aQFp/t52zpf82FhLLTXAXr30NuCnxvwA==}
+ engines: {node: ^20.0.0 || >=22.0.0}
+
+ napi-postinstall@0.3.4:
+ resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+ hasBin: true
+
+ nativewind@4.2.1:
+ resolution: {integrity: sha512-10uUB2Dlli3MH3NDL5nMHqJHz1A3e/E6mzjTj6cl7hHECClJ7HpE6v+xZL+GXdbwQSnWE+UWMIMsNz7yOQkAJQ==}
+ engines: {node: '>=16'}
+ peerDependencies:
+ tailwindcss: '>3.3.0'
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+ negotiator@0.6.3:
+ resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+ engines: {node: '>= 0.6'}
+
+ negotiator@0.6.4:
+ resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==}
+ engines: {node: '>= 0.6'}
+
+ nested-error-stacks@2.0.1:
+ resolution: {integrity: sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==}
+
+ next@15.5.12:
+ resolution: {integrity: sha512-Fi/wQ4Etlrn60rz78bebG1i1SR20QxvV8tVp6iJspjLUSHcZoeUXCt+vmWoEcza85ElZzExK/jJ/F6SvtGktjA==}
+ engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@opentelemetry/api': ^1.1.0
+ '@playwright/test': ^1.51.1
+ babel-plugin-react-compiler: '*'
+ react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ sass: ^1.3.0
+ peerDependenciesMeta:
+ '@opentelemetry/api':
+ optional: true
+ '@playwright/test':
+ optional: true
+ babel-plugin-react-compiler:
+ optional: true
+ sass:
+ optional: true
+
+ node-exports-info@1.6.0:
+ resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==}
+ engines: {node: '>= 0.4'}
+
+ node-forge@1.3.3:
+ resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==}
+ engines: {node: '>= 6.13.0'}
+
+ node-int64@0.4.0:
+ resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
+
+ node-releases@2.0.27:
+ resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
+
+ nodemailer@6.10.1:
+ resolution: {integrity: sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==}
+ engines: {node: '>=6.0.0'}
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ npm-package-arg@11.0.3:
+ resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==}
+ engines: {node: ^16.14.0 || >=18.0.0}
+
+ nth-check@2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+ nullthrows@1.1.1:
+ resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==}
+
+ ob1@0.83.3:
+ resolution: {integrity: sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==}
+ engines: {node: '>=20.19.4'}
+
+ 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.4:
+ resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+ engines: {node: '>= 0.4'}
+
+ object-is@1.1.6:
+ resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
+ engines: {node: '>= 0.4'}
+
+ object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+
+ object.assign@4.1.7:
+ resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
+ engines: {node: '>= 0.4'}
+
+ object.entries@1.1.9:
+ resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==}
+ engines: {node: '>= 0.4'}
+
+ object.fromentries@2.0.8:
+ resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
+ engines: {node: '>= 0.4'}
+
+ object.groupby@1.0.3:
+ resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
+ engines: {node: '>= 0.4'}
+
+ object.values@1.2.1:
+ resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
+ engines: {node: '>= 0.4'}
+
+ on-finished@2.3.0:
+ resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==}
+ engines: {node: '>= 0.8'}
+
+ on-finished@2.4.1:
+ resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+ engines: {node: '>= 0.8'}
+
+ on-headers@1.1.0:
+ resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==}
+ engines: {node: '>= 0.8'}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ onetime@2.0.1:
+ resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==}
+ engines: {node: '>=4'}
+
+ open@7.4.2:
+ resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==}
+ engines: {node: '>=8'}
+
+ open@8.4.2:
+ resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+ engines: {node: '>=12'}
+
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+
+ ora@3.4.0:
+ resolution: {integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==}
+ engines: {node: '>=6'}
+
+ own-keys@1.0.1:
+ resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
+ engines: {node: '>= 0.4'}
+
+ 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@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-try@2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ parse-entities@4.0.2:
+ resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==}
+
+ parse-numeric-range@1.3.0:
+ resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==}
+
+ parse-png@2.1.0:
+ resolution: {integrity: sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==}
+ engines: {node: '>=10'}
+
+ parse5@7.3.0:
+ resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
+
+ parseurl@1.3.3:
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+ engines: {node: '>= 0.8'}
+
+ 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@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@2.0.1:
+ resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==}
+ engines: {node: 20 || >=22}
+
+ 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@3.0.1:
+ resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==}
+ engines: {node: '>=10'}
+
+ picomatch@4.0.3:
+ resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
+ engines: {node: '>=12'}
+
+ pify@2.3.0:
+ resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+ engines: {node: '>=0.10.0'}
+
+ pirates@4.0.7:
+ resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==}
+ engines: {node: '>= 6'}
+
+ plist@3.1.0:
+ resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==}
+ engines: {node: '>=10.4.0'}
+
+ pngjs@3.4.0:
+ resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==}
+ engines: {node: '>=4.0.0'}
+
+ possible-typed-array-names@1.1.0:
+ resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
+ 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.1.0:
+ resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==}
+ engines: {node: ^12 || ^14 || >= 16}
+ peerDependencies:
+ postcss: ^8.4.21
+
+ postcss-load-config@6.0.1:
+ resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==}
+ engines: {node: '>= 18'}
+ peerDependencies:
+ jiti: '>=1.21.0'
+ postcss: '>=8.0.9'
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+ postcss:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ 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.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.49:
+ resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ postcss@8.5.6:
+ resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ pretty-bytes@5.6.0:
+ resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==}
+ engines: {node: '>=6'}
+
+ pretty-format@29.7.0:
+ resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ prisma@5.22.0:
+ resolution: {integrity: sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A==}
+ engines: {node: '>=16.13'}
+ hasBin: true
+
+ proc-log@4.2.0:
+ resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ progress@2.0.3:
+ resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==}
+ engines: {node: '>=0.4.0'}
+
+ promise@8.3.0:
+ resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==}
+
+ prompts@2.4.2:
+ resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
+ engines: {node: '>= 6'}
+
+ prop-types@15.8.1:
+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+
+ property-information@6.5.0:
+ resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==}
+
+ property-information@7.1.0:
+ resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ qrcode-terminal@0.11.0:
+ resolution: {integrity: sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==}
+ hasBin: true
+
+ query-string@7.1.3:
+ resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==}
+ engines: {node: '>=6'}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ queue@6.0.2:
+ resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==}
+
+ range-parser@1.2.1:
+ resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+ engines: {node: '>= 0.6'}
+
+ rc@1.2.8:
+ resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
+ hasBin: true
+
+ react-devtools-core@6.1.5:
+ resolution: {integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==}
+
+ react-dom@18.3.1:
+ resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
+ peerDependencies:
+ react: ^18.3.1
+
+ react-fast-compare@3.2.2:
+ resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==}
+
+ react-freeze@1.0.4:
+ resolution: {integrity: sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ react: '>=17.0.0'
+
+ react-is@16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+
+ react-is@18.3.1:
+ resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
+
+ react-is@19.2.4:
+ resolution: {integrity: sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==}
+
+ react-markdown@9.0.3:
+ resolution: {integrity: sha512-Yk7Z94dbgYTOrdk41Z74GoKA7rThnsbbqBTRYuxoe08qvfQ9tJVhmAKw6BJS/ZORG7kTy/s1QvYzSuaoBA1qfw==}
+ peerDependencies:
+ '@types/react': '>=18'
+ react: '>=18'
+
+ react-native-css-interop@0.2.1:
+ resolution: {integrity: sha512-B88f5rIymJXmy1sNC/MhTkb3xxBej1KkuAt7TiT9iM7oXz3RM8Bn+7GUrfR02TvSgKm4cg2XiSuLEKYfKwNsjA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ react: '>=18'
+ react-native: '*'
+ react-native-reanimated: '>=3.6.2'
+ react-native-safe-area-context: '*'
+ react-native-svg: '*'
+ tailwindcss: ~3
+ peerDependenciesMeta:
+ react-native-safe-area-context:
+ optional: true
+ react-native-svg:
+ optional: true
+
+ react-native-gesture-handler@2.28.0:
+ resolution: {integrity: sha512-0msfJ1vRxXKVgTgvL+1ZOoYw3/0z1R+Ked0+udoJhyplC2jbVKIJ8Z1bzWdpQRCV3QcQ87Op0zJVE5DhKK2A0A==}
+ peerDependencies:
+ react: '*'
+ react-native: '*'
+
+ react-native-is-edge-to-edge@1.2.1:
+ resolution: {integrity: sha512-FLbPWl/MyYQWz+KwqOZsSyj2JmLKglHatd3xLZWskXOpRaio4LfEDEz8E/A6uD8QoTHW6Aobw1jbEwK7KMgR7Q==}
+ peerDependencies:
+ react: '*'
+ react-native: '*'
+
+ react-native-reanimated@4.1.6:
+ resolution: {integrity: sha512-F+ZJBYiok/6Jzp1re75F/9aLzkgoQCOh4yxrnwATa8392RvM3kx+fiXXFvwcgE59v48lMwd9q0nzF1oJLXpfxQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ react: '*'
+ react-native: '*'
+ react-native-worklets: '>=0.5.0'
+
+ react-native-safe-area-context@5.6.2:
+ resolution: {integrity: sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg==}
+ peerDependencies:
+ react: '*'
+ react-native: '*'
+
+ react-native-screens@4.16.0:
+ resolution: {integrity: sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q==}
+ peerDependencies:
+ react: '*'
+ react-native: '*'
+
+ react-native-worklets@0.7.4:
+ resolution: {integrity: sha512-NYOdM1MwBb3n+AtMqy1tFy3Mn8DliQtd8sbzAVRf9Gc+uvQ0zRfxN7dS8ZzoyX7t6cyQL5THuGhlnX+iFlQTag==}
+ peerDependencies:
+ '@babel/core': '*'
+ react: '*'
+ react-native: '*'
+
+ react-native@0.81.5:
+ resolution: {integrity: sha512-1w+/oSjEXZjMqsIvmkCRsOc8UBYv163bTWKTI8+1mxztvQPhCRYGTvZ/PL1w16xXHneIj/SLGfxWg2GWN2uexw==}
+ engines: {node: '>= 20.19.4'}
+ hasBin: true
+ peerDependencies:
+ '@types/react': ^19.1.0
+ react: ^19.1.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ react-refresh@0.14.2:
+ resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==}
+ engines: {node: '>=0.10.0'}
+
+ react-remove-scroll-bar@2.3.8:
+ resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ react-remove-scroll@2.7.2:
+ resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ react-style-singleton@2.2.3:
+ resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ react@18.3.1:
+ resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
+ engines: {node: '>=0.10.0'}
+
+ react@19.1.0:
+ resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==}
+ engines: {node: '>=0.10.0'}
+
+ read-cache@1.0.0:
+ resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
+
+ readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+
+ reflect.getprototypeof@1.0.10:
+ resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
+ engines: {node: '>= 0.4'}
+
+ refractor@4.9.0:
+ resolution: {integrity: sha512-nEG1SPXFoGGx+dcjftjv8cAjEusIh6ED1xhf5DG3C0x/k+rmZ2duKnc3QLpt6qeHv5fPb8uwN3VWN2BT7fr3Og==}
+
+ refractor@5.0.0:
+ resolution: {integrity: sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw==}
+
+ regenerate-unicode-properties@10.2.2:
+ resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==}
+ engines: {node: '>=4'}
+
+ regenerate@1.4.2:
+ resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
+
+ regenerator-runtime@0.13.11:
+ resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
+
+ regexp.prototype.flags@1.5.4:
+ resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
+ engines: {node: '>= 0.4'}
+
+ regexpu-core@6.4.0:
+ resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==}
+ engines: {node: '>=4'}
+
+ regjsgen@0.8.0:
+ resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==}
+
+ regjsparser@0.13.0:
+ resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==}
+ hasBin: true
+
+ rehype-attr@3.0.3:
+ resolution: {integrity: sha512-Up50Xfra8tyxnkJdCzLBIBtxOcB2M1xdeKe1324U06RAvSjYm7ULSeoM+b/nYPQPVd7jsXJ9+39IG1WAJPXONw==}
+ engines: {node: '>=16'}
+
+ rehype-autolink-headings@7.1.0:
+ resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==}
+
+ rehype-ignore@2.0.3:
+ resolution: {integrity: sha512-IzhP6/u/6sm49sdktuYSmeIuObWB+5yC/5eqVws8BhuGA9kY25/byz6uCy/Ravj6lXUShEd2ofHM5MyAIj86Sg==}
+ engines: {node: '>=16'}
+
+ rehype-parse@9.0.1:
+ resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==}
+
+ rehype-prism-plus@2.0.0:
+ resolution: {integrity: sha512-FeM/9V2N7EvDZVdR2dqhAzlw5YI49m9Tgn7ZrYJeYHIahM6gcXpH0K1y2gNnKanZCydOMluJvX2cB9z3lhY8XQ==}
+
+ rehype-prism-plus@2.0.2:
+ resolution: {integrity: sha512-jTHb8ZtQHd2VWAAKeCINgv/8zNEF0+LesmwJak69GemoPVN9/8fGEARTvqOpKqmN57HwaM9z8UKBVNVJe8zggw==}
+
+ rehype-raw@7.0.0:
+ resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==}
+
+ rehype-rewrite@4.0.4:
+ resolution: {integrity: sha512-L/FO96EOzSA6bzOam4DVu61/PB3AGKcSPXpa53yMIozoxH4qg1+bVZDF8zh1EsuxtSauAhzt5cCnvoplAaSLrw==}
+ engines: {node: '>=16.0.0'}
+
+ 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==}
+
+ remark-gfm@4.0.1:
+ resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==}
+
+ remark-github-blockquote-alert@1.3.1:
+ resolution: {integrity: sha512-OPNnimcKeozWN1w8KVQEuHOxgN3L4rah8geMOLhA5vN9wITqU4FWD+G26tkEsCGHiOVDbISx+Se5rGZ+D1p0Jg==}
+ engines: {node: '>=16'}
+
+ remark-parse@11.0.0:
+ resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
+
+ remark-rehype@11.1.2:
+ resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==}
+
+ remark-stringify@11.0.0:
+ resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
+
+ 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'}
+
+ requireg@0.2.2:
+ resolution: {integrity: sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==}
+ engines: {node: '>= 4.0.0'}
+
+ 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-global@1.0.0:
+ resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==}
+ engines: {node: '>=8'}
+
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ resolve-workspace-root@2.0.1:
+ resolution: {integrity: sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w==}
+
+ resolve.exports@2.0.3:
+ resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==}
+ engines: {node: '>=10'}
+
+ resolve@1.22.11:
+ resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
+ resolve@1.7.1:
+ resolution: {integrity: sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==}
+
+ resolve@2.0.0-next.6:
+ resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
+ restore-cursor@2.0.0:
+ resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==}
+ engines: {node: '>=4'}
+
+ reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+ 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
+
+ rou3@0.7.12:
+ resolution: {integrity: sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg==}
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ safe-array-concat@1.1.3:
+ resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
+ engines: {node: '>=0.4'}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safe-push-apply@1.0.0:
+ resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
+ engines: {node: '>= 0.4'}
+
+ safe-regex-test@1.1.0:
+ resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
+ engines: {node: '>= 0.4'}
+
+ sax@1.4.4:
+ resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==}
+ engines: {node: '>=11.0.0'}
+
+ scheduler@0.23.2:
+ resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
+
+ scheduler@0.26.0:
+ resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==}
+
+ 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
+
+ semver@7.7.2:
+ resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ semver@7.7.3:
+ resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ semver@7.7.4:
+ resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ send@0.19.2:
+ resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==}
+ engines: {node: '>= 0.8.0'}
+
+ serialize-error@2.1.0:
+ resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==}
+ engines: {node: '>=0.10.0'}
+
+ serve-static@1.16.3:
+ resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==}
+ engines: {node: '>= 0.8.0'}
+
+ server-only@0.0.1:
+ resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==}
+
+ set-cookie-parser@2.7.2:
+ resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==}
+
+ 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'}
+
+ set-proto@1.0.0:
+ resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
+ engines: {node: '>= 0.4'}
+
+ setprototypeof@1.2.0:
+ resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+
+ sf-symbols-typescript@2.2.0:
+ resolution: {integrity: sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw==}
+ engines: {node: '>=10'}
+
+ shallowequal@1.1.0:
+ resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==}
+
+ sharp@0.34.5:
+ resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ shell-quote@1.8.3:
+ resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-list@1.0.0:
+ resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+ engines: {node: '>= 0.4'}
+
+ side-channel@1.1.0:
+ resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+ engines: {node: '>= 0.4'}
+
+ signal-exit@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
+ simple-plist@1.3.1:
+ resolution: {integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==}
+
+ simple-swizzle@0.2.4:
+ resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==}
+
+ sisteransi@1.0.5:
+ resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+
+ slash@3.0.0:
+ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+ engines: {node: '>=8'}
+
+ slugify@1.6.6:
+ resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==}
+ engines: {node: '>=8.0.0'}
+
+ 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'}
+
+ space-separated-tokens@2.0.2:
+ resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
+
+ split-on-first@1.1.0:
+ resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==}
+ engines: {node: '>=6'}
+
+ sprintf-js@1.0.3:
+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+
+ stable-hash@0.0.5:
+ resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==}
+
+ stack-utils@2.0.6:
+ resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
+ engines: {node: '>=10'}
+
+ stackframe@1.3.4:
+ resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==}
+
+ stacktrace-parser@0.1.11:
+ resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==}
+ engines: {node: '>=6'}
+
+ statuses@1.5.0:
+ resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
+ engines: {node: '>= 0.6'}
+
+ statuses@2.0.2:
+ resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
+ engines: {node: '>= 0.8'}
+
+ stop-iteration-iterator@1.1.0:
+ resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
+ engines: {node: '>= 0.4'}
+
+ stream-buffers@2.2.0:
+ resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==}
+ engines: {node: '>= 0.10.0'}
+
+ strict-uri-encode@2.0.0:
+ resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==}
+ engines: {node: '>=4'}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string.prototype.includes@2.0.1:
+ resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.matchall@4.0.12:
+ resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.repeat@1.0.0:
+ resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==}
+
+ string.prototype.trim@1.2.10:
+ resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimend@1.0.9:
+ resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
+ engines: {node: '>= 0.4'}
+
+ string.prototype.trimstart@1.0.8:
+ resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+ engines: {node: '>= 0.4'}
+
+ stringify-entities@4.0.4:
+ resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
+
+ strip-ansi@5.2.0:
+ resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==}
+ engines: {node: '>=6'}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+
+ strip-json-comments@2.0.1:
+ resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
+ engines: {node: '>=0.10.0'}
+
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+
+ structured-headers@0.4.1:
+ resolution: {integrity: sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==}
+
+ style-to-js@1.1.21:
+ resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==}
+
+ style-to-object@1.0.14:
+ resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==}
+
+ styled-jsx@5.1.6:
+ resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
+ engines: {node: '>= 12.0.0'}
+ peerDependencies:
+ '@babel/core': '*'
+ babel-plugin-macros: '*'
+ react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ babel-plugin-macros:
+ optional: true
+
+ sucrase@3.35.1:
+ resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ hasBin: true
+
+ superjson@2.2.6:
+ resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==}
+ engines: {node: '>=16'}
+
+ 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-hyperlinks@2.3.0:
+ resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==}
+ engines: {node: '>=8'}
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ tailwind-merge@2.6.1:
+ resolution: {integrity: sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==}
+
+ tailwindcss@3.4.19:
+ resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+
+ tar@7.5.9:
+ resolution: {integrity: sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==}
+ engines: {node: '>=18'}
+
+ temp-dir@2.0.0:
+ resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==}
+ engines: {node: '>=8'}
+
+ terminal-link@2.1.1:
+ resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==}
+ engines: {node: '>=8'}
+
+ terser@5.46.0:
+ resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ test-exclude@6.0.0:
+ resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
+ engines: {node: '>=8'}
+
+ 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==}
+
+ throat@5.0.0:
+ resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==}
+
+ tinyglobby@0.2.15:
+ resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+ engines: {node: '>=12.0.0'}
+
+ tmpl@1.0.5:
+ resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ toidentifier@1.0.1:
+ resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+ engines: {node: '>=0.6'}
+
+ trim-lines@3.0.1:
+ resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
+
+ trough@2.2.0:
+ resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
+
+ ts-api-utils@2.4.0:
+ resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==}
+ engines: {node: '>=18.12'}
+ peerDependencies:
+ typescript: '>=4.8.4'
+
+ ts-interface-checker@0.1.13:
+ resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
+
+ tsconfig-paths@3.15.0:
+ resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ tsx@4.21.0:
+ resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
+ turbo-darwin-64@2.8.10:
+ resolution: {integrity: sha512-A03fXh+B7S8mL3PbdhTd+0UsaGrhfyPkODvzBDpKRY7bbeac4MDFpJ7I+Slf2oSkCEeSvHKR7Z4U71uKRUfX7g==}
+ cpu: [x64]
+ os: [darwin]
+
+ turbo-darwin-arm64@2.8.10:
+ resolution: {integrity: sha512-sidzowgWL3s5xCHLeqwC9M3s9M0i16W1nuQF3Mc7fPHpZ+YPohvcbVFBB2uoRRHYZg6yBnwD4gyUHKTeXfwtXA==}
+ cpu: [arm64]
+ os: [darwin]
+
+ turbo-linux-64@2.8.10:
+ resolution: {integrity: sha512-YK9vcpL3TVtqonB021XwgaQhY9hJJbKKUhLv16osxV0HkcQASQWUqR56yMge7puh6nxU67rQlTq1b7ksR1T3KA==}
+ cpu: [x64]
+ os: [linux]
+
+ turbo-linux-arm64@2.8.10:
+ resolution: {integrity: sha512-3+j2tL0sG95iBJTm+6J8/45JsETQABPqtFyYjVjBbi6eVGdtNTiBmHNKrbvXRlQ3ZbUG75bKLaSSDHSEEN+btQ==}
+ cpu: [arm64]
+ os: [linux]
+
+ turbo-windows-64@2.8.10:
+ resolution: {integrity: sha512-hdeF5qmVY/NFgiucf8FW0CWJWtyT2QPm5mIsX0W1DXAVzqKVXGq+Zf+dg4EUngAFKjDzoBeN6ec2Fhajwfztkw==}
+ cpu: [x64]
+ os: [win32]
+
+ turbo-windows-arm64@2.8.10:
+ resolution: {integrity: sha512-QGdr/Q8LWmj+ITMkSvfiz2glf0d7JG0oXVzGL3jxkGqiBI1zXFj20oqVY0qWi+112LO9SVrYdpHS0E/oGFrMbQ==}
+ cpu: [arm64]
+ os: [win32]
+
+ turbo@2.8.10:
+ resolution: {integrity: sha512-OxbzDES66+x7nnKGg2MwBA1ypVsZoDTLHpeaP4giyiHSixbsiTaMyeJqbEyvBdp5Cm28fc+8GG6RdQtic0ijwQ==}
+ hasBin: true
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ type-detect@4.0.8:
+ resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
+ engines: {node: '>=4'}
+
+ type-fest@0.21.3:
+ resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+ engines: {node: '>=10'}
+
+ type-fest@0.7.1:
+ resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==}
+ engines: {node: '>=8'}
+
+ typed-array-buffer@1.0.3:
+ resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-length@1.0.3:
+ resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-byte-offset@1.0.4:
+ resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
+ engines: {node: '>= 0.4'}
+
+ typed-array-length@1.0.7:
+ resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
+ engines: {node: '>= 0.4'}
+
+ typescript@5.9.3:
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ unbox-primitive@1.1.0:
+ resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
+ engines: {node: '>= 0.4'}
+
+ undici-types@6.21.0:
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+
+ undici@6.23.0:
+ resolution: {integrity: sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==}
+ engines: {node: '>=18.17'}
+
+ 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.1:
+ resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==}
+ engines: {node: '>=4'}
+
+ unicode-property-aliases-ecmascript@2.2.0:
+ resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==}
+ 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@5.0.1:
+ resolution: {integrity: sha512-pHx7D4Zt6+TsfwylH9+lYhBhzyhEnCXs/lbq/Hstxno5z4gVdyc2WEW0asfjGKPyG4pEKrnBv5hdkO6+aRnQJw==}
+
+ unist-util-is@6.0.1:
+ resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==}
+
+ unist-util-position@5.0.0:
+ resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+
+ unist-util-stringify-position@4.0.0:
+ resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
+
+ unist-util-visit-parents@6.0.2:
+ resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==}
+
+ unist-util-visit@5.0.0:
+ resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
+
+ unist-util-visit@5.1.0:
+ resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==}
+
+ unpipe@1.0.0:
+ resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+ engines: {node: '>= 0.8'}
+
+ unrs-resolver@1.11.1:
+ resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==}
+
+ update-browserslist-db@1.2.3:
+ resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ use-callback-ref@1.3.3:
+ resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ use-latest-callback@0.2.6:
+ resolution: {integrity: sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg==}
+ peerDependencies:
+ react: '>=16.8'
+
+ use-sidecar@1.1.3:
+ resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ use-sync-external-store@1.6.0:
+ resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ util@0.12.5:
+ resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==}
+
+ utils-merge@1.0.1:
+ resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
+ engines: {node: '>= 0.4.0'}
+
+ uuid@7.0.3:
+ resolution: {integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==}
+ hasBin: true
+
+ validate-npm-package-name@5.0.1:
+ resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+ vary@1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+ engines: {node: '>= 0.8'}
+
+ vaul@1.1.2:
+ resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==}
+ peerDependencies:
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc
+
+ vfile-location@5.0.3:
+ resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==}
+
+ vfile-message@4.0.3:
+ resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==}
+
+ vfile@6.0.3:
+ resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
+
+ vlq@1.0.1:
+ resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==}
+
+ walker@1.0.8:
+ resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
+
+ warn-once@0.1.1:
+ resolution: {integrity: sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==}
+
+ wcwidth@1.0.1:
+ resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+
+ web-namespaces@2.0.1:
+ resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
+
+ webidl-conversions@5.0.0:
+ resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==}
+ engines: {node: '>=8'}
+
+ whatwg-fetch@3.6.20:
+ resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==}
+
+ whatwg-url-without-unicode@8.0.0-3:
+ resolution: {integrity: sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==}
+ engines: {node: '>=10'}
+
+ which-boxed-primitive@1.1.1:
+ resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
+ engines: {node: '>= 0.4'}
+
+ which-builtin-type@1.2.1:
+ resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
+ engines: {node: '>= 0.4'}
+
+ which-collection@1.0.2:
+ resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+ engines: {node: '>= 0.4'}
+
+ which-typed-array@1.1.20:
+ resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==}
+ engines: {node: '>= 0.4'}
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ wonka@6.3.5:
+ resolution: {integrity: sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==}
+
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+
+ wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ write-file-atomic@4.0.2:
+ resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ ws@6.2.3:
+ resolution: {integrity: sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: ^5.0.2
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
+ ws@7.5.10:
+ resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==}
+ engines: {node: '>=8.3.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: ^5.0.2
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
+ ws@8.19.0:
+ resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==}
+ 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
+
+ xcode@3.0.1:
+ resolution: {integrity: sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==}
+ engines: {node: '>=10.0.0'}
+
+ xml2js@0.6.0:
+ resolution: {integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==}
+ engines: {node: '>=4.0.0'}
+
+ xmlbuilder@11.0.1:
+ resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==}
+ engines: {node: '>=4.0'}
+
+ xmlbuilder@15.1.1:
+ resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==}
+ engines: {node: '>=8.0'}
+
+ y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ yallist@5.0.0:
+ resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
+ engines: {node: '>=18'}
+
+ yaml@2.8.2:
+ resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==}
+ engines: {node: '>= 14.6'}
+ hasBin: true
+
+ 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'}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+ zod@3.25.76:
+ resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
+
+ zod@4.3.6:
+ resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
+
+ zustand@5.0.11:
+ resolution: {integrity: sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg==}
+ engines: {node: '>=12.20.0'}
+ peerDependencies:
+ '@types/react': '>=18.0.0'
+ immer: '>=9.0.6'
+ react: '>=18.0.0'
+ use-sync-external-store: '>=1.2.0'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ immer:
+ optional: true
+ react:
+ optional: true
+ use-sync-external-store:
+ optional: true
+
+ zwitch@2.0.4:
+ resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
+
+snapshots:
+
+ '@0no-co/graphql.web@1.2.0': {}
+
+ '@alloc/quick-lru@5.2.0': {}
+
+ '@babel/code-frame@7.10.4':
+ dependencies:
+ '@babel/highlight': 7.25.9
+
+ '@babel/code-frame@7.29.0':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.28.5
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/compat-data@7.29.0': {}
+
+ '@babel/core@7.29.0':
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ '@babel/generator': 7.29.1
+ '@babel/helper-compilation-targets': 7.28.6
+ '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0)
+ '@babel/helpers': 7.28.6
+ '@babel/parser': 7.29.0
+ '@babel/template': 7.28.6
+ '@babel/traverse': 7.29.0
+ '@babel/types': 7.29.0
+ '@jridgewell/remapping': 2.3.5
+ convert-source-map: 2.0.0
+ debug: 4.4.3
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/generator@7.29.1':
+ dependencies:
+ '@babel/parser': 7.29.0
+ '@babel/types': 7.29.0
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.1.0
+
+ '@babel/helper-annotate-as-pure@7.27.3':
+ dependencies:
+ '@babel/types': 7.29.0
+
+ '@babel/helper-compilation-targets@7.28.6':
+ dependencies:
+ '@babel/compat-data': 7.29.0
+ '@babel/helper-validator-option': 7.27.1
+ browserslist: 4.28.1
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-member-expression-to-functions': 7.28.5
+ '@babel/helper-optimise-call-expression': 7.27.1
+ '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0)
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ '@babel/traverse': 7.29.0
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-annotate-as-pure': 7.27.3
+ regexpu-core: 6.4.0
+ semver: 6.3.1
+
+ '@babel/helper-define-polyfill-provider@0.6.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-compilation-targets': 7.28.6
+ '@babel/helper-plugin-utils': 7.28.6
+ debug: 4.4.3
+ lodash.debounce: 4.0.8
+ resolve: 1.22.11
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-globals@7.28.0': {}
+
+ '@babel/helper-member-expression-to-functions@7.28.5':
+ dependencies:
+ '@babel/traverse': 7.29.0
+ '@babel/types': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-imports@7.28.6':
+ dependencies:
+ '@babel/traverse': 7.29.0
+ '@babel/types': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-module-imports': 7.28.6
+ '@babel/helper-validator-identifier': 7.28.5
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-optimise-call-expression@7.27.1':
+ dependencies:
+ '@babel/types': 7.29.0
+
+ '@babel/helper-plugin-utils@7.28.6': {}
+
+ '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-wrap-function': 7.28.6
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-member-expression-to-functions': 7.28.5
+ '@babel/helper-optimise-call-expression': 7.27.1
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
+ dependencies:
+ '@babel/traverse': 7.29.0
+ '@babel/types': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-string-parser@7.27.1': {}
+
+ '@babel/helper-validator-identifier@7.28.5': {}
+
+ '@babel/helper-validator-option@7.27.1': {}
+
+ '@babel/helper-wrap-function@7.28.6':
+ dependencies:
+ '@babel/template': 7.28.6
+ '@babel/traverse': 7.29.0
+ '@babel/types': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helpers@7.28.6':
+ dependencies:
+ '@babel/template': 7.28.6
+ '@babel/types': 7.29.0
+
+ '@babel/highlight@7.25.9':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.28.5
+ chalk: 2.4.2
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/parser@7.29.0':
+ dependencies:
+ '@babel/types': 7.29.0
+
+ '@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0)
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/plugin-syntax-decorators': 7.28.6(@babel/core@7.29.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-proposal-export-default-from@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-decorators@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-export-default-from@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-flow@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0)
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-module-imports': 7.28.6
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0)
+ '@babel/helper-plugin-utils': 7.28.6
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0)
+ '@babel/helper-plugin-utils': 7.28.6
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0)
+ '@babel/helper-plugin-utils': 7.28.6
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-classes@7.28.4(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-compilation-targets': 7.28.6
+ '@babel/helper-globals': 7.28.0
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0)
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-classes@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-compilation-targets': 7.28.6
+ '@babel/helper-globals': 7.28.0
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0)
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/template': 7.28.6
+
+ '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/plugin-syntax-flow': 7.28.6(@babel/core@7.29.0)
+
+ '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-compilation-targets': 7.28.6
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-literals@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0)
+ '@babel/helper-plugin-utils': 7.28.6
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0)
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-compilation-targets': 7.28.6
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0)
+ '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0)
+ '@babel/traverse': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0)
+ '@babel/helper-plugin-utils': 7.28.6
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0)
+ '@babel/helper-plugin-utils': 7.28.6
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-module-imports': 7.28.6
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0)
+ '@babel/types': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-runtime@7.29.0(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-module-imports': 7.28.6
+ '@babel/helper-plugin-utils': 7.28.6
+ babel-plugin-polyfill-corejs2: 0.4.15(@babel/core@7.29.0)
+ babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.0)
+ babel-plugin-polyfill-regenerator: 0.6.6(@babel/core@7.29.0)
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-spread@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-annotate-as-pure': 7.27.3
+ '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0)
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+ '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0)
+ '@babel/helper-plugin-utils': 7.28.6
+
+ '@babel/preset-react@7.28.5(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-validator-option': 7.27.1
+ '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.29.0)
+ '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.29.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/preset-typescript@7.27.1(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-validator-option': 7.27.1
+ '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/preset-typescript@7.28.5(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.28.6
+ '@babel/helper-validator-option': 7.27.1
+ '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/runtime@7.28.6': {}
+
+ '@babel/template@7.28.6':
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ '@babel/parser': 7.29.0
+ '@babel/types': 7.29.0
+
+ '@babel/traverse@7.29.0':
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ '@babel/generator': 7.29.1
+ '@babel/helper-globals': 7.28.0
+ '@babel/parser': 7.29.0
+ '@babel/template': 7.28.6
+ '@babel/types': 7.29.0
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.29.0':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+
+ '@better-auth/core@1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@3.25.76))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.0)':
+ dependencies:
+ '@better-auth/utils': 0.3.0
+ '@better-fetch/fetch': 1.1.21
+ '@standard-schema/spec': 1.1.0
+ better-call: 1.1.8(zod@4.3.6)
+ jose: 6.1.3
+ kysely: 0.28.11
+ nanostores: 1.1.0
+ zod: 4.3.6
+
+ '@better-auth/telemetry@1.4.18(@better-auth/core@1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@3.25.76))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.0))':
+ dependencies:
+ '@better-auth/core': 1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@3.25.76))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.0)
+ '@better-auth/utils': 0.3.0
+ '@better-fetch/fetch': 1.1.21
+
+ '@better-auth/utils@0.3.0': {}
+
+ '@better-fetch/fetch@1.1.21': {}
+
+ '@egjs/hammerjs@2.0.17':
+ dependencies:
+ '@types/hammerjs': 2.0.46
+
+ '@emnapi/core@1.8.1':
+ dependencies:
+ '@emnapi/wasi-threads': 1.1.0
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/runtime@1.8.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/wasi-threads@1.1.0':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@esbuild/aix-ppc64@0.27.3':
+ optional: true
+
+ '@esbuild/android-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/android-arm@0.27.3':
+ optional: true
+
+ '@esbuild/android-x64@0.27.3':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/darwin-x64@0.27.3':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.27.3':
+ optional: true
+
+ '@esbuild/linux-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/linux-arm@0.27.3':
+ optional: true
+
+ '@esbuild/linux-ia32@0.27.3':
+ optional: true
+
+ '@esbuild/linux-loong64@0.27.3':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.27.3':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.27.3':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.27.3':
+ optional: true
+
+ '@esbuild/linux-s390x@0.27.3':
+ optional: true
+
+ '@esbuild/linux-x64@0.27.3':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.27.3':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.27.3':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/sunos-x64@0.27.3':
+ optional: true
+
+ '@esbuild/win32-arm64@0.27.3':
+ optional: true
+
+ '@esbuild/win32-ia32@0.27.3':
+ optional: true
+
+ '@esbuild/win32-x64@0.27.3':
+ optional: true
+
+ '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@1.21.7))':
+ dependencies:
+ eslint: 9.39.2(jiti@1.21.7)
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.12.2': {}
+
+ '@eslint/config-array@0.21.1':
+ dependencies:
+ '@eslint/object-schema': 2.1.7
+ debug: 4.4.3
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/config-helpers@0.4.2':
+ dependencies:
+ '@eslint/core': 0.17.0
+
+ '@eslint/core@0.17.0':
+ dependencies:
+ '@types/json-schema': 7.0.15
+
+ '@eslint/eslintrc@3.3.3':
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.4.3
+ espree: 10.4.0
+ globals: 14.0.0
+ ignore: 5.3.2
+ import-fresh: 3.3.1
+ js-yaml: 4.1.1
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/js@9.39.2': {}
+
+ '@eslint/object-schema@2.1.7': {}
+
+ '@eslint/plugin-kit@0.4.1':
+ dependencies:
+ '@eslint/core': 0.17.0
+ levn: 0.4.1
+
+ '@expo/cli@54.0.23(expo-router@6.0.23)(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))':
+ dependencies:
+ '@0no-co/graphql.web': 1.2.0
+ '@expo/code-signing-certificates': 0.0.6
+ '@expo/config': 12.0.13
+ '@expo/config-plugins': 54.0.4
+ '@expo/devcert': 1.2.1
+ '@expo/env': 2.0.8
+ '@expo/image-utils': 0.8.8
+ '@expo/json-file': 10.0.8
+ '@expo/metro': 54.2.0
+ '@expo/metro-config': 54.0.14(expo@54.0.33)
+ '@expo/osascript': 2.3.8
+ '@expo/package-manager': 1.9.10
+ '@expo/plist': 0.4.8
+ '@expo/prebuild-config': 54.0.8(expo@54.0.33)
+ '@expo/schema-utils': 0.1.8
+ '@expo/spawn-async': 1.7.2
+ '@expo/ws-tunnel': 1.0.6
+ '@expo/xcpretty': 4.4.0
+ '@react-native/dev-middleware': 0.81.5
+ '@urql/core': 5.2.0
+ '@urql/exchange-retry': 1.3.2(@urql/core@5.2.0)
+ accepts: 1.3.8
+ arg: 5.0.2
+ better-opn: 3.0.2
+ bplist-creator: 0.1.0
+ bplist-parser: 0.3.2
+ chalk: 4.1.2
+ ci-info: 3.9.0
+ compression: 1.8.1
+ connect: 3.7.0
+ debug: 4.4.3
+ env-editor: 0.4.2
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-server: 1.0.5
+ freeport-async: 2.0.0
+ getenv: 2.0.0
+ glob: 13.0.5
+ lan-network: 0.1.7
+ minimatch: 9.0.5
+ node-forge: 1.3.3
+ npm-package-arg: 11.0.3
+ ora: 3.4.0
+ picomatch: 3.0.1
+ pretty-bytes: 5.6.0
+ pretty-format: 29.7.0
+ progress: 2.0.3
+ prompts: 2.4.2
+ qrcode-terminal: 0.11.0
+ require-from-string: 2.0.2
+ requireg: 0.2.2
+ resolve: 1.22.11
+ resolve-from: 5.0.0
+ resolve.exports: 2.0.3
+ semver: 7.7.4
+ send: 0.19.2
+ slugify: 1.6.6
+ source-map-support: 0.5.21
+ stacktrace-parser: 0.1.11
+ structured-headers: 0.4.1
+ tar: 7.5.9
+ terminal-link: 2.1.1
+ undici: 6.23.0
+ wrap-ansi: 7.0.0
+ ws: 8.19.0
+ optionalDependencies:
+ expo-router: 6.0.23(@expo/metro-runtime@6.1.2)(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(expo-constants@18.0.13)(expo-linking@8.0.11)(expo@54.0.33)(react-dom@18.3.1(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-reanimated@4.1.6(@babel/core@7.29.0)(react-native-worklets@0.7.4(@babel/core@7.29.0)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+ transitivePeerDependencies:
+ - bufferutil
+ - graphql
+ - supports-color
+ - utf-8-validate
+
+ '@expo/code-signing-certificates@0.0.6':
+ dependencies:
+ node-forge: 1.3.3
+
+ '@expo/config-plugins@54.0.4':
+ dependencies:
+ '@expo/config-types': 54.0.10
+ '@expo/json-file': 10.0.8
+ '@expo/plist': 0.4.8
+ '@expo/sdk-runtime-versions': 1.0.0
+ chalk: 4.1.2
+ debug: 4.4.3
+ getenv: 2.0.0
+ glob: 13.0.5
+ resolve-from: 5.0.0
+ semver: 7.7.4
+ slash: 3.0.0
+ slugify: 1.6.6
+ xcode: 3.0.1
+ xml2js: 0.6.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@expo/config-types@54.0.10': {}
+
+ '@expo/config@12.0.13':
+ dependencies:
+ '@babel/code-frame': 7.10.4
+ '@expo/config-plugins': 54.0.4
+ '@expo/config-types': 54.0.10
+ '@expo/json-file': 10.0.8
+ deepmerge: 4.3.1
+ getenv: 2.0.0
+ glob: 13.0.5
+ require-from-string: 2.0.2
+ resolve-from: 5.0.0
+ resolve-workspace-root: 2.0.1
+ semver: 7.7.4
+ slugify: 1.6.6
+ sucrase: 3.35.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@expo/devcert@1.2.1':
+ dependencies:
+ '@expo/sudo-prompt': 9.3.2
+ debug: 3.2.7
+ transitivePeerDependencies:
+ - supports-color
+
+ '@expo/devtools@0.1.8(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ chalk: 4.1.2
+ optionalDependencies:
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+
+ '@expo/env@2.0.8':
+ dependencies:
+ chalk: 4.1.2
+ debug: 4.4.3
+ dotenv: 16.4.7
+ dotenv-expand: 11.0.7
+ getenv: 2.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@expo/fingerprint@0.15.4':
+ dependencies:
+ '@expo/spawn-async': 1.7.2
+ arg: 5.0.2
+ chalk: 4.1.2
+ debug: 4.4.3
+ getenv: 2.0.0
+ glob: 13.0.5
+ ignore: 5.3.2
+ minimatch: 9.0.5
+ p-limit: 3.1.0
+ resolve-from: 5.0.0
+ semver: 7.7.4
+ transitivePeerDependencies:
+ - supports-color
+
+ '@expo/image-utils@0.8.8':
+ dependencies:
+ '@expo/spawn-async': 1.7.2
+ chalk: 4.1.2
+ getenv: 2.0.0
+ jimp-compact: 0.16.1
+ parse-png: 2.1.0
+ resolve-from: 5.0.0
+ resolve-global: 1.0.0
+ semver: 7.7.4
+ temp-dir: 2.0.0
+ unique-string: 2.0.0
+
+ '@expo/json-file@10.0.8':
+ dependencies:
+ '@babel/code-frame': 7.10.4
+ json5: 2.2.3
+
+ '@expo/metro-config@54.0.14(expo@54.0.33)':
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ '@babel/core': 7.29.0
+ '@babel/generator': 7.29.1
+ '@expo/config': 12.0.13
+ '@expo/env': 2.0.8
+ '@expo/json-file': 10.0.8
+ '@expo/metro': 54.2.0
+ '@expo/spawn-async': 1.7.2
+ browserslist: 4.28.1
+ chalk: 4.1.2
+ debug: 4.4.3
+ dotenv: 16.4.7
+ dotenv-expand: 11.0.7
+ getenv: 2.0.0
+ glob: 13.0.5
+ hermes-parser: 0.29.1
+ jsc-safe-url: 0.2.4
+ lightningcss: 1.31.1
+ minimatch: 9.0.5
+ postcss: 8.4.49
+ resolve-from: 5.0.0
+ optionalDependencies:
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ '@expo/metro-runtime@6.1.2(expo@54.0.33)(react-dom@18.3.1(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ anser: 1.4.10
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ pretty-format: 29.7.0
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+ stacktrace-parser: 0.1.11
+ whatwg-fetch: 3.6.20
+ optionalDependencies:
+ react-dom: 18.3.1(react@19.1.0)
+
+ '@expo/metro@54.2.0':
+ dependencies:
+ metro: 0.83.3
+ metro-babel-transformer: 0.83.3
+ metro-cache: 0.83.3
+ metro-cache-key: 0.83.3
+ metro-config: 0.83.3
+ metro-core: 0.83.3
+ metro-file-map: 0.83.3
+ metro-minify-terser: 0.83.3
+ metro-resolver: 0.83.3
+ metro-runtime: 0.83.3
+ metro-source-map: 0.83.3
+ metro-symbolicate: 0.83.3
+ metro-transform-plugins: 0.83.3
+ metro-transform-worker: 0.83.3
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ '@expo/osascript@2.3.8':
+ dependencies:
+ '@expo/spawn-async': 1.7.2
+ exec-async: 2.2.0
+
+ '@expo/package-manager@1.9.10':
+ dependencies:
+ '@expo/json-file': 10.0.8
+ '@expo/spawn-async': 1.7.2
+ chalk: 4.1.2
+ npm-package-arg: 11.0.3
+ ora: 3.4.0
+ resolve-workspace-root: 2.0.1
+
+ '@expo/plist@0.4.8':
+ dependencies:
+ '@xmldom/xmldom': 0.8.11
+ base64-js: 1.5.1
+ xmlbuilder: 15.1.1
+
+ '@expo/prebuild-config@54.0.8(expo@54.0.33)':
+ dependencies:
+ '@expo/config': 12.0.13
+ '@expo/config-plugins': 54.0.4
+ '@expo/config-types': 54.0.10
+ '@expo/image-utils': 0.8.8
+ '@expo/json-file': 10.0.8
+ '@react-native/normalize-colors': 0.81.5
+ debug: 4.4.3
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ resolve-from: 5.0.0
+ semver: 7.7.4
+ xml2js: 0.6.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@expo/schema-utils@0.1.8': {}
+
+ '@expo/sdk-runtime-versions@1.0.0': {}
+
+ '@expo/spawn-async@1.7.2':
+ dependencies:
+ cross-spawn: 7.0.6
+
+ '@expo/sudo-prompt@9.3.2': {}
+
+ '@expo/vector-icons@15.0.3(expo-font@14.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ expo-font: 14.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+
+ '@expo/ws-tunnel@1.0.6': {}
+
+ '@expo/xcpretty@4.4.0':
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ chalk: 4.1.2
+ js-yaml: 4.1.1
+
+ '@humanfs/core@0.19.1': {}
+
+ '@humanfs/node@0.16.7':
+ dependencies:
+ '@humanfs/core': 0.19.1
+ '@humanwhocodes/retry': 0.4.3
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/retry@0.4.3': {}
+
+ '@ide/backoff@1.0.0': {}
+
+ '@img/colour@1.0.0':
+ optional: true
+
+ '@img/sharp-darwin-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-darwin-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-linux-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-arm@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-ppc64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-s390x@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-wasm32@0.34.5':
+ dependencies:
+ '@emnapi/runtime': 1.8.1
+ optional: true
+
+ '@img/sharp-win32-arm64@0.34.5':
+ optional: true
+
+ '@img/sharp-win32-ia32@0.34.5':
+ optional: true
+
+ '@img/sharp-win32-x64@0.34.5':
+ optional: true
+
+ '@isaacs/fs-minipass@4.0.1':
+ dependencies:
+ minipass: 7.1.2
+
+ '@isaacs/ttlcache@1.4.1': {}
+
+ '@istanbuljs/load-nyc-config@1.1.0':
+ dependencies:
+ camelcase: 5.3.1
+ find-up: 4.1.0
+ get-package-type: 0.1.0
+ js-yaml: 3.14.2
+ resolve-from: 5.0.0
+
+ '@istanbuljs/schema@0.1.3': {}
+
+ '@jest/create-cache-key-function@29.7.0':
+ dependencies:
+ '@jest/types': 29.6.3
+
+ '@jest/environment@29.7.0':
+ dependencies:
+ '@jest/fake-timers': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 22.19.11
+ jest-mock: 29.7.0
+
+ '@jest/fake-timers@29.7.0':
+ dependencies:
+ '@jest/types': 29.6.3
+ '@sinonjs/fake-timers': 10.3.0
+ '@types/node': 22.19.11
+ jest-message-util: 29.7.0
+ jest-mock: 29.7.0
+ jest-util: 29.7.0
+
+ '@jest/schemas@29.6.3':
+ dependencies:
+ '@sinclair/typebox': 0.27.10
+
+ '@jest/transform@29.7.0':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@jest/types': 29.6.3
+ '@jridgewell/trace-mapping': 0.3.31
+ babel-plugin-istanbul: 6.1.1
+ chalk: 4.1.2
+ convert-source-map: 2.0.0
+ fast-json-stable-stringify: 2.1.0
+ graceful-fs: 4.2.11
+ jest-haste-map: 29.7.0
+ jest-regex-util: 29.6.3
+ jest-util: 29.7.0
+ micromatch: 4.0.8
+ pirates: 4.0.7
+ slash: 3.0.0
+ write-file-atomic: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@jest/types@29.6.3':
+ dependencies:
+ '@jest/schemas': 29.6.3
+ '@types/istanbul-lib-coverage': 2.0.6
+ '@types/istanbul-reports': 3.0.4
+ '@types/node': 22.19.11
+ '@types/yargs': 17.0.35
+ chalk: 4.1.2
+
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/remapping@2.3.5':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/source-map@0.3.11':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/sourcemap-codec@1.5.5': {}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ '@napi-rs/wasm-runtime@0.2.12':
+ dependencies:
+ '@emnapi/core': 1.8.1
+ '@emnapi/runtime': 1.8.1
+ '@tybys/wasm-util': 0.10.1
+ optional: true
+
+ '@next/env@15.5.12': {}
+
+ '@next/eslint-plugin-next@15.5.12':
+ dependencies:
+ fast-glob: 3.3.1
+
+ '@next/swc-darwin-arm64@15.5.12':
+ optional: true
+
+ '@next/swc-darwin-x64@15.5.12':
+ optional: true
+
+ '@next/swc-linux-arm64-gnu@15.5.12':
+ optional: true
+
+ '@next/swc-linux-arm64-musl@15.5.12':
+ optional: true
+
+ '@next/swc-linux-x64-gnu@15.5.12':
+ optional: true
+
+ '@next/swc-linux-x64-musl@15.5.12':
+ optional: true
+
+ '@next/swc-win32-arm64-msvc@15.5.12':
+ optional: true
+
+ '@next/swc-win32-x64-msvc@15.5.12':
+ optional: true
+
+ '@noble/ciphers@2.1.1': {}
+
+ '@noble/hashes@2.0.1': {}
+
+ '@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.20.1
+
+ '@nolyfill/is-core-module@1.0.39': {}
+
+ '@prisma/client@5.22.0(prisma@5.22.0)':
+ optionalDependencies:
+ prisma: 5.22.0
+
+ '@prisma/debug@5.22.0': {}
+
+ '@prisma/engines-version@5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2': {}
+
+ '@prisma/engines@5.22.0':
+ dependencies:
+ '@prisma/debug': 5.22.0
+ '@prisma/engines-version': 5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2
+ '@prisma/fetch-engine': 5.22.0
+ '@prisma/get-platform': 5.22.0
+
+ '@prisma/fetch-engine@5.22.0':
+ dependencies:
+ '@prisma/debug': 5.22.0
+ '@prisma/engines-version': 5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2
+ '@prisma/get-platform': 5.22.0
+
+ '@prisma/get-platform@5.22.0':
+ dependencies:
+ '@prisma/debug': 5.22.0
+
+ '@radix-ui/primitive@1.1.3': {}
+
+ '@radix-ui/react-collection@1.1.7(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 18.3.1(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+ '@types/react-dom': 18.3.7(@types/react@19.1.17)
+
+ '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
+ '@radix-ui/react-context@1.1.2(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
+ '@radix-ui/react-dialog@1.1.15(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0)
+ aria-hidden: 1.2.6
+ react: 19.1.0
+ react-dom: 18.3.1(react@19.1.0)
+ react-remove-scroll: 2.7.2(@types/react@19.1.17)(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+ '@types/react-dom': 18.3.7(@types/react@19.1.17)
+
+ '@radix-ui/react-direction@1.1.1(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
+ '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 18.3.1(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+ '@types/react-dom': 18.3.7(@types/react@19.1.17)
+
+ '@radix-ui/react-focus-guards@1.1.3(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
+ '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 18.3.1(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+ '@types/react-dom': 18.3.7(@types/react@19.1.17)
+
+ '@radix-ui/react-id@1.1.1(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
+ '@radix-ui/react-portal@1.1.9(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 18.3.1(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+ '@types/react-dom': 18.3.7(@types/react@19.1.17)
+
+ '@radix-ui/react-presence@1.1.5(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 18.3.1(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+ '@types/react-dom': 18.3.7(@types/react@19.1.17)
+
+ '@radix-ui/react-primitive@2.1.3(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 18.3.1(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+ '@types/react-dom': 18.3.7(@types/react@19.1.17)
+
+ '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 18.3.1(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+ '@types/react-dom': 18.3.7(@types/react@19.1.17)
+
+ '@radix-ui/react-slot@1.2.0(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
+ '@radix-ui/react-slot@1.2.3(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
+ '@radix-ui/react-tabs@1.1.13(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-context': 1.1.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 18.3.1(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+ '@types/react-dom': 18.3.7(@types/react@19.1.17)
+
+ '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
+ '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
+ '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
+ '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.17)(react@19.1.0)
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
+ '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.17)(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+ optionalDependencies:
+ '@types/react': 19.1.17
+
+ '@react-native-async-storage/async-storage@2.2.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))':
+ dependencies:
+ merge-options: 3.0.4
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+
+ '@react-native/assets-registry@0.81.5': {}
+
+ '@react-native/babel-plugin-codegen@0.81.5(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/traverse': 7.29.0
+ '@react-native/codegen': 0.81.5(@babel/core@7.29.0)
+ transitivePeerDependencies:
+ - '@babel/core'
+ - supports-color
+
+ '@react-native/babel-preset@0.81.5(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.29.0)
+ '@babel/plugin-syntax-export-default-from': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0)
+ '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0)
+ '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.0)
+ '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0)
+ '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0)
+ '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0)
+ '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.29.0)
+ '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.29.0)
+ '@babel/plugin-transform-runtime': 7.29.0(@babel/core@7.29.0)
+ '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0)
+ '@babel/template': 7.28.6
+ '@react-native/babel-plugin-codegen': 0.81.5(@babel/core@7.29.0)
+ babel-plugin-syntax-hermes-parser: 0.29.1
+ babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.0)
+ react-refresh: 0.14.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@react-native/codegen@0.81.5(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/parser': 7.29.0
+ glob: 7.2.3
+ hermes-parser: 0.29.1
+ invariant: 2.2.4
+ nullthrows: 1.1.1
+ yargs: 17.7.2
+
+ '@react-native/community-cli-plugin@0.81.5':
+ dependencies:
+ '@react-native/dev-middleware': 0.81.5
+ debug: 4.4.3
+ invariant: 2.2.4
+ metro: 0.83.3
+ metro-config: 0.83.3
+ metro-core: 0.83.3
+ semver: 7.7.4
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ '@react-native/debugger-frontend@0.81.5': {}
+
+ '@react-native/dev-middleware@0.81.5':
+ dependencies:
+ '@isaacs/ttlcache': 1.4.1
+ '@react-native/debugger-frontend': 0.81.5
+ chrome-launcher: 0.15.2
+ chromium-edge-launcher: 0.2.0
+ connect: 3.7.0
+ debug: 4.4.3
+ invariant: 2.2.4
+ nullthrows: 1.1.1
+ open: 7.4.2
+ serve-static: 1.16.3
+ ws: 6.2.3
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ '@react-native/gradle-plugin@0.81.5': {}
+
+ '@react-native/js-polyfills@0.81.5': {}
+
+ '@react-native/normalize-colors@0.81.5': {}
+
+ '@react-native/virtualized-lists@0.81.5(@types/react@19.1.17)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ invariant: 2.2.4
+ nullthrows: 1.1.1
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+
+ '@react-navigation/bottom-tabs@7.14.0(@react-navigation/native@7.1.28(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@react-navigation/elements': 2.9.5(@react-navigation/native@7.1.28(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ '@react-navigation/native': 7.1.28(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ color: 4.2.3
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+ react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-screens: 4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ sf-symbols-typescript: 2.2.0
+ transitivePeerDependencies:
+ - '@react-native-masked-view/masked-view'
+
+ '@react-navigation/core@7.14.0(react@19.1.0)':
+ dependencies:
+ '@react-navigation/routers': 7.5.3
+ escape-string-regexp: 4.0.0
+ fast-deep-equal: 3.1.3
+ nanoid: 3.3.11
+ query-string: 7.1.3
+ react: 19.1.0
+ react-is: 19.2.4
+ use-latest-callback: 0.2.6(react@19.1.0)
+ use-sync-external-store: 1.6.0(react@19.1.0)
+
+ '@react-navigation/elements@2.9.5(@react-navigation/native@7.1.28(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@react-navigation/native': 7.1.28(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ color: 4.2.3
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+ react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ use-latest-callback: 0.2.6(react@19.1.0)
+ use-sync-external-store: 1.6.0(react@19.1.0)
+
+ '@react-navigation/native-stack@7.13.0(@react-navigation/native@7.1.28(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@react-navigation/elements': 2.9.5(@react-navigation/native@7.1.28(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ '@react-navigation/native': 7.1.28(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ color: 4.2.3
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+ react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-screens: 4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ sf-symbols-typescript: 2.2.0
+ warn-once: 0.1.1
+ transitivePeerDependencies:
+ - '@react-native-masked-view/masked-view'
+
+ '@react-navigation/native@7.1.28(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@react-navigation/core': 7.14.0(react@19.1.0)
+ escape-string-regexp: 4.0.0
+ fast-deep-equal: 3.1.3
+ nanoid: 3.3.11
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+ use-latest-callback: 0.2.6(react@19.1.0)
+
+ '@react-navigation/routers@7.5.3':
+ dependencies:
+ nanoid: 3.3.11
+
+ '@rtsao/scc@1.1.0': {}
+
+ '@rushstack/eslint-patch@1.15.0': {}
+
+ '@sinclair/typebox@0.27.10': {}
+
+ '@sinonjs/commons@3.0.1':
+ dependencies:
+ type-detect: 4.0.8
+
+ '@sinonjs/fake-timers@10.3.0':
+ dependencies:
+ '@sinonjs/commons': 3.0.1
+
+ '@standard-schema/spec@1.1.0': {}
+
+ '@swc/helpers@0.5.15':
+ dependencies:
+ tslib: 2.8.1
+
+ '@tanstack/query-core@5.90.20': {}
+
+ '@tanstack/react-query@5.90.21(react@18.3.1)':
+ dependencies:
+ '@tanstack/query-core': 5.90.20
+ react: 18.3.1
+
+ '@tanstack/react-query@5.90.21(react@19.1.0)':
+ dependencies:
+ '@tanstack/query-core': 5.90.20
+ react: 19.1.0
+
+ '@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3)':
+ dependencies:
+ '@trpc/server': 11.10.0(typescript@5.9.3)
+ typescript: 5.9.3
+
+ '@trpc/react-query@11.10.0(@tanstack/react-query@5.90.21(react@18.3.1))(@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.10.0(typescript@5.9.3))(react@18.3.1)(typescript@5.9.3)':
+ dependencies:
+ '@tanstack/react-query': 5.90.21(react@18.3.1)
+ '@trpc/client': 11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3)
+ '@trpc/server': 11.10.0(typescript@5.9.3)
+ react: 18.3.1
+ typescript: 5.9.3
+
+ '@trpc/react-query@11.10.0(@tanstack/react-query@5.90.21(react@19.1.0))(@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.10.0(typescript@5.9.3))(react@19.1.0)(typescript@5.9.3)':
+ dependencies:
+ '@tanstack/react-query': 5.90.21(react@19.1.0)
+ '@trpc/client': 11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3)
+ '@trpc/server': 11.10.0(typescript@5.9.3)
+ react: 19.1.0
+ typescript: 5.9.3
+
+ '@trpc/server@11.10.0(typescript@5.9.3)':
+ dependencies:
+ typescript: 5.9.3
+
+ '@tybys/wasm-util@0.10.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@types/babel__core@7.20.5':
+ dependencies:
+ '@babel/parser': 7.29.0
+ '@babel/types': 7.29.0
+ '@types/babel__generator': 7.27.0
+ '@types/babel__template': 7.4.4
+ '@types/babel__traverse': 7.28.0
+
+ '@types/babel__generator@7.27.0':
+ dependencies:
+ '@babel/types': 7.29.0
+
+ '@types/babel__template@7.4.4':
+ dependencies:
+ '@babel/parser': 7.29.0
+ '@babel/types': 7.29.0
+
+ '@types/babel__traverse@7.28.0':
+ dependencies:
+ '@babel/types': 7.29.0
+
+ '@types/debug@4.1.12':
+ dependencies:
+ '@types/ms': 2.1.0
+
+ '@types/estree-jsx@1.0.5':
+ dependencies:
+ '@types/estree': 1.0.8
+
+ '@types/estree@1.0.8': {}
+
+ '@types/graceful-fs@4.1.9':
+ dependencies:
+ '@types/node': 22.19.11
+
+ '@types/hammerjs@2.0.46': {}
+
+ '@types/hast@2.3.10':
+ dependencies:
+ '@types/unist': 2.0.11
+
+ '@types/hast@3.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/istanbul-lib-coverage@2.0.6': {}
+
+ '@types/istanbul-lib-report@3.0.3':
+ dependencies:
+ '@types/istanbul-lib-coverage': 2.0.6
+
+ '@types/istanbul-reports@3.0.4':
+ dependencies:
+ '@types/istanbul-lib-report': 3.0.3
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/json5@0.0.29': {}
+
+ '@types/mdast@4.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/ms@2.1.0': {}
+
+ '@types/node@22.19.11':
+ dependencies:
+ undici-types: 6.21.0
+
+ '@types/nodemailer@6.4.22':
+ dependencies:
+ '@types/node': 22.19.11
+
+ '@types/prismjs@1.26.6': {}
+
+ '@types/prop-types@15.7.15': {}
+
+ '@types/react-dom@18.3.7(@types/react@18.3.28)':
+ dependencies:
+ '@types/react': 18.3.28
+
+ '@types/react-dom@18.3.7(@types/react@19.1.17)':
+ dependencies:
+ '@types/react': 19.1.17
+ optional: true
+
+ '@types/react@18.3.28':
+ dependencies:
+ '@types/prop-types': 15.7.15
+ csstype: 3.2.3
+
+ '@types/react@19.1.17':
+ dependencies:
+ csstype: 3.2.3
+
+ '@types/stack-utils@2.0.3': {}
+
+ '@types/unist@2.0.11': {}
+
+ '@types/unist@3.0.3': {}
+
+ '@types/yargs-parser@21.0.3': {}
+
+ '@types/yargs@17.0.35':
+ dependencies:
+ '@types/yargs-parser': 21.0.3
+
+ '@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.2
+ '@typescript-eslint/parser': 8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.56.0
+ '@typescript-eslint/type-utils': 8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.56.0
+ eslint: 9.39.2(jiti@1.21.7)
+ ignore: 7.0.5
+ natural-compare: 1.4.0
+ ts-api-utils: 2.4.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.56.0
+ '@typescript-eslint/types': 8.56.0
+ '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.56.0
+ debug: 4.4.3
+ eslint: 9.39.2(jiti@1.21.7)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/project-service@8.56.0(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/tsconfig-utils': 8.56.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.56.0
+ debug: 4.4.3
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/scope-manager@8.56.0':
+ dependencies:
+ '@typescript-eslint/types': 8.56.0
+ '@typescript-eslint/visitor-keys': 8.56.0
+
+ '@typescript-eslint/tsconfig-utils@8.56.0(typescript@5.9.3)':
+ dependencies:
+ typescript: 5.9.3
+
+ '@typescript-eslint/type-utils@8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/types': 8.56.0
+ '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)
+ debug: 4.4.3
+ eslint: 9.39.2(jiti@1.21.7)
+ ts-api-utils: 2.4.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/types@8.56.0': {}
+
+ '@typescript-eslint/typescript-estree@8.56.0(typescript@5.9.3)':
+ dependencies:
+ '@typescript-eslint/project-service': 8.56.0(typescript@5.9.3)
+ '@typescript-eslint/tsconfig-utils': 8.56.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.56.0
+ '@typescript-eslint/visitor-keys': 8.56.0
+ debug: 4.4.3
+ minimatch: 9.0.5
+ semver: 7.7.4
+ tinyglobby: 0.2.15
+ ts-api-utils: 2.4.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@1.21.7))
+ '@typescript-eslint/scope-manager': 8.56.0
+ '@typescript-eslint/types': 8.56.0
+ '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3)
+ eslint: 9.39.2(jiti@1.21.7)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/visitor-keys@8.56.0':
+ dependencies:
+ '@typescript-eslint/types': 8.56.0
+ eslint-visitor-keys: 5.0.0
+
+ '@uiw/copy-to-clipboard@1.0.20': {}
+
+ '@uiw/react-markdown-preview@5.1.5(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.28.6
+ '@uiw/copy-to-clipboard': 1.0.20
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ react-markdown: 9.0.3(@types/react@18.3.28)(react@18.3.1)
+ rehype-attr: 3.0.3
+ rehype-autolink-headings: 7.1.0
+ rehype-ignore: 2.0.3
+ rehype-prism-plus: 2.0.0
+ rehype-raw: 7.0.0
+ rehype-rewrite: 4.0.4
+ rehype-slug: 6.0.0
+ remark-gfm: 4.0.1
+ remark-github-blockquote-alert: 1.3.1
+ unist-util-visit: 5.1.0
+ transitivePeerDependencies:
+ - '@types/react'
+ - supports-color
+
+ '@uiw/react-md-editor@4.0.11(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.28.6
+ '@uiw/react-markdown-preview': 5.1.5(@types/react@18.3.28)(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)
+ rehype: 13.0.2
+ rehype-prism-plus: 2.0.2
+ transitivePeerDependencies:
+ - '@types/react'
+ - supports-color
+
+ '@ungap/structured-clone@1.3.0': {}
+
+ '@unrs/resolver-binding-android-arm-eabi@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-android-arm64@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-darwin-arm64@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-darwin-x64@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-freebsd-x64@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm64-gnu@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm64-musl@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-riscv64-musl@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-s390x-gnu@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-x64-gnu@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-linux-x64-musl@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-wasm32-wasi@1.11.1':
+ dependencies:
+ '@napi-rs/wasm-runtime': 0.2.12
+ optional: true
+
+ '@unrs/resolver-binding-win32-arm64-msvc@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-win32-ia32-msvc@1.11.1':
+ optional: true
+
+ '@unrs/resolver-binding-win32-x64-msvc@1.11.1':
+ optional: true
+
+ '@urql/core@5.2.0':
+ dependencies:
+ '@0no-co/graphql.web': 1.2.0
+ wonka: 6.3.5
+ transitivePeerDependencies:
+ - graphql
+
+ '@urql/exchange-retry@1.3.2(@urql/core@5.2.0)':
+ dependencies:
+ '@urql/core': 5.2.0
+ wonka: 6.3.5
+
+ '@xmldom/xmldom@0.8.11': {}
+
+ 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.15.0):
+ dependencies:
+ acorn: 8.15.0
+
+ acorn@8.15.0: {}
+
+ agent-base@7.1.4: {}
+
+ 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
+
+ ajv@8.11.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+ uri-js: 4.4.1
+
+ anser@1.4.10: {}
+
+ ansi-escapes@4.3.2:
+ dependencies:
+ type-fest: 0.21.3
+
+ ansi-regex@4.1.1: {}
+
+ ansi-regex@5.0.1: {}
+
+ ansi-styles@3.2.1:
+ dependencies:
+ color-convert: 1.9.3
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ ansi-styles@5.2.0: {}
+
+ any-promise@1.3.0: {}
+
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+
+ arg@5.0.2: {}
+
+ argparse@1.0.10:
+ dependencies:
+ sprintf-js: 1.0.3
+
+ argparse@2.0.1: {}
+
+ aria-hidden@1.2.6:
+ dependencies:
+ tslib: 2.8.1
+
+ aria-query@5.3.2: {}
+
+ array-buffer-byte-length@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ is-array-buffer: 3.0.5
+
+ array-includes@3.1.9:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ is-string: 1.1.1
+ math-intrinsics: 1.1.0
+
+ array-timsort@1.0.3: {}
+
+ array.prototype.findlast@1.2.5:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ es-shim-unscopables: 1.1.0
+
+ array.prototype.findlastindex@1.2.6:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ es-shim-unscopables: 1.1.0
+
+ array.prototype.flat@1.3.3:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-shim-unscopables: 1.1.0
+
+ array.prototype.flatmap@1.3.3:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-shim-unscopables: 1.1.0
+
+ array.prototype.tosorted@1.1.4:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-errors: 1.3.0
+ es-shim-unscopables: 1.1.0
+
+ arraybuffer.prototype.slice@1.0.4:
+ dependencies:
+ array-buffer-byte-length: 1.0.2
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ is-array-buffer: 3.0.5
+
+ asap@2.0.6: {}
+
+ assert@2.1.0:
+ dependencies:
+ call-bind: 1.0.8
+ is-nan: 1.3.2
+ object-is: 1.1.6
+ object.assign: 4.1.7
+ util: 0.12.5
+
+ ast-types-flow@0.0.8: {}
+
+ async-function@1.0.0: {}
+
+ async-limiter@1.0.1: {}
+
+ autoprefixer@10.4.24(postcss@8.5.6):
+ dependencies:
+ browserslist: 4.28.1
+ caniuse-lite: 1.0.30001770
+ fraction.js: 5.3.4
+ picocolors: 1.1.1
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+
+ available-typed-arrays@1.0.7:
+ dependencies:
+ possible-typed-array-names: 1.1.0
+
+ axe-core@4.11.1: {}
+
+ axobject-query@4.1.0: {}
+
+ babel-jest@29.7.0(@babel/core@7.29.0):
+ dependencies:
+ '@babel/core': 7.29.0
+ '@jest/transform': 29.7.0
+ '@types/babel__core': 7.20.5
+ babel-plugin-istanbul: 6.1.1
+ babel-preset-jest: 29.6.3(@babel/core@7.29.0)
+ chalk: 4.1.2
+ graceful-fs: 4.2.11
+ slash: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ babel-plugin-istanbul@6.1.1:
+ dependencies:
+ '@babel/helper-plugin-utils': 7.28.6
+ '@istanbuljs/load-nyc-config': 1.1.0
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-instrument: 5.2.1
+ test-exclude: 6.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ babel-plugin-jest-hoist@29.6.3:
+ dependencies:
+ '@babel/template': 7.28.6
+ '@babel/types': 7.29.0
+ '@types/babel__core': 7.20.5
+ '@types/babel__traverse': 7.28.0
+
+ babel-plugin-polyfill-corejs2@0.4.15(@babel/core@7.29.0):
+ dependencies:
+ '@babel/compat-data': 7.29.0
+ '@babel/core': 7.29.0
+ '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0)
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.0):
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0)
+ core-js-compat: 3.48.0
+ transitivePeerDependencies:
+ - supports-color
+
+ babel-plugin-polyfill-regenerator@0.6.6(@babel/core@7.29.0):
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ babel-plugin-react-compiler@1.0.0:
+ dependencies:
+ '@babel/types': 7.29.0
+
+ babel-plugin-react-native-web@0.21.2: {}
+
+ babel-plugin-syntax-hermes-parser@0.29.1:
+ dependencies:
+ hermes-parser: 0.29.1
+
+ babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.29.0):
+ dependencies:
+ '@babel/plugin-syntax-flow': 7.28.6(@babel/core@7.29.0)
+ transitivePeerDependencies:
+ - '@babel/core'
+
+ babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.0):
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.0)
+ '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.0)
+ '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.0)
+ '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.0)
+ '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0)
+ '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.0)
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.0)
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0)
+ '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.0)
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.0)
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.0)
+ '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0)
+ '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0)
+ '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0)
+
+ babel-preset-expo@54.0.10(@babel/core@7.29.0)(@babel/runtime@7.28.6)(expo@54.0.33)(react-refresh@0.14.2):
+ dependencies:
+ '@babel/helper-module-imports': 7.28.6
+ '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.0)
+ '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-syntax-export-default-from': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0)
+ '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.29.0)
+ '@babel/plugin-transform-runtime': 7.29.0(@babel/core@7.29.0)
+ '@babel/preset-react': 7.28.5(@babel/core@7.29.0)
+ '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0)
+ '@react-native/babel-preset': 0.81.5(@babel/core@7.29.0)
+ babel-plugin-react-compiler: 1.0.0
+ babel-plugin-react-native-web: 0.21.2
+ babel-plugin-syntax-hermes-parser: 0.29.1
+ babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.0)
+ debug: 4.4.3
+ react-refresh: 0.14.2
+ resolve-from: 5.0.0
+ optionalDependencies:
+ '@babel/runtime': 7.28.6
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ transitivePeerDependencies:
+ - '@babel/core'
+ - supports-color
+
+ babel-preset-jest@29.6.3(@babel/core@7.29.0):
+ dependencies:
+ '@babel/core': 7.29.0
+ babel-plugin-jest-hoist: 29.6.3
+ babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0)
+
+ badgin@1.2.3: {}
+
+ bail@2.0.2: {}
+
+ balanced-match@1.0.2: {}
+
+ balanced-match@4.0.3: {}
+
+ base64-js@1.5.1: {}
+
+ baseline-browser-mapping@2.9.19: {}
+
+ bcp-47-match@2.0.3: {}
+
+ better-auth@1.4.18(@prisma/client@5.22.0(prisma@5.22.0))(next@15.5.12(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@19.1.0))(react@19.1.0))(prisma@5.22.0)(react-dom@18.3.1(react@19.1.0))(react@19.1.0):
+ dependencies:
+ '@better-auth/core': 1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@3.25.76))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.0)
+ '@better-auth/telemetry': 1.4.18(@better-auth/core@1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@3.25.76))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.0))
+ '@better-auth/utils': 0.3.0
+ '@better-fetch/fetch': 1.1.21
+ '@noble/ciphers': 2.1.1
+ '@noble/hashes': 2.0.1
+ better-call: 1.1.8(zod@4.3.6)
+ defu: 6.1.4
+ jose: 6.1.3
+ kysely: 0.28.11
+ nanostores: 1.1.0
+ zod: 4.3.6
+ optionalDependencies:
+ '@prisma/client': 5.22.0(prisma@5.22.0)
+ next: 15.5.12(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)
+ prisma: 5.22.0
+ react: 19.1.0
+ react-dom: 18.3.1(react@19.1.0)
+
+ better-auth@1.4.18(@prisma/client@5.22.0(prisma@5.22.0))(next@15.5.12(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(prisma@5.22.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@better-auth/core': 1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@3.25.76))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.0)
+ '@better-auth/telemetry': 1.4.18(@better-auth/core@1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@3.25.76))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.0))
+ '@better-auth/utils': 0.3.0
+ '@better-fetch/fetch': 1.1.21
+ '@noble/ciphers': 2.1.1
+ '@noble/hashes': 2.0.1
+ better-call: 1.1.8(zod@4.3.6)
+ defu: 6.1.4
+ jose: 6.1.3
+ kysely: 0.28.11
+ nanostores: 1.1.0
+ zod: 4.3.6
+ optionalDependencies:
+ '@prisma/client': 5.22.0(prisma@5.22.0)
+ next: 15.5.12(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ prisma: 5.22.0
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+
+ better-call@1.1.8(zod@4.3.6):
+ dependencies:
+ '@better-auth/utils': 0.3.0
+ '@better-fetch/fetch': 1.1.21
+ rou3: 0.7.12
+ set-cookie-parser: 2.7.2
+ optionalDependencies:
+ zod: 4.3.6
+
+ better-opn@3.0.2:
+ dependencies:
+ open: 8.4.2
+
+ big-integer@1.6.52: {}
+
+ binary-extensions@2.3.0: {}
+
+ boolbase@1.0.0: {}
+
+ bplist-creator@0.1.0:
+ dependencies:
+ stream-buffers: 2.2.0
+
+ bplist-parser@0.3.1:
+ dependencies:
+ big-integer: 1.6.52
+
+ bplist-parser@0.3.2:
+ dependencies:
+ big-integer: 1.6.52
+
+ brace-expansion@1.1.12:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@2.0.2:
+ dependencies:
+ balanced-match: 1.0.2
+
+ brace-expansion@5.0.2:
+ dependencies:
+ balanced-match: 4.0.3
+
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
+ browserslist@4.28.1:
+ dependencies:
+ baseline-browser-mapping: 2.9.19
+ caniuse-lite: 1.0.30001770
+ electron-to-chromium: 1.5.286
+ node-releases: 2.0.27
+ update-browserslist-db: 1.2.3(browserslist@4.28.1)
+
+ bser@2.1.1:
+ dependencies:
+ node-int64: 0.4.0
+
+ buffer-from@1.1.2: {}
+
+ buffer@5.7.1:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ bytes@3.1.2: {}
+
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
+ call-bind@1.0.8:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ get-intrinsic: 1.3.0
+ set-function-length: 1.2.2
+
+ call-bound@1.0.4:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ get-intrinsic: 1.3.0
+
+ callsites@3.1.0: {}
+
+ camelcase-css@2.0.1: {}
+
+ camelcase@5.3.1: {}
+
+ camelcase@6.3.0: {}
+
+ caniuse-lite@1.0.30001770: {}
+
+ 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
+
+ character-entities-html4@2.1.0: {}
+
+ character-entities-legacy@3.0.0: {}
+
+ character-entities@2.0.2: {}
+
+ 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@3.0.0: {}
+
+ chrome-launcher@0.15.2:
+ dependencies:
+ '@types/node': 22.19.11
+ escape-string-regexp: 4.0.0
+ is-wsl: 2.2.0
+ lighthouse-logger: 1.4.2
+ transitivePeerDependencies:
+ - supports-color
+
+ chromium-edge-launcher@0.2.0:
+ dependencies:
+ '@types/node': 22.19.11
+ escape-string-regexp: 4.0.0
+ is-wsl: 2.2.0
+ lighthouse-logger: 1.4.2
+ mkdirp: 1.0.4
+ rimraf: 3.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ ci-info@2.0.0: {}
+
+ ci-info@3.9.0: {}
+
+ cli-cursor@2.1.0:
+ dependencies:
+ restore-cursor: 2.0.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@1.0.4: {}
+
+ clsx@2.1.1: {}
+
+ 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: {}
+
+ color-string@1.9.1:
+ dependencies:
+ color-name: 1.1.4
+ simple-swizzle: 0.2.4
+
+ color@4.2.3:
+ dependencies:
+ color-convert: 2.0.1
+ color-string: 1.9.1
+
+ comma-separated-tokens@2.0.3: {}
+
+ commander@12.1.0: {}
+
+ commander@2.20.3: {}
+
+ commander@4.1.1: {}
+
+ commander@7.2.0: {}
+
+ comment-json@4.5.1:
+ dependencies:
+ array-timsort: 1.0.3
+ core-util-is: 1.0.3
+ esprima: 4.0.1
+
+ compressible@2.0.18:
+ dependencies:
+ mime-db: 1.54.0
+
+ compression@1.8.1:
+ dependencies:
+ bytes: 3.1.2
+ compressible: 2.0.18
+ debug: 2.6.9
+ negotiator: 0.6.4
+ on-headers: 1.1.0
+ safe-buffer: 5.2.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ concat-map@0.0.1: {}
+
+ connect@3.7.0:
+ dependencies:
+ debug: 2.6.9
+ finalhandler: 1.1.2
+ parseurl: 1.3.3
+ utils-merge: 1.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ convert-source-map@2.0.0: {}
+
+ copy-anything@4.0.5:
+ dependencies:
+ is-what: 5.5.0
+
+ core-js-compat@3.48.0:
+ dependencies:
+ browserslist: 4.28.1
+
+ core-util-is@1.0.3: {}
+
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ crypto-random-string@2.0.0: {}
+
+ css-selector-parser@3.3.0: {}
+
+ cssesc@3.0.0: {}
+
+ csstype@3.2.3: {}
+
+ damerau-levenshtein@1.0.8: {}
+
+ data-view-buffer@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ data-view-byte-length@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ data-view-byte-offset@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+
+ date-fns@3.6.0: {}
+
+ debug@2.6.9:
+ dependencies:
+ ms: 2.0.0
+
+ debug@3.2.7:
+ dependencies:
+ ms: 2.1.3
+
+ debug@4.4.3:
+ dependencies:
+ ms: 2.1.3
+
+ decode-named-character-reference@1.3.0:
+ dependencies:
+ character-entities: 2.0.2
+
+ decode-uri-component@0.2.2: {}
+
+ deep-extend@0.6.0: {}
+
+ deep-is@0.1.4: {}
+
+ deepmerge@4.3.1: {}
+
+ defaults@1.0.4:
+ dependencies:
+ clone: 1.0.4
+
+ define-data-property@1.1.4:
+ dependencies:
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ 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
+
+ defu@6.1.4: {}
+
+ depd@2.0.0: {}
+
+ dequal@2.0.3: {}
+
+ destroy@1.2.0: {}
+
+ detect-libc@1.0.3: {}
+
+ detect-libc@2.1.2: {}
+
+ detect-node-es@1.1.0: {}
+
+ devlop@1.1.0:
+ dependencies:
+ dequal: 2.0.3
+
+ didyoumean@1.2.2: {}
+
+ direction@2.0.1: {}
+
+ dlv@1.1.3: {}
+
+ doctrine@2.1.0:
+ dependencies:
+ esutils: 2.0.3
+
+ dotenv-expand@11.0.7:
+ dependencies:
+ dotenv: 16.4.7
+
+ dotenv@16.4.7: {}
+
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ ee-first@1.1.1: {}
+
+ electron-to-chromium@1.5.286: {}
+
+ emoji-regex@8.0.0: {}
+
+ emoji-regex@9.2.2: {}
+
+ encodeurl@1.0.2: {}
+
+ encodeurl@2.0.0: {}
+
+ entities@6.0.1: {}
+
+ env-editor@0.4.2: {}
+
+ error-stack-parser@2.1.4:
+ dependencies:
+ stackframe: 1.3.4
+
+ es-abstract@1.24.1:
+ dependencies:
+ array-buffer-byte-length: 1.0.2
+ arraybuffer.prototype.slice: 1.0.4
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ data-view-buffer: 1.0.2
+ data-view-byte-length: 1.0.2
+ data-view-byte-offset: 1.0.1
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ es-set-tostringtag: 2.1.0
+ es-to-primitive: 1.3.0
+ function.prototype.name: 1.1.8
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ get-symbol-description: 1.1.0
+ globalthis: 1.0.4
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+ has-proto: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ internal-slot: 1.1.0
+ is-array-buffer: 3.0.5
+ is-callable: 1.2.7
+ is-data-view: 1.0.2
+ is-negative-zero: 2.0.3
+ is-regex: 1.2.1
+ is-set: 2.0.3
+ is-shared-array-buffer: 1.0.4
+ is-string: 1.1.1
+ is-typed-array: 1.1.15
+ is-weakref: 1.1.1
+ math-intrinsics: 1.1.0
+ object-inspect: 1.13.4
+ object-keys: 1.1.1
+ object.assign: 4.1.7
+ own-keys: 1.0.1
+ regexp.prototype.flags: 1.5.4
+ safe-array-concat: 1.1.3
+ safe-push-apply: 1.0.0
+ safe-regex-test: 1.1.0
+ set-proto: 1.0.0
+ stop-iteration-iterator: 1.1.0
+ string.prototype.trim: 1.2.10
+ string.prototype.trimend: 1.0.9
+ string.prototype.trimstart: 1.0.8
+ typed-array-buffer: 1.0.3
+ typed-array-byte-length: 1.0.3
+ typed-array-byte-offset: 1.0.4
+ typed-array-length: 1.0.7
+ unbox-primitive: 1.1.0
+ which-typed-array: 1.1.20
+
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
+ es-iterator-helpers@1.2.2:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-errors: 1.3.0
+ es-set-tostringtag: 2.1.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.3.0
+ globalthis: 1.0.4
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+ has-proto: 1.2.0
+ has-symbols: 1.1.0
+ internal-slot: 1.1.0
+ iterator.prototype: 1.1.5
+ safe-array-concat: 1.1.3
+
+ es-object-atoms@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+
+ es-set-tostringtag@2.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+
+ es-shim-unscopables@1.1.0:
+ dependencies:
+ hasown: 2.0.2
+
+ es-to-primitive@1.3.0:
+ dependencies:
+ is-callable: 1.2.7
+ is-date-object: 1.1.0
+ is-symbol: 1.1.1
+
+ esbuild@0.27.3:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.27.3
+ '@esbuild/android-arm': 0.27.3
+ '@esbuild/android-arm64': 0.27.3
+ '@esbuild/android-x64': 0.27.3
+ '@esbuild/darwin-arm64': 0.27.3
+ '@esbuild/darwin-x64': 0.27.3
+ '@esbuild/freebsd-arm64': 0.27.3
+ '@esbuild/freebsd-x64': 0.27.3
+ '@esbuild/linux-arm': 0.27.3
+ '@esbuild/linux-arm64': 0.27.3
+ '@esbuild/linux-ia32': 0.27.3
+ '@esbuild/linux-loong64': 0.27.3
+ '@esbuild/linux-mips64el': 0.27.3
+ '@esbuild/linux-ppc64': 0.27.3
+ '@esbuild/linux-riscv64': 0.27.3
+ '@esbuild/linux-s390x': 0.27.3
+ '@esbuild/linux-x64': 0.27.3
+ '@esbuild/netbsd-arm64': 0.27.3
+ '@esbuild/netbsd-x64': 0.27.3
+ '@esbuild/openbsd-arm64': 0.27.3
+ '@esbuild/openbsd-x64': 0.27.3
+ '@esbuild/openharmony-arm64': 0.27.3
+ '@esbuild/sunos-x64': 0.27.3
+ '@esbuild/win32-arm64': 0.27.3
+ '@esbuild/win32-ia32': 0.27.3
+ '@esbuild/win32-x64': 0.27.3
+
+ escalade@3.2.0: {}
+
+ escape-html@1.0.3: {}
+
+ escape-string-regexp@1.0.5: {}
+
+ escape-string-regexp@2.0.0: {}
+
+ escape-string-regexp@4.0.0: {}
+
+ escape-string-regexp@5.0.0: {}
+
+ eslint-config-expo@10.0.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3):
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)
+ eslint: 9.39.2(jiti@1.21.7)
+ eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@1.21.7))
+ eslint-plugin-expo: 1.0.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@1.21.7))
+ eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@1.21.7))
+ eslint-plugin-react-hooks: 5.2.0(eslint@9.39.2(jiti@1.21.7))
+ globals: 16.5.0
+ transitivePeerDependencies:
+ - eslint-import-resolver-webpack
+ - eslint-plugin-import-x
+ - supports-color
+ - typescript
+
+ eslint-config-next@15.5.12(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3):
+ dependencies:
+ '@next/eslint-plugin-next': 15.5.12
+ '@rushstack/eslint-patch': 1.15.0
+ '@typescript-eslint/eslint-plugin': 8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)
+ eslint: 9.39.2(jiti@1.21.7)
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@1.21.7))
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@1.21.7))
+ eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2(jiti@1.21.7))
+ eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@1.21.7))
+ eslint-plugin-react-hooks: 5.2.0(eslint@9.39.2(jiti@1.21.7))
+ optionalDependencies:
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - eslint-import-resolver-webpack
+ - eslint-plugin-import-x
+ - supports-color
+
+ eslint-import-resolver-node@0.3.9:
+ dependencies:
+ debug: 3.2.7
+ is-core-module: 2.16.1
+ resolve: 1.22.11
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@1.21.7)):
+ dependencies:
+ '@nolyfill/is-core-module': 1.0.39
+ debug: 4.4.3
+ eslint: 9.39.2(jiti@1.21.7)
+ get-tsconfig: 4.13.6
+ is-bun-module: 2.0.0
+ stable-hash: 0.0.5
+ tinyglobby: 0.2.15
+ unrs-resolver: 1.11.1
+ optionalDependencies:
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@1.21.7))
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-module-utils@2.12.1(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@1.21.7)):
+ dependencies:
+ debug: 3.2.7
+ optionalDependencies:
+ '@typescript-eslint/parser': 8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)
+ eslint: 9.39.2(jiti@1.21.7)
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@1.21.7))
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-plugin-expo@1.0.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3):
+ dependencies:
+ '@typescript-eslint/types': 8.56.0
+ '@typescript-eslint/utils': 8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)
+ eslint: 9.39.2(jiti@1.21.7)
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@1.21.7)):
+ dependencies:
+ '@rtsao/scc': 1.1.0
+ array-includes: 3.1.9
+ array.prototype.findlastindex: 1.2.6
+ array.prototype.flat: 1.3.3
+ array.prototype.flatmap: 1.3.3
+ debug: 3.2.7
+ doctrine: 2.1.0
+ eslint: 9.39.2(jiti@1.21.7)
+ eslint-import-resolver-node: 0.3.9
+ eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@1.21.7))
+ hasown: 2.0.2
+ is-core-module: 2.16.1
+ is-glob: 4.0.3
+ minimatch: 3.1.2
+ object.fromentries: 2.0.8
+ object.groupby: 1.0.3
+ object.values: 1.2.1
+ semver: 6.3.1
+ string.prototype.trimend: 1.0.9
+ tsconfig-paths: 3.15.0
+ optionalDependencies:
+ '@typescript-eslint/parser': 8.56.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)
+ transitivePeerDependencies:
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
+
+ eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.2(jiti@1.21.7)):
+ dependencies:
+ aria-query: 5.3.2
+ array-includes: 3.1.9
+ array.prototype.flatmap: 1.3.3
+ ast-types-flow: 0.0.8
+ axe-core: 4.11.1
+ axobject-query: 4.1.0
+ damerau-levenshtein: 1.0.8
+ emoji-regex: 9.2.2
+ eslint: 9.39.2(jiti@1.21.7)
+ hasown: 2.0.2
+ jsx-ast-utils: 3.3.5
+ language-tags: 1.0.9
+ minimatch: 3.1.2
+ object.fromentries: 2.0.8
+ safe-regex-test: 1.1.0
+ string.prototype.includes: 2.0.1
+
+ eslint-plugin-react-hooks@5.2.0(eslint@9.39.2(jiti@1.21.7)):
+ dependencies:
+ eslint: 9.39.2(jiti@1.21.7)
+
+ eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@1.21.7)):
+ dependencies:
+ array-includes: 3.1.9
+ array.prototype.findlast: 1.2.5
+ array.prototype.flatmap: 1.3.3
+ array.prototype.tosorted: 1.1.4
+ doctrine: 2.1.0
+ es-iterator-helpers: 1.2.2
+ eslint: 9.39.2(jiti@1.21.7)
+ estraverse: 5.3.0
+ hasown: 2.0.2
+ jsx-ast-utils: 3.3.5
+ minimatch: 3.1.2
+ object.entries: 1.1.9
+ object.fromentries: 2.0.8
+ object.values: 1.2.1
+ prop-types: 15.8.1
+ resolve: 2.0.0-next.6
+ semver: 6.3.1
+ string.prototype.matchall: 4.0.12
+ string.prototype.repeat: 1.0.0
+
+ eslint-scope@8.4.0:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-visitor-keys@3.4.3: {}
+
+ eslint-visitor-keys@4.2.1: {}
+
+ eslint-visitor-keys@5.0.0: {}
+
+ eslint@9.39.2(jiti@1.21.7):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@1.21.7))
+ '@eslint-community/regexpp': 4.12.2
+ '@eslint/config-array': 0.21.1
+ '@eslint/config-helpers': 0.4.2
+ '@eslint/core': 0.17.0
+ '@eslint/eslintrc': 3.3.3
+ '@eslint/js': 9.39.2
+ '@eslint/plugin-kit': 0.4.1
+ '@humanfs/node': 0.16.7
+ '@humanwhocodes/module-importer': 1.0.1
+ '@humanwhocodes/retry': 0.4.3
+ '@types/estree': 1.0.8
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.6
+ debug: 4.4.3
+ escape-string-regexp: 4.0.0
+ eslint-scope: 8.4.0
+ eslint-visitor-keys: 4.2.1
+ espree: 10.4.0
+ esquery: 1.7.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 8.0.0
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ json-stable-stringify-without-jsonify: 1.0.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.2
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ optionalDependencies:
+ jiti: 1.21.7
+ transitivePeerDependencies:
+ - supports-color
+
+ espree@10.4.0:
+ dependencies:
+ acorn: 8.15.0
+ acorn-jsx: 5.3.2(acorn@8.15.0)
+ eslint-visitor-keys: 4.2.1
+
+ esprima@4.0.1: {}
+
+ esquery@1.7.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@5.3.0: {}
+
+ estree-util-is-identifier-name@3.0.0: {}
+
+ esutils@2.0.3: {}
+
+ etag@1.8.1: {}
+
+ event-target-shim@5.0.1: {}
+
+ exec-async@2.2.0: {}
+
+ expo-application@7.0.8(expo@54.0.33):
+ dependencies:
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+
+ expo-asset@12.0.12(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ '@expo/image-utils': 0.8.8
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-constants: 18.0.13(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ expo-calendar@15.0.8(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)):
+ dependencies:
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+
+ expo-constants@18.0.13(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)):
+ dependencies:
+ '@expo/config': 12.0.13
+ '@expo/env': 2.0.8
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ expo-dev-client@6.0.20(expo@54.0.33):
+ dependencies:
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-dev-launcher: 6.0.20(expo@54.0.33)
+ expo-dev-menu: 7.0.18(expo@54.0.33)
+ expo-dev-menu-interface: 2.0.0(expo@54.0.33)
+ expo-manifests: 1.0.10(expo@54.0.33)
+ expo-updates-interface: 2.0.0(expo@54.0.33)
+ transitivePeerDependencies:
+ - supports-color
+
+ expo-dev-launcher@6.0.20(expo@54.0.33):
+ dependencies:
+ ajv: 8.11.0
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-dev-menu: 7.0.18(expo@54.0.33)
+ expo-manifests: 1.0.10(expo@54.0.33)
+ transitivePeerDependencies:
+ - supports-color
+
+ expo-dev-menu-interface@2.0.0(expo@54.0.33):
+ dependencies:
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+
+ expo-dev-menu@7.0.18(expo@54.0.33):
+ dependencies:
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-dev-menu-interface: 2.0.0(expo@54.0.33)
+
+ expo-document-picker@14.0.8(expo@54.0.33):
+ dependencies:
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+
+ expo-file-system@19.0.21(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)):
+ dependencies:
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+
+ expo-font@14.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ fontfaceobserver: 2.3.0
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+
+ expo-haptics@15.0.8(expo@54.0.33):
+ dependencies:
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+
+ expo-json-utils@0.15.0: {}
+
+ expo-keep-awake@15.0.8(expo@54.0.33)(react@19.1.0):
+ dependencies:
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react: 19.1.0
+
+ expo-linking@8.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ expo-constants: 18.0.13(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))
+ invariant: 2.2.4
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+ transitivePeerDependencies:
+ - expo
+ - supports-color
+
+ expo-manifests@1.0.10(expo@54.0.33):
+ dependencies:
+ '@expo/config': 12.0.13
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-json-utils: 0.15.0
+ transitivePeerDependencies:
+ - supports-color
+
+ expo-modules-autolinking@3.0.24:
+ dependencies:
+ '@expo/spawn-async': 1.7.2
+ chalk: 4.1.2
+ commander: 7.2.0
+ require-from-string: 2.0.2
+ resolve-from: 5.0.0
+
+ expo-modules-core@3.0.29(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ invariant: 2.2.4
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+
+ expo-notifications@0.32.16(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ '@expo/image-utils': 0.8.8
+ '@ide/backoff': 1.0.0
+ abort-controller: 3.0.0
+ assert: 2.1.0
+ badgin: 1.2.3
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-application: 7.0.8(expo@54.0.33)
+ expo-constants: 18.0.13(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ expo-router@6.0.23(@expo/metro-runtime@6.1.2)(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(expo-constants@18.0.13)(expo-linking@8.0.11)(expo@54.0.33)(react-dom@18.3.1(react@19.1.0))(react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-reanimated@4.1.6(@babel/core@7.29.0)(react-native-worklets@0.7.4(@babel/core@7.29.0)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ '@expo/metro-runtime': 6.1.2(expo@54.0.33)(react-dom@18.3.1(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ '@expo/schema-utils': 0.1.8
+ '@radix-ui/react-slot': 1.2.0(@types/react@19.1.17)(react@19.1.0)
+ '@radix-ui/react-tabs': 1.1.13(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)
+ '@react-navigation/bottom-tabs': 7.14.0(@react-navigation/native@7.1.28(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ '@react-navigation/native': 7.1.28(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ '@react-navigation/native-stack': 7.13.0(@react-navigation/native@7.1.28(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ client-only: 0.0.1
+ debug: 4.4.3
+ escape-string-regexp: 4.0.0
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-constants: 18.0.13(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))
+ expo-linking: 8.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-server: 1.0.5
+ fast-deep-equal: 3.1.3
+ invariant: 2.2.4
+ nanoid: 3.3.11
+ query-string: 7.1.3
+ react: 19.1.0
+ react-fast-compare: 3.2.2
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+ react-native-is-edge-to-edge: 1.2.1(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-screens: 4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ semver: 7.6.3
+ server-only: 0.0.1
+ sf-symbols-typescript: 2.2.0
+ shallowequal: 1.1.0
+ use-latest-callback: 0.2.6(react@19.1.0)
+ vaul: 1.1.2(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)
+ optionalDependencies:
+ react-dom: 18.3.1(react@19.1.0)
+ react-native-gesture-handler: 2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-reanimated: 4.1.6(@babel/core@7.29.0)(react-native-worklets@0.7.4(@babel/core@7.29.0)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ transitivePeerDependencies:
+ - '@react-native-masked-view/masked-view'
+ - '@types/react'
+ - '@types/react-dom'
+ - supports-color
+
+ expo-server@1.0.5: {}
+
+ expo-splash-screen@31.0.13(expo@54.0.33):
+ dependencies:
+ '@expo/prebuild-config': 54.0.8(expo@54.0.33)
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ expo-status-bar@3.0.9(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+ react-native-is-edge-to-edge: 1.2.1(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+
+ expo-system-ui@6.0.9(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)):
+ dependencies:
+ '@react-native/normalize-colors': 0.81.5
+ debug: 4.4.3
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ expo-updates-interface@2.0.0(expo@54.0.33):
+ dependencies:
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+
+ expo-web-browser@15.0.10(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)):
+ dependencies:
+ expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+
+ expo@54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ '@babel/runtime': 7.28.6
+ '@expo/cli': 54.0.23(expo-router@6.0.23)(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))
+ '@expo/config': 12.0.13
+ '@expo/config-plugins': 54.0.4
+ '@expo/devtools': 0.1.8(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ '@expo/fingerprint': 0.15.4
+ '@expo/metro': 54.2.0
+ '@expo/metro-config': 54.0.14(expo@54.0.33)
+ '@expo/vector-icons': 15.0.3(expo-font@14.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ '@ungap/structured-clone': 1.3.0
+ babel-preset-expo: 54.0.10(@babel/core@7.29.0)(@babel/runtime@7.28.6)(expo@54.0.33)(react-refresh@0.14.2)
+ expo-asset: 12.0.12(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-constants: 18.0.13(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))
+ expo-file-system: 19.0.21(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))
+ expo-font: 14.0.11(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ expo-keep-awake: 15.0.8(expo@54.0.33)(react@19.1.0)
+ expo-modules-autolinking: 3.0.24
+ expo-modules-core: 3.0.29(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ pretty-format: 29.7.0
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+ react-refresh: 0.14.2
+ whatwg-url-without-unicode: 8.0.0-3
+ optionalDependencies:
+ '@expo/metro-runtime': 6.1.2(expo@54.0.33)(react-dom@18.3.1(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ transitivePeerDependencies:
+ - '@babel/core'
+ - bufferutil
+ - expo-router
+ - graphql
+ - supports-color
+ - utf-8-validate
+
+ exponential-backoff@3.1.3: {}
+
+ extend@3.0.2: {}
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-glob@3.3.1:
+ 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-glob@3.3.3:
+ 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: {}
+
+ fast-levenshtein@2.0.6: {}
+
+ fastq@1.20.1:
+ dependencies:
+ reusify: 1.1.0
+
+ fb-watchman@2.0.2:
+ dependencies:
+ bser: 2.1.1
+
+ fdir@6.5.0(picomatch@4.0.3):
+ optionalDependencies:
+ picomatch: 4.0.3
+
+ file-entry-cache@8.0.0:
+ dependencies:
+ flat-cache: 4.0.1
+
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
+ filter-obj@1.1.0: {}
+
+ finalhandler@1.1.2:
+ dependencies:
+ debug: 2.6.9
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ on-finished: 2.3.0
+ parseurl: 1.3.3
+ statuses: 1.5.0
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ 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
+
+ flat-cache@4.0.1:
+ dependencies:
+ flatted: 3.3.3
+ keyv: 4.5.4
+
+ flatted@3.3.3: {}
+
+ flow-enums-runtime@0.0.6: {}
+
+ fontfaceobserver@2.3.0: {}
+
+ for-each@0.3.5:
+ dependencies:
+ is-callable: 1.2.7
+
+ fraction.js@5.3.4: {}
+
+ freeport-async@2.0.0: {}
+
+ fresh@0.5.2: {}
+
+ fs.realpath@1.0.0: {}
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ function.prototype.name@1.1.8:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ functions-have-names: 1.2.3
+ hasown: 2.0.2
+ is-callable: 1.2.7
+
+ functions-have-names@1.2.3: {}
+
+ generator-function@2.0.1: {}
+
+ gensync@1.0.0-beta.2: {}
+
+ get-caller-file@2.0.5: {}
+
+ get-intrinsic@1.3.0:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ math-intrinsics: 1.1.0
+
+ get-nonce@1.0.1: {}
+
+ get-package-type@0.1.0: {}
+
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
+
+ get-symbol-description@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+
+ get-tsconfig@4.13.6:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ getenv@2.0.0: {}
+
+ 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@13.0.5:
+ dependencies:
+ minimatch: 10.2.1
+ minipass: 7.1.2
+ path-scurry: 2.0.1
+
+ 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-dirs@0.1.1:
+ dependencies:
+ ini: 1.3.8
+
+ globals@14.0.0: {}
+
+ globals@16.5.0: {}
+
+ globalthis@1.0.4:
+ dependencies:
+ define-properties: 1.2.1
+ gopd: 1.2.0
+
+ gopd@1.2.0: {}
+
+ graceful-fs@4.2.11: {}
+
+ has-bigints@1.1.0: {}
+
+ has-flag@3.0.0: {}
+
+ has-flag@4.0.0: {}
+
+ has-property-descriptors@1.0.2:
+ dependencies:
+ es-define-property: 1.0.1
+
+ has-proto@1.2.0:
+ dependencies:
+ dunder-proto: 1.0.1
+
+ has-symbols@1.1.0: {}
+
+ has-tostringtag@1.0.2:
+ dependencies:
+ has-symbols: 1.1.0
+
+ 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.3
+ parse5: 7.3.0
+ vfile: 6.0.3
+ vfile-message: 4.0.3
+
+ hast-util-from-parse5@8.0.3:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ devlop: 1.1.0
+ hastscript: 9.0.1
+ property-information: 7.1.0
+ vfile: 6.0.3
+ vfile-location: 5.0.3
+ web-namespaces: 2.0.1
+
+ hast-util-has-property@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ 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@3.1.1:
+ dependencies:
+ '@types/hast': 2.3.10
+
+ hast-util-parse-selector@4.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-raw@9.1.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ '@ungap/structured-clone': 1.3.0
+ hast-util-from-parse5: 8.0.3
+ hast-util-to-parse5: 8.0.1
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.2.1
+ parse5: 7.3.0
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.1.0
+ vfile: 6.0.3
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+
+ hast-util-select@6.0.4:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ bcp-47-match: 2.0.3
+ comma-separated-tokens: 2.0.3
+ css-selector-parser: 3.3.0
+ devlop: 1.1.0
+ direction: 2.0.1
+ hast-util-has-property: 3.0.0
+ hast-util-to-string: 3.0.1
+ hast-util-whitespace: 3.0.0
+ nth-check: 2.1.1
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+ unist-util-visit: 5.1.0
+ zwitch: 2.0.4
+
+ hast-util-to-html@9.0.5:
+ 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.1
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+ stringify-entities: 4.0.4
+ zwitch: 2.0.4
+
+ hast-util-to-jsx-runtime@2.3.6:
+ dependencies:
+ '@types/estree': 1.0.8
+ '@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.2.0
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+ style-to-js: 1.1.21
+ unist-util-position: 5.0.0
+ vfile-message: 4.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ hast-util-to-parse5@8.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+
+ 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@7.2.0:
+ dependencies:
+ '@types/hast': 2.3.10
+ comma-separated-tokens: 2.0.3
+ hast-util-parse-selector: 3.1.1
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+
+ hastscript@9.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ hast-util-parse-selector: 4.0.0
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+
+ hermes-estree@0.29.1: {}
+
+ hermes-estree@0.32.0: {}
+
+ hermes-parser@0.29.1:
+ dependencies:
+ hermes-estree: 0.29.1
+
+ hermes-parser@0.32.0:
+ dependencies:
+ hermes-estree: 0.32.0
+
+ hoist-non-react-statics@3.3.2:
+ dependencies:
+ react-is: 16.13.1
+
+ hosted-git-info@7.0.2:
+ dependencies:
+ lru-cache: 10.4.3
+
+ html-url-attributes@3.0.1: {}
+
+ html-void-elements@3.0.0: {}
+
+ http-errors@2.0.1:
+ dependencies:
+ depd: 2.0.0
+ inherits: 2.0.4
+ setprototypeof: 1.2.0
+ statuses: 2.0.2
+ toidentifier: 1.0.1
+
+ https-proxy-agent@7.0.6:
+ dependencies:
+ agent-base: 7.1.4
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ ieee754@1.2.1: {}
+
+ ignore@5.3.2: {}
+
+ ignore@7.0.5: {}
+
+ image-size@1.2.1:
+ dependencies:
+ queue: 6.0.2
+
+ import-fresh@3.3.1:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ imurmurhash@0.1.4: {}
+
+ 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.2.7: {}
+
+ internal-slot@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ hasown: 2.0.2
+ side-channel: 1.1.0
+
+ invariant@2.2.4:
+ dependencies:
+ loose-envify: 1.4.0
+
+ is-alphabetical@2.0.1: {}
+
+ is-alphanumerical@2.0.1:
+ dependencies:
+ is-alphabetical: 2.0.1
+ is-decimal: 2.0.1
+
+ is-arguments@1.2.0:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-array-buffer@3.0.5:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+
+ is-arrayish@0.3.4: {}
+
+ is-async-function@2.1.1:
+ dependencies:
+ async-function: 1.0.0
+ call-bound: 1.0.4
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
+
+ is-bigint@1.1.0:
+ dependencies:
+ has-bigints: 1.1.0
+
+ is-binary-path@2.1.0:
+ dependencies:
+ binary-extensions: 2.3.0
+
+ is-boolean-object@1.2.2:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-bun-module@2.0.0:
+ dependencies:
+ semver: 7.7.4
+
+ is-callable@1.2.7: {}
+
+ is-core-module@2.16.1:
+ dependencies:
+ hasown: 2.0.2
+
+ is-data-view@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ is-typed-array: 1.1.15
+
+ is-date-object@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-decimal@2.0.1: {}
+
+ is-docker@2.2.1: {}
+
+ is-extglob@2.1.1: {}
+
+ is-finalizationregistry@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-generator-function@1.1.2:
+ dependencies:
+ call-bound: 1.0.4
+ generator-function: 2.0.1
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-hexadecimal@2.0.1: {}
+
+ is-map@2.0.3: {}
+
+ is-nan@1.3.2:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+
+ is-negative-zero@2.0.3: {}
+
+ is-number-object@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-number@7.0.0: {}
+
+ is-plain-obj@2.1.0: {}
+
+ is-plain-obj@4.1.0: {}
+
+ is-regex@1.2.1:
+ dependencies:
+ call-bound: 1.0.4
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+
+ is-set@2.0.3: {}
+
+ is-shared-array-buffer@1.0.4:
+ dependencies:
+ call-bound: 1.0.4
+
+ is-string@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+
+ is-symbol@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+ has-symbols: 1.1.0
+ safe-regex-test: 1.1.0
+
+ is-typed-array@1.1.15:
+ dependencies:
+ which-typed-array: 1.1.20
+
+ is-weakmap@2.0.2: {}
+
+ is-weakref@1.1.1:
+ dependencies:
+ call-bound: 1.0.4
+
+ is-weakset@2.0.4:
+ dependencies:
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+
+ is-what@5.5.0: {}
+
+ is-wsl@2.2.0:
+ dependencies:
+ is-docker: 2.2.1
+
+ isarray@2.0.5: {}
+
+ isexe@2.0.0: {}
+
+ istanbul-lib-coverage@3.2.2: {}
+
+ istanbul-lib-instrument@5.2.1:
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/parser': 7.29.0
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-coverage: 3.2.2
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ iterator.prototype@1.1.5:
+ dependencies:
+ define-data-property: 1.1.4
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ has-symbols: 1.1.0
+ set-function-name: 2.0.2
+
+ jest-environment-node@29.7.0:
+ dependencies:
+ '@jest/environment': 29.7.0
+ '@jest/fake-timers': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 22.19.11
+ jest-mock: 29.7.0
+ jest-util: 29.7.0
+
+ jest-get-type@29.6.3: {}
+
+ jest-haste-map@29.7.0:
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/graceful-fs': 4.1.9
+ '@types/node': 22.19.11
+ anymatch: 3.1.3
+ fb-watchman: 2.0.2
+ graceful-fs: 4.2.11
+ jest-regex-util: 29.6.3
+ jest-util: 29.7.0
+ jest-worker: 29.7.0
+ micromatch: 4.0.8
+ walker: 1.0.8
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ jest-message-util@29.7.0:
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ '@jest/types': 29.6.3
+ '@types/stack-utils': 2.0.3
+ chalk: 4.1.2
+ graceful-fs: 4.2.11
+ micromatch: 4.0.8
+ pretty-format: 29.7.0
+ slash: 3.0.0
+ stack-utils: 2.0.6
+
+ jest-mock@29.7.0:
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/node': 22.19.11
+ jest-util: 29.7.0
+
+ jest-regex-util@29.6.3: {}
+
+ jest-util@29.7.0:
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/node': 22.19.11
+ chalk: 4.1.2
+ ci-info: 3.9.0
+ graceful-fs: 4.2.11
+ picomatch: 2.3.1
+
+ jest-validate@29.7.0:
+ dependencies:
+ '@jest/types': 29.6.3
+ camelcase: 6.3.0
+ chalk: 4.1.2
+ jest-get-type: 29.6.3
+ leven: 3.1.0
+ pretty-format: 29.7.0
+
+ jest-worker@29.7.0:
+ dependencies:
+ '@types/node': 22.19.11
+ jest-util: 29.7.0
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
+
+ jimp-compact@0.16.1: {}
+
+ jiti@1.21.7: {}
+
+ jose@6.1.3: {}
+
+ js-tokens@4.0.0: {}
+
+ js-yaml@3.14.2:
+ dependencies:
+ argparse: 1.0.10
+ esprima: 4.0.1
+
+ js-yaml@4.1.1:
+ dependencies:
+ argparse: 2.0.1
+
+ jsc-safe-url@0.2.4: {}
+
+ jsesc@3.1.0: {}
+
+ json-buffer@3.0.1: {}
+
+ json-schema-traverse@0.4.1: {}
+
+ json-schema-traverse@1.0.0: {}
+
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
+ json5@1.0.2:
+ dependencies:
+ minimist: 1.2.8
+
+ json5@2.2.3: {}
+
+ jsx-ast-utils@3.3.5:
+ dependencies:
+ array-includes: 3.1.9
+ array.prototype.flat: 1.3.3
+ object.assign: 4.1.7
+ object.values: 1.2.1
+
+ keyv@4.5.4:
+ dependencies:
+ json-buffer: 3.0.1
+
+ kleur@3.0.3: {}
+
+ kysely@0.28.11: {}
+
+ lan-network@0.1.7: {}
+
+ language-subtag-registry@0.3.23: {}
+
+ language-tags@1.0.9:
+ dependencies:
+ language-subtag-registry: 0.3.23
+
+ leven@3.1.0: {}
+
+ levn@0.4.1:
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+
+ lighthouse-logger@1.4.2:
+ dependencies:
+ debug: 2.6.9
+ marky: 1.3.0
+ transitivePeerDependencies:
+ - supports-color
+
+ lightningcss-android-arm64@1.31.1:
+ optional: true
+
+ lightningcss-darwin-arm64@1.27.0:
+ optional: true
+
+ lightningcss-darwin-arm64@1.31.1:
+ optional: true
+
+ lightningcss-darwin-x64@1.27.0:
+ optional: true
+
+ lightningcss-darwin-x64@1.31.1:
+ optional: true
+
+ lightningcss-freebsd-x64@1.27.0:
+ optional: true
+
+ lightningcss-freebsd-x64@1.31.1:
+ optional: true
+
+ lightningcss-linux-arm-gnueabihf@1.27.0:
+ optional: true
+
+ lightningcss-linux-arm-gnueabihf@1.31.1:
+ optional: true
+
+ lightningcss-linux-arm64-gnu@1.27.0:
+ optional: true
+
+ lightningcss-linux-arm64-gnu@1.31.1:
+ optional: true
+
+ lightningcss-linux-arm64-musl@1.27.0:
+ optional: true
+
+ lightningcss-linux-arm64-musl@1.31.1:
+ optional: true
+
+ lightningcss-linux-x64-gnu@1.27.0:
+ optional: true
+
+ lightningcss-linux-x64-gnu@1.31.1:
+ optional: true
+
+ lightningcss-linux-x64-musl@1.27.0:
+ optional: true
+
+ lightningcss-linux-x64-musl@1.31.1:
+ optional: true
+
+ lightningcss-win32-arm64-msvc@1.27.0:
+ optional: true
+
+ lightningcss-win32-arm64-msvc@1.31.1:
+ optional: true
+
+ lightningcss-win32-x64-msvc@1.27.0:
+ optional: true
+
+ lightningcss-win32-x64-msvc@1.31.1:
+ optional: true
+
+ lightningcss@1.27.0:
+ dependencies:
+ detect-libc: 1.0.3
+ optionalDependencies:
+ lightningcss-darwin-arm64: 1.27.0
+ lightningcss-darwin-x64: 1.27.0
+ lightningcss-freebsd-x64: 1.27.0
+ lightningcss-linux-arm-gnueabihf: 1.27.0
+ lightningcss-linux-arm64-gnu: 1.27.0
+ lightningcss-linux-arm64-musl: 1.27.0
+ lightningcss-linux-x64-gnu: 1.27.0
+ lightningcss-linux-x64-musl: 1.27.0
+ lightningcss-win32-arm64-msvc: 1.27.0
+ lightningcss-win32-x64-msvc: 1.27.0
+
+ lightningcss@1.31.1:
+ dependencies:
+ detect-libc: 2.1.2
+ optionalDependencies:
+ lightningcss-android-arm64: 1.31.1
+ lightningcss-darwin-arm64: 1.31.1
+ lightningcss-darwin-x64: 1.31.1
+ lightningcss-freebsd-x64: 1.31.1
+ lightningcss-linux-arm-gnueabihf: 1.31.1
+ lightningcss-linux-arm64-gnu: 1.31.1
+ lightningcss-linux-arm64-musl: 1.31.1
+ lightningcss-linux-x64-gnu: 1.31.1
+ lightningcss-linux-x64-musl: 1.31.1
+ lightningcss-win32-arm64-msvc: 1.31.1
+ lightningcss-win32-x64-msvc: 1.31.1
+
+ lilconfig@3.1.3: {}
+
+ lines-and-columns@1.2.4: {}
+
+ locate-path@5.0.0:
+ dependencies:
+ p-locate: 4.1.0
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ lodash.debounce@4.0.8: {}
+
+ lodash.merge@4.6.2: {}
+
+ lodash.throttle@4.1.1: {}
+
+ log-symbols@2.2.0:
+ dependencies:
+ chalk: 2.4.2
+
+ longest-streak@3.1.0: {}
+
+ loose-envify@1.4.0:
+ dependencies:
+ js-tokens: 4.0.0
+
+ lru-cache@10.4.3: {}
+
+ lru-cache@11.2.6: {}
+
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ lucide-react@0.460.0(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
+ makeerror@1.0.12:
+ dependencies:
+ tmpl: 1.0.5
+
+ markdown-table@3.0.4: {}
+
+ marky@1.3.0: {}
+
+ math-intrinsics@1.1.0: {}
+
+ mdast-util-find-and-replace@3.0.2:
+ dependencies:
+ '@types/mdast': 4.0.4
+ escape-string-regexp: 5.0.0
+ unist-util-is: 6.0.1
+ unist-util-visit-parents: 6.0.2
+
+ mdast-util-from-markdown@2.0.2:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ decode-named-character-reference: 1.3.0
+ devlop: 1.1.0
+ mdast-util-to-string: 4.0.0
+ micromark: 4.0.2
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-decode-string: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ 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.2
+ micromark-util-character: 2.1.1
+
+ mdast-util-gfm-footnote@2.1.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.1
+ 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.1.0:
+ dependencies:
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-gfm-autolink-literal: 2.0.1
+ mdast-util-gfm-footnote: 2.1.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.2.0:
+ 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.2
+ stringify-entities: 4.0.4
+ unist-util-stringify-position: 4.0.0
+ vfile-message: 4.0.3
+ 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.1
+
+ mdast-util-to-hast@13.2.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@ungap/structured-clone': 1.3.0
+ devlop: 1.1.0
+ micromark-util-sanitize-uri: 2.0.1
+ trim-lines: 3.0.1
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.1.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.1
+ micromark-util-decode-string: 2.0.1
+ unist-util-visit: 5.1.0
+ zwitch: 2.0.4
+
+ mdast-util-to-string@4.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+
+ memoize-one@5.2.1: {}
+
+ merge-options@3.0.4:
+ dependencies:
+ is-plain-obj: 2.1.0
+
+ merge-stream@2.0.0: {}
+
+ merge2@1.4.1: {}
+
+ metro-babel-transformer@0.83.3:
+ dependencies:
+ '@babel/core': 7.29.0
+ flow-enums-runtime: 0.0.6
+ hermes-parser: 0.32.0
+ nullthrows: 1.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ metro-cache-key@0.83.3:
+ dependencies:
+ flow-enums-runtime: 0.0.6
+
+ metro-cache@0.83.3:
+ dependencies:
+ exponential-backoff: 3.1.3
+ flow-enums-runtime: 0.0.6
+ https-proxy-agent: 7.0.6
+ metro-core: 0.83.3
+ transitivePeerDependencies:
+ - supports-color
+
+ metro-config@0.83.3:
+ dependencies:
+ connect: 3.7.0
+ flow-enums-runtime: 0.0.6
+ jest-validate: 29.7.0
+ metro: 0.83.3
+ metro-cache: 0.83.3
+ metro-core: 0.83.3
+ metro-runtime: 0.83.3
+ yaml: 2.8.2
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ metro-core@0.83.3:
+ dependencies:
+ flow-enums-runtime: 0.0.6
+ lodash.throttle: 4.1.1
+ metro-resolver: 0.83.3
+
+ metro-file-map@0.83.3:
+ dependencies:
+ debug: 4.4.3
+ fb-watchman: 2.0.2
+ flow-enums-runtime: 0.0.6
+ graceful-fs: 4.2.11
+ invariant: 2.2.4
+ jest-worker: 29.7.0
+ micromatch: 4.0.8
+ nullthrows: 1.1.1
+ walker: 1.0.8
+ transitivePeerDependencies:
+ - supports-color
+
+ metro-minify-terser@0.83.3:
+ dependencies:
+ flow-enums-runtime: 0.0.6
+ terser: 5.46.0
+
+ metro-resolver@0.83.3:
+ dependencies:
+ flow-enums-runtime: 0.0.6
+
+ metro-runtime@0.83.3:
+ dependencies:
+ '@babel/runtime': 7.28.6
+ flow-enums-runtime: 0.0.6
+
+ metro-source-map@0.83.3:
+ dependencies:
+ '@babel/traverse': 7.29.0
+ '@babel/traverse--for-generate-function-map': '@babel/traverse@7.29.0'
+ '@babel/types': 7.29.0
+ flow-enums-runtime: 0.0.6
+ invariant: 2.2.4
+ metro-symbolicate: 0.83.3
+ nullthrows: 1.1.1
+ ob1: 0.83.3
+ source-map: 0.5.7
+ vlq: 1.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ metro-symbolicate@0.83.3:
+ dependencies:
+ flow-enums-runtime: 0.0.6
+ invariant: 2.2.4
+ metro-source-map: 0.83.3
+ nullthrows: 1.1.1
+ source-map: 0.5.7
+ vlq: 1.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ metro-transform-plugins@0.83.3:
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/generator': 7.29.1
+ '@babel/template': 7.28.6
+ '@babel/traverse': 7.29.0
+ flow-enums-runtime: 0.0.6
+ nullthrows: 1.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ metro-transform-worker@0.83.3:
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/generator': 7.29.1
+ '@babel/parser': 7.29.0
+ '@babel/types': 7.29.0
+ flow-enums-runtime: 0.0.6
+ metro: 0.83.3
+ metro-babel-transformer: 0.83.3
+ metro-cache: 0.83.3
+ metro-cache-key: 0.83.3
+ metro-minify-terser: 0.83.3
+ metro-source-map: 0.83.3
+ metro-transform-plugins: 0.83.3
+ nullthrows: 1.1.1
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ metro@0.83.3:
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ '@babel/core': 7.29.0
+ '@babel/generator': 7.29.1
+ '@babel/parser': 7.29.0
+ '@babel/template': 7.28.6
+ '@babel/traverse': 7.29.0
+ '@babel/types': 7.29.0
+ accepts: 1.3.8
+ chalk: 4.1.2
+ ci-info: 2.0.0
+ connect: 3.7.0
+ debug: 4.4.3
+ error-stack-parser: 2.1.4
+ flow-enums-runtime: 0.0.6
+ graceful-fs: 4.2.11
+ hermes-parser: 0.32.0
+ image-size: 1.2.1
+ invariant: 2.2.4
+ jest-worker: 29.7.0
+ jsc-safe-url: 0.2.4
+ lodash.throttle: 4.1.1
+ metro-babel-transformer: 0.83.3
+ metro-cache: 0.83.3
+ metro-cache-key: 0.83.3
+ metro-config: 0.83.3
+ metro-core: 0.83.3
+ metro-file-map: 0.83.3
+ metro-resolver: 0.83.3
+ metro-runtime: 0.83.3
+ metro-source-map: 0.83.3
+ metro-symbolicate: 0.83.3
+ metro-transform-plugins: 0.83.3
+ metro-transform-worker: 0.83.3
+ mime-types: 2.1.35
+ nullthrows: 1.1.1
+ serialize-error: 2.1.0
+ source-map: 0.5.7
+ throat: 5.0.0
+ ws: 7.5.10
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ micromark-core-commonmark@2.0.3:
+ dependencies:
+ decode-named-character-reference: 1.3.0
+ devlop: 1.1.0
+ micromark-factory-destination: 2.0.1
+ micromark-factory-label: 2.0.1
+ micromark-factory-space: 2.0.1
+ micromark-factory-title: 2.0.1
+ micromark-factory-whitespace: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-chunked: 2.0.1
+ micromark-util-classify-character: 2.0.1
+ micromark-util-html-tag-name: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-subtokenize: 2.1.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-autolink-literal@2.1.0:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-footnote@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-strikethrough@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.1
+ micromark-util-classify-character: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-table@2.1.1:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-tagfilter@2.0.0:
+ dependencies:
+ micromark-util-types: 2.0.2
+
+ micromark-extension-gfm-task-list-item@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ 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.1
+ micromark-extension-gfm-tagfilter: 2.0.0
+ micromark-extension-gfm-task-list-item: 2.1.0
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-destination@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-label@2.0.1:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-space@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-title@2.0.1:
+ dependencies:
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-factory-whitespace@2.0.1:
+ dependencies:
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-character@2.1.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-chunked@2.0.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-classify-character@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-combine-extensions@2.0.1:
+ dependencies:
+ micromark-util-chunked: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-decode-numeric-character-reference@2.0.2:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-decode-string@2.0.1:
+ dependencies:
+ decode-named-character-reference: 1.3.0
+ micromark-util-character: 2.1.1
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-encode@2.0.1: {}
+
+ micromark-util-html-tag-name@2.0.1: {}
+
+ micromark-util-normalize-identifier@2.0.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-resolve-all@2.0.1:
+ dependencies:
+ micromark-util-types: 2.0.2
+
+ micromark-util-sanitize-uri@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-encode: 2.0.1
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-subtokenize@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-symbol@2.0.1: {}
+
+ micromark-util-types@2.0.2: {}
+
+ micromark@4.0.2:
+ dependencies:
+ '@types/debug': 4.1.12
+ debug: 4.4.3
+ decode-named-character-reference: 1.3.0
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-chunked: 2.0.1
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-encode: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-subtokenize: 2.1.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+
+ mime-db@1.52.0: {}
+
+ mime-db@1.54.0: {}
+
+ mime-types@2.1.35:
+ dependencies:
+ mime-db: 1.52.0
+
+ mime@1.6.0: {}
+
+ mimic-fn@1.2.0: {}
+
+ minimatch@10.2.1:
+ dependencies:
+ brace-expansion: 5.0.2
+
+ minimatch@3.1.2:
+ dependencies:
+ brace-expansion: 1.1.12
+
+ minimatch@9.0.5:
+ dependencies:
+ brace-expansion: 2.0.2
+
+ minimist@1.2.8: {}
+
+ minipass@7.1.2: {}
+
+ minizlib@3.1.0:
+ dependencies:
+ minipass: 7.1.2
+
+ mkdirp@1.0.4: {}
+
+ 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
+
+ nanoid@3.3.11: {}
+
+ nanostores@1.1.0: {}
+
+ napi-postinstall@0.3.4: {}
+
+ nativewind@4.2.1(react-native-reanimated@4.1.6(@babel/core@7.29.0)(react-native-worklets@0.7.4(@babel/core@7.29.0)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.8.2)):
+ dependencies:
+ comment-json: 4.5.1
+ debug: 4.4.3
+ react-native-css-interop: 0.2.1(react-native-reanimated@4.1.6(@babel/core@7.29.0)(react-native-worklets@0.7.4(@babel/core@7.29.0)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.8.2))
+ tailwindcss: 3.4.19(tsx@4.21.0)(yaml@2.8.2)
+ transitivePeerDependencies:
+ - react
+ - react-native
+ - react-native-reanimated
+ - react-native-safe-area-context
+ - react-native-svg
+ - supports-color
+
+ natural-compare@1.4.0: {}
+
+ negotiator@0.6.3: {}
+
+ negotiator@0.6.4: {}
+
+ nested-error-stacks@2.0.1: {}
+
+ next@15.5.12(@babel/core@7.29.0)(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@19.1.0))(react@19.1.0):
+ dependencies:
+ '@next/env': 15.5.12
+ '@swc/helpers': 0.5.15
+ caniuse-lite: 1.0.30001770
+ postcss: 8.4.31
+ react: 19.1.0
+ react-dom: 18.3.1(react@19.1.0)
+ styled-jsx: 5.1.6(@babel/core@7.29.0)(react@19.1.0)
+ optionalDependencies:
+ '@next/swc-darwin-arm64': 15.5.12
+ '@next/swc-darwin-x64': 15.5.12
+ '@next/swc-linux-arm64-gnu': 15.5.12
+ '@next/swc-linux-arm64-musl': 15.5.12
+ '@next/swc-linux-x64-gnu': 15.5.12
+ '@next/swc-linux-x64-musl': 15.5.12
+ '@next/swc-win32-arm64-msvc': 15.5.12
+ '@next/swc-win32-x64-msvc': 15.5.12
+ babel-plugin-react-compiler: 1.0.0
+ sharp: 0.34.5
+ transitivePeerDependencies:
+ - '@babel/core'
+ - babel-plugin-macros
+ optional: true
+
+ next@15.5.12(babel-plugin-react-compiler@1.0.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@next/env': 15.5.12
+ '@swc/helpers': 0.5.15
+ caniuse-lite: 1.0.30001770
+ postcss: 8.4.31
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ styled-jsx: 5.1.6(react@18.3.1)
+ optionalDependencies:
+ '@next/swc-darwin-arm64': 15.5.12
+ '@next/swc-darwin-x64': 15.5.12
+ '@next/swc-linux-arm64-gnu': 15.5.12
+ '@next/swc-linux-arm64-musl': 15.5.12
+ '@next/swc-linux-x64-gnu': 15.5.12
+ '@next/swc-linux-x64-musl': 15.5.12
+ '@next/swc-win32-arm64-msvc': 15.5.12
+ '@next/swc-win32-x64-msvc': 15.5.12
+ babel-plugin-react-compiler: 1.0.0
+ sharp: 0.34.5
+ transitivePeerDependencies:
+ - '@babel/core'
+ - babel-plugin-macros
+
+ node-exports-info@1.6.0:
+ dependencies:
+ array.prototype.flatmap: 1.3.3
+ es-errors: 1.3.0
+ object.entries: 1.1.9
+ semver: 6.3.1
+
+ node-forge@1.3.3: {}
+
+ node-int64@0.4.0: {}
+
+ node-releases@2.0.27: {}
+
+ nodemailer@6.10.1: {}
+
+ normalize-path@3.0.0: {}
+
+ npm-package-arg@11.0.3:
+ dependencies:
+ hosted-git-info: 7.0.2
+ proc-log: 4.2.0
+ semver: 7.7.4
+ validate-npm-package-name: 5.0.1
+
+ nth-check@2.1.1:
+ dependencies:
+ boolbase: 1.0.0
+
+ nullthrows@1.1.1: {}
+
+ ob1@0.83.3:
+ dependencies:
+ flow-enums-runtime: 0.0.6
+
+ object-assign@4.1.1: {}
+
+ object-hash@3.0.0: {}
+
+ object-inspect@1.13.4: {}
+
+ object-is@1.1.6:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+
+ object-keys@1.1.1: {}
+
+ object.assign@4.1.7:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+ has-symbols: 1.1.0
+ object-keys: 1.1.1
+
+ object.entries@1.1.9:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+
+ object.fromentries@2.0.8:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-object-atoms: 1.1.1
+
+ object.groupby@1.0.3:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+
+ object.values@1.2.1:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+
+ on-finished@2.3.0:
+ dependencies:
+ ee-first: 1.1.1
+
+ on-finished@2.4.1:
+ dependencies:
+ ee-first: 1.1.1
+
+ on-headers@1.1.0: {}
+
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
+ onetime@2.0.1:
+ dependencies:
+ mimic-fn: 1.2.0
+
+ open@7.4.2:
+ dependencies:
+ is-docker: 2.2.1
+ is-wsl: 2.2.0
+
+ open@8.4.2:
+ dependencies:
+ define-lazy-prop: 2.0.0
+ is-docker: 2.2.1
+ is-wsl: 2.2.0
+
+ optionator@0.9.4:
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
+
+ ora@3.4.0:
+ dependencies:
+ chalk: 2.4.2
+ cli-cursor: 2.1.0
+ cli-spinners: 2.9.2
+ log-symbols: 2.2.0
+ strip-ansi: 5.2.0
+ wcwidth: 1.0.1
+
+ own-keys@1.0.1:
+ dependencies:
+ get-intrinsic: 1.3.0
+ object-keys: 1.1.1
+ safe-push-apply: 1.0.0
+
+ p-limit@2.3.0:
+ dependencies:
+ p-try: 2.2.0
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-locate@4.1.0:
+ dependencies:
+ p-limit: 2.3.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ p-try@2.2.0: {}
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ parse-entities@4.0.2:
+ dependencies:
+ '@types/unist': 2.0.11
+ character-entities-legacy: 3.0.0
+ character-reference-invalid: 2.0.1
+ decode-named-character-reference: 1.3.0
+ is-alphanumerical: 2.0.1
+ is-decimal: 2.0.1
+ is-hexadecimal: 2.0.1
+
+ parse-numeric-range@1.3.0: {}
+
+ parse-png@2.1.0:
+ dependencies:
+ pngjs: 3.4.0
+
+ parse5@7.3.0:
+ dependencies:
+ entities: 6.0.1
+
+ parseurl@1.3.3: {}
+
+ path-exists@4.0.0: {}
+
+ path-is-absolute@1.0.1: {}
+
+ path-key@3.1.1: {}
+
+ path-parse@1.0.7: {}
+
+ path-scurry@2.0.1:
+ dependencies:
+ lru-cache: 11.2.6
+ minipass: 7.1.2
+
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.1: {}
+
+ picomatch@3.0.1: {}
+
+ picomatch@4.0.3: {}
+
+ pify@2.3.0: {}
+
+ pirates@4.0.7: {}
+
+ plist@3.1.0:
+ dependencies:
+ '@xmldom/xmldom': 0.8.11
+ base64-js: 1.5.1
+ xmlbuilder: 15.1.1
+
+ pngjs@3.4.0: {}
+
+ possible-typed-array-names@1.1.0: {}
+
+ postcss-import@15.1.0(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-value-parser: 4.2.0
+ read-cache: 1.0.0
+ resolve: 1.22.11
+
+ postcss-js@4.1.0(postcss@8.5.6):
+ dependencies:
+ camelcase-css: 2.0.1
+ postcss: 8.5.6
+
+ postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.21.0)(yaml@2.8.2):
+ dependencies:
+ lilconfig: 3.1.3
+ optionalDependencies:
+ jiti: 1.21.7
+ postcss: 8.5.6
+ tsx: 4.21.0
+ yaml: 2.8.2
+
+ postcss-nested@6.2.0(postcss@8.5.6):
+ dependencies:
+ postcss: 8.5.6
+ postcss-selector-parser: 6.1.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.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ postcss@8.4.49:
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ postcss@8.5.6:
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ prelude-ls@1.2.1: {}
+
+ pretty-bytes@5.6.0: {}
+
+ pretty-format@29.7.0:
+ dependencies:
+ '@jest/schemas': 29.6.3
+ ansi-styles: 5.2.0
+ react-is: 18.3.1
+
+ prisma@5.22.0:
+ dependencies:
+ '@prisma/engines': 5.22.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ proc-log@4.2.0: {}
+
+ progress@2.0.3: {}
+
+ promise@8.3.0:
+ dependencies:
+ asap: 2.0.6
+
+ prompts@2.4.2:
+ dependencies:
+ kleur: 3.0.3
+ sisteransi: 1.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@6.5.0: {}
+
+ property-information@7.1.0: {}
+
+ punycode@2.3.1: {}
+
+ qrcode-terminal@0.11.0: {}
+
+ query-string@7.1.3:
+ dependencies:
+ decode-uri-component: 0.2.2
+ filter-obj: 1.1.0
+ split-on-first: 1.1.0
+ strict-uri-encode: 2.0.0
+
+ queue-microtask@1.2.3: {}
+
+ queue@6.0.2:
+ dependencies:
+ inherits: 2.0.4
+
+ range-parser@1.2.1: {}
+
+ rc@1.2.8:
+ dependencies:
+ deep-extend: 0.6.0
+ ini: 1.3.8
+ minimist: 1.2.8
+ strip-json-comments: 2.0.1
+
+ react-devtools-core@6.1.5:
+ dependencies:
+ shell-quote: 1.8.3
+ ws: 7.5.10
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
+ react-dom@18.3.1(react@18.3.1):
+ dependencies:
+ loose-envify: 1.4.0
+ react: 18.3.1
+ scheduler: 0.23.2
+
+ react-dom@18.3.1(react@19.1.0):
+ dependencies:
+ loose-envify: 1.4.0
+ react: 19.1.0
+ scheduler: 0.23.2
+
+ react-fast-compare@3.2.2: {}
+
+ react-freeze@1.0.4(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+
+ react-is@16.13.1: {}
+
+ react-is@18.3.1: {}
+
+ react-is@19.2.4: {}
+
+ react-markdown@9.0.3(@types/react@18.3.28)(react@18.3.1):
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/react': 18.3.28
+ devlop: 1.1.0
+ hast-util-to-jsx-runtime: 2.3.6
+ html-url-attributes: 3.0.1
+ mdast-util-to-hast: 13.2.1
+ react: 18.3.1
+ remark-parse: 11.0.0
+ remark-rehype: 11.1.2
+ unified: 11.0.5
+ unist-util-visit: 5.1.0
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ react-native-css-interop@0.2.1(react-native-reanimated@4.1.6(@babel/core@7.29.0)(react-native-worklets@0.7.4(@babel/core@7.29.0)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.8.2)):
+ dependencies:
+ '@babel/helper-module-imports': 7.28.6
+ '@babel/traverse': 7.29.0
+ '@babel/types': 7.29.0
+ debug: 4.4.3
+ lightningcss: 1.27.0
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+ react-native-reanimated: 4.1.6(@babel/core@7.29.0)(react-native-worklets@0.7.4(@babel/core@7.29.0)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ semver: 7.7.4
+ tailwindcss: 3.4.19(tsx@4.21.0)(yaml@2.8.2)
+ optionalDependencies:
+ react-native-safe-area-context: 5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ react-native-gesture-handler@2.28.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ '@egjs/hammerjs': 2.0.17
+ hoist-non-react-statics: 3.3.2
+ invariant: 2.2.4
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+
+ react-native-is-edge-to-edge@1.2.1(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+
+ react-native-reanimated@4.1.6(@babel/core@7.29.0)(react-native-worklets@0.7.4(@babel/core@7.29.0)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ '@babel/core': 7.29.0
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+ react-native-is-edge-to-edge: 1.2.1(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-worklets: 0.7.4(@babel/core@7.29.0)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ semver: 7.7.2
+
+ react-native-safe-area-context@5.6.2(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+
+ react-native-screens@4.16.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+ react-freeze: 1.0.4(react@19.1.0)
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+ react-native-is-edge-to-edge: 1.2.1(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ warn-once: 0.1.1
+
+ react-native-worklets@0.7.4(@babel/core@7.29.0)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.29.0)
+ '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.29.0)
+ '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0)
+ '@babel/preset-typescript': 7.27.1(@babel/core@7.29.0)
+ convert-source-map: 2.0.0
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0)
+ semver: 7.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0):
+ dependencies:
+ '@jest/create-cache-key-function': 29.7.0
+ '@react-native/assets-registry': 0.81.5
+ '@react-native/codegen': 0.81.5(@babel/core@7.29.0)
+ '@react-native/community-cli-plugin': 0.81.5
+ '@react-native/gradle-plugin': 0.81.5
+ '@react-native/js-polyfills': 0.81.5
+ '@react-native/normalize-colors': 0.81.5
+ '@react-native/virtualized-lists': 0.81.5(@types/react@19.1.17)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ abort-controller: 3.0.0
+ anser: 1.4.10
+ ansi-regex: 5.0.1
+ babel-jest: 29.7.0(@babel/core@7.29.0)
+ babel-plugin-syntax-hermes-parser: 0.29.1
+ base64-js: 1.5.1
+ commander: 12.1.0
+ flow-enums-runtime: 0.0.6
+ glob: 7.2.3
+ invariant: 2.2.4
+ jest-environment-node: 29.7.0
+ memoize-one: 5.2.1
+ metro-runtime: 0.83.3
+ metro-source-map: 0.83.3
+ nullthrows: 1.1.1
+ pretty-format: 29.7.0
+ promise: 8.3.0
+ react: 19.1.0
+ react-devtools-core: 6.1.5
+ react-refresh: 0.14.2
+ regenerator-runtime: 0.13.11
+ scheduler: 0.26.0
+ semver: 7.7.4
+ stacktrace-parser: 0.1.11
+ whatwg-fetch: 3.6.20
+ ws: 6.2.3
+ yargs: 17.7.2
+ optionalDependencies:
+ '@types/react': 19.1.17
+ transitivePeerDependencies:
+ - '@babel/core'
+ - '@react-native-community/cli'
+ - '@react-native/metro-config'
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ react-refresh@0.14.2: {}
+
+ react-remove-scroll-bar@2.3.8(@types/react@19.1.17)(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+ react-style-singleton: 2.2.3(@types/react@19.1.17)(react@19.1.0)
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.1.17
+
+ react-remove-scroll@2.7.2(@types/react@19.1.17)(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+ react-remove-scroll-bar: 2.3.8(@types/react@19.1.17)(react@19.1.0)
+ react-style-singleton: 2.2.3(@types/react@19.1.17)(react@19.1.0)
+ tslib: 2.8.1
+ use-callback-ref: 1.3.3(@types/react@19.1.17)(react@19.1.0)
+ use-sidecar: 1.1.3(@types/react@19.1.17)(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.17
+
+ react-style-singleton@2.2.3(@types/react@19.1.17)(react@19.1.0):
+ dependencies:
+ get-nonce: 1.0.1
+ react: 19.1.0
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.1.17
+
+ react@18.3.1:
+ dependencies:
+ loose-envify: 1.4.0
+
+ react@19.1.0: {}
+
+ read-cache@1.0.0:
+ dependencies:
+ pify: 2.3.0
+
+ readdirp@3.6.0:
+ dependencies:
+ picomatch: 2.3.1
+
+ reflect.getprototypeof@1.0.10:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ which-builtin-type: 1.2.1
+
+ refractor@4.9.0:
+ dependencies:
+ '@types/hast': 2.3.10
+ '@types/prismjs': 1.26.6
+ hastscript: 7.2.0
+ parse-entities: 4.0.2
+
+ refractor@5.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/prismjs': 1.26.6
+ hastscript: 9.0.1
+ parse-entities: 4.0.2
+
+ regenerate-unicode-properties@10.2.2:
+ dependencies:
+ regenerate: 1.4.2
+
+ regenerate@1.4.2: {}
+
+ regenerator-runtime@0.13.11: {}
+
+ regexp.prototype.flags@1.5.4:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-errors: 1.3.0
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ set-function-name: 2.0.2
+
+ regexpu-core@6.4.0:
+ dependencies:
+ regenerate: 1.4.2
+ regenerate-unicode-properties: 10.2.2
+ regjsgen: 0.8.0
+ regjsparser: 0.13.0
+ unicode-match-property-ecmascript: 2.0.0
+ unicode-match-property-value-ecmascript: 2.2.1
+
+ regjsgen@0.8.0: {}
+
+ regjsparser@0.13.0:
+ dependencies:
+ jsesc: 3.1.0
+
+ rehype-attr@3.0.3:
+ dependencies:
+ unified: 11.0.5
+ unist-util-visit: 5.0.0
+
+ rehype-autolink-headings@7.1.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@ungap/structured-clone': 1.3.0
+ hast-util-heading-rank: 3.0.0
+ hast-util-is-element: 3.0.0
+ unified: 11.0.5
+ unist-util-visit: 5.1.0
+
+ rehype-ignore@2.0.3:
+ dependencies:
+ hast-util-select: 6.0.4
+ unified: 11.0.5
+ unist-util-visit: 5.1.0
+
+ rehype-parse@9.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-from-html: 2.0.3
+ unified: 11.0.5
+
+ rehype-prism-plus@2.0.0:
+ dependencies:
+ hast-util-to-string: 3.0.1
+ parse-numeric-range: 1.3.0
+ refractor: 4.9.0
+ rehype-parse: 9.0.1
+ unist-util-filter: 5.0.1
+ unist-util-visit: 5.1.0
+
+ rehype-prism-plus@2.0.2:
+ dependencies:
+ hast-util-to-string: 3.0.1
+ parse-numeric-range: 1.3.0
+ refractor: 5.0.0
+ rehype-parse: 9.0.1
+ unist-util-filter: 5.0.1
+ unist-util-visit: 5.1.0
+
+ rehype-raw@7.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-raw: 9.1.0
+ vfile: 6.0.3
+
+ rehype-rewrite@4.0.4:
+ dependencies:
+ hast-util-select: 6.0.4
+ unified: 11.0.5
+ unist-util-visit: 5.1.0
+
+ 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.1.0
+
+ rehype-stringify@10.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-to-html: 9.0.5
+ 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
+
+ remark-gfm@4.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-gfm: 3.1.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-github-blockquote-alert@1.3.1:
+ dependencies:
+ unist-util-visit: 5.1.0
+
+ remark-parse@11.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.2
+ micromark-util-types: 2.0.2
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-rehype@11.1.2:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ mdast-util-to-hast: 13.2.1
+ 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
+
+ require-directory@2.1.1: {}
+
+ require-from-string@2.0.2: {}
+
+ requireg@0.2.2:
+ dependencies:
+ nested-error-stacks: 2.0.1
+ rc: 1.2.8
+ resolve: 1.7.1
+
+ resolve-from@4.0.0: {}
+
+ resolve-from@5.0.0: {}
+
+ resolve-global@1.0.0:
+ dependencies:
+ global-dirs: 0.1.1
+
+ resolve-pkg-maps@1.0.0: {}
+
+ resolve-workspace-root@2.0.1: {}
+
+ resolve.exports@2.0.3: {}
+
+ resolve@1.22.11:
+ dependencies:
+ is-core-module: 2.16.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ resolve@1.7.1:
+ dependencies:
+ path-parse: 1.0.7
+
+ resolve@2.0.0-next.6:
+ dependencies:
+ es-errors: 1.3.0
+ is-core-module: 2.16.1
+ node-exports-info: 1.6.0
+ object-keys: 1.1.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ restore-cursor@2.0.0:
+ dependencies:
+ onetime: 2.0.1
+ signal-exit: 3.0.7
+
+ reusify@1.1.0: {}
+
+ rimraf@3.0.2:
+ dependencies:
+ glob: 7.2.3
+
+ rou3@0.7.12: {}
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
+ safe-array-concat@1.1.3:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ has-symbols: 1.1.0
+ isarray: 2.0.5
+
+ safe-buffer@5.2.1: {}
+
+ safe-push-apply@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+ isarray: 2.0.5
+
+ safe-regex-test@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-regex: 1.2.1
+
+ sax@1.4.4: {}
+
+ scheduler@0.23.2:
+ dependencies:
+ loose-envify: 1.4.0
+
+ scheduler@0.26.0: {}
+
+ semver@6.3.1: {}
+
+ semver@7.6.3: {}
+
+ semver@7.7.2: {}
+
+ semver@7.7.3: {}
+
+ semver@7.7.4: {}
+
+ send@0.19.2:
+ dependencies:
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ fresh: 0.5.2
+ http-errors: 2.0.1
+ mime: 1.6.0
+ ms: 2.1.3
+ on-finished: 2.4.1
+ range-parser: 1.2.1
+ statuses: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ serialize-error@2.1.0: {}
+
+ serve-static@1.16.3:
+ dependencies:
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 0.19.2
+ transitivePeerDependencies:
+ - supports-color
+
+ server-only@0.0.1: {}
+
+ set-cookie-parser@2.7.2: {}
+
+ 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.3.0
+ gopd: 1.2.0
+ 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
+
+ set-proto@1.0.0:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+
+ setprototypeof@1.2.0: {}
+
+ sf-symbols-typescript@2.2.0: {}
+
+ shallowequal@1.1.0: {}
+
+ sharp@0.34.5:
+ dependencies:
+ '@img/colour': 1.0.0
+ detect-libc: 2.1.2
+ semver: 7.7.4
+ optionalDependencies:
+ '@img/sharp-darwin-arm64': 0.34.5
+ '@img/sharp-darwin-x64': 0.34.5
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ '@img/sharp-linux-arm': 0.34.5
+ '@img/sharp-linux-arm64': 0.34.5
+ '@img/sharp-linux-ppc64': 0.34.5
+ '@img/sharp-linux-riscv64': 0.34.5
+ '@img/sharp-linux-s390x': 0.34.5
+ '@img/sharp-linux-x64': 0.34.5
+ '@img/sharp-linuxmusl-arm64': 0.34.5
+ '@img/sharp-linuxmusl-x64': 0.34.5
+ '@img/sharp-wasm32': 0.34.5
+ '@img/sharp-win32-arm64': 0.34.5
+ '@img/sharp-win32-ia32': 0.34.5
+ '@img/sharp-win32-x64': 0.34.5
+ optional: true
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ shell-quote@1.8.3: {}
+
+ side-channel-list@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-map@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-weakmap@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-map: 1.0.1
+
+ side-channel@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-list: 1.0.0
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
+
+ signal-exit@3.0.7: {}
+
+ simple-plist@1.3.1:
+ dependencies:
+ bplist-creator: 0.1.0
+ bplist-parser: 0.3.1
+ plist: 3.1.0
+
+ simple-swizzle@0.2.4:
+ dependencies:
+ is-arrayish: 0.3.4
+
+ sisteransi@1.0.5: {}
+
+ slash@3.0.0: {}
+
+ slugify@1.6.6: {}
+
+ 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: {}
+
+ space-separated-tokens@2.0.2: {}
+
+ split-on-first@1.1.0: {}
+
+ sprintf-js@1.0.3: {}
+
+ stable-hash@0.0.5: {}
+
+ stack-utils@2.0.6:
+ dependencies:
+ escape-string-regexp: 2.0.0
+
+ stackframe@1.3.4: {}
+
+ stacktrace-parser@0.1.11:
+ dependencies:
+ type-fest: 0.7.1
+
+ statuses@1.5.0: {}
+
+ statuses@2.0.2: {}
+
+ stop-iteration-iterator@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ internal-slot: 1.1.0
+
+ stream-buffers@2.2.0: {}
+
+ strict-uri-encode@2.0.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.prototype.includes@2.0.1:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+
+ string.prototype.matchall@4.0.12:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ internal-slot: 1.1.0
+ regexp.prototype.flags: 1.5.4
+ set-function-name: 2.0.2
+ side-channel: 1.1.0
+
+ string.prototype.repeat@1.0.0:
+ dependencies:
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+
+ string.prototype.trim@1.2.10:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-data-property: 1.1.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-object-atoms: 1.1.1
+ has-property-descriptors: 1.0.2
+
+ string.prototype.trimend@1.0.9:
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+
+ string.prototype.trimstart@1.0.8:
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+
+ stringify-entities@4.0.4:
+ dependencies:
+ character-entities-html4: 2.1.0
+ character-entities-legacy: 3.0.0
+
+ strip-ansi@5.2.0:
+ dependencies:
+ ansi-regex: 4.1.1
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-bom@3.0.0: {}
+
+ strip-json-comments@2.0.1: {}
+
+ strip-json-comments@3.1.1: {}
+
+ structured-headers@0.4.1: {}
+
+ style-to-js@1.1.21:
+ dependencies:
+ style-to-object: 1.0.14
+
+ style-to-object@1.0.14:
+ dependencies:
+ inline-style-parser: 0.2.7
+
+ styled-jsx@5.1.6(@babel/core@7.29.0)(react@19.1.0):
+ dependencies:
+ client-only: 0.0.1
+ react: 19.1.0
+ optionalDependencies:
+ '@babel/core': 7.29.0
+ optional: true
+
+ styled-jsx@5.1.6(react@18.3.1):
+ dependencies:
+ client-only: 0.0.1
+ react: 18.3.1
+
+ sucrase@3.35.1:
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ commander: 4.1.1
+ lines-and-columns: 1.2.4
+ mz: 2.7.0
+ pirates: 4.0.7
+ tinyglobby: 0.2.15
+ ts-interface-checker: 0.1.13
+
+ superjson@2.2.6:
+ dependencies:
+ copy-anything: 4.0.5
+
+ 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-hyperlinks@2.3.0:
+ dependencies:
+ has-flag: 4.0.0
+ supports-color: 7.2.0
+
+ supports-preserve-symlinks-flag@1.0.0: {}
+
+ tailwind-merge@2.6.1: {}
+
+ tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.8.2):
+ 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.3
+ glob-parent: 6.0.2
+ is-glob: 4.0.3
+ jiti: 1.21.7
+ lilconfig: 3.1.3
+ micromatch: 4.0.8
+ normalize-path: 3.0.0
+ object-hash: 3.0.0
+ picocolors: 1.1.1
+ postcss: 8.5.6
+ postcss-import: 15.1.0(postcss@8.5.6)
+ postcss-js: 4.1.0(postcss@8.5.6)
+ postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.21.0)(yaml@2.8.2)
+ postcss-nested: 6.2.0(postcss@8.5.6)
+ postcss-selector-parser: 6.1.2
+ resolve: 1.22.11
+ sucrase: 3.35.1
+ transitivePeerDependencies:
+ - tsx
+ - yaml
+
+ tar@7.5.9:
+ dependencies:
+ '@isaacs/fs-minipass': 4.0.1
+ chownr: 3.0.0
+ minipass: 7.1.2
+ minizlib: 3.1.0
+ yallist: 5.0.0
+
+ temp-dir@2.0.0: {}
+
+ terminal-link@2.1.1:
+ dependencies:
+ ansi-escapes: 4.3.2
+ supports-hyperlinks: 2.3.0
+
+ terser@5.46.0:
+ dependencies:
+ '@jridgewell/source-map': 0.3.11
+ acorn: 8.15.0
+ commander: 2.20.3
+ source-map-support: 0.5.21
+
+ test-exclude@6.0.0:
+ dependencies:
+ '@istanbuljs/schema': 0.1.3
+ glob: 7.2.3
+ minimatch: 3.1.2
+
+ thenify-all@1.6.0:
+ dependencies:
+ thenify: 3.3.1
+
+ thenify@3.3.1:
+ dependencies:
+ any-promise: 1.3.0
+
+ throat@5.0.0: {}
+
+ tinyglobby@0.2.15:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+
+ tmpl@1.0.5: {}
+
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ toidentifier@1.0.1: {}
+
+ trim-lines@3.0.1: {}
+
+ trough@2.2.0: {}
+
+ ts-api-utils@2.4.0(typescript@5.9.3):
+ dependencies:
+ typescript: 5.9.3
+
+ ts-interface-checker@0.1.13: {}
+
+ tsconfig-paths@3.15.0:
+ dependencies:
+ '@types/json5': 0.0.29
+ json5: 1.0.2
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+
+ tslib@2.8.1: {}
+
+ tsx@4.21.0:
+ dependencies:
+ esbuild: 0.27.3
+ get-tsconfig: 4.13.6
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ turbo-darwin-64@2.8.10:
+ optional: true
+
+ turbo-darwin-arm64@2.8.10:
+ optional: true
+
+ turbo-linux-64@2.8.10:
+ optional: true
+
+ turbo-linux-arm64@2.8.10:
+ optional: true
+
+ turbo-windows-64@2.8.10:
+ optional: true
+
+ turbo-windows-arm64@2.8.10:
+ optional: true
+
+ turbo@2.8.10:
+ optionalDependencies:
+ turbo-darwin-64: 2.8.10
+ turbo-darwin-arm64: 2.8.10
+ turbo-linux-64: 2.8.10
+ turbo-linux-arm64: 2.8.10
+ turbo-windows-64: 2.8.10
+ turbo-windows-arm64: 2.8.10
+
+ type-check@0.4.0:
+ dependencies:
+ prelude-ls: 1.2.1
+
+ type-detect@4.0.8: {}
+
+ type-fest@0.21.3: {}
+
+ type-fest@0.7.1: {}
+
+ typed-array-buffer@1.0.3:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-typed-array: 1.1.15
+
+ typed-array-byte-length@1.0.3:
+ dependencies:
+ call-bind: 1.0.8
+ for-each: 0.3.5
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
+
+ typed-array-byte-offset@1.0.4:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ for-each: 0.3.5
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
+ reflect.getprototypeof: 1.0.10
+
+ typed-array-length@1.0.7:
+ dependencies:
+ call-bind: 1.0.8
+ for-each: 0.3.5
+ gopd: 1.2.0
+ is-typed-array: 1.1.15
+ possible-typed-array-names: 1.1.0
+ reflect.getprototypeof: 1.0.10
+
+ typescript@5.9.3: {}
+
+ unbox-primitive@1.1.0:
+ dependencies:
+ call-bound: 1.0.4
+ has-bigints: 1.1.0
+ has-symbols: 1.1.0
+ which-boxed-primitive: 1.1.1
+
+ undici-types@6.21.0: {}
+
+ undici@6.23.0: {}
+
+ 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.2.0
+
+ unicode-match-property-value-ecmascript@2.2.1: {}
+
+ unicode-property-aliases-ecmascript@2.2.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@5.0.1:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+ unist-util-visit-parents: 6.0.2
+
+ unist-util-is@6.0.1:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-position@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-stringify-position@4.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-visit-parents@6.0.2:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+
+ unist-util-visit@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+ unist-util-visit-parents: 6.0.2
+
+ unist-util-visit@5.1.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+ unist-util-visit-parents: 6.0.2
+
+ unpipe@1.0.0: {}
+
+ unrs-resolver@1.11.1:
+ dependencies:
+ napi-postinstall: 0.3.4
+ optionalDependencies:
+ '@unrs/resolver-binding-android-arm-eabi': 1.11.1
+ '@unrs/resolver-binding-android-arm64': 1.11.1
+ '@unrs/resolver-binding-darwin-arm64': 1.11.1
+ '@unrs/resolver-binding-darwin-x64': 1.11.1
+ '@unrs/resolver-binding-freebsd-x64': 1.11.1
+ '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1
+ '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1
+ '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-arm64-musl': 1.11.1
+ '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1
+ '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-x64-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-x64-musl': 1.11.1
+ '@unrs/resolver-binding-wasm32-wasi': 1.11.1
+ '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1
+ '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1
+ '@unrs/resolver-binding-win32-x64-msvc': 1.11.1
+
+ update-browserslist-db@1.2.3(browserslist@4.28.1):
+ dependencies:
+ browserslist: 4.28.1
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ use-callback-ref@1.3.3(@types/react@19.1.17)(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.1.17
+
+ use-latest-callback@0.2.6(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+
+ use-sidecar@1.1.3(@types/react@19.1.17)(react@19.1.0):
+ dependencies:
+ detect-node-es: 1.1.0
+ react: 19.1.0
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.1.17
+
+ use-sync-external-store@1.6.0(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+
+ util-deprecate@1.0.2: {}
+
+ util@0.12.5:
+ dependencies:
+ inherits: 2.0.4
+ is-arguments: 1.2.0
+ is-generator-function: 1.1.2
+ is-typed-array: 1.1.15
+ which-typed-array: 1.1.20
+
+ utils-merge@1.0.1: {}
+
+ uuid@7.0.3: {}
+
+ validate-npm-package-name@5.0.1: {}
+
+ vary@1.1.2: {}
+
+ vaul@1.1.2(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0):
+ dependencies:
+ '@radix-ui/react-dialog': 1.1.15(@types/react-dom@18.3.7(@types/react@19.1.17))(@types/react@19.1.17)(react-dom@18.3.1(react@19.1.0))(react@19.1.0)
+ react: 19.1.0
+ react-dom: 18.3.1(react@19.1.0)
+ transitivePeerDependencies:
+ - '@types/react'
+ - '@types/react-dom'
+
+ vfile-location@5.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile: 6.0.3
+
+ vfile-message@4.0.3:
+ 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.3
+
+ vlq@1.0.1: {}
+
+ walker@1.0.8:
+ dependencies:
+ makeerror: 1.0.12
+
+ warn-once@0.1.1: {}
+
+ wcwidth@1.0.1:
+ dependencies:
+ defaults: 1.0.4
+
+ web-namespaces@2.0.1: {}
+
+ webidl-conversions@5.0.0: {}
+
+ whatwg-fetch@3.6.20: {}
+
+ whatwg-url-without-unicode@8.0.0-3:
+ dependencies:
+ buffer: 5.7.1
+ punycode: 2.3.1
+ webidl-conversions: 5.0.0
+
+ which-boxed-primitive@1.1.1:
+ dependencies:
+ is-bigint: 1.1.0
+ is-boolean-object: 1.2.2
+ is-number-object: 1.1.1
+ is-string: 1.1.1
+ is-symbol: 1.1.1
+
+ which-builtin-type@1.2.1:
+ dependencies:
+ call-bound: 1.0.4
+ function.prototype.name: 1.1.8
+ has-tostringtag: 1.0.2
+ is-async-function: 2.1.1
+ is-date-object: 1.1.0
+ is-finalizationregistry: 1.1.1
+ is-generator-function: 1.1.2
+ is-regex: 1.2.1
+ is-weakref: 1.1.1
+ isarray: 2.0.5
+ which-boxed-primitive: 1.1.1
+ which-collection: 1.0.2
+ which-typed-array: 1.1.20
+
+ which-collection@1.0.2:
+ dependencies:
+ is-map: 2.0.3
+ is-set: 2.0.3
+ is-weakmap: 2.0.2
+ is-weakset: 2.0.4
+
+ which-typed-array@1.1.20:
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ for-each: 0.3.5
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ wonka@6.3.5: {}
+
+ word-wrap@1.2.5: {}
+
+ wrap-ansi@7.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ wrappy@1.0.2: {}
+
+ write-file-atomic@4.0.2:
+ dependencies:
+ imurmurhash: 0.1.4
+ signal-exit: 3.0.7
+
+ ws@6.2.3:
+ dependencies:
+ async-limiter: 1.0.1
+
+ ws@7.5.10: {}
+
+ ws@8.19.0: {}
+
+ xcode@3.0.1:
+ dependencies:
+ simple-plist: 1.3.1
+ uuid: 7.0.3
+
+ xml2js@0.6.0:
+ dependencies:
+ sax: 1.4.4
+ xmlbuilder: 11.0.1
+
+ xmlbuilder@11.0.1: {}
+
+ xmlbuilder@15.1.1: {}
+
+ y18n@5.0.8: {}
+
+ yallist@3.1.1: {}
+
+ yallist@5.0.0: {}
+
+ yaml@2.8.2: {}
+
+ 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
+
+ yocto-queue@0.1.0: {}
+
+ zod@3.25.76: {}
+
+ zod@4.3.6: {}
+
+ zustand@5.0.11(@types/react@19.1.17)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0)):
+ optionalDependencies:
+ '@types/react': 19.1.17
+ react: 19.1.0
+ use-sync-external-store: 1.6.0(react@19.1.0)
+
+ zwitch@2.0.4: {}
diff --git a/leads/analysis/red_flags.md b/leads/analysis/red_flags.md
new file mode 100644
index 0000000..aff0384
--- /dev/null
+++ b/leads/analysis/red_flags.md
@@ -0,0 +1,54 @@
+# Lead Quality Audit & Red Flags
+
+## 🚩 Duplicate Emails (Potential Central Administration)
+| Email | Count | Innungen |
+|---|---|---|
+| `khw-kg@t-online.de` | 4 | Bäckerinnung Bad Kissingen - Rhön-Grabfeld
Kreishandwerkerschaft Bad Kissingen
Maler- und Lackiererinnung Bad Kissingen... |
+| `info@elektroinnung-hassberge.de` | 2 | Innung für Elektro- und Informationstechnik Haßberge
Kreishandwerkerschaft Haßberge |
+| `rapp@kreishandwerkerschaft-sw.de` | 2 | Friseurinnung Main-Rhön
Metallinnung Schweinfurt - Haßberge |
+
+## 🟡 Freemail Addresses (Check Professionality)
+| Innung | Contact | Email |
+|---|---|---|
+| Buechsenmacher-Innung Nordrhein, RLP und Saarland | nan | `kliedl@t-online.de` |
+| Bäckerinnung Bad Kissingen - Rhön-Grabfeld | Petra Schwab | `khw-kg@t-online.de` |
+| Bäckerinnung Kitzingen | Tilo Brönner | `tilo-br@t-online.de` |
+| Bäckerinnung Mainfranken | Marcel Scherg | `scherge.beck@t-online.de` |
+| Bäckerinnung Schweinfurt - Haßberge | Gerhard Götz | `baeckerei-goetz@web.de` |
+| Fleischer-Innung Main-Spessart | Sebastian Bumm | `fleischerinnungmsp@gmx.de` |
+| Friseur-Innung Aschaffenburg Stadt und Land | nan | `friseurinnung-aschaffenburg@t-online.de` |
+| Friseur-Innung Würzburg, Main-Spessart und Bad Kissingen | nan | `katharinawalker88@gmx.de` |
+| Friseurinnung Kitzingen | nan | `sabine.hack71@web.de` |
+| Innung des Massschneiderhandwerks Koeln / Textileiniger-Innung Koeln/Bonn | nan | `twp.koeln@gmail.com` |
+| Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg | Sandra Köller | `innung.shk@t-online.de` |
+| Innung für Spengler-, Sanitär-, und Heizungstechnik Kitzingen | Christine Keppner-Siegert | `innung-kitzingen@freenet.de` |
+| Kreishandwerkerschaft Bad Kissingen | Petra Schwab | `khw-kg@t-online.de` |
+| Kreishandwerkerschaft Kitzingen | Monika Henneberger | `monika.henneberger@t-online.de` |
+| Kreishandwerkerschaft Miltenberg | nan | `kreishandwerker.mil@gmail.com` |
+| Maler -, Tüncher- und Lackierer Innung Alzenau | nan | `maler_trageser@gmx.de` |
+| Maler- und Lackiererinnung Bad Kissingen | Mathias Stöth | `khw-kg@t-online.de` |
+| Metzgerinnung Miltenberg | nan | `j.neuberger@t-online.de` |
+| Schreinerinnung Bad Kissingen | Norbert Borst | `khw-kg@t-online.de` |
+| Schreinerinnung Haßberge – Schweinfurt | Horst Zitterbart | `schreinerei.zitterbart@t-online.de` |
+| Schuhmacherinnung Unterfranken | nan | `l.emge@t-online.de` |
+| Spengler-, Sanitär- und Heizungstechnik Innung Aschaffenburg - Miltenberg | Michael Bramm | `shk-aschaffenburg@t-online.de` |
+| Zimmerer-Innung Schweinfurt-Haßberge | Marion Reichhold | `zimmerei_klaus_treiber@gmx.de` |
+
+## ℹ️ Kreishandwerkerschaft (KH) Generic Contacts
+These emails likely reach the administrative office, not necessarily the specific trade representative directly.
+| Innung | Email | Note |
+|---|---|---|
+| Bau-Innung Kreis Mettmann | `info@handwerk-me.de` | Generic KH Domain |
+| Bau-Innung Mönchengladbach | `info@kh-mg.de` | Generic KH Domain |
+| Bau-Innung Neuss-Viersen | `info@kh-niederrhein.de` | Generic KH Domain |
+| Bau-Innung Remscheid | `info@handwerk-remscheid.de` | Generic KH Domain |
+| Drucker- (Buchdrucker-)- und Buchbinder-Innung Duisburg | `info@handwerk-duisburg.de` | Generic KH Domain |
+| Friseurinnung Main-Rhön | `rapp@kreishandwerkerschaft-sw.de` | Generic KH Domain |
+| Glasapparatebauer-Innung Duisburg | `hippler@handwerk-duisburg.de` | Generic KH Domain |
+| Graveur- und Metallbildner-Innung Rhein-Ruhr | `info@kh-mo.de` | Generic KH Domain |
+| Innung der Metallhandwerke (Solingen) | `info@handwerk-sgw.de` | Generic KH Domain |
+| Innung für Metallhandwerk des Kreises Kleve | `info@kh-kleve.de` | Generic KH Domain |
+| Kreishandwerkerschaft Schweinfurt | `rapp@kreishandwerkerschaft-sw.de` | Generic KH Domain |
+| Kreishandwerkerschaft Würzburg | `info@kreishandwerkerschaft-wuerzburg.de` | Generic KH Domain |
+| Metall-Innung Essen | `info@metallhandwerk-essen.de` | Generic KH Domain |
+| Metallinnung Schweinfurt - Haßberge | `rapp@kreishandwerkerschaft-sw.de` | Generic KH Domain |
\ No newline at end of file
diff --git a/leads/cologne_duesseldorf_data/batch6_results_part1.json b/leads/cologne_duesseldorf_data/batch6_results_part1.json
new file mode 100644
index 0000000..cf910d5
--- /dev/null
+++ b/leads/cologne_duesseldorf_data/batch6_results_part1.json
@@ -0,0 +1,62 @@
+[
+ {
+ "innung": "Baugewerks-Innung Duisburg",
+ "email": "info@baugewerksinnung-duisburg.de"
+ },
+ {
+ "innung": "Graveur- und Metallbildner-Innung Rhein-Ruhr",
+ "email": "info@kh-mo.de"
+ },
+ {
+ "innung": "Metall-Innung Essen",
+ "email": "info@metallhandwerk-essen.de"
+ },
+ {
+ "innung": "Innung für Metallhandwerk des Kreises Kleve",
+ "email": "info@kh-kleve.de"
+ },
+ {
+ "innung": "Bau-Innung Kreis Mettmann",
+ "email": "info@handwerk-me.de"
+ },
+ {
+ "innung": "Innung für Metalltechnik Kreis Mettmann",
+ "email": "info@handwerk-me.de"
+ },
+ {
+ "innung": "Bau-Innung Mönchengladbach",
+ "email": "info@kh-mg.de"
+ },
+ {
+ "innung": "Metall-Innung Mönchengladbach-Rheydt",
+ "email": "info@kh-mg.de"
+ },
+ {
+ "innung": "Baugewerks-Innung Mülheim an der Ruhr-Oberhausen",
+ "email": "info@kh-mo.de"
+ },
+ {
+ "innung": "Innung für Metallhandwerke Mülheim an der Ruhr-Oberhausen",
+ "email": "info@metallbauinnung-mh-ob.de"
+ },
+ {
+ "innung": "Bau-Innung Neuss-Viersen",
+ "email": "info@kh-niederrhein.de"
+ },
+ {
+ "innung": "Innung für Land- und Baumaschinentechnik Niederrhein",
+ "email": "info@kh-niederrhein.de"
+ },
+ {
+ "innung": "Metall-Innung Niederrhein",
+ "email": "info@kh-niederrhein.de"
+ },
+ {
+ "innung": "Bau-Innung Remscheid",
+ "email": "info@handwerk-remscheid.de"
+ },
+ {
+ "innung": "Fachinnung Metall- und Graviertechnik Remscheid",
+ "email": "info@handwerk-remscheid.de"
+ }
+]
\ No newline at end of file
diff --git a/leads/cologne_duesseldorf_data/batch6_results_part2.json b/leads/cologne_duesseldorf_data/batch6_results_part2.json
new file mode 100644
index 0000000..50bdd95
--- /dev/null
+++ b/leads/cologne_duesseldorf_data/batch6_results_part2.json
@@ -0,0 +1,62 @@
+[
+ {
+ "innung": "Bau-Innung Wuppertal-Solingen",
+ "email": "info@bauinnung-wuppertal.de"
+ },
+ {
+ "innung": "Innung der Metallhandwerke (Solingen)",
+ "email": "info@handwerk-sgw.de"
+ },
+ {
+ "innung": "Innung für Metallhandwerke Wuppertal",
+ "email": "info@handwerk-sgw.de"
+ },
+ {
+ "innung": "Baugewerks-Innung des Kreises Wesel",
+ "email": "info@khwesel.de"
+ },
+ {
+ "innung": "Metall-Innung des Kreises Wesel",
+ "email": "info@metallinnung-wesel.de"
+ },
+ {
+ "innung": "Fotografen-Innung Düsseldorf-Aachen-Köln",
+ "email": "info@Fotografen-DUS.de"
+ },
+ {
+ "innung": "Maßschneider-Innung Düsseldorf",
+ "email": "info@mass-schneider-innung.de"
+ },
+ {
+ "innung": "Musikinstrumentenmacher-Innung Nordrhein",
+ "email": "info@musikinstrumentenmacher-innung.de"
+ },
+ {
+ "innung": "Straßen- und Tiefbauer-Innung Düsseldorf",
+ "email": "info@strassenbauer-innung-duesseldorf.de"
+ },
+ {
+ "innung": "Drucker- (Buchdrucker-)- und Buchbinder-Innung Duisburg",
+ "email": "info@handwerk-duisburg.de"
+ },
+ {
+ "innung": "Glasapparatebauer-Innung Duisburg",
+ "email": "hippler@handwerk-duisburg.de"
+ },
+ {
+ "innung": "Innung des modeschaffenden Handwerks Duisburg",
+ "email": "info@handwerk-duisburg.de"
+ },
+ {
+ "innung": "Raumausstatter-Innung Rhein-Ruhr",
+ "email": "info@handwerk-duisburg.de"
+ },
+ {
+ "innung": "Zweiradmechaniker-Innung Rhein-Ruhr",
+ "email": "info@handwerk-duisburg.de"
+ },
+ {
+ "innung": "Verband der Berufsfotografen Ruhr",
+ "email": "ak@koehring-fotografie.de"
+ }
+]
\ No newline at end of file
diff --git a/leads/cologne_duesseldorf_data/batch6_targets.json b/leads/cologne_duesseldorf_data/batch6_targets.json
new file mode 100644
index 0000000..0d757bc
--- /dev/null
+++ b/leads/cologne_duesseldorf_data/batch6_targets.json
@@ -0,0 +1,152 @@
+[
+ {
+ "query": "Baugewerks-Innung Duisburg D\u00fcsseldorf Kontakt Email",
+ "innung": "Baugewerks-Innung Duisburg",
+ "person": "Volker Blastik"
+ },
+ {
+ "query": "Graveur- und Metallbildner-Innung Rhein-Ruhr D\u00fcsseldorf Kontakt Email",
+ "innung": "Graveur- und Metallbildner-Innung Rhein-Ruhr",
+ "person": "Till Esser"
+ },
+ {
+ "query": "Metall-Innung Essen D\u00fcsseldorf Kontakt Email",
+ "innung": "Metall-Innung Essen",
+ "person": "Bj\u00f6rn Bergmann"
+ },
+ {
+ "query": "Innung f\u00fcr Metallhandwerk des Kreises Kleve D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Metallhandwerk des Kreises Kleve",
+ "person": "Johannes Flinterhoff"
+ },
+ {
+ "query": "Bau-Innung Kreis Mettmann D\u00fcsseldorf Kontakt Email",
+ "innung": "Bau-Innung Kreis Mettmann",
+ "person": "Thomas Gr\u00fcnendahl"
+ },
+ {
+ "query": "Innung f\u00fcr Metalltechnik Kreis Mettmann D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Metalltechnik Kreis Mettmann",
+ "person": "Reiner Schumacher"
+ },
+ {
+ "query": "Bau-Innung M\u00f6nchengladbach D\u00fcsseldorf Kontakt Email",
+ "innung": "Bau-Innung M\u00f6nchengladbach",
+ "person": "Dipl.-Ing. Frank B\u00fchler"
+ },
+ {
+ "query": "Metall-Innung M\u00f6nchengladbach-Rheydt D\u00fcsseldorf Kontakt Email",
+ "innung": "Metall-Innung M\u00f6nchengladbach-Rheydt",
+ "person": "Adam Sautner"
+ },
+ {
+ "query": "Baugewerks-Innung M\u00fclheim an der Ruhr-Oberhausen D\u00fcsseldorf Kontakt Email",
+ "innung": "Baugewerks-Innung M\u00fclheim an der Ruhr-Oberhausen",
+ "person": "J\u00fcrgen Bunk"
+ },
+ {
+ "query": "Innung f\u00fcr Metallhandwerke M\u00fclheim an der Ruhr-Oberhausen D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Metallhandwerke M\u00fclheim an der Ruhr-Oberhausen",
+ "person": "Johannes Arnzen"
+ },
+ {
+ "query": "Bau-Innung Neuss-Viersen D\u00fcsseldorf Kontakt Email",
+ "innung": "Bau-Innung Neuss-Viersen",
+ "person": "Thomas Goldmann"
+ },
+ {
+ "query": "Innung f\u00fcr Land- und Baumaschinentechnik Niederrhein D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Land- und Baumaschinentechnik Niederrhein",
+ "person": "Franz-Josef Schulte"
+ },
+ {
+ "query": "Metall-Innung Niederrhein D\u00fcsseldorf Kontakt Email",
+ "innung": "Metall-Innung Niederrhein",
+ "person": "Klaus Caris"
+ },
+ {
+ "query": "Bau-Innung Remscheid D\u00fcsseldorf Kontakt Email",
+ "innung": "Bau-Innung Remscheid",
+ "person": "Carsten Hof"
+ },
+ {
+ "query": "Fachinnung Metall- und Graviertechnik Remscheid D\u00fcsseldorf Kontakt Email",
+ "innung": "Fachinnung Metall- und Graviertechnik Remscheid",
+ "person": "Uwe Wiegand"
+ },
+ {
+ "query": "Bau-Innung Wuppertal-Solingen D\u00fcsseldorf Kontakt Email",
+ "innung": "Bau-Innung Wuppertal-Solingen",
+ "person": "Marcus Koch"
+ },
+ {
+ "query": "Innung der Metallhandwerke (Solingen) D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung der Metallhandwerke (Solingen)",
+ "person": "Thomas Blau"
+ },
+ {
+ "query": "Innung f\u00fcr Metallhandwerke Wuppertal D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Metallhandwerke Wuppertal",
+ "person": "Christian Fl\u00fcss"
+ },
+ {
+ "query": "Baugewerks-Innung des Kreises Wesel D\u00fcsseldorf Kontakt Email",
+ "innung": "Baugewerks-Innung des Kreises Wesel",
+ "person": "Gerhard Landwehrs"
+ },
+ {
+ "query": "Metall-Innung des Kreises Wesel D\u00fcsseldorf Kontakt Email",
+ "innung": "Metall-Innung des Kreises Wesel",
+ "person": "Rainer Theunissen"
+ },
+ {
+ "query": "Fotografen-Innung D\u00fcsseldorf-Aachen-K\u00f6ln D\u00fcsseldorf Kontakt Email",
+ "innung": "Fotografen-Innung D\u00fcsseldorf-Aachen-K\u00f6ln",
+ "person": "Guido de Nardo"
+ },
+ {
+ "query": "Ma\u00dfschneider-Innung D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Ma\u00dfschneider-Innung D\u00fcsseldorf",
+ "person": "Sandra Gronemeier"
+ },
+ {
+ "query": "Musikinstrumentenmacher-Innung Nordrhein D\u00fcsseldorf Kontakt Email",
+ "innung": "Musikinstrumentenmacher-Innung Nordrhein",
+ "person": "Christoph B\u00f6ttcher"
+ },
+ {
+ "query": "Stra\u00dfen- und Tiefbauer-Innung D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Stra\u00dfen- und Tiefbauer-Innung D\u00fcsseldorf",
+ "person": "Andr\u00e9 Grimmert"
+ },
+ {
+ "query": "Drucker- (Buchdrucker-)- und Buchbinder-Innung Duisburg D\u00fcsseldorf Kontakt Email",
+ "innung": "Drucker- (Buchdrucker-)- und Buchbinder-Innung Duisburg",
+ "person": "Bodo H. Oppenberg"
+ },
+ {
+ "query": "Glasapparatebauer-Innung Duisburg D\u00fcsseldorf Kontakt Email",
+ "innung": "Glasapparatebauer-Innung Duisburg",
+ "person": "Dieter Verhees"
+ },
+ {
+ "query": "Innung des modeschaffenden Handwerks Duisburg D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung des modeschaffenden Handwerks Duisburg",
+ "person": "Charlotte No\u00e9"
+ },
+ {
+ "query": "Raumausstatter-Innung Rhein-Ruhr D\u00fcsseldorf Kontakt Email",
+ "innung": "Raumausstatter-Innung Rhein-Ruhr",
+ "person": "Kay Piller"
+ },
+ {
+ "query": "Zweiradmechaniker-Innung Rhein-Ruhr D\u00fcsseldorf Kontakt Email",
+ "innung": "Zweiradmechaniker-Innung Rhein-Ruhr",
+ "person": "Erwin Lohrmann"
+ },
+ {
+ "query": "Verband der Berufsfotografen Ruhr D\u00fcsseldorf Kontakt Email",
+ "innung": "Verband der Berufsfotografen Ruhr",
+ "person": "Andreas K\u00f6hring"
+ }
+]
\ No newline at end of file
diff --git a/leads/cologne_duesseldorf_data/cologne_leads.csv b/leads/cologne_duesseldorf_data/cologne_leads.csv
new file mode 100644
index 0000000..08bb159
--- /dev/null
+++ b/leads/cologne_duesseldorf_data/cologne_leads.csv
@@ -0,0 +1,10 @@
+Firm/Innung,Contact,Email,Phone,Region
+Handwerkskammer zu Köln,N/A,e-mail@dachdecker-innung-koeln.de,N/A,Köln
+Handwerkskammer zu Köln,N/A,e-mail@zimmerer-innung-koeln.de,N/A,Köln
+shk-innung-koeln.de,N/A,info@shk-innung-koeln.de,N/A,Köln
+Elektroinnung Köln,N/A,info@elektroinnungkoeln.de,N/A,Köln
+Stuckateurinnung Köln,N/A,info@stuckateurinnung.koeln,N/A,Köln
+Innung für Metalltechnik Köln,N/A,werle@handwerk.koeln,N/A,Köln
+Innung des Gebäudereiniger-Handwerks Köln-Aachen,N/A,info@die-gebaeudedienstleister-koeln-aachen.de,N/A,Köln
+Zahntechniker-Innung Köln,N/A,info@zik.de,N/A,Köln
+Innung Köln Rollladen- und Sonnenschutz,N/A,fritsche@handwerk.koeln,N/A,Köln
diff --git a/leads/cologne_duesseldorf_data/duesseldorf_batch1.csv b/leads/cologne_duesseldorf_data/duesseldorf_batch1.csv
new file mode 100644
index 0000000..1004628
--- /dev/null
+++ b/leads/cologne_duesseldorf_data/duesseldorf_batch1.csv
@@ -0,0 +1,6 @@
+Firm/Innung,Contact,Email,Phone,Region
+Baugewerbe Düsseldorf,N/A,buero@morick.com,N/A,Düsseldorf
+Metall Düsseldorf,N/A,beate.schmidt@kh-duesseldorf.de,N/A,Düsseldorf
+Dachdecker Düsseldorf,N/A,info@dachdeckerinnung.nrw,N/A,Düsseldorf
+Elektro Düsseldorf,N/A,info@e-k-h.de,N/A,Düsseldorf
+Sanitär Düsseldorf,N/A,info@shk-duesseldorf.de,N/A,Düsseldorf
diff --git a/leads/cologne_duesseldorf_data/duesseldorf_batch2.csv b/leads/cologne_duesseldorf_data/duesseldorf_batch2.csv
new file mode 100644
index 0000000..f972dc1
--- /dev/null
+++ b/leads/cologne_duesseldorf_data/duesseldorf_batch2.csv
@@ -0,0 +1,6 @@
+Firm/Innung,Contact,Email,Phone,Region
+Tischler Düsseldorf,N/A,info@thomasklode.de,N/A,Düsseldorf
+Maler Düsseldorf,N/A,roeckendorf@web.de,N/A,Düsseldorf
+KFZ Düsseldorf,N/A,info@kfz-innung-duesseldorf.de,N/A,Düsseldorf
+Friseur Düsseldorf,N/A,gnaki@web.de,N/A,Düsseldorf
+Fleischer Düsseldorf,N/A,fleischer-innung-duesseldorf@t-online.de,N/A,Düsseldorf
diff --git a/leads/cologne_duesseldorf_data/duesseldorf_batch3_4.csv b/leads/cologne_duesseldorf_data/duesseldorf_batch3_4.csv
new file mode 100644
index 0000000..9bc120c
--- /dev/null
+++ b/leads/cologne_duesseldorf_data/duesseldorf_batch3_4.csv
@@ -0,0 +1,11 @@
+Firm/Innung,Contact,Email,Phone,Region
+Zimmerer Düsseldorf,N/A,beate.schmidt@kh-duesseldorf.de,N/A,Düsseldorf
+Glaser Düsseldorf,N/A,info@glaserinnung.de,N/A,Düsseldorf
+Rollladen Düsseldorf,N/A,mm@rolladen-muellers.de,N/A,Düsseldorf
+Gebäudereiniger Düsseldorf,N/A,kontakt@michael-kregel.de,N/A,Düsseldorf
+Augenoptiker Düsseldorf,N/A,info@optikerinnung.de,N/A,Düsseldorf
+Bäcker Düsseldorf,N/A,info@baecker-innung-rhein-ruhr.de,N/A,Düsseldorf
+Konditoren Düsseldorf,N/A,beate.schmidt@kh-duesseldorf.de,N/A,Düsseldorf
+Schornsteinfeger Düsseldorf,N/A,info@schornsteinfeger-duesseldorf.de,N/A,Düsseldorf
+Steinmetz Düsseldorf,N/A,steinmetze@kh-duesseldorf.de,N/A,Düsseldorf
+Straßenbauer Düsseldorf,N/A,andre@grimmert.de,N/A,Düsseldorf
diff --git a/leads/cologne_duesseldorf_data/duesseldorf_batch5.csv b/leads/cologne_duesseldorf_data/duesseldorf_batch5.csv
new file mode 100644
index 0000000..80a3bac
--- /dev/null
+++ b/leads/cologne_duesseldorf_data/duesseldorf_batch5.csv
@@ -0,0 +1,13 @@
+Firm/Innung,Contact,Email,Phone,Region
+Goldschmiede Düsseldorf,N/A,info@stuckateur-innung-duesseldorf.de,N/A,Düsseldorf
+IT Düsseldorf,N/A,beate.schmidt@kh-duesseldorf.de,N/A,Düsseldorf
+Kachel Düsseldorf,N/A,susannekunzmann@googlemail.com,N/A,Düsseldorf
+Karosserie Düsseldorf,N/A,info@ifit-duesseldorf.de,N/A,Düsseldorf
+Schneider Düsseldorf,N/A,info@kachelofenbau-innung-nordrhein.de,N/A,Düsseldorf
+Instrumenten Düsseldorf,N/A,beate.schmidt@kh-duesseldorf.de,N/A,Düsseldorf
+Ortho-Technik Düsseldorf,N/A,info@mass-schneider-innung.de,N/A,Düsseldorf
+Ortho-Schuh Düsseldorf,N/A,info@musikinstrumentenmacher-innung.de,N/A,Düsseldorf
+Parkett Düsseldorf,N/A,info@ot-innung-dues.de,N/A,Düsseldorf
+Sattler Düsseldorf,N/A,info@os-nrw.de,N/A,Düsseldorf
+Werbe Düsseldorf,N/A,info@parkett-und-bodenleger.de,N/A,Düsseldorf
+Zahn Düsseldorf,N/A,holgerhohmann@t-online.de,N/A,Düsseldorf
diff --git a/leads/cologne_duesseldorf_data/duesseldorf_innungen.pdf b/leads/cologne_duesseldorf_data/duesseldorf_innungen.pdf
new file mode 100644
index 0000000..0ed18f8
Binary files /dev/null and b/leads/cologne_duesseldorf_data/duesseldorf_innungen.pdf differ
diff --git a/leads/cologne_duesseldorf_data/duesseldorf_leads.csv b/leads/cologne_duesseldorf_data/duesseldorf_leads.csv
new file mode 100644
index 0000000..3450a3e
--- /dev/null
+++ b/leads/cologne_duesseldorf_data/duesseldorf_leads.csv
@@ -0,0 +1 @@
+Firm/Innung,Contact,Email,Phone,Region
diff --git a/leads/cologne_duesseldorf_data/duesseldorf_raw.txt b/leads/cologne_duesseldorf_data/duesseldorf_raw.txt
new file mode 100644
index 0000000..2278c25
--- /dev/null
+++ b/leads/cologne_duesseldorf_data/duesseldorf_raw.txt
@@ -0,0 +1,238 @@
+
+
+
+Innungen im Kammerbezirk
+Innungen Kreishandwerkerschaft Düsseldorf
+• Augenoptiker-Innung Düssel-Rhein-Ruhr/OM: Jens Schulz
+• Bäcker-Innung Rhein-Ruhr/OM: Johannes Dackweiler
+• Baugewerbe-Innung Düsseldorf/OM: Christoph Morick
+• Boots- und Schiffbauer-Innung Düsseldorf/OM Marcus Rogozinski
+• Dachdecker-Innung Düsseldorf/OM: Andreas Braun
+• Elektro-Innung Düsseldorf/OM: Kai Hofmann
+• Fleischer-Innung Düsseldorf-Mettmann-Solingen/OM: Lutz Kluke
+• Fotografen-Innung Düsseldorf-Aachen-Köln/OM: Guido de Nardo
+• Friseur-Innung Düsseldorf/OM: Christos Neofotistos
+• Gebäudereiniger-Innung Düsseldorf/OM: Michael Kregel
+• Glaser-Innung Düsseldorf/OM: Ralph Icks
+• Gold- und Silberschmiede-Innung Düsseldorf/OM: Susanne Kunzmann
+• Innung für Informationstechnik Düssel-Rhein-Ruhr/OM: Alvaro Millan
+• Innung Nordrhein der Kachel- und Luftheizungsbauer/OM: Uwe Gobien
+• Karosseriebauer-Innung Düsseldorf/OM: Detlev Thedens
+• Konditoren-Innung Bergisches Land und Düsseldorf/OM: Thomas Pons
+• Innung des Kraftfahrzeuggewerbes Düsseldorf/OM: Hermann Görtz
+• Maler- und Lackierer-Innung Düsseldorf/OM: Jörg Schmitz
+• Maßschneider-Innung Düsseldorf/OM: Sandra Gronemeier
+• Musikinstrumentenmacher-Innung Nordrhein/OM: Christoph Böttcher
+• Innung für Orthopädie-Technik für den Regierungsbezirk Düsseldorf/OM: Pierre Koppetsch
+• Innung für Orthopädieschuhtechnik Rheinland-Westfalen/OM: Philipp Radtke
+• Innung für Parkett- und Fußbodentechnik für den Regierungsbezirk Düsseldorf/
+OM: Roland Hüsgen
+• Innung Sanitär-Heizung-Klima Düsseldorf/OM: Hans Werner Eschrich
+• Sattler- und Raumausstatter-Innung Düsseldorf/OM: Holger Hohmann
+• Schornsteinfeger-Innung für den Regierungsbezirk Düsseldorf/OM: N.N.
+• Fachinnung Stahl und Metall Düsseldorf/OM: Peter Maxisch
+• Steinmetz- und Steinbildhauer-Innung Düsseldorf/OM: Jörg Hahn
+• Straßen- und Tiefbauer-Innung Düsseldorf/OM: André Grimmert
+• Stukkateur-Innung Düsseldorf-Neuss für Ausbau und Fassade/OM: Tobias Jülich
+• Tischler-Innung Düsseldorf/OM: Thomas Klode
+• Werbetechniker-Innung Düsseldorf/OM: Tim Rehse
+• Zahntechniker-Innung Düsseldorf/OM: Dominik Kruchen
+Innungen Kreishandwerkerschaft Duisburg
+• Baugewerks-Innung Duisburg/OM: Volker Blastik
+• Dachdecker- und Zimmerer-Innung Duisburg/OM: Udo Rosenstengel
+• Drucker- (Buchdrucker-)- und Buchbinder-Innung Duisburg/OM: Bodo H. Oppenberg
+• Elektro-Innung Duisburg/OM: Dipl.-Ing. Lothar Hellmann
+• Fleischer-Innung Duisburg/OM: Franz-Josef van Bebber
+• Friseur-Innung Duisburg/OM: Markus Lotze
+• Gebäudereiniger-Innung Duisburg/OM: Jörg Hämmerling
+• Glasapparatebauer-Innung Duisburg/OM: Dieter Verhees
+
+
+
+• Konditoren-Innung Rhein-Ruhr/OM: Hubert Cordes
+• Innung der Kraftfahrzeughandwerks Duisburg/OM: Thomas Dosoudil
+• Maler- und Lackierer-Innung Duisburg/OM: Heinz-Jürgen Lobreyer
+• Innung für Metall, Karosserie- und Fahrzeugbau Duisburg/Niederrhein/OM: Sebastian Christ
+• Innung des modeschaffenden Handwerks Duisburg/OM: Charlotte Noé
+• Innung für Informationstechnik Duisburg/OM: Thorsten Slizewski
+• Raumausstatter-Innung Rhein-Ruhr/OM: Kay Piller
+• Innung Sanitär-Heizung-Klima Duisburg/OM: Uwe Schöbel
+• Steinmetz- und Steinbildhauer-Innung Duisburg, Mülheim, Oberhausen/OM: Ralf Pauschert
+• Straßenbauer-Innung Duisburg/OM: Heiner Kühne
+• Tischler-Innung Duisburg/OM: Frank Paschke
+• Zweiradmechaniker-Innung Rhein-Ruhr/OM: Erwin Lohrmann
+Innungen Kreishandwerkerschaft Essen
+• Baugewerbe-Innung Essen/OM: Frank Schulte-Hubbert
+• Dachdecker-Innung Essen/OM: Marc Sparrer
+• Elektro-Innung Essen/OM: Frank Struck
+• Verband der Berufsfotografen Ruhr/OM: Andreas Köhring
+• Friseur-Innung Essen/OM: Markus Bredenbröcker
+• Gebäudereiniger-Innung Essen-Mülheim an der Ruhr-Oberhausen/OM: Stefan Thielen
+• Gold- und Silberschmiede-Innung Essen/OM: Zeno Ablass
+• Graveur- und Metallbildner-Innung Rhein-Ruhr/OM: Till Esser
+• Innung des Kraftfahrzeuggewerbes Essen-Mülheim-Oberhausen/OMs: Marcel Seyer und Ralf
+Werner
+• Maler- und Lackierer-Innung Essen/OM: Marc-Alexander Kecker
+• Metall-Innung Essen/OM: Björn Bergmann
+• Raumausstatter- und Sattler-Innung Essen/OM: Michel Gutberlet
+• Innung für Sanitär- und Heizungstechnik Ruhr-West/OM: Thomas Weber
+• Innung des Schilder- und Lichtreklameherstellerhandwerks Essen/OM: Sascha Schlüter
+• Steinmetz- und Steinbildhauer-Innung Essen/OM: Stephan Peters
+• Straßenbauer-Innung Essen-Mülheim/OM: Thorsten Potysch
+• Tischler-Innung Essen/OM: Matthias Spehr
+• Innung für Vulkaniseur- und Reifenmechanik-Handwerk Rhein-Ruhr/OM: Horst Kornetka
+Innungen der Kreishandwerkerschaft Kreis Kleve
+• Bäcker-Innung Niederrhein-Kleve-Wesel/OM: Johannes Gerhards
+• Baugewerbe-Innung des Kreises Kleve/OM: Michael Köster
+• Dachdecker-Innung des Kreises Kleve/OM: Markus Henkel
+• Elektro-Innung des Kreises Kleve/OM: Jörg Weykamp
+• Fleischer-Innung des Kreises Kleve/OM: Heinz Borghs
+• Friseur-Innung des Kreises Kleve/OM: Karin Merlin Wrobel
+• Gold- und Silberschmiede-Innung Niederrhein/OM: Martin Link
+• Maler- und Lackierer-Innung des Kreises Kleve/OM: Franz-Theo Dirmeier
+• Innung für Metallhandwerk des Kreises Kleve/OM: Johannes Flinterhoff
+• Innung Sanitär-Heizung-Klima Kreis Kleve/OM: Michael Janßen
+• Tischler-Innung des Kreises Kleve/OM: Stefan Meyer
+• Zweiradmechaniker-Innung des Kreises Kleve/OM: Markus Daute
+
+
+
+Innungen der Kreishandwerkerschaft Kreis Mettmann
+• Bau-Innung Kreis Mettmann/OM: Thomas Grünendahl
+• Dachdecker- und Zimmerer-Innung Kreis Mettmann/OM: Renee Fügener
+• Elektro-Innung Kreis Mettmann/OM: Andreas Schmidt
+• Friseur-Innung Kreis Mettmann/OM: Uwe Ranke
+• Karosserie- und Fahrzeugbauer-Innung Kreis Mettmann/OM: Max Witeczek
+• Innung des Kraftfahrzeughandwerks Kreis Mettmann/OM: Alfons Kunz
+• Maler- und Lackierer-Innung Kreis Mettmann/OM: Ralf Heinz Weber
+• Innung für Metalltechnik Kreis Mettmann/OM: Reiner Schumacher
+• Raumausstatter- und Sattler-Innung Kreis Mettmann/OM: Thomas Wittig
+• Innung Rollladen- und Sonnenschutztechniker-Handwerk Regierungsbezirk Düsseldorf/
+OM: Markus Müller
+• Innung für Sanitär- und Heizungstechnik Kreis Mettmann/OM: Christian Möller
+• Tischler-Innung Kreis Mettmann/OM: Michael Fischbach
+Innungen Kreishandwerkerschaft Mönchengladbach
+• Bäcker-Innung Mönchengladbach/OM: Gertie Riethmacher
+• Bau-Innung Mönchengladbach/OM: Dipl.-Ing. Frank Bühler
+• Dachdecker-Innung Mönchengladbach/OM: Reinhard Esser
+• Elektro-Innung Mönchengladbach/OM: Heinz-Willi-Ober
+• Fleischer-Innung Mönchengladbach/OM: Josef Baumanns
+• Friseur-Innung Mönchengladbach/OM: Sabine Capan
+• Informationstechniker-Innung Mönchengladbach-Neuss/OM: Dirk Weduwen
+• Karosserie- und Fahrzeugbauer-Innung Mönchengladbach/OM: Reiner Brenner
+• Konditoren-Innung Mönchengladbach/OM: Manfred Groth
+• Innung des Kraftfahrzeuggewerbes Mönchengladbach/OM: Peter Fischer
+• Maler- und Lackierer-Innung Mönchengladbach/OM: Udo Nösen
+• Metall-Innung Mönchengladbach-Rheydt/OM: Adam Sautner
+• Raumausstatter- und Sattler-Innung Mönchengladbach/OM: Joachim Rütten
+• Innung Sanitär-Heizung-Klima Mönchengladbach/OM: Thorsten Caspers
+• Schuhmacher-Innung linker Niederrhein/OM: Günther Schellenberger
+• Tischler-Innung Mönchengladbach-Rheydt/OM: Hans Wilhelm Klomp
+• Zimmerer-Innung Mönchengladbach/OM: Peter Röders
+Innungen Kreishandwerkerschaft Mülheim a. d. Ruhr - Oberhausen
+• Baugewerks-Innung Mülheim an der Ruhr-Oberhausen/OM: Jürgen Bunk
+• Dachdecker- und Zimmerer-Innung Mülheim an der Ruhr/OM: Jens-Peter Richard
+• Dachdecker-Innung Oberhausen-Rheinland/OM: Mark Notthoff
+• Elektro-Innung Mülheim an der Ruhr/OM: Joachim Schweins
+• Elektro-Innung Oberhausen-Rheinland/OM: Florian Menger
+• Fleischer-Innung RheinRuhr/OM: Jörg Bischoff
+• Friseur-Innung Mülheim an der Ruhr/OM: Ralf Wüstefeld
+• Friseur-Innung Oberhausen-Rheinland/OM: Bernd Görg
+• Karosserie- und Fahrzeugbauer-Innung Essen-Mülheim an der Ruhr-Oberhausen/
+OM: Jörg Bergmann
+• Maler- und Lackierer-Innung Mülheim an der Ruhr-Oberhausen/OM: Guido vom Ufer
+• Innung für Metallhandwerke Mülheim an der Ruhr-Oberhausen/OM: Johannes Arnzen
+• Innung für Sanitär- und Heizungstechnik Oberhausen-Rheinland/OM: Stefan Tögel
+
+
+
+• Tischler-Innung Mülheim an der Ruhr-Oberhausen/OM: Michael Schmeling
+Innungen der Kreishandwerkerschaft Niederrhein
+• Niederrheinische Bäcker-Innung Krefeld-Viersen-Neuss/OM: Rudolf Weißert
+• Bau-Innung Neuss-Viersen/OM: Thomas Goldmann
+• Bau- und Straßenbauer-Innung Krefeld-Linker Niederrhein/OM: Dipl.-Ing. Joachim Selzer
+• Bestatter-Innung Nordrhein-Westfalen/OM: Frank Wesemann
+• Dachdecker-Innung Krefeld/OM: Andreas Pavel
+• Dachdecker-Innung Kreis Viersen/OM: Ulrich Heurs
+• Dachdecker-Innung Rhein-Kreis Neuss/OM: Marco Brüggen
+• Drechsler-Innung Krefeld/OM: Klaus Reef
+• Elektro-Innung Krefeld/OM: Peter Rath
+• E-Handwerke Niederrhein-Kreis Viersen/OM: Martin Thomas Nowroth
+• Elektro-Innung Rhein-Kreis Neuss/OM: Ernst Veiser
+• Fleischer-Innung Niederrhein Krefeld-Viersen-Neuss/OM: Willi Schillings
+• Friseur-Innung Krefeld-Viersen-Neuss/OM: Alexandra Houx-Brenner
+• Gebäudereiniger-Innung Mittlerer Niederrhein/OM: Nadine Ludwigs
+• Innung für Informationstechnik Niederrhein Krefeld-Viersen-Neuss/OM: Horst Rinsch
+• Karosserie- und Fahrzeugbauer-Innung Krefeld-Viersen-Neuss/OM: Ralph Treeker
+• Konditoren-Innung Niederrhein/OM: Andreas Achten
+• Innung des Kraftfahrzeuggewerbes Krefeld-Viersen/OM: Dietmar Lassek
+• Kraftfahrzeug-Innung Rhein-Kreis Neuss/OM: Johannes Brester
+• Innung für Land- und Baumaschinentechnik Niederrhein/OM: Franz-Josef Schulte
+• Maler- und Lackierer-Innung Niederrhein Krefeld-Neuss-Viersen/OM: Stephanie Jahrke
+• Metall-Innung Niederrhein/OM: Klaus Caris
+• Innung für das Modeschaffende Handwerk Niederrhein/OM: Angelika van Neerven
+• Niederrheinische Raumausstatter- und Sattler-Innung Krefeld-Viersen-Neuss/
+OM: Dittmar Posern
+• Innung für Sanitär-Heizung-Klima-Apparatebau Krefeld/OM: Daniel Küppers
+• Innung für Sanitär- und Heizungstechnik Kreis Viersen/OM: Michael Smeets
+• Innung für Sanitär- und Heizungstechnik Rhein-Kreis Neuss/OM: Thomas Hanna
+• Steinmetz- und Steinbildhauer-Innung Mittlerer Niederrhein/OM: Daniel Franzen
+• Stuckateur-Innung Krefeld-Viersen/OM: Roland Gerhards
+• Textilreiniger-Innung für den Regierungsbezirk Düsseldorf/OM: Dirk Querfurth
+• Tischler-Innung Krefeld/OM: Dirk Kosanke
+• Tischler-Innung Kreis Viersen/OM: Uwe Sötje
+• Tischler-Innung Rhein-Kreis Neuss/OM: Philipp Schlang
+• Zweiradmechaniker-Innung Niederrhein Krefeld-Viersen-Neuss/OM: Rolf Langer
+Innungen der Kreishandwerkerschaft Remscheid
+• Bau-Innung Remscheid/OM: Carsten Hof
+• Dachdecker-Innung Remscheid/OM: Jörg Margies
+• Innung für elektrotechnische Handwerke Remscheid/OM: Andreas Müller
+• Friseur-Innung Remscheid/OM: Tanja Kürten-Rauhaus
+• Innung für das Gebäudereiniger-Handwerk Remscheid-Solingen/OM: Oliver Knedlich
+• Innung des Kraftfahrzeughandwerks Remscheid//OM: Thomas Bliß
+• Maler- und Lackierer-Innung Remscheid/OM: Holger Schulz
+• Fachinnung Metall- und Graviertechnik Remscheid/OM: Uwe Wiegand
+
+
+
+• Innung der Nahrungsmittelhandwerke Remscheid/OM: Birgit Eppels
+• Innung für Sanitär- und Heizungstechnik Remscheid/OM: Oliver Bergmann
+• Steinmetz- und Steinbildhauer-Innung Bergisch Land/OM: Beate Globisch
+• Tischler-Innung Remscheid/OM: Martin Stracke
+Innungen der Kreishandwerkerschaft Solingen-Wuppertal
+• Bäcker-Innung Solingen-Wuppertal (Sitz: Wuppertal)/OM: Dirk Polick
+• Bau-Innung Wuppertal-Solingen/OM: Marcus Koch
+• Dachdecker-Innung Solingen-Wuppertal/OM: Thomas Sobireg
+• Elektro-Innung (Solingen)/OM: Frank Roth
+• Elektro-Innung Wuppertal/OM: Ingo Kursawe
+• Friseur-Innung Solingen-Wuppertal/OM: Pia Schneider
+• Glaser-Innung Wuppertal/OM: Rafael Musik
+• Graveur-Innung Solingen-Wuppertal/OM: Stefan Krüth
+• Karosserie- und Fahrzeugbauer-Innung Wuppertal/OM: Martin Rosslan
+• Innung des Kraftfahrzeughandwerks (Solingen)/OM: Uwe Stamm
+• Innung des Kraftfahrzeughandwerks Wuppertal/OM: Wolfram Friedrich
+• Maler- und Lackierer-Innung (Solingen)/OM: Oliver Conrads
+• Maler- und Lackierer-Innung Wuppertal/OM: Oliver Conyn
+• Innung der Metallhandwerke (Solingen)/OM: Thomas Blau
+• Innung für Metallhandwerke Wuppertal/OM: Christian Flüss
+• Raumausstatter-Innung Solingen-Wuppertal/OM: Frank Dembny
+• Innung für Sanitär- und Heizungstechnik (Solingen)/OM: Andreas Glingener
+• Innung für Sanitär-, Heizungs- und Klimatechnik Wuppertal/OM: Frank Karuc
+• Straßen- und Tiefbau-Innung Wuppertal/OM: Martin Ehlhardt
+• Stukkateur-Innung Wuppertal-Kreis Mettmann/OM: Wolfgang Wüstenhagen
+• Tischler-Innung (Solingen)/OM: Paul-Gerhard Rössling
+• Tischler-Innung Wuppertal/OM: Thomas Landsiedel
+Innungen der Kreishandwerkerschaft Kreis Wesel
+• Baugewerks-Innung des Kreises Wesel/OM: Gerhard Landwehrs
+• Dachdecker-Innung des Kreises Wesel/OM: Marco Remy
+• Innung für Elektrotechnik und Informationstechnik des Kreises Wesel/OM: Klemens Mues
+• Friseur-Innung des Kreises Wesel/OM: Klaus Peter Neske
+• Glaser-Innung Niederrhein/OM: Thomas Schulmeyer
+• Innung des Kraftfahrzeuggewerbes Niederrhein Kleve-Wesel/OM: René Gravendyk
+• Maler- und Lackierer-Innung des Kreises Wesel/OM: Günter Bode
+• Metall-Innung des Kreises Wesel/OM: Rainer Theunissen
+• Innung Sanitär-Heizung-Klima Kreis Wesel/OM: Norbert Buhl
+• Innung für Schneid- und Schleiftechnik Nordrhein/OM: Uwe Peters
+• Steinmetz- und Steinbildhauer-Innung Niederrhein/OM: Benedikt L. Kreusch
+• Stuckateur-Innung Niederrhein/OM: Norbert Kehrbusch
+• Tischler-Innung des Kreises Wesel/OM: Dirk Jockram
diff --git a/leads/cologne_duesseldorf_data/duesseldorf_targets.json b/leads/cologne_duesseldorf_data/duesseldorf_targets.json
new file mode 100644
index 0000000..96e869d
--- /dev/null
+++ b/leads/cologne_duesseldorf_data/duesseldorf_targets.json
@@ -0,0 +1,1002 @@
+[
+ {
+ "query": "Baugewerbe-Innung D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Baugewerbe-Innung D\u00fcsseldorf",
+ "person": "Christoph Morick"
+ },
+ {
+ "query": "Dachdecker-Innung D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Dachdecker-Innung D\u00fcsseldorf",
+ "person": "Andreas Braun"
+ },
+ {
+ "query": "Elektro-Innung D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Elektro-Innung D\u00fcsseldorf",
+ "person": "Kai Hofmann"
+ },
+ {
+ "query": "Innung Sanit\u00e4r-Heizung-Klima D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung Sanit\u00e4r-Heizung-Klima D\u00fcsseldorf",
+ "person": "Hans Werner Eschrich"
+ },
+ {
+ "query": "Fachinnung Stahl und Metall D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Fachinnung Stahl und Metall D\u00fcsseldorf",
+ "person": "Peter Maxisch"
+ },
+ {
+ "query": "Tischler-Innung D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Tischler-Innung D\u00fcsseldorf",
+ "person": "Thomas Klode"
+ },
+ {
+ "query": "Baugewerks-Innung Duisburg D\u00fcsseldorf Kontakt Email",
+ "innung": "Baugewerks-Innung Duisburg",
+ "person": "Volker Blastik"
+ },
+ {
+ "query": "Dachdecker- und Zimmerer-Innung Duisburg D\u00fcsseldorf Kontakt Email",
+ "innung": "Dachdecker- und Zimmerer-Innung Duisburg",
+ "person": "Udo Rosenstengel"
+ },
+ {
+ "query": "Elektro-Innung Duisburg D\u00fcsseldorf Kontakt Email",
+ "innung": "Elektro-Innung Duisburg",
+ "person": "Dipl.-Ing. Lothar Hellmann"
+ },
+ {
+ "query": "Innung f\u00fcr Metall, Karosserie- und Fahrzeugbau Duisburg/Niederrhein D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Metall, Karosserie- und Fahrzeugbau Duisburg/Niederrhein",
+ "person": "Sebastian Christ"
+ },
+ {
+ "query": "Innung Sanit\u00e4r-Heizung-Klima Duisburg D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung Sanit\u00e4r-Heizung-Klima Duisburg",
+ "person": "Uwe Sch\u00f6bel"
+ },
+ {
+ "query": "Tischler-Innung Duisburg D\u00fcsseldorf Kontakt Email",
+ "innung": "Tischler-Innung Duisburg",
+ "person": "Frank Paschke"
+ },
+ {
+ "query": "Baugewerbe-Innung Essen D\u00fcsseldorf Kontakt Email",
+ "innung": "Baugewerbe-Innung Essen",
+ "person": "Frank Schulte-Hubbert"
+ },
+ {
+ "query": "Dachdecker-Innung Essen D\u00fcsseldorf Kontakt Email",
+ "innung": "Dachdecker-Innung Essen",
+ "person": "Marc Sparrer"
+ },
+ {
+ "query": "Elektro-Innung Essen D\u00fcsseldorf Kontakt Email",
+ "innung": "Elektro-Innung Essen",
+ "person": "Frank Struck"
+ },
+ {
+ "query": "Graveur- und Metallbildner-Innung Rhein-Ruhr D\u00fcsseldorf Kontakt Email",
+ "innung": "Graveur- und Metallbildner-Innung Rhein-Ruhr",
+ "person": "Till Esser"
+ },
+ {
+ "query": "Metall-Innung Essen D\u00fcsseldorf Kontakt Email",
+ "innung": "Metall-Innung Essen",
+ "person": "Bj\u00f6rn Bergmann"
+ },
+ {
+ "query": "Innung f\u00fcr Sanit\u00e4r- und Heizungstechnik Ruhr-West D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Sanit\u00e4r- und Heizungstechnik Ruhr-West",
+ "person": "Thomas Weber"
+ },
+ {
+ "query": "Tischler-Innung Essen D\u00fcsseldorf Kontakt Email",
+ "innung": "Tischler-Innung Essen",
+ "person": "Matthias Spehr"
+ },
+ {
+ "query": "Baugewerbe-Innung des Kreises Kleve D\u00fcsseldorf Kontakt Email",
+ "innung": "Baugewerbe-Innung des Kreises Kleve",
+ "person": "Michael K\u00f6ster"
+ },
+ {
+ "query": "Dachdecker-Innung des Kreises Kleve D\u00fcsseldorf Kontakt Email",
+ "innung": "Dachdecker-Innung des Kreises Kleve",
+ "person": "Markus Henkel"
+ },
+ {
+ "query": "Elektro-Innung des Kreises Kleve D\u00fcsseldorf Kontakt Email",
+ "innung": "Elektro-Innung des Kreises Kleve",
+ "person": "J\u00f6rg Weykamp"
+ },
+ {
+ "query": "Innung f\u00fcr Metallhandwerk des Kreises Kleve D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Metallhandwerk des Kreises Kleve",
+ "person": "Johannes Flinterhoff"
+ },
+ {
+ "query": "Innung Sanit\u00e4r-Heizung-Klima Kreis Kleve D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung Sanit\u00e4r-Heizung-Klima Kreis Kleve",
+ "person": "Michael Jan\u00dfen"
+ },
+ {
+ "query": "Tischler-Innung des Kreises Kleve D\u00fcsseldorf Kontakt Email",
+ "innung": "Tischler-Innung des Kreises Kleve",
+ "person": "Stefan Meyer"
+ },
+ {
+ "query": "Bau-Innung Kreis Mettmann D\u00fcsseldorf Kontakt Email",
+ "innung": "Bau-Innung Kreis Mettmann",
+ "person": "Thomas Gr\u00fcnendahl"
+ },
+ {
+ "query": "Dachdecker- und Zimmerer-Innung Kreis Mettmann D\u00fcsseldorf Kontakt Email",
+ "innung": "Dachdecker- und Zimmerer-Innung Kreis Mettmann",
+ "person": "Renee F\u00fcgener"
+ },
+ {
+ "query": "Elektro-Innung Kreis Mettmann D\u00fcsseldorf Kontakt Email",
+ "innung": "Elektro-Innung Kreis Mettmann",
+ "person": "Andreas Schmidt"
+ },
+ {
+ "query": "Innung f\u00fcr Metalltechnik Kreis Mettmann D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Metalltechnik Kreis Mettmann",
+ "person": "Reiner Schumacher"
+ },
+ {
+ "query": "Innung f\u00fcr Sanit\u00e4r- und Heizungstechnik Kreis Mettmann D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Sanit\u00e4r- und Heizungstechnik Kreis Mettmann",
+ "person": "Christian M\u00f6ller"
+ },
+ {
+ "query": "Tischler-Innung Kreis Mettmann D\u00fcsseldorf Kontakt Email",
+ "innung": "Tischler-Innung Kreis Mettmann",
+ "person": "Michael Fischbach"
+ },
+ {
+ "query": "Bau-Innung M\u00f6nchengladbach D\u00fcsseldorf Kontakt Email",
+ "innung": "Bau-Innung M\u00f6nchengladbach",
+ "person": "Dipl.-Ing. Frank B\u00fchler"
+ },
+ {
+ "query": "Dachdecker-Innung M\u00f6nchengladbach D\u00fcsseldorf Kontakt Email",
+ "innung": "Dachdecker-Innung M\u00f6nchengladbach",
+ "person": "Reinhard Esser"
+ },
+ {
+ "query": "Elektro-Innung M\u00f6nchengladbach D\u00fcsseldorf Kontakt Email",
+ "innung": "Elektro-Innung M\u00f6nchengladbach",
+ "person": "Heinz-Willi-Ober"
+ },
+ {
+ "query": "Metall-Innung M\u00f6nchengladbach-Rheydt D\u00fcsseldorf Kontakt Email",
+ "innung": "Metall-Innung M\u00f6nchengladbach-Rheydt",
+ "person": "Adam Sautner"
+ },
+ {
+ "query": "Innung Sanit\u00e4r-Heizung-Klima M\u00f6nchengladbach D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung Sanit\u00e4r-Heizung-Klima M\u00f6nchengladbach",
+ "person": "Thorsten Caspers"
+ },
+ {
+ "query": "Tischler-Innung M\u00f6nchengladbach-Rheydt D\u00fcsseldorf Kontakt Email",
+ "innung": "Tischler-Innung M\u00f6nchengladbach-Rheydt",
+ "person": "Hans Wilhelm Klomp"
+ },
+ {
+ "query": "Baugewerks-Innung M\u00fclheim an der Ruhr-Oberhausen D\u00fcsseldorf Kontakt Email",
+ "innung": "Baugewerks-Innung M\u00fclheim an der Ruhr-Oberhausen",
+ "person": "J\u00fcrgen Bunk"
+ },
+ {
+ "query": "Dachdecker- und Zimmerer-Innung M\u00fclheim an der Ruhr D\u00fcsseldorf Kontakt Email",
+ "innung": "Dachdecker- und Zimmerer-Innung M\u00fclheim an der Ruhr",
+ "person": "Jens-Peter Richard"
+ },
+ {
+ "query": "Dachdecker-Innung Oberhausen-Rheinland D\u00fcsseldorf Kontakt Email",
+ "innung": "Dachdecker-Innung Oberhausen-Rheinland",
+ "person": "Mark Notthoff"
+ },
+ {
+ "query": "Elektro-Innung M\u00fclheim an der Ruhr D\u00fcsseldorf Kontakt Email",
+ "innung": "Elektro-Innung M\u00fclheim an der Ruhr",
+ "person": "Joachim Schweins"
+ },
+ {
+ "query": "Elektro-Innung Oberhausen-Rheinland D\u00fcsseldorf Kontakt Email",
+ "innung": "Elektro-Innung Oberhausen-Rheinland",
+ "person": "Florian Menger"
+ },
+ {
+ "query": "Innung f\u00fcr Metallhandwerke M\u00fclheim an der Ruhr-Oberhausen D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Metallhandwerke M\u00fclheim an der Ruhr-Oberhausen",
+ "person": "Johannes Arnzen"
+ },
+ {
+ "query": "Innung f\u00fcr Sanit\u00e4r- und Heizungstechnik Oberhausen-Rheinland D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Sanit\u00e4r- und Heizungstechnik Oberhausen-Rheinland",
+ "person": "Stefan T\u00f6gel"
+ },
+ {
+ "query": "Tischler-Innung M\u00fclheim an der Ruhr-Oberhausen D\u00fcsseldorf Kontakt Email",
+ "innung": "Tischler-Innung M\u00fclheim an der Ruhr-Oberhausen",
+ "person": "Michael Schmeling"
+ },
+ {
+ "query": "Bau-Innung Neuss-Viersen D\u00fcsseldorf Kontakt Email",
+ "innung": "Bau-Innung Neuss-Viersen",
+ "person": "Thomas Goldmann"
+ },
+ {
+ "query": "Bau- und Stra\u00dfenbauer-Innung Krefeld-Linker Niederrhein D\u00fcsseldorf Kontakt Email",
+ "innung": "Bau- und Stra\u00dfenbauer-Innung Krefeld-Linker Niederrhein",
+ "person": "Dipl.-Ing. Joachim Selzer"
+ },
+ {
+ "query": "Dachdecker-Innung Krefeld D\u00fcsseldorf Kontakt Email",
+ "innung": "Dachdecker-Innung Krefeld",
+ "person": "Andreas Pavel"
+ },
+ {
+ "query": "Dachdecker-Innung Kreis Viersen D\u00fcsseldorf Kontakt Email",
+ "innung": "Dachdecker-Innung Kreis Viersen",
+ "person": "Ulrich Heurs"
+ },
+ {
+ "query": "Dachdecker-Innung Rhein-Kreis Neuss D\u00fcsseldorf Kontakt Email",
+ "innung": "Dachdecker-Innung Rhein-Kreis Neuss",
+ "person": "Marco Br\u00fcggen"
+ },
+ {
+ "query": "Elektro-Innung Krefeld D\u00fcsseldorf Kontakt Email",
+ "innung": "Elektro-Innung Krefeld",
+ "person": "Peter Rath"
+ },
+ {
+ "query": "Elektro-Innung Rhein-Kreis Neuss D\u00fcsseldorf Kontakt Email",
+ "innung": "Elektro-Innung Rhein-Kreis Neuss",
+ "person": "Ernst Veiser"
+ },
+ {
+ "query": "Innung f\u00fcr Land- und Baumaschinentechnik Niederrhein D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Land- und Baumaschinentechnik Niederrhein",
+ "person": "Franz-Josef Schulte"
+ },
+ {
+ "query": "Metall-Innung Niederrhein D\u00fcsseldorf Kontakt Email",
+ "innung": "Metall-Innung Niederrhein",
+ "person": "Klaus Caris"
+ },
+ {
+ "query": "Innung f\u00fcr Sanit\u00e4r-Heizung-Klima-Apparatebau Krefeld D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Sanit\u00e4r-Heizung-Klima-Apparatebau Krefeld",
+ "person": "Daniel K\u00fcppers"
+ },
+ {
+ "query": "Innung f\u00fcr Sanit\u00e4r- und Heizungstechnik Kreis Viersen D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Sanit\u00e4r- und Heizungstechnik Kreis Viersen",
+ "person": "Michael Smeets"
+ },
+ {
+ "query": "Innung f\u00fcr Sanit\u00e4r- und Heizungstechnik Rhein-Kreis Neuss D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Sanit\u00e4r- und Heizungstechnik Rhein-Kreis Neuss",
+ "person": "Thomas Hanna"
+ },
+ {
+ "query": "Tischler-Innung Krefeld D\u00fcsseldorf Kontakt Email",
+ "innung": "Tischler-Innung Krefeld",
+ "person": "Dirk Kosanke"
+ },
+ {
+ "query": "Tischler-Innung Kreis Viersen D\u00fcsseldorf Kontakt Email",
+ "innung": "Tischler-Innung Kreis Viersen",
+ "person": "Uwe S\u00f6tje"
+ },
+ {
+ "query": "Tischler-Innung Rhein-Kreis Neuss D\u00fcsseldorf Kontakt Email",
+ "innung": "Tischler-Innung Rhein-Kreis Neuss",
+ "person": "Philipp Schlang"
+ },
+ {
+ "query": "Bau-Innung Remscheid D\u00fcsseldorf Kontakt Email",
+ "innung": "Bau-Innung Remscheid",
+ "person": "Carsten Hof"
+ },
+ {
+ "query": "Dachdecker-Innung Remscheid D\u00fcsseldorf Kontakt Email",
+ "innung": "Dachdecker-Innung Remscheid",
+ "person": "J\u00f6rg Margies"
+ },
+ {
+ "query": "Fachinnung Metall- und Graviertechnik Remscheid D\u00fcsseldorf Kontakt Email",
+ "innung": "Fachinnung Metall- und Graviertechnik Remscheid",
+ "person": "Uwe Wiegand"
+ },
+ {
+ "query": "Innung f\u00fcr Sanit\u00e4r- und Heizungstechnik Remscheid D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Sanit\u00e4r- und Heizungstechnik Remscheid",
+ "person": "Oliver Bergmann"
+ },
+ {
+ "query": "Tischler-Innung Remscheid D\u00fcsseldorf Kontakt Email",
+ "innung": "Tischler-Innung Remscheid",
+ "person": "Martin Stracke"
+ },
+ {
+ "query": "Bau-Innung Wuppertal-Solingen D\u00fcsseldorf Kontakt Email",
+ "innung": "Bau-Innung Wuppertal-Solingen",
+ "person": "Marcus Koch"
+ },
+ {
+ "query": "Dachdecker-Innung Solingen-Wuppertal D\u00fcsseldorf Kontakt Email",
+ "innung": "Dachdecker-Innung Solingen-Wuppertal",
+ "person": "Thomas Sobireg"
+ },
+ {
+ "query": "Elektro-Innung (Solingen) D\u00fcsseldorf Kontakt Email",
+ "innung": "Elektro-Innung (Solingen)",
+ "person": "Frank Roth"
+ },
+ {
+ "query": "Elektro-Innung Wuppertal D\u00fcsseldorf Kontakt Email",
+ "innung": "Elektro-Innung Wuppertal",
+ "person": "Ingo Kursawe"
+ },
+ {
+ "query": "Innung der Metallhandwerke (Solingen) D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung der Metallhandwerke (Solingen)",
+ "person": "Thomas Blau"
+ },
+ {
+ "query": "Innung f\u00fcr Metallhandwerke Wuppertal D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Metallhandwerke Wuppertal",
+ "person": "Christian Fl\u00fcss"
+ },
+ {
+ "query": "Innung f\u00fcr Sanit\u00e4r- und Heizungstechnik (Solingen) D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Sanit\u00e4r- und Heizungstechnik (Solingen)",
+ "person": "Andreas Glingener"
+ },
+ {
+ "query": "Innung f\u00fcr Sanit\u00e4r-, Heizungs- und Klimatechnik Wuppertal D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Sanit\u00e4r-, Heizungs- und Klimatechnik Wuppertal",
+ "person": "Frank Karuc"
+ },
+ {
+ "query": "Tischler-Innung (Solingen) D\u00fcsseldorf Kontakt Email",
+ "innung": "Tischler-Innung (Solingen)",
+ "person": "Paul-Gerhard R\u00f6ssling"
+ },
+ {
+ "query": "Tischler-Innung Wuppertal D\u00fcsseldorf Kontakt Email",
+ "innung": "Tischler-Innung Wuppertal",
+ "person": "Thomas Landsiedel"
+ },
+ {
+ "query": "Baugewerks-Innung des Kreises Wesel D\u00fcsseldorf Kontakt Email",
+ "innung": "Baugewerks-Innung des Kreises Wesel",
+ "person": "Gerhard Landwehrs"
+ },
+ {
+ "query": "Dachdecker-Innung des Kreises Wesel D\u00fcsseldorf Kontakt Email",
+ "innung": "Dachdecker-Innung des Kreises Wesel",
+ "person": "Marco Remy"
+ },
+ {
+ "query": "Innung f\u00fcr Elektrotechnik und Informationstechnik des Kreises Wesel D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Elektrotechnik und Informationstechnik des Kreises Wesel",
+ "person": "Klemens Mues"
+ },
+ {
+ "query": "Metall-Innung des Kreises Wesel D\u00fcsseldorf Kontakt Email",
+ "innung": "Metall-Innung des Kreises Wesel",
+ "person": "Rainer Theunissen"
+ },
+ {
+ "query": "Innung Sanit\u00e4r-Heizung-Klima Kreis Wesel D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung Sanit\u00e4r-Heizung-Klima Kreis Wesel",
+ "person": "Norbert Buhl"
+ },
+ {
+ "query": "Tischler-Innung des Kreises Wesel D\u00fcsseldorf Kontakt Email",
+ "innung": "Tischler-Innung des Kreises Wesel",
+ "person": "Dirk Jockram"
+ },
+ {
+ "query": "Augenoptiker-Innung D\u00fcssel-Rhein-Ruhr D\u00fcsseldorf Kontakt Email",
+ "innung": "Augenoptiker-Innung D\u00fcssel-Rhein-Ruhr",
+ "person": "Jens Schulz"
+ },
+ {
+ "query": "B\u00e4cker-Innung Rhein-Ruhr D\u00fcsseldorf Kontakt Email",
+ "innung": "B\u00e4cker-Innung Rhein-Ruhr",
+ "person": "Johannes Dackweiler"
+ },
+ {
+ "query": "Fleischer-Innung D\u00fcsseldorf-Mettmann-Solingen D\u00fcsseldorf Kontakt Email",
+ "innung": "Fleischer-Innung D\u00fcsseldorf-Mettmann-Solingen",
+ "person": "Lutz Kluke"
+ },
+ {
+ "query": "Fotografen-Innung D\u00fcsseldorf-Aachen-K\u00f6ln D\u00fcsseldorf Kontakt Email",
+ "innung": "Fotografen-Innung D\u00fcsseldorf-Aachen-K\u00f6ln",
+ "person": "Guido de Nardo"
+ },
+ {
+ "query": "Friseur-Innung D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Friseur-Innung D\u00fcsseldorf",
+ "person": "Christos Neofotistos"
+ },
+ {
+ "query": "Geb\u00e4udereiniger-Innung D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Geb\u00e4udereiniger-Innung D\u00fcsseldorf",
+ "person": "Michael Kregel"
+ },
+ {
+ "query": "Glaser-Innung D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Glaser-Innung D\u00fcsseldorf",
+ "person": "Ralph Icks"
+ },
+ {
+ "query": "Gold- und Silberschmiede-Innung D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Gold- und Silberschmiede-Innung D\u00fcsseldorf",
+ "person": "Susanne Kunzmann"
+ },
+ {
+ "query": "Innung f\u00fcr Informationstechnik D\u00fcssel-Rhein-Ruhr D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Informationstechnik D\u00fcssel-Rhein-Ruhr",
+ "person": "Alvaro Millan"
+ },
+ {
+ "query": "Innung Nordrhein der Kachel- und Luftheizungsbauer D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung Nordrhein der Kachel- und Luftheizungsbauer",
+ "person": "Uwe Gobien"
+ },
+ {
+ "query": "Karosseriebauer-Innung D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Karosseriebauer-Innung D\u00fcsseldorf",
+ "person": "Detlev Thedens"
+ },
+ {
+ "query": "Konditoren-Innung Bergisches Land und D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Konditoren-Innung Bergisches Land und D\u00fcsseldorf",
+ "person": "Thomas Pons"
+ },
+ {
+ "query": "Innung des Kraftfahrzeuggewerbes D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung des Kraftfahrzeuggewerbes D\u00fcsseldorf",
+ "person": "Hermann G\u00f6rtz"
+ },
+ {
+ "query": "Maler- und Lackierer-Innung D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Maler- und Lackierer-Innung D\u00fcsseldorf",
+ "person": "J\u00f6rg Schmitz"
+ },
+ {
+ "query": "Ma\u00dfschneider-Innung D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Ma\u00dfschneider-Innung D\u00fcsseldorf",
+ "person": "Sandra Gronemeier"
+ },
+ {
+ "query": "Musikinstrumentenmacher-Innung Nordrhein D\u00fcsseldorf Kontakt Email",
+ "innung": "Musikinstrumentenmacher-Innung Nordrhein",
+ "person": "Christoph B\u00f6ttcher"
+ },
+ {
+ "query": "Innung f\u00fcr Orthop\u00e4die-Technik f\u00fcr den Regierungsbezirk D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Orthop\u00e4die-Technik f\u00fcr den Regierungsbezirk D\u00fcsseldorf",
+ "person": "Pierre Koppetsch"
+ },
+ {
+ "query": "Innung f\u00fcr Orthop\u00e4dieschuhtechnik Rheinland-Westfalen D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Orthop\u00e4dieschuhtechnik Rheinland-Westfalen",
+ "person": "Philipp Radtke"
+ },
+ {
+ "query": "Sattler- und Raumausstatter-Innung D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Sattler- und Raumausstatter-Innung D\u00fcsseldorf",
+ "person": "Holger Hohmann"
+ },
+ {
+ "query": "Schornsteinfeger-Innung f\u00fcr den Regierungsbezirk D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Schornsteinfeger-Innung f\u00fcr den Regierungsbezirk D\u00fcsseldorf",
+ "person": "N.N."
+ },
+ {
+ "query": "Steinmetz- und Steinbildhauer-Innung D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Steinmetz- und Steinbildhauer-Innung D\u00fcsseldorf",
+ "person": "J\u00f6rg Hahn"
+ },
+ {
+ "query": "Stra\u00dfen- und Tiefbauer-Innung D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Stra\u00dfen- und Tiefbauer-Innung D\u00fcsseldorf",
+ "person": "Andr\u00e9 Grimmert"
+ },
+ {
+ "query": "Stukkateur-Innung D\u00fcsseldorf-Neuss f\u00fcr Ausbau und Fassade D\u00fcsseldorf Kontakt Email",
+ "innung": "Stukkateur-Innung D\u00fcsseldorf-Neuss f\u00fcr Ausbau und Fassade",
+ "person": "Tobias J\u00fclich"
+ },
+ {
+ "query": "Werbetechniker-Innung D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Werbetechniker-Innung D\u00fcsseldorf",
+ "person": "Tim Rehse"
+ },
+ {
+ "query": "Zahntechniker-Innung D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Zahntechniker-Innung D\u00fcsseldorf",
+ "person": "Dominik Kruchen"
+ },
+ {
+ "query": "Drucker- (Buchdrucker-)- und Buchbinder-Innung Duisburg D\u00fcsseldorf Kontakt Email",
+ "innung": "Drucker- (Buchdrucker-)- und Buchbinder-Innung Duisburg",
+ "person": "Bodo H. Oppenberg"
+ },
+ {
+ "query": "Fleischer-Innung Duisburg D\u00fcsseldorf Kontakt Email",
+ "innung": "Fleischer-Innung Duisburg",
+ "person": "Franz-Josef van Bebber"
+ },
+ {
+ "query": "Friseur-Innung Duisburg D\u00fcsseldorf Kontakt Email",
+ "innung": "Friseur-Innung Duisburg",
+ "person": "Markus Lotze"
+ },
+ {
+ "query": "Geb\u00e4udereiniger-Innung Duisburg D\u00fcsseldorf Kontakt Email",
+ "innung": "Geb\u00e4udereiniger-Innung Duisburg",
+ "person": "J\u00f6rg H\u00e4mmerling"
+ },
+ {
+ "query": "Glasapparatebauer-Innung Duisburg D\u00fcsseldorf Kontakt Email",
+ "innung": "Glasapparatebauer-Innung Duisburg",
+ "person": "Dieter Verhees"
+ },
+ {
+ "query": "Konditoren-Innung Rhein-Ruhr D\u00fcsseldorf Kontakt Email",
+ "innung": "Konditoren-Innung Rhein-Ruhr",
+ "person": "Hubert Cordes"
+ },
+ {
+ "query": "Innung der Kraftfahrzeughandwerks Duisburg D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung der Kraftfahrzeughandwerks Duisburg",
+ "person": "Thomas Dosoudil"
+ },
+ {
+ "query": "Maler- und Lackierer-Innung Duisburg D\u00fcsseldorf Kontakt Email",
+ "innung": "Maler- und Lackierer-Innung Duisburg",
+ "person": "Heinz-J\u00fcrgen Lobreyer"
+ },
+ {
+ "query": "Innung des modeschaffenden Handwerks Duisburg D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung des modeschaffenden Handwerks Duisburg",
+ "person": "Charlotte No\u00e9"
+ },
+ {
+ "query": "Innung f\u00fcr Informationstechnik Duisburg D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Informationstechnik Duisburg",
+ "person": "Thorsten Slizewski"
+ },
+ {
+ "query": "Raumausstatter-Innung Rhein-Ruhr D\u00fcsseldorf Kontakt Email",
+ "innung": "Raumausstatter-Innung Rhein-Ruhr",
+ "person": "Kay Piller"
+ },
+ {
+ "query": "Steinmetz- und Steinbildhauer-Innung Duisburg, M\u00fclheim, Oberhausen D\u00fcsseldorf Kontakt Email",
+ "innung": "Steinmetz- und Steinbildhauer-Innung Duisburg, M\u00fclheim, Oberhausen",
+ "person": "Ralf Pauschert"
+ },
+ {
+ "query": "Stra\u00dfenbauer-Innung Duisburg D\u00fcsseldorf Kontakt Email",
+ "innung": "Stra\u00dfenbauer-Innung Duisburg",
+ "person": "Heiner K\u00fchne"
+ },
+ {
+ "query": "Zweiradmechaniker-Innung Rhein-Ruhr D\u00fcsseldorf Kontakt Email",
+ "innung": "Zweiradmechaniker-Innung Rhein-Ruhr",
+ "person": "Erwin Lohrmann"
+ },
+ {
+ "query": "Verband der Berufsfotografen Ruhr D\u00fcsseldorf Kontakt Email",
+ "innung": "Verband der Berufsfotografen Ruhr",
+ "person": "Andreas K\u00f6hring"
+ },
+ {
+ "query": "Friseur-Innung Essen D\u00fcsseldorf Kontakt Email",
+ "innung": "Friseur-Innung Essen",
+ "person": "Markus Bredenbr\u00f6cker"
+ },
+ {
+ "query": "Geb\u00e4udereiniger-Innung Essen-M\u00fclheim an der Ruhr-Oberhausen D\u00fcsseldorf Kontakt Email",
+ "innung": "Geb\u00e4udereiniger-Innung Essen-M\u00fclheim an der Ruhr-Oberhausen",
+ "person": "Stefan Thielen"
+ },
+ {
+ "query": "Gold- und Silberschmiede-Innung Essen D\u00fcsseldorf Kontakt Email",
+ "innung": "Gold- und Silberschmiede-Innung Essen",
+ "person": "Zeno Ablass"
+ },
+ {
+ "query": "Maler- und Lackierer-Innung Essen D\u00fcsseldorf Kontakt Email",
+ "innung": "Maler- und Lackierer-Innung Essen",
+ "person": "Marc-Alexander Kecker"
+ },
+ {
+ "query": "Raumausstatter- und Sattler-Innung Essen D\u00fcsseldorf Kontakt Email",
+ "innung": "Raumausstatter- und Sattler-Innung Essen",
+ "person": "Michel Gutberlet"
+ },
+ {
+ "query": "Innung des Schilder- und Lichtreklameherstellerhandwerks Essen D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung des Schilder- und Lichtreklameherstellerhandwerks Essen",
+ "person": "Sascha Schl\u00fcter"
+ },
+ {
+ "query": "Steinmetz- und Steinbildhauer-Innung Essen D\u00fcsseldorf Kontakt Email",
+ "innung": "Steinmetz- und Steinbildhauer-Innung Essen",
+ "person": "Stephan Peters"
+ },
+ {
+ "query": "Stra\u00dfenbauer-Innung Essen-M\u00fclheim D\u00fcsseldorf Kontakt Email",
+ "innung": "Stra\u00dfenbauer-Innung Essen-M\u00fclheim",
+ "person": "Thorsten Potysch"
+ },
+ {
+ "query": "Innung f\u00fcr Vulkaniseur- und Reifenmechanik-Handwerk Rhein-Ruhr D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Vulkaniseur- und Reifenmechanik-Handwerk Rhein-Ruhr",
+ "person": "Horst Kornetka"
+ },
+ {
+ "query": "B\u00e4cker-Innung Niederrhein-Kleve-Wesel D\u00fcsseldorf Kontakt Email",
+ "innung": "B\u00e4cker-Innung Niederrhein-Kleve-Wesel",
+ "person": "Johannes Gerhards"
+ },
+ {
+ "query": "Fleischer-Innung des Kreises Kleve D\u00fcsseldorf Kontakt Email",
+ "innung": "Fleischer-Innung des Kreises Kleve",
+ "person": "Heinz Borghs"
+ },
+ {
+ "query": "Friseur-Innung des Kreises Kleve D\u00fcsseldorf Kontakt Email",
+ "innung": "Friseur-Innung des Kreises Kleve",
+ "person": "Karin Merlin Wrobel"
+ },
+ {
+ "query": "Gold- und Silberschmiede-Innung Niederrhein D\u00fcsseldorf Kontakt Email",
+ "innung": "Gold- und Silberschmiede-Innung Niederrhein",
+ "person": "Martin Link"
+ },
+ {
+ "query": "Maler- und Lackierer-Innung des Kreises Kleve D\u00fcsseldorf Kontakt Email",
+ "innung": "Maler- und Lackierer-Innung des Kreises Kleve",
+ "person": "Franz-Theo Dirmeier"
+ },
+ {
+ "query": "Zweiradmechaniker-Innung des Kreises Kleve D\u00fcsseldorf Kontakt Email",
+ "innung": "Zweiradmechaniker-Innung des Kreises Kleve",
+ "person": "Markus Daute"
+ },
+ {
+ "query": "Friseur-Innung Kreis Mettmann D\u00fcsseldorf Kontakt Email",
+ "innung": "Friseur-Innung Kreis Mettmann",
+ "person": "Uwe Ranke"
+ },
+ {
+ "query": "Karosserie- und Fahrzeugbauer-Innung Kreis Mettmann D\u00fcsseldorf Kontakt Email",
+ "innung": "Karosserie- und Fahrzeugbauer-Innung Kreis Mettmann",
+ "person": "Max Witeczek"
+ },
+ {
+ "query": "Innung des Kraftfahrzeughandwerks Kreis Mettmann D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung des Kraftfahrzeughandwerks Kreis Mettmann",
+ "person": "Alfons Kunz"
+ },
+ {
+ "query": "Maler- und Lackierer-Innung Kreis Mettmann D\u00fcsseldorf Kontakt Email",
+ "innung": "Maler- und Lackierer-Innung Kreis Mettmann",
+ "person": "Ralf Heinz Weber"
+ },
+ {
+ "query": "Raumausstatter- und Sattler-Innung Kreis Mettmann D\u00fcsseldorf Kontakt Email",
+ "innung": "Raumausstatter- und Sattler-Innung Kreis Mettmann",
+ "person": "Thomas Wittig"
+ },
+ {
+ "query": "B\u00e4cker-Innung M\u00f6nchengladbach D\u00fcsseldorf Kontakt Email",
+ "innung": "B\u00e4cker-Innung M\u00f6nchengladbach",
+ "person": "Gertie Riethmacher"
+ },
+ {
+ "query": "Fleischer-Innung M\u00f6nchengladbach D\u00fcsseldorf Kontakt Email",
+ "innung": "Fleischer-Innung M\u00f6nchengladbach",
+ "person": "Josef Baumanns"
+ },
+ {
+ "query": "Friseur-Innung M\u00f6nchengladbach D\u00fcsseldorf Kontakt Email",
+ "innung": "Friseur-Innung M\u00f6nchengladbach",
+ "person": "Sabine Capan"
+ },
+ {
+ "query": "Informationstechniker-Innung M\u00f6nchengladbach-Neuss D\u00fcsseldorf Kontakt Email",
+ "innung": "Informationstechniker-Innung M\u00f6nchengladbach-Neuss",
+ "person": "Dirk Weduwen"
+ },
+ {
+ "query": "Karosserie- und Fahrzeugbauer-Innung M\u00f6nchengladbach D\u00fcsseldorf Kontakt Email",
+ "innung": "Karosserie- und Fahrzeugbauer-Innung M\u00f6nchengladbach",
+ "person": "Reiner Brenner"
+ },
+ {
+ "query": "Konditoren-Innung M\u00f6nchengladbach D\u00fcsseldorf Kontakt Email",
+ "innung": "Konditoren-Innung M\u00f6nchengladbach",
+ "person": "Manfred Groth"
+ },
+ {
+ "query": "Innung des Kraftfahrzeuggewerbes M\u00f6nchengladbach D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung des Kraftfahrzeuggewerbes M\u00f6nchengladbach",
+ "person": "Peter Fischer"
+ },
+ {
+ "query": "Maler- und Lackierer-Innung M\u00f6nchengladbach D\u00fcsseldorf Kontakt Email",
+ "innung": "Maler- und Lackierer-Innung M\u00f6nchengladbach",
+ "person": "Udo N\u00f6sen"
+ },
+ {
+ "query": "Raumausstatter- und Sattler-Innung M\u00f6nchengladbach D\u00fcsseldorf Kontakt Email",
+ "innung": "Raumausstatter- und Sattler-Innung M\u00f6nchengladbach",
+ "person": "Joachim R\u00fctten"
+ },
+ {
+ "query": "Schuhmacher-Innung linker Niederrhein D\u00fcsseldorf Kontakt Email",
+ "innung": "Schuhmacher-Innung linker Niederrhein",
+ "person": "G\u00fcnther Schellenberger"
+ },
+ {
+ "query": "Zimmerer-Innung M\u00f6nchengladbach D\u00fcsseldorf Kontakt Email",
+ "innung": "Zimmerer-Innung M\u00f6nchengladbach",
+ "person": "Peter R\u00f6ders"
+ },
+ {
+ "query": "Fleischer-Innung RheinRuhr D\u00fcsseldorf Kontakt Email",
+ "innung": "Fleischer-Innung RheinRuhr",
+ "person": "J\u00f6rg Bischoff"
+ },
+ {
+ "query": "Friseur-Innung M\u00fclheim an der Ruhr D\u00fcsseldorf Kontakt Email",
+ "innung": "Friseur-Innung M\u00fclheim an der Ruhr",
+ "person": "Ralf W\u00fcstefeld"
+ },
+ {
+ "query": "Friseur-Innung Oberhausen-Rheinland D\u00fcsseldorf Kontakt Email",
+ "innung": "Friseur-Innung Oberhausen-Rheinland",
+ "person": "Bernd G\u00f6rg"
+ },
+ {
+ "query": "Maler- und Lackierer-Innung M\u00fclheim an der Ruhr-Oberhausen D\u00fcsseldorf Kontakt Email",
+ "innung": "Maler- und Lackierer-Innung M\u00fclheim an der Ruhr-Oberhausen",
+ "person": "Guido vom Ufer"
+ },
+ {
+ "query": "Niederrheinische B\u00e4cker-Innung Krefeld-Viersen-Neuss D\u00fcsseldorf Kontakt Email",
+ "innung": "Niederrheinische B\u00e4cker-Innung Krefeld-Viersen-Neuss",
+ "person": "Rudolf Wei\u00dfert"
+ },
+ {
+ "query": "Bestatter-Innung Nordrhein-Westfalen D\u00fcsseldorf Kontakt Email",
+ "innung": "Bestatter-Innung Nordrhein-Westfalen",
+ "person": "Frank Wesemann"
+ },
+ {
+ "query": "Drechsler-Innung Krefeld D\u00fcsseldorf Kontakt Email",
+ "innung": "Drechsler-Innung Krefeld",
+ "person": "Klaus Reef"
+ },
+ {
+ "query": "E-Handwerke Niederrhein-Kreis Viersen D\u00fcsseldorf Kontakt Email",
+ "innung": "E-Handwerke Niederrhein-Kreis Viersen",
+ "person": "Martin Thomas Nowroth"
+ },
+ {
+ "query": "Fleischer-Innung Niederrhein Krefeld-Viersen-Neuss D\u00fcsseldorf Kontakt Email",
+ "innung": "Fleischer-Innung Niederrhein Krefeld-Viersen-Neuss",
+ "person": "Willi Schillings"
+ },
+ {
+ "query": "Friseur-Innung Krefeld-Viersen-Neuss D\u00fcsseldorf Kontakt Email",
+ "innung": "Friseur-Innung Krefeld-Viersen-Neuss",
+ "person": "Alexandra Houx-Brenner"
+ },
+ {
+ "query": "Geb\u00e4udereiniger-Innung Mittlerer Niederrhein D\u00fcsseldorf Kontakt Email",
+ "innung": "Geb\u00e4udereiniger-Innung Mittlerer Niederrhein",
+ "person": "Nadine Ludwigs"
+ },
+ {
+ "query": "Innung f\u00fcr Informationstechnik Niederrhein Krefeld-Viersen-Neuss D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Informationstechnik Niederrhein Krefeld-Viersen-Neuss",
+ "person": "Horst Rinsch"
+ },
+ {
+ "query": "Karosserie- und Fahrzeugbauer-Innung Krefeld-Viersen-Neuss D\u00fcsseldorf Kontakt Email",
+ "innung": "Karosserie- und Fahrzeugbauer-Innung Krefeld-Viersen-Neuss",
+ "person": "Ralph Treeker"
+ },
+ {
+ "query": "Konditoren-Innung Niederrhein D\u00fcsseldorf Kontakt Email",
+ "innung": "Konditoren-Innung Niederrhein",
+ "person": "Andreas Achten"
+ },
+ {
+ "query": "Innung des Kraftfahrzeuggewerbes Krefeld-Viersen D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung des Kraftfahrzeuggewerbes Krefeld-Viersen",
+ "person": "Dietmar Lassek"
+ },
+ {
+ "query": "Kraftfahrzeug-Innung Rhein-Kreis Neuss D\u00fcsseldorf Kontakt Email",
+ "innung": "Kraftfahrzeug-Innung Rhein-Kreis Neuss",
+ "person": "Johannes Brester"
+ },
+ {
+ "query": "Maler- und Lackierer-Innung Niederrhein Krefeld-Neuss-Viersen D\u00fcsseldorf Kontakt Email",
+ "innung": "Maler- und Lackierer-Innung Niederrhein Krefeld-Neuss-Viersen",
+ "person": "Stephanie Jahrke"
+ },
+ {
+ "query": "Innung f\u00fcr das Modeschaffende Handwerk Niederrhein D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr das Modeschaffende Handwerk Niederrhein",
+ "person": "Angelika van Neerven"
+ },
+ {
+ "query": "Steinmetz- und Steinbildhauer-Innung Mittlerer Niederrhein D\u00fcsseldorf Kontakt Email",
+ "innung": "Steinmetz- und Steinbildhauer-Innung Mittlerer Niederrhein",
+ "person": "Daniel Franzen"
+ },
+ {
+ "query": "Stuckateur-Innung Krefeld-Viersen D\u00fcsseldorf Kontakt Email",
+ "innung": "Stuckateur-Innung Krefeld-Viersen",
+ "person": "Roland Gerhards"
+ },
+ {
+ "query": "Textilreiniger-Innung f\u00fcr den Regierungsbezirk D\u00fcsseldorf D\u00fcsseldorf Kontakt Email",
+ "innung": "Textilreiniger-Innung f\u00fcr den Regierungsbezirk D\u00fcsseldorf",
+ "person": "Dirk Querfurth"
+ },
+ {
+ "query": "Zweiradmechaniker-Innung Niederrhein Krefeld-Viersen-Neuss D\u00fcsseldorf Kontakt Email",
+ "innung": "Zweiradmechaniker-Innung Niederrhein Krefeld-Viersen-Neuss",
+ "person": "Rolf Langer"
+ },
+ {
+ "query": "Innung f\u00fcr elektrotechnische Handwerke Remscheid D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr elektrotechnische Handwerke Remscheid",
+ "person": "Andreas M\u00fcller"
+ },
+ {
+ "query": "Friseur-Innung Remscheid D\u00fcsseldorf Kontakt Email",
+ "innung": "Friseur-Innung Remscheid",
+ "person": "Tanja K\u00fcrten-Rauhaus"
+ },
+ {
+ "query": "Innung f\u00fcr das Geb\u00e4udereiniger-Handwerk Remscheid-Solingen D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr das Geb\u00e4udereiniger-Handwerk Remscheid-Solingen",
+ "person": "Oliver Knedlich"
+ },
+ {
+ "query": "Innung des Kraftfahrzeughandwerks Remscheid/ D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung des Kraftfahrzeughandwerks Remscheid/",
+ "person": "Thomas Bli\u00df"
+ },
+ {
+ "query": "Maler- und Lackierer-Innung Remscheid D\u00fcsseldorf Kontakt Email",
+ "innung": "Maler- und Lackierer-Innung Remscheid",
+ "person": "Holger Schulz"
+ },
+ {
+ "query": "Innung der Nahrungsmittelhandwerke Remscheid D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung der Nahrungsmittelhandwerke Remscheid",
+ "person": "Birgit Eppels"
+ },
+ {
+ "query": "Steinmetz- und Steinbildhauer-Innung Bergisch Land D\u00fcsseldorf Kontakt Email",
+ "innung": "Steinmetz- und Steinbildhauer-Innung Bergisch Land",
+ "person": "Beate Globisch"
+ },
+ {
+ "query": "B\u00e4cker-Innung Solingen-Wuppertal (Sitz: Wuppertal) D\u00fcsseldorf Kontakt Email",
+ "innung": "B\u00e4cker-Innung Solingen-Wuppertal (Sitz: Wuppertal)",
+ "person": "Dirk Polick"
+ },
+ {
+ "query": "Friseur-Innung Solingen-Wuppertal D\u00fcsseldorf Kontakt Email",
+ "innung": "Friseur-Innung Solingen-Wuppertal",
+ "person": "Pia Schneider"
+ },
+ {
+ "query": "Glaser-Innung Wuppertal D\u00fcsseldorf Kontakt Email",
+ "innung": "Glaser-Innung Wuppertal",
+ "person": "Rafael Musik"
+ },
+ {
+ "query": "Graveur-Innung Solingen-Wuppertal D\u00fcsseldorf Kontakt Email",
+ "innung": "Graveur-Innung Solingen-Wuppertal",
+ "person": "Stefan Kr\u00fcth"
+ },
+ {
+ "query": "Karosserie- und Fahrzeugbauer-Innung Wuppertal D\u00fcsseldorf Kontakt Email",
+ "innung": "Karosserie- und Fahrzeugbauer-Innung Wuppertal",
+ "person": "Martin Rosslan"
+ },
+ {
+ "query": "Innung des Kraftfahrzeughandwerks (Solingen) D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung des Kraftfahrzeughandwerks (Solingen)",
+ "person": "Uwe Stamm"
+ },
+ {
+ "query": "Innung des Kraftfahrzeughandwerks Wuppertal D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung des Kraftfahrzeughandwerks Wuppertal",
+ "person": "Wolfram Friedrich"
+ },
+ {
+ "query": "Maler- und Lackierer-Innung (Solingen) D\u00fcsseldorf Kontakt Email",
+ "innung": "Maler- und Lackierer-Innung (Solingen)",
+ "person": "Oliver Conrads"
+ },
+ {
+ "query": "Maler- und Lackierer-Innung Wuppertal D\u00fcsseldorf Kontakt Email",
+ "innung": "Maler- und Lackierer-Innung Wuppertal",
+ "person": "Oliver Conyn"
+ },
+ {
+ "query": "Raumausstatter-Innung Solingen-Wuppertal D\u00fcsseldorf Kontakt Email",
+ "innung": "Raumausstatter-Innung Solingen-Wuppertal",
+ "person": "Frank Dembny"
+ },
+ {
+ "query": "Stra\u00dfen- und Tiefbau-Innung Wuppertal D\u00fcsseldorf Kontakt Email",
+ "innung": "Stra\u00dfen- und Tiefbau-Innung Wuppertal",
+ "person": "Martin Ehlhardt"
+ },
+ {
+ "query": "Stukkateur-Innung Wuppertal-Kreis Mettmann D\u00fcsseldorf Kontakt Email",
+ "innung": "Stukkateur-Innung Wuppertal-Kreis Mettmann",
+ "person": "Wolfgang W\u00fcstenhagen"
+ },
+ {
+ "query": "Friseur-Innung des Kreises Wesel D\u00fcsseldorf Kontakt Email",
+ "innung": "Friseur-Innung des Kreises Wesel",
+ "person": "Klaus Peter Neske"
+ },
+ {
+ "query": "Glaser-Innung Niederrhein D\u00fcsseldorf Kontakt Email",
+ "innung": "Glaser-Innung Niederrhein",
+ "person": "Thomas Schulmeyer"
+ },
+ {
+ "query": "Innung des Kraftfahrzeuggewerbes Niederrhein Kleve-Wesel D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung des Kraftfahrzeuggewerbes Niederrhein Kleve-Wesel",
+ "person": "Ren\u00e9 Gravendyk"
+ },
+ {
+ "query": "Maler- und Lackierer-Innung des Kreises Wesel D\u00fcsseldorf Kontakt Email",
+ "innung": "Maler- und Lackierer-Innung des Kreises Wesel",
+ "person": "G\u00fcnter Bode"
+ },
+ {
+ "query": "Innung f\u00fcr Schneid- und Schleiftechnik Nordrhein D\u00fcsseldorf Kontakt Email",
+ "innung": "Innung f\u00fcr Schneid- und Schleiftechnik Nordrhein",
+ "person": "Uwe Peters"
+ },
+ {
+ "query": "Steinmetz- und Steinbildhauer-Innung Niederrhein D\u00fcsseldorf Kontakt Email",
+ "innung": "Steinmetz- und Steinbildhauer-Innung Niederrhein",
+ "person": "Benedikt L. Kreusch"
+ },
+ {
+ "query": "Stuckateur-Innung Niederrhein D\u00fcsseldorf Kontakt Email",
+ "innung": "Stuckateur-Innung Niederrhein",
+ "person": "Norbert Kehrbusch"
+ }
+]
\ No newline at end of file
diff --git a/leads/identify_missing_leads.py b/leads/identify_missing_leads.py
new file mode 100644
index 0000000..b7368d3
--- /dev/null
+++ b/leads/identify_missing_leads.py
@@ -0,0 +1,105 @@
+import pandas as pd
+import json
+import os
+
+def normalize(text):
+ if not isinstance(text, str):
+ return ""
+ return text.strip().lower()
+
+def main():
+ # 1. Load the "Done" list
+ leads_csv_path = 'leads/leads.csv'
+ if os.path.exists(leads_csv_path):
+ leads_df = pd.read_csv(leads_csv_path)
+ done_names = set(leads_df['Firm/Innung'].apply(normalize))
+ done_emails = set(leads_df['Email'].apply(normalize))
+ else:
+ done_names = set()
+ done_emails = set()
+
+ missing_duesseldorf = []
+ missing_cologne = []
+ missing_unterfranken = []
+
+ # 2. Check Düsseldorf Targets
+ duesseldorf_path = 'leads/cologne_duesseldorf_data/duesseldorf_targets.json'
+ if os.path.exists(duesseldorf_path):
+ with open(duesseldorf_path, 'r', encoding='utf-8') as f:
+ targets = json.load(f)
+ seen_d = set()
+ for t in targets:
+ name = t.get('innung', '')
+ if normalize(name) not in done_names and normalize(name) not in seen_d:
+ missing_duesseldorf.append(t)
+ seen_d.add(normalize(name))
+
+ # 3. Check Cologne/Düsseldorf Raw CSV
+ cologne_raw_path = 'leads/raw/innungen_leads_koeln_duesseldorf.csv'
+ if os.path.exists(cologne_raw_path):
+ cologne_df = pd.read_csv(cologne_raw_path)
+ seen_c = set()
+ for _, row in cologne_df.iterrows():
+ name = row.get('organisation', '')
+ region = row.get('region', '')
+ email = row.get('email', '')
+
+ if str(region).lower() == 'koeln':
+ if normalize(name) in seen_c:
+ continue
+ seen_c.add(normalize(name))
+
+ if pd.isna(email) or email.strip() == '':
+ missing_cologne.append({'name': name, 'reason': 'No Email'})
+ else:
+ if normalize(email) not in done_emails and normalize(name) not in done_names:
+ missing_cologne.append({'name': name, 'email': email, 'reason': 'Not in final list'})
+
+ # 4. Check Unterfranken Raw CSV
+ unterfranken_raw_path = 'leads/raw/leads_unterfranken.csv'
+ if os.path.exists(unterfranken_raw_path):
+ uf_df = pd.read_csv(unterfranken_raw_path)
+ name_col = None
+ for col in uf_df.columns:
+ if 'innung' in col.lower() or 'firm' in col.lower() or 'name' in col.lower():
+ name_col = col
+ break
+
+ seen_u = set()
+ if name_col:
+ for _, row in uf_df.iterrows():
+ name = str(row[name_col]).strip()
+ # Filter garbage
+ if len(name) < 5: continue
+ if "regierungsbezirk" in name.lower() and "sitz" in name.lower(): continue # Garbage header line
+
+ if normalize(name) not in done_names and normalize(name) not in seen_u:
+ missing_unterfranken.append(name)
+ seen_u.add(normalize(name))
+
+ # 5. Generate Markdown
+ with open('missing_leads.md', 'w', encoding='utf-8') as f:
+ f.write('# Missing Leads Report\n\n')
+
+ f.write(f'## Düsseldorf (Missing: {len(missing_duesseldorf)})\n')
+ if not missing_duesseldorf:
+ f.write("No missing leads identified (or source file empty).\n")
+ for item in missing_duesseldorf:
+ f.write(f"- {item.get('innung')} (Contact: {item.get('person', 'N/A')})\n")
+
+ f.write(f'\n## Cologne (Missing: {len(missing_cologne)})\n')
+ if not missing_cologne:
+ f.write("No missing leads identified from raw source.\n")
+ for item in missing_cologne:
+ reason = item.get('reason', '')
+ email_part = f" (Email: {item['email']})" if 'email' in item else ""
+ f.write(f"- {item.get('name')}{email_part} [{reason}]\n")
+
+ f.write(f'\n## Unterfranken (Missing: {len(missing_unterfranken)})\n')
+ if not missing_unterfranken:
+ f.write("All raw Unterfranken leads seem to be in the final list.\n")
+ for name in missing_unterfranken:
+ f.write(f"- {name}\n")
+
+if __name__ == "__main__":
+ main()
diff --git a/leads/leads.csv b/leads/leads.csv
new file mode 100644
index 0000000..ba119f2
--- /dev/null
+++ b/leads/leads.csv
@@ -0,0 +1,120 @@
+Firm/Innung,Contact Person,Email,Region
+Augenoptiker-Innung Koeln-Aachen,,info@optikerinnung.de,Köln
+Bau-Innung Kreis Mettmann,Thomas Grünendahl,info@handwerk-me.de,Düsseldorf/Surrounding
+Bau-Innung Mönchengladbach,Dipl.-Ing. Frank Bühler,info@kh-mg.de,Düsseldorf/Surrounding
+Bau-Innung Neuss-Viersen,Thomas Goldmann,info@kh-niederrhein.de,Düsseldorf/Surrounding
+Bau-Innung Remscheid,Carsten Hof,info@handwerk-remscheid.de,Düsseldorf/Surrounding
+Bau-Innung Schweinfurt,Karl Böhner,info@bauinnung-schweinfurt.de,Unterfranken
+Bau-Innung Wuppertal-Solingen,Marcus Koch,info@bauinnung-wuppertal.de,Düsseldorf/Surrounding
+Baugewerks-Innung des Kreises Wesel,Gerhard Landwehrs,info@khwesel.de,Düsseldorf/Surrounding
+Baugewerks-Innung Duisburg,Volker Blastik,info@baugewerksinnung-duisburg.de,Düsseldorf/Surrounding
+Bauinnung Aschaffenburg,Felix Englert,felix.englert@bauinnung-aschaffenburg.de,Unterfranken
+Bauinnung Bad Kissingen / Rhön-Grabfeld,Stefan Goos,stefan.goos@zehe-gmbh.de,Unterfranken
+Bauinnung Mainfranken - Würzburg,Ralf Stegmeier,info@trend-bau.com,Unterfranken
+Berufsfotografen-Innung für Unterfranken,,info@foto-alfen.de,Unterfranken
+Brauer- und Mälzerinnung Unterfranken,,info@private-brauereien-bayern.de,Unterfranken
+"Buechsenmacher-Innung Nordrhein, RLP und Saarland",,kliedl@t-online.de,Köln
+Bundesinnung fuer das Geruestbauer-Handwerk,,info@geruestbauhandwerk.de,Köln
+Bäckerinnung Bad Kissingen - Rhön-Grabfeld,Petra Schwab,khw-kg@t-online.de,Unterfranken
+Bäckerinnung Bayerischer Untermain,,v.hench@baeckerinnung-bayerischer-untermain.de,Unterfranken
+Bäckerinnung Kitzingen,Tilo Brönner,tilo-br@t-online.de,Unterfranken
+Bäckerinnung Mainfranken,Marcel Scherg,scherge.beck@t-online.de,Unterfranken
+Bäckerinnung Schweinfurt - Haßberge,Gerhard Götz,baeckerei-goetz@web.de,Unterfranken
+Dachdecker- und Zimmerer-Innung Koeln,,e-mail@dachdecker-innung-koeln.de,Köln
+Dachdeckerinnung Aschaffenburg - Miltenberg,,lukas.thalheimer@thalheimer.de,Unterfranken
+Dachdeckerinnung Unterfranken,,info@dachdecker-unterfranken.de,Unterfranken
+Drucker- (Buchdrucker-)- und Buchbinder-Innung Duisburg,Bodo H. Oppenberg,info@handwerk-duisburg.de,Düsseldorf/Surrounding
+Elektroinnung Koeln,,info@elektroinnungkoeln.de,Köln
+Fleischer-Innung Koeln,,obermeister@fleischer-koeln.de,Köln
+Fleischer-Innung Main-Spessart,Sebastian Bumm,fleischerinnungMSP@gmx.de,Unterfranken
+Fotografen-Innung Düsseldorf-Aachen-Köln,Guido de Nardo,info@Fotografen-DUS.de,Düsseldorf/Surrounding
+Friseur-Innung Aschaffenburg Stadt und Land,,friseurinnung-aschaffenburg@t-online.de,Unterfranken
+Friseur-Innung Haßberge,Heinz Göhr,info@team-art-of-hair.com,Unterfranken
+Friseur-Innung Koeln,,info@kopfarbeit-koeln.de,Köln
+"Friseur-Innung Würzburg, Main-Spessart und Bad Kissingen",,katharinawalker88@gmx.de,Unterfranken
+Friseurinnung Kitzingen,,sabine.hack71@web.de,Unterfranken
+Friseurinnung Main-Rhön,Brigitte Rapp,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+Friseurinnung Miltenberg,,info@haarmonique.de,Unterfranken
+Glasapparatebauer-Innung Duisburg,Dieter Verhees,hippler@handwerk-duisburg.de,Düsseldorf/Surrounding
+Glaser-Innung Koeln-Bonn-Aachen,,mail@glas-bong.de,Köln
+Glaserinnung Unterfranken,,info@frank-bauglaserei.de,Unterfranken
+Graveur- und Metallbildner-Innung Rhein-Ruhr,Till Esser,info@kh-mo.de,Düsseldorf/Surrounding
+Innung der Metallhandwerke (Solingen),Thomas Blau,info@handwerk-sgw.de,Düsseldorf/Surrounding
+Innung des Bekleidungshandwerks Unterfranken,Friedrun Schlagbauer-Werner,info@schneiderin-wuerzburg.de,Unterfranken
+Innung des Gebaeudereiniger-Handwerks Koeln-Aachen,,info@gebaeudereiniger-koeln-aachen.de,Köln
+Innung des Massschneiderhandwerks Koeln / Textileiniger-Innung Koeln/Bonn,,twp.koeln@gmail.com,Köln
+Innung Farbe Koeln,,s.epe@epe-maler.de,Köln
+Innung fuer Informationstechnik Koeln/Bonn/Rhein-Sieg/Rhein-Erft,,n.gassner@koenig-avt.de,Köln
+Innung fuer Metalltechnik Koeln,,info@van-broek.de,Köln
+Innung fuer Orthopaedie-Technik Koeln,,sebastian@malzkorn.at,Köln
+Innung für Elektro- und Informationstechnik Bayerischer Untermain,Annett Kinzel,info@elektroinnung-bayerischeruntermain.de,Unterfranken
+Innung für Elektro- und Informationstechnik Haßberge,Gitta Klopf,info@elektroinnung-hassberge.de,Unterfranken
+Innung für Elektro- und Informationstechnik Schweinfurt,"Gaby Fröschel, Roland Klöffel, Ronald Niessner",info@elektroinnung-sw.de,Unterfranken
+Innung für Elektro- und Informationstechnik Würzburg,Heike Langner,mailbox@elektro-innung-wuerzburg.de,Unterfranken
+Innung für Land- und Baumaschinentechnik Unterfranken,Brigitte Rapp,info@innung-landbautechnik.de,Unterfranken
+Innung für Metallhandwerk des Kreises Kleve,Johannes Flinterhoff,info@kh-kleve.de,Düsseldorf/Surrounding
+Innung für Metallhandwerke Mülheim an der Ruhr-Oberhausen,Johannes Arnzen,info@metallbauinnung-mh-ob.de,Düsseldorf/Surrounding
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Sandra Köller,innung.shk@t-online.de,Unterfranken
+"Innung für Spengler-, Sanitär-, Heizungs- und Klimatechnik Schweinfurt - Main-Rhön",Stefan Köppe,info@shk-schweinfurt.de,Unterfranken
+"Innung für Spengler-, Sanitär-, und Heizungstechnik Kitzingen",Christine Keppner-Siegert,innung-kitzingen@freenet.de,Unterfranken
+Innung Koeln Rollladen und Sonnenschutz,,info@rhp-online.de,Köln
+Innung Metallbau- und Feinwerktechnik Bayerischer Untermain,Matthias Kreß,m.kress@wassermannkress.de,Unterfranken
+"Juwelier-, Gold- und Silberschmiede-Innung Koeln",,info@sotos-schmuck.de,Köln
+Kaminkehrer-Innung Unterfranken,,info@kaminkehrerinnung-unterfranken.de,Unterfranken
+Karosserie- und Fahrzeugtechnik Innung Unterfranken,Michael Seidel,info@seidel-karosserie.de,Unterfranken
+Karosseriebauer-Innung Koeln,,info@karosserie-innungkoeln.de,Köln
+Kfz-Innung Unterfranken,Michael Frank,info@kfz-innung-ufr.de,Unterfranken
+Konditoren-Innung Koeln - Bonn,,info@cafe-schoener.de,Köln
+Kreishandwerkerschaft Aschaffenburg,Claudia Find,info@khw-ab.de,Unterfranken
+Kreishandwerkerschaft Bad Kissingen,Petra Schwab,khw-kg@t-online.de,Unterfranken
+Kreishandwerkerschaft Haßberge,Gitta Klopf,info@elektroinnung-hassberge.de,Unterfranken
+Kreishandwerkerschaft Kitzingen,Monika Henneberger,monika.henneberger@t-online.de,Unterfranken
+Kreishandwerkerschaft Koeln,,lepore@handwerk.koeln,Köln
+Kreishandwerkerschaft Main-Spessart,Thomas Heußlein,info@schreinerei-heusslein.de,Unterfranken
+Kreishandwerkerschaft Miltenberg,,kreishandwerker.mil@gmail.com,Unterfranken
+Kreishandwerkerschaft Rhön-Grabfeld,,khwsch-rhoen-grabfeld@mail.de,Unterfranken
+Kreishandwerkerschaft Schweinfurt,Brigitte Rapp,rapp@Kreishandwerkerschaft-sw.de,Unterfranken
+Kreishandwerkerschaft Würzburg,Sandra Köller,info@kreishandwerkerschaft-wuerzburg.de,Unterfranken
+"Maler -, Tüncher- und Lackierer Innung Alzenau",,maler_trageser@gmx.de,Unterfranken
+Maler- und Lackierer-Innung Aschaffenburg Stadt und Land,,uta.kern@kolb-kern.de,Unterfranken
+Maler- und Lackiererinnung Bad Kissingen,Mathias Stöth,khw-kg@t-online.de,Unterfranken
+Maler- und Lackiererinnung Kitzingen,Thomas Wandler,mail@maler-wandler.de,Unterfranken
+Maler- und Lackiererinnung Miltenberg,Melitta Becker,info@farbe-miltenberg.de,Unterfranken
+Maler- und Stuckateur-Innung Würzburg und Main-Spessart,Claudius Wolfrum,info@malerinnung-wuerzburg.de,Unterfranken
+Maler- und Tüncherinnung Haßberge,,obermeister@malerinnung-hassberge.de,Unterfranken
+"Maler-, Tüncher- und Lackierer-Innung Rhön-Grabfeld",Birgit Neuhöfer,info@malerinnung-rg.de,Unterfranken
+Malerinnung Schweinfurt Stadt- und Land,Brigitte Rapp,info@malerinnung-schweinfurt.de,Unterfranken
+Maßschneider-Innung Düsseldorf,Sandra Gronemeier,info@mass-schneider-innung.de,Düsseldorf/Surrounding
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,Klaus Engelmann,info@metallinnung-kg-nes.de,Unterfranken
+Metall-Innung des Kreises Wesel,Rainer Theunissen,info@metallinnung-wesel.de,Düsseldorf/Surrounding
+Metall-Innung Essen,Björn Bergmann,info@metallhandwerk-essen.de,Düsseldorf/Surrounding
+Metallinnung Mainfranken - Mitte,Detlef Lurz,detlef.lurz@lurz-metalltec.de,Unterfranken
+Metallinnung Schweinfurt - Haßberge,Brigitte Rapp,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+Metzger-Innung Würzburg,,horst@schoemig.eu,Unterfranken
+Metzgerinnung Aschaffenburg,Marco Häuser,marco.haeuser@haeuser-hra.de,Unterfranken
+Metzgerinnung Main-Rhön,Barbara Fink,metzgerei_dros_fladungen@outlook.de,Unterfranken
+Metzgerinnung Miltenberg,,j.neuberger@t-online.de,Unterfranken
+Musikinstrumentenmacher-Innung Nordrhein,Christoph Böttcher,info@musikinstrumentenmacher-innung.de,Düsseldorf/Surrounding
+Raumausstatter- und Sattlerinnung Unterfranken,Hermann Noske,mail@sofa-shop.de,Unterfranken
+Raumausstatter-Innung Koeln,,info@diana-breidenbach.de,Köln
+Schreinerinnung Aschaffenburg Stadt und Land,,info@dellers-werkstatt.de,Unterfranken
+Schreinerinnung Bad Kissingen,Norbert Borst,khw-kg@t-online.de,Unterfranken
+Schreinerinnung Haßberge – Schweinfurt,Horst Zitterbart,schreinerei.zitterbart@t-online.de,Unterfranken
+Schreinerinnung Mainfranken,Ramona Pfenning,info@schreinerinnung-mainfranken.de,Unterfranken
+Schreinerinnung Miltenberg-Obernburg,,wt@reichert-betten.de,Unterfranken
+Schreinerinnung Rhön-Grabfeld,,info@schreiner-rhoen-grabfeld.de,Unterfranken
+Schuhmacherinnung Unterfranken,,l.emge@t-online.de,Unterfranken
+"SHK-Innung Main-Spessart Innung Sanitär-, Heizungs- und Klimatechnik",,info@shk-main-spessart.de,Unterfranken
+"Spengler-, Sanitär- und Heizungstechnik Innung Aschaffenburg - Miltenberg",Michael Bramm,shk-aschaffenburg@t-online.de,Unterfranken
+Steinmetz- und Steinbildhauerinnung Unterfranken,Josef Hofmann,info@stein-welten.com,Unterfranken
+Straßen- und Tiefbauer-Innung Düsseldorf,André Grimmert,info@strassenbauer-innung-duesseldorf.de,Düsseldorf/Surrounding
+Stuckateur-Innung Koeln - Ausbau + Fassade,,s.rettig@hhhuerth.de,Köln
+"Uhrmacher-, Gold- und Silberschmiedeinnung Unterfranken",Klaus Imhof,kontakt@juwelier-imhof.de,Unterfranken
+Unterfränkische Ofen- und Luftheizungsbauer-Innung,Michael Heigel,heigel@heigel.de,Unterfranken
+Verband der Berufsfotografen Ruhr,Andreas Köhring,ak@koehring-fotografie.de,Düsseldorf/Surrounding
+Werbetechniker-Innung Koeln - Bonn - Aachen,,info@werbetechnik-baecker.de,Köln
+Zimmerer-Innung Aschaffenburg - Miltenberg,Theresa Breunig,info@zimmerer-aschaffenburg-miltenberg.de,Unterfranken
+Zimmerer-Innung Bad Neustadt,,info@holzbau-eyrich.de,Unterfranken
+Zimmerer-Innung Main-Spessart,Volker Schäfer,info@schaefer-halsbach.de,Unterfranken
+Zimmerer-Innung Schweinfurt-Haßberge,Marion Reichhold,zimmerei_klaus_treiber@gmx.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,lang@zimmerer-wuerzburg-kitzingen.de,Unterfranken
diff --git a/leads/missing_leads.md b/leads/missing_leads.md
new file mode 100644
index 0000000..b08261e
--- /dev/null
+++ b/leads/missing_leads.md
@@ -0,0 +1,227 @@
+# Missing Leads Report
+
+## Düsseldorf (Missing: 180)
+- Baugewerbe-Innung Düsseldorf (Contact: Christoph Morick)
+- Dachdecker-Innung Düsseldorf (Contact: Andreas Braun)
+- Elektro-Innung Düsseldorf (Contact: Kai Hofmann)
+- Innung Sanitär-Heizung-Klima Düsseldorf (Contact: Hans Werner Eschrich)
+- Fachinnung Stahl und Metall Düsseldorf (Contact: Peter Maxisch)
+- Tischler-Innung Düsseldorf (Contact: Thomas Klode)
+- Dachdecker- und Zimmerer-Innung Duisburg (Contact: Udo Rosenstengel)
+- Elektro-Innung Duisburg (Contact: Dipl.-Ing. Lothar Hellmann)
+- Innung für Metall, Karosserie- und Fahrzeugbau Duisburg/Niederrhein (Contact: Sebastian Christ)
+- Innung Sanitär-Heizung-Klima Duisburg (Contact: Uwe Schöbel)
+- Tischler-Innung Duisburg (Contact: Frank Paschke)
+- Baugewerbe-Innung Essen (Contact: Frank Schulte-Hubbert)
+- Dachdecker-Innung Essen (Contact: Marc Sparrer)
+- Elektro-Innung Essen (Contact: Frank Struck)
+- Innung für Sanitär- und Heizungstechnik Ruhr-West (Contact: Thomas Weber)
+- Tischler-Innung Essen (Contact: Matthias Spehr)
+- Baugewerbe-Innung des Kreises Kleve (Contact: Michael Köster)
+- Dachdecker-Innung des Kreises Kleve (Contact: Markus Henkel)
+- Elektro-Innung des Kreises Kleve (Contact: Jörg Weykamp)
+- Innung Sanitär-Heizung-Klima Kreis Kleve (Contact: Michael Janßen)
+- Tischler-Innung des Kreises Kleve (Contact: Stefan Meyer)
+- Dachdecker- und Zimmerer-Innung Kreis Mettmann (Contact: Renee Fügener)
+- Elektro-Innung Kreis Mettmann (Contact: Andreas Schmidt)
+- Innung für Metalltechnik Kreis Mettmann (Contact: Reiner Schumacher)
+- Innung für Sanitär- und Heizungstechnik Kreis Mettmann (Contact: Christian Möller)
+- Tischler-Innung Kreis Mettmann (Contact: Michael Fischbach)
+- Dachdecker-Innung Mönchengladbach (Contact: Reinhard Esser)
+- Elektro-Innung Mönchengladbach (Contact: Heinz-Willi-Ober)
+- Metall-Innung Mönchengladbach-Rheydt (Contact: Adam Sautner)
+- Innung Sanitär-Heizung-Klima Mönchengladbach (Contact: Thorsten Caspers)
+- Tischler-Innung Mönchengladbach-Rheydt (Contact: Hans Wilhelm Klomp)
+- Baugewerks-Innung Mülheim an der Ruhr-Oberhausen (Contact: Jürgen Bunk)
+- Dachdecker- und Zimmerer-Innung Mülheim an der Ruhr (Contact: Jens-Peter Richard)
+- Dachdecker-Innung Oberhausen-Rheinland (Contact: Mark Notthoff)
+- Elektro-Innung Mülheim an der Ruhr (Contact: Joachim Schweins)
+- Elektro-Innung Oberhausen-Rheinland (Contact: Florian Menger)
+- Innung für Sanitär- und Heizungstechnik Oberhausen-Rheinland (Contact: Stefan Tögel)
+- Tischler-Innung Mülheim an der Ruhr-Oberhausen (Contact: Michael Schmeling)
+- Bau- und Straßenbauer-Innung Krefeld-Linker Niederrhein (Contact: Dipl.-Ing. Joachim Selzer)
+- Dachdecker-Innung Krefeld (Contact: Andreas Pavel)
+- Dachdecker-Innung Kreis Viersen (Contact: Ulrich Heurs)
+- Dachdecker-Innung Rhein-Kreis Neuss (Contact: Marco Brüggen)
+- Elektro-Innung Krefeld (Contact: Peter Rath)
+- Elektro-Innung Rhein-Kreis Neuss (Contact: Ernst Veiser)
+- Innung für Land- und Baumaschinentechnik Niederrhein (Contact: Franz-Josef Schulte)
+- Metall-Innung Niederrhein (Contact: Klaus Caris)
+- Innung für Sanitär-Heizung-Klima-Apparatebau Krefeld (Contact: Daniel Küppers)
+- Innung für Sanitär- und Heizungstechnik Kreis Viersen (Contact: Michael Smeets)
+- Innung für Sanitär- und Heizungstechnik Rhein-Kreis Neuss (Contact: Thomas Hanna)
+- Tischler-Innung Krefeld (Contact: Dirk Kosanke)
+- Tischler-Innung Kreis Viersen (Contact: Uwe Sötje)
+- Tischler-Innung Rhein-Kreis Neuss (Contact: Philipp Schlang)
+- Dachdecker-Innung Remscheid (Contact: Jörg Margies)
+- Fachinnung Metall- und Graviertechnik Remscheid (Contact: Uwe Wiegand)
+- Innung für Sanitär- und Heizungstechnik Remscheid (Contact: Oliver Bergmann)
+- Tischler-Innung Remscheid (Contact: Martin Stracke)
+- Dachdecker-Innung Solingen-Wuppertal (Contact: Thomas Sobireg)
+- Elektro-Innung (Solingen) (Contact: Frank Roth)
+- Elektro-Innung Wuppertal (Contact: Ingo Kursawe)
+- Innung für Metallhandwerke Wuppertal (Contact: Christian Flüss)
+- Innung für Sanitär- und Heizungstechnik (Solingen) (Contact: Andreas Glingener)
+- Innung für Sanitär-, Heizungs- und Klimatechnik Wuppertal (Contact: Frank Karuc)
+- Tischler-Innung (Solingen) (Contact: Paul-Gerhard Rössling)
+- Tischler-Innung Wuppertal (Contact: Thomas Landsiedel)
+- Dachdecker-Innung des Kreises Wesel (Contact: Marco Remy)
+- Innung für Elektrotechnik und Informationstechnik des Kreises Wesel (Contact: Klemens Mues)
+- Innung Sanitär-Heizung-Klima Kreis Wesel (Contact: Norbert Buhl)
+- Tischler-Innung des Kreises Wesel (Contact: Dirk Jockram)
+- Augenoptiker-Innung Düssel-Rhein-Ruhr (Contact: Jens Schulz)
+- Bäcker-Innung Rhein-Ruhr (Contact: Johannes Dackweiler)
+- Fleischer-Innung Düsseldorf-Mettmann-Solingen (Contact: Lutz Kluke)
+- Friseur-Innung Düsseldorf (Contact: Christos Neofotistos)
+- Gebäudereiniger-Innung Düsseldorf (Contact: Michael Kregel)
+- Glaser-Innung Düsseldorf (Contact: Ralph Icks)
+- Gold- und Silberschmiede-Innung Düsseldorf (Contact: Susanne Kunzmann)
+- Innung für Informationstechnik Düssel-Rhein-Ruhr (Contact: Alvaro Millan)
+- Innung Nordrhein der Kachel- und Luftheizungsbauer (Contact: Uwe Gobien)
+- Karosseriebauer-Innung Düsseldorf (Contact: Detlev Thedens)
+- Konditoren-Innung Bergisches Land und Düsseldorf (Contact: Thomas Pons)
+- Innung des Kraftfahrzeuggewerbes Düsseldorf (Contact: Hermann Görtz)
+- Maler- und Lackierer-Innung Düsseldorf (Contact: Jörg Schmitz)
+- Innung für Orthopädie-Technik für den Regierungsbezirk Düsseldorf (Contact: Pierre Koppetsch)
+- Innung für Orthopädieschuhtechnik Rheinland-Westfalen (Contact: Philipp Radtke)
+- Sattler- und Raumausstatter-Innung Düsseldorf (Contact: Holger Hohmann)
+- Schornsteinfeger-Innung für den Regierungsbezirk Düsseldorf (Contact: N.N.)
+- Steinmetz- und Steinbildhauer-Innung Düsseldorf (Contact: Jörg Hahn)
+- Stukkateur-Innung Düsseldorf-Neuss für Ausbau und Fassade (Contact: Tobias Jülich)
+- Werbetechniker-Innung Düsseldorf (Contact: Tim Rehse)
+- Zahntechniker-Innung Düsseldorf (Contact: Dominik Kruchen)
+- Fleischer-Innung Duisburg (Contact: Franz-Josef van Bebber)
+- Friseur-Innung Duisburg (Contact: Markus Lotze)
+- Gebäudereiniger-Innung Duisburg (Contact: Jörg Hämmerling)
+- Konditoren-Innung Rhein-Ruhr (Contact: Hubert Cordes)
+- Innung der Kraftfahrzeughandwerks Duisburg (Contact: Thomas Dosoudil)
+- Maler- und Lackierer-Innung Duisburg (Contact: Heinz-Jürgen Lobreyer)
+- Innung des modeschaffenden Handwerks Duisburg (Contact: Charlotte Noé)
+- Innung für Informationstechnik Duisburg (Contact: Thorsten Slizewski)
+- Raumausstatter-Innung Rhein-Ruhr (Contact: Kay Piller)
+- Steinmetz- und Steinbildhauer-Innung Duisburg, Mülheim, Oberhausen (Contact: Ralf Pauschert)
+- Straßenbauer-Innung Duisburg (Contact: Heiner Kühne)
+- Zweiradmechaniker-Innung Rhein-Ruhr (Contact: Erwin Lohrmann)
+- Friseur-Innung Essen (Contact: Markus Bredenbröcker)
+- Gebäudereiniger-Innung Essen-Mülheim an der Ruhr-Oberhausen (Contact: Stefan Thielen)
+- Gold- und Silberschmiede-Innung Essen (Contact: Zeno Ablass)
+- Maler- und Lackierer-Innung Essen (Contact: Marc-Alexander Kecker)
+- Raumausstatter- und Sattler-Innung Essen (Contact: Michel Gutberlet)
+- Innung des Schilder- und Lichtreklameherstellerhandwerks Essen (Contact: Sascha Schlüter)
+- Steinmetz- und Steinbildhauer-Innung Essen (Contact: Stephan Peters)
+- Straßenbauer-Innung Essen-Mülheim (Contact: Thorsten Potysch)
+- Innung für Vulkaniseur- und Reifenmechanik-Handwerk Rhein-Ruhr (Contact: Horst Kornetka)
+- Bäcker-Innung Niederrhein-Kleve-Wesel (Contact: Johannes Gerhards)
+- Fleischer-Innung des Kreises Kleve (Contact: Heinz Borghs)
+- Friseur-Innung des Kreises Kleve (Contact: Karin Merlin Wrobel)
+- Gold- und Silberschmiede-Innung Niederrhein (Contact: Martin Link)
+- Maler- und Lackierer-Innung des Kreises Kleve (Contact: Franz-Theo Dirmeier)
+- Zweiradmechaniker-Innung des Kreises Kleve (Contact: Markus Daute)
+- Friseur-Innung Kreis Mettmann (Contact: Uwe Ranke)
+- Karosserie- und Fahrzeugbauer-Innung Kreis Mettmann (Contact: Max Witeczek)
+- Innung des Kraftfahrzeughandwerks Kreis Mettmann (Contact: Alfons Kunz)
+- Maler- und Lackierer-Innung Kreis Mettmann (Contact: Ralf Heinz Weber)
+- Raumausstatter- und Sattler-Innung Kreis Mettmann (Contact: Thomas Wittig)
+- Bäcker-Innung Mönchengladbach (Contact: Gertie Riethmacher)
+- Fleischer-Innung Mönchengladbach (Contact: Josef Baumanns)
+- Friseur-Innung Mönchengladbach (Contact: Sabine Capan)
+- Informationstechniker-Innung Mönchengladbach-Neuss (Contact: Dirk Weduwen)
+- Karosserie- und Fahrzeugbauer-Innung Mönchengladbach (Contact: Reiner Brenner)
+- Konditoren-Innung Mönchengladbach (Contact: Manfred Groth)
+- Innung des Kraftfahrzeuggewerbes Mönchengladbach (Contact: Peter Fischer)
+- Maler- und Lackierer-Innung Mönchengladbach (Contact: Udo Nösen)
+- Raumausstatter- und Sattler-Innung Mönchengladbach (Contact: Joachim Rütten)
+- Schuhmacher-Innung linker Niederrhein (Contact: Günther Schellenberger)
+- Zimmerer-Innung Mönchengladbach (Contact: Peter Röders)
+- Fleischer-Innung RheinRuhr (Contact: Jörg Bischoff)
+- Friseur-Innung Mülheim an der Ruhr (Contact: Ralf Wüstefeld)
+- Friseur-Innung Oberhausen-Rheinland (Contact: Bernd Görg)
+- Maler- und Lackierer-Innung Mülheim an der Ruhr-Oberhausen (Contact: Guido vom Ufer)
+- Niederrheinische Bäcker-Innung Krefeld-Viersen-Neuss (Contact: Rudolf Weißert)
+- Bestatter-Innung Nordrhein-Westfalen (Contact: Frank Wesemann)
+- Drechsler-Innung Krefeld (Contact: Klaus Reef)
+- E-Handwerke Niederrhein-Kreis Viersen (Contact: Martin Thomas Nowroth)
+- Fleischer-Innung Niederrhein Krefeld-Viersen-Neuss (Contact: Willi Schillings)
+- Friseur-Innung Krefeld-Viersen-Neuss (Contact: Alexandra Houx-Brenner)
+- Gebäudereiniger-Innung Mittlerer Niederrhein (Contact: Nadine Ludwigs)
+- Innung für Informationstechnik Niederrhein Krefeld-Viersen-Neuss (Contact: Horst Rinsch)
+- Karosserie- und Fahrzeugbauer-Innung Krefeld-Viersen-Neuss (Contact: Ralph Treeker)
+- Konditoren-Innung Niederrhein (Contact: Andreas Achten)
+- Innung des Kraftfahrzeuggewerbes Krefeld-Viersen (Contact: Dietmar Lassek)
+- Kraftfahrzeug-Innung Rhein-Kreis Neuss (Contact: Johannes Brester)
+- Maler- und Lackierer-Innung Niederrhein Krefeld-Neuss-Viersen (Contact: Stephanie Jahrke)
+- Innung für das Modeschaffende Handwerk Niederrhein (Contact: Angelika van Neerven)
+- Steinmetz- und Steinbildhauer-Innung Mittlerer Niederrhein (Contact: Daniel Franzen)
+- Stuckateur-Innung Krefeld-Viersen (Contact: Roland Gerhards)
+- Textilreiniger-Innung für den Regierungsbezirk Düsseldorf (Contact: Dirk Querfurth)
+- Zweiradmechaniker-Innung Niederrhein Krefeld-Viersen-Neuss (Contact: Rolf Langer)
+- Innung für elektrotechnische Handwerke Remscheid (Contact: Andreas Müller)
+- Friseur-Innung Remscheid (Contact: Tanja Kürten-Rauhaus)
+- Innung für das Gebäudereiniger-Handwerk Remscheid-Solingen (Contact: Oliver Knedlich)
+- Innung des Kraftfahrzeughandwerks Remscheid/ (Contact: Thomas Bliß)
+- Maler- und Lackierer-Innung Remscheid (Contact: Holger Schulz)
+- Innung der Nahrungsmittelhandwerke Remscheid (Contact: Birgit Eppels)
+- Steinmetz- und Steinbildhauer-Innung Bergisch Land (Contact: Beate Globisch)
+- Bäcker-Innung Solingen-Wuppertal (Sitz: Wuppertal) (Contact: Dirk Polick)
+- Friseur-Innung Solingen-Wuppertal (Contact: Pia Schneider)
+- Glaser-Innung Wuppertal (Contact: Rafael Musik)
+- Graveur-Innung Solingen-Wuppertal (Contact: Stefan Krüth)
+- Karosserie- und Fahrzeugbauer-Innung Wuppertal (Contact: Martin Rosslan)
+- Innung des Kraftfahrzeughandwerks (Solingen) (Contact: Uwe Stamm)
+- Innung des Kraftfahrzeughandwerks Wuppertal (Contact: Wolfram Friedrich)
+- Maler- und Lackierer-Innung (Solingen) (Contact: Oliver Conrads)
+- Maler- und Lackierer-Innung Wuppertal (Contact: Oliver Conyn)
+- Raumausstatter-Innung Solingen-Wuppertal (Contact: Frank Dembny)
+- Straßen- und Tiefbau-Innung Wuppertal (Contact: Martin Ehlhardt)
+- Stukkateur-Innung Wuppertal-Kreis Mettmann (Contact: Wolfgang Wüstenhagen)
+- Friseur-Innung des Kreises Wesel (Contact: Klaus Peter Neske)
+- Glaser-Innung Niederrhein (Contact: Thomas Schulmeyer)
+- Innung des Kraftfahrzeuggewerbes Niederrhein Kleve-Wesel (Contact: René Gravendyk)
+- Maler- und Lackierer-Innung des Kreises Wesel (Contact: Günter Bode)
+- Innung für Schneid- und Schleiftechnik Nordrhein (Contact: Uwe Peters)
+- Steinmetz- und Steinbildhauer-Innung Niederrhein (Contact: Benedikt L. Kreusch)
+- Stuckateur-Innung Niederrhein (Contact: Norbert Kehrbusch)
+
+## Cologne (Missing: 22)
+- Kreishandwerkerschaft Koeln (Email: lepore@handwerk.koeln) [Not in final list]
+- Buechsenmacher-Innung Nordrhein, RLP und Saarland (Email: kliedl@t-online.de) [Not in final list]
+- Fleischer-Innung Koeln (Email: obermeister@fleischer-koeln.de) [Not in final list]
+- Glaser-Innung Koeln-Bonn-Aachen (Email: mail@glas-bong.de) [Not in final list]
+- Juwelier-, Gold- und Silberschmiede-Innung Koeln (Email: info@sotos-schmuck.de) [Not in final list]
+- Innung Farbe Koeln (Email: s.epe@epe-maler.de) [Not in final list]
+- Innung des Massschneiderhandwerks Koeln / Textileiniger-Innung Koeln/Bonn (Email: twp.koeln@gmail.com) [Not in final list]
+- Innung fuer Metalltechnik Koeln (Email: info@van-broek.de) [Not in final list]
+- Innung fuer Orthopaedie-Technik Koeln (Email: sebastian@malzkorn.at) [Not in final list]
+- Raumausstatter-Innung Koeln (Email: info@diana-breidenbach.de) [Not in final list]
+- Innung Koeln Rollladen und Sonnenschutz (Email: info@rhp-online.de) [Not in final list]
+- Stuckateur-Innung Koeln - Ausbau + Fassade (Email: s.rettig@hhhuerth.de) [Not in final list]
+- Werbetechniker-Innung Koeln - Bonn - Aachen (Email: info@werbetechnik-baecker.de) [Not in final list]
+- Augenoptiker-Innung Koeln-Aachen (Email: info@optikerinnung.de) [Not in final list]
+- Dachdecker- und Zimmerer-Innung Koeln (Email: e-mail@dachdecker-innung-koeln.de) [Not in final list]
+- Elektroinnung Koeln (Email: info@elektroinnungkoeln.de) [Not in final list]
+- Friseur-Innung Koeln (Email: info@kopfarbeit-koeln.de) [Not in final list]
+- Innung des Gebaeudereiniger-Handwerks Koeln-Aachen (Email: info@gebaeudereiniger-koeln-aachen.de) [Not in final list]
+- Bundesinnung fuer das Geruestbauer-Handwerk (Email: info@geruestbauhandwerk.de) [Not in final list]
+- Innung fuer Informationstechnik Koeln/Bonn/Rhein-Sieg/Rhein-Erft (Email: n.gassner@koenig-avt.de) [Not in final list]
+- Karosseriebauer-Innung Koeln (Email: info@karosserie-innungkoeln.de) [Not in final list]
+- Konditoren-Innung Koeln - Bonn (Email: info@cafe-schoener.de) [Not in final list]
+
+## Unterfranken (Missing: 18)
+- Innung für Elektro- und Informationstechnik Bayerischer Untermain
+- Innung für Elektro- und Informationstechnik Haßberge
+- Innung für Elektro- und Informationstechnik Schweinfurt
+- Innung für Elektro- und Informationstechnik Würzburg
+- Friseur-Innung Würzburg, Main-Spessart und Bad Kissingen
+- Karosserie- und Fahrzeugtechnik Innung Unterfranken
+- Innung für Land- und Baumaschinentechnik Unterfranken
+- Maler -, Tüncher- und Lackierer Innung Alzenau
+- Maler- und Lackierer-Innung Aschaffenburg Stadt und Land
+- Maler-, Tüncher- und Lackierer-Innung Rhön-Grabfeld
+- Maler- und Stuckateur-Innung Würzburg und Main-Spessart
+- Innung Metallbau- und Feinwerktechnik Bayerischer Untermain
+- Unterfränkische Ofen- und Luftheizungsbauer-Innung
+- Spengler-, Sanitär- und Heizungstechnik Innung Aschaffenburg - Miltenberg
+- Innung für Spengler-, Sanitär-, und Heizungstechnik Kitzingen
+- SHK-Innung Main-Spessart Innung Sanitär-, Heizungs- und Klimatechnik
+- Innung für Spengler-, Sanitär-, Heizungs- und Klimatechnik Schweinfurt - Main-Rhön
+- Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg
diff --git a/leads/raw/final_leads.csv b/leads/raw/final_leads.csv
new file mode 100644
index 0000000..3432cf1
--- /dev/null
+++ b/leads/raw/final_leads.csv
@@ -0,0 +1,143 @@
+Firm/Innung,Contact Person,Email,Region
+Bäckerinnung Bayerischer Untermain,N/A,v.hench@baeckerinnung-bayerischer-untermain.de,Unterfranken
+Bäckerinnung Bad Kissingen - Rhön-Grabfeld,Petra Schwab,khw-kg@t-online.de,Unterfranken
+Bäckerinnung Bad Kissingen - Rhön-Grabfeld,Ullrich Amthor,info@baeckerei-amthor.com,Unterfranken
+Bäckerinnung Kitzingen,Tilo Brönner,tilo-br@t-online.de,Unterfranken
+Bäckerinnung Schweinfurt - Haßberge,Brigitte Rapp,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+Bäckerinnung Schweinfurt - Haßberge,Gerhard Götz,baeckerei-goetz@web.de,Unterfranken
+Bäckerinnung Mainfranken,Christine Winterbauer,christine.winterbauer@baeckerbuchstelle.de,Unterfranken
+Bäckerinnung Mainfranken,Marcel Scherg,scherge.beck@t-online.de,Unterfranken
+Bauinnung Aschaffenburg,Nina Emeneth,info@bauinnung-aschaffenburg.de,Unterfranken
+Bauinnung Aschaffenburg,Felix Englert,felix.englert@bauinnung-aschaffenburg.de,Unterfranken
+Bauinnung Bad Kissingen / Rhön-Grabfeld,Stefan Goos,stefan.goos@zehe-gmbh.de,Unterfranken
+Bau-Innung Schweinfurt,Ramona Ziegler,info@bauinnung-schweinfurt.de,Unterfranken
+Bau-Innung Schweinfurt,Karl Böhner,boehner-bau@t-online.de,Unterfranken
+Bauinnung Mainfranken - Würzburg,Manfred Dallner,baugewerbe@lbb-unterfranken.de,Unterfranken
+Bauinnung Mainfranken - Würzburg,Ralf Stegmeier,trendbaugmbh@aol.com,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Nicole Brandler,info@innung-unterfranken.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Friedrun Schlagbauer-Werner,info@schneiderin-wuerzburg.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Friedrun Schlagbauer-Werner,info@private-brauereien-bayern.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Josef Göller,geschaeftsleitung@brauerei-goeller.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Josef Göller,lukas.thalheimer@thalheimer.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Lukas Thalheimer,info@mein-dachdecker.com,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Timo Markert,info@elektroinnung-bayerischeruntermain.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Edwin Palzer,info@elektroinnung-hassberge.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Ralf Jooß,info@elektro-jooss.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Ralf Jooß,info@elektroinnung-sw.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Rainer Walter-Helk,rwalter-helk@innotech-solar.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Rainer Walter-Helk,mailbox@elektro-innung-wuerzburg.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Sebastian Seynstahl,se@elektro-seynstahl.de,Unterfranken
+Berufsfotografen-Innung für Unterfranken,N/A,info@foto-alfen.de,Unterfranken
+Friseur-Innung Aschaffenburg Stadt und Land,N/A,friseurinnung-aschaffenburg@t-online.de,Unterfranken
+Friseur-Innung Aschaffenburg Stadt und Land,Corina Bayer,cbm.bayer@t-online.de,Unterfranken
+Friseur-Innung Haßberge,Heinz Göhr,info@team-art-of-hair.com,Unterfranken
+Friseurinnung Kitzingen,N/A,sabine.hack71@web.de,Unterfranken
+Friseurinnung Miltenberg,N/A,info@haarmonique.de,Unterfranken
+Friseurinnung Main-Rhön,Margit Rosentritt,katharinawalker88@gmx.de,Unterfranken
+Friseurinnung Main-Rhön,Katharina Walker,info@frank-bauglaserei.de,Unterfranken
+Kaminkehrer-Innung Unterfranken,N/A,info@kaminkehrerinnung-unterfranken.de,Unterfranken
+Kaminkehrer-Innung Unterfranken,Benjamin Schreck,benjamin.schreck@t-online.de,Unterfranken
+Kaminkehrer-Innung Unterfranken,Benjamin Schreck,info@khw-nuernberg.de,Unterfranken
+Kaminkehrer-Innung Unterfranken,Michael Seidel,info@seidel-karosserie.de,Unterfranken
+Kfz-Innung Unterfranken,Michael Frank,info@kfz-innung-ufr.de,Unterfranken
+Kfz-Innung Unterfranken,Roland Hoier,roland.hoier@autohaus-keller.de,Unterfranken
+Kfz-Innung Unterfranken,Bertram Muth,bertram.muth@outlook.de,Unterfranken
+Maler,N/A,maler_trageser@gmx.de,Unterfranken
+Maler,Karlheinz Trageser,uta.kern@kolb-kern.de,Unterfranken
+Maler,Ansgar Kern,ansgar.kern@kolb-kern.de,Unterfranken
+Maler,Mathias Stöth,mathias@stoeth-fuchsstadt.de,Unterfranken
+Maler,Mathias Stöth,obermeister@malerinnung-hassberge.de,Unterfranken
+Maler,Michael Ott,info@malerinnung-kitzingen.de,Unterfranken
+Maler,Thomas Wandler,mail@maler-wandler.de,Unterfranken
+Maler,Thomas Wandler,info@farbe-miltenberg.de,Unterfranken
+Maler,Jan Becker,info@malerinnung-rg.de,Unterfranken
+Malerinnung Schweinfurt Stadt- und Land,Andreas Spath,info@spath-tuencher.de,Unterfranken
+Malerinnung Schweinfurt Stadt- und Land,Andreas Spath,info@malerinnung-wuerzburg.de,Unterfranken
+Malerinnung Schweinfurt Stadt- und Land,Peter Killinger,info@manufatture-colori.de,Unterfranken
+Malerinnung Schweinfurt Stadt- und Land,Peter Killinger,info@innung-metallbau-feinwerktechnik.de,Unterfranken
+Malerinnung Schweinfurt Stadt- und Land,Matthias Kreß,m.kress@wassermannkress.de,Unterfranken
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,Klaus Engelmann,info@metallbau-engelmann.de,Unterfranken
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,René Dauelsberg,rd@mpi-dauelsberg.de,Unterfranken
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,René Dauelsberg,info@metallinnung-mainfranken.de,Unterfranken
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,Detlef Lurz,detlef.lurz@lurz-metalltec.de,Unterfranken
+Metzgerinnung Aschaffenburg,Dagobert Pfarr,metzgerei-pfarr@t-online.de,Unterfranken
+Metzgerinnung Aschaffenburg,Marco Häuser,marco.haeuser@haeuser-hra.de,Unterfranken
+Fleischer-Innung Main-Spessart,Sebastian Bumm,fleischerinnungMSP@gmx.de,Unterfranken
+Fleischer-Innung Main-Spessart,Sebastian Bumm,metzgerei-bumm@t-online.de,Unterfranken
+Metzgerinnung Miltenberg,N/A,j.neuberger@t-online.de,Unterfranken
+Metzgerinnung Main-Rhön,"Jürgen Straub, Sonja Grob",innung@fleischerring.de,Unterfranken
+Metzgerinnung Main-Rhön,Barbara Fink,metzgerei_dros_fladungen@outlook.de,Unterfranken
+Metzger-Innung Würzburg,N/A,horst@schoemig.eu,Unterfranken
+Metzger-Innung Würzburg,Horst Schömig,horst.schoemig@arcor.de,Unterfranken
+Metzger-Innung Würzburg,Horst Schömig,josef.bock60@gmail.com,Unterfranken
+Metzger-Innung Würzburg,Michael Heigel,heigel@heigel.de,Unterfranken
+Metzger-Innung Würzburg,Hermann Noske,mail@sofa-shop.de,Unterfranken
+Metzger-Innung Würzburg,Hermann Noske,shk-aschaffenburg@t-online.de,Unterfranken
+Metzger-Innung Würzburg,Christoph Winkler,c.winkler@cw-haustechnik.de,Unterfranken
+Metzger-Innung Würzburg,Christoph Winkler,innung-kitzingen@freenet.de,Unterfranken
+Metzger-Innung Würzburg,Thomas Lößlein,thomas_loesslein@t-online.de,Unterfranken
+Metzger-Innung Würzburg,Thomas Lößlein,info@shk-main-spessart.de,Unterfranken
+Metzger-Innung Würzburg,Johannes Reber,info@shk-schweinfurt.de,Unterfranken
+Metzger-Innung Würzburg,Heinz Schuchbauer,innung.shk@t-online.de,Unterfranken
+Metzger-Innung Würzburg,Werner Rath,info@dellers-werkstatt.de,Unterfranken
+Metzger-Innung Würzburg,Norbert Borst,service@norbert-borst.de,Unterfranken
+Metzger-Innung Würzburg,Norbert Borst,wt@reichert-betten.de,Unterfranken
+Metzger-Innung Würzburg,Werner Tausch,info@schreiner-rhoen-grabfeld.de,Unterfranken
+Metzger-Innung Würzburg,Michael Werner,michael@werner-objekteinrichtungen.de,Unterfranken
+Metzger-Innung Würzburg,Horst Zitterbart,schreinerei.zitterbart@t-online.de,Unterfranken
+Metzger-Innung Würzburg,Horst Zitterbart,info@schreinerinnung-mainfranken.de,Unterfranken
+Metzger-Innung Würzburg,Thomas Heußlein,info@schreinerei-heusslein.de,Unterfranken
+Metzger-Innung Würzburg,Thomas Heußlein,l.emge@t-online.de,Unterfranken
+Metzger-Innung Würzburg,Sebastian Ludwig,info@geisendoerfer-online.de,Unterfranken
+Metzger-Innung Würzburg,Sebastian Ludwig,m.graf@hwk-ufr.de,Unterfranken
+Metzger-Innung Würzburg,Klaus Imhof,kontakt@juwelier-imhof.de,Unterfranken
+Zimmerer-Innung Aschaffenburg - Miltenberg,Theresa Breunig,info@zimmerer-aschaffenburg-miltenberg.de,Unterfranken
+Zimmerer-Innung Aschaffenburg - Miltenberg,Jürgen Pfarr,info@zimmerei-juergen-pfarr.de,Unterfranken
+Zimmerer-Innung Bad Neustadt,N/A,info@holzbau-eyrich.de,Unterfranken
+Zimmerer-Innung Main-Spessart,Ulrike Feser,info@zimmerer-wuerzburg-kitzingen.de,Unterfranken
+Zimmerer-Innung Main-Spessart,Volker Schäfer,info@schaefer-halsbach.de,Unterfranken
+Zimmerer-Innung Schweinfurt-Haßberge,Marion Reichhold,zimmerei_klaus_treiber@gmx.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,lang@zimmerer-wuerzburg-kitzingen.de,Unterfranken
+Kreishandwerkerschaft Aschaffenburg,Claudia Find,info@khw-ab.de,Unterfranken
+Kreishandwerkerschaft Bad Kissingen,Ulrike Lochner-Erhard,lochner-baudekoration-gmbh@t-online.de,Unterfranken
+Kreishandwerkerschaft Haßberge,Udo Merz,u.merz@haustechnik-merz.de,Unterfranken
+Kreishandwerkerschaft Kitzingen,Elisabeth Hofmann,khw.kitzingen@gmail.com,Unterfranken
+Kreishandwerkerschaft Kitzingen,Monika Henneberger,monika.henneberger@t-online.de,Unterfranken
+Kreishandwerkerschaft Main-Spessart,Petra Stegerwald,petra@stegerwald.de,Unterfranken
+Kreishandwerkerschaft Miltenberg,N/A,kreishandwerker.mil@gmail.com,Unterfranken
+Kreishandwerkerschaft Miltenberg,Monique Haas,monique3003@arcor.de,Unterfranken
+Kreishandwerkerschaft Rhön-Grabfeld,N/A,khwsch-rhoen-grabfeld@mail.de,Unterfranken
+Kreishandwerkerschaft Rhön-Grabfeld,Bruno Werner,info@werner-objekteinrichtungen.de,Unterfranken
+E-Mail: rapp@Kreishandwerkerschaft-sw.de,N/A,rapp@Kreishandwerkerschaft-sw.de,Unterfranken
+Kreishandwerkerschaft Würzburg,Sandra Köller,info@kreishandwerkerschaft-wuerzburg.de,Unterfranken
+Kreishandwerkerschaft Würzburg,Martin Strobl,innung@elektro-strobl.de,Unterfranken
+Baugewerks-Innung Duisburg,Volker Blastik,info@baugewerksinnung-duisburg.de,Düsseldorf/Surrounding
+Graveur- und Metallbildner-Innung Rhein-Ruhr,Till Esser,info@kh-mo.de,Düsseldorf/Surrounding
+Metall-Innung Essen,Björn Bergmann,info@metallhandwerk-essen.de,Düsseldorf/Surrounding
+Innung für Metallhandwerk des Kreises Kleve,Johannes Flinterhoff,info@kh-kleve.de,Düsseldorf/Surrounding
+Bau-Innung Kreis Mettmann,Thomas Grünendahl,info@handwerk-me.de,Düsseldorf/Surrounding
+Innung für Metalltechnik Kreis Mettmann,Reiner Schumacher,info@handwerk-me.de,Düsseldorf/Surrounding
+Bau-Innung Mönchengladbach,Dipl.-Ing. Frank Bühler,info@kh-mg.de,Düsseldorf/Surrounding
+Metall-Innung Mönchengladbach-Rheydt,Adam Sautner,info@kh-mg.de,Düsseldorf/Surrounding
+Baugewerks-Innung Mülheim an der Ruhr-Oberhausen,Jürgen Bunk,info@kh-mo.de,Düsseldorf/Surrounding
+Innung für Metallhandwerke Mülheim an der Ruhr-Oberhausen,Johannes Arnzen,info@metallbauinnung-mh-ob.de,Düsseldorf/Surrounding
+Bau-Innung Neuss-Viersen,Thomas Goldmann,info@kh-niederrhein.de,Düsseldorf/Surrounding
+Innung für Land- und Baumaschinentechnik Niederrhein,Franz-Josef Schulte,info@kh-niederrhein.de,Düsseldorf/Surrounding
+Metall-Innung Niederrhein,Klaus Caris,info@kh-niederrhein.de,Düsseldorf/Surrounding
+Bau-Innung Remscheid,Carsten Hof,info@handwerk-remscheid.de,Düsseldorf/Surrounding
+Fachinnung Metall- und Graviertechnik Remscheid,Uwe Wiegand,info@handwerk-remscheid.de,Düsseldorf/Surrounding
+Bau-Innung Wuppertal-Solingen,Marcus Koch,info@bauinnung-wuppertal.de,Düsseldorf/Surrounding
+Innung der Metallhandwerke (Solingen),Thomas Blau,info@handwerk-sgw.de,Düsseldorf/Surrounding
+Innung für Metallhandwerke Wuppertal,Christian Flüss,info@handwerk-sgw.de,Düsseldorf/Surrounding
+Baugewerks-Innung des Kreises Wesel,Gerhard Landwehrs,info@khwesel.de,Düsseldorf/Surrounding
+Metall-Innung des Kreises Wesel,Rainer Theunissen,info@metallinnung-wesel.de,Düsseldorf/Surrounding
+Fotografen-Innung Düsseldorf-Aachen-Köln,Guido de Nardo,info@Fotografen-DUS.de,Düsseldorf/Surrounding
+Maßschneider-Innung Düsseldorf,Sandra Gronemeier,info@mass-schneider-innung.de,Düsseldorf/Surrounding
+Musikinstrumentenmacher-Innung Nordrhein,Christoph Böttcher,info@musikinstrumentenmacher-innung.de,Düsseldorf/Surrounding
+Straßen- und Tiefbauer-Innung Düsseldorf,André Grimmert,info@strassenbauer-innung-duesseldorf.de,Düsseldorf/Surrounding
+Drucker- (Buchdrucker-)- und Buchbinder-Innung Duisburg,Bodo H. Oppenberg,info@handwerk-duisburg.de,Düsseldorf/Surrounding
+Glasapparatebauer-Innung Duisburg,Dieter Verhees,hippler@handwerk-duisburg.de,Düsseldorf/Surrounding
+Innung des modeschaffenden Handwerks Duisburg,Charlotte Noé,info@handwerk-duisburg.de,Düsseldorf/Surrounding
+Raumausstatter-Innung Rhein-Ruhr,Kay Piller,info@handwerk-duisburg.de,Düsseldorf/Surrounding
+Zweiradmechaniker-Innung Rhein-Ruhr,Erwin Lohrmann,info@handwerk-duisburg.de,Düsseldorf/Surrounding
+Verband der Berufsfotografen Ruhr,Andreas Köhring,ak@koehring-fotografie.de,Düsseldorf/Surrounding
diff --git a/leads/raw/innungen_leads_koeln_duesseldorf.csv b/leads/raw/innungen_leads_koeln_duesseldorf.csv
new file mode 100644
index 0000000..1033ba5
--- /dev/null
+++ b/leads/raw/innungen_leads_koeln_duesseldorf.csv
@@ -0,0 +1,34 @@
+region,organisation,url,kontaktperson,email,facebook,instagram,linkedin,twitter
+Koeln,Kreishandwerkerschaft Koeln,www.handwerk.koeln,Roberto Lepore (Hauptgeschaeftsfuehrer) / Nicolai Lucks (Kreishandwerksmeister),lepore@handwerk.koeln,,,,
+Koeln,"Buechsenmacher-Innung Nordrhein, RLP und Saarland",,Klaus-Bernd Liedl (Obermeister),kliedl@t-online.de,,,,
+Koeln,Fleischer-Innung Koeln,,Astrid Schmitz (Obermeisterin),obermeister@fleischer-koeln.de,,,,
+Koeln,Glaser-Innung Koeln-Bonn-Aachen,,Anne Bong (Obermeisterin),mail@glas-bong.de,,,,
+Koeln,"Juwelier-, Gold- und Silberschmiede-Innung Koeln",,Ingo Telkmann (Obermeister),info@sotos-schmuck.de,,,,
+Koeln,Innung Farbe Koeln,,Sebastian Epe (Obermeister),s.epe@epe-maler.de,,,,
+Koeln,Innung des Massschneiderhandwerks Koeln / Textileiniger-Innung Koeln/Bonn,,Thomas Wien-Pegelow (Obermeister),twp.koeln@gmail.com,,,,
+Koeln,Innung fuer Metalltechnik Koeln,,Sascha Franke (Obermeister),info@van-broek.de,,,,
+Koeln,Innung fuer Orthopaedie-Technik Koeln,,Sebastian Malzkorn (Obermeister),sebastian@malzkorn.at,,,,
+Koeln,Raumausstatter-Innung Koeln,,Diana Goeddertz (Obermeisterin),info@diana-breidenbach.de,,,,
+Koeln,Innung Koeln Rollladen und Sonnenschutz,,Andre Urban (Obermeister),info@rhp-online.de,,,,
+Koeln,Stuckateur-Innung Koeln - Ausbau + Fassade,,Sarah M. Rettig (Obermeisterin),s.rettig@hhhuerth.de,,,,
+Koeln,Werbetechniker-Innung Koeln - Bonn - Aachen,,Markus Boecker (Obermeister),info@werbetechnik-baecker.de,,,,
+Koeln,Augenoptiker-Innung Koeln-Aachen,www.optikerinnung.de/aoi/,Hans Josef Schuemmer (Obermeister),info@optikerinnung.de,,,https://www.linkedin.com/company/aov-nrw,
+Koeln,Dachdecker- und Zimmerer-Innung Koeln,www.dachdecker-innung-koeln.de,Oliver Miesen (Obermeister) / Bettina Dietrich (Geschaeftsfuehrerin),e-mail@dachdecker-innung-koeln.de,,,,
+Koeln,Elektroinnung Koeln,www.elektroinnungkoeln.de,Ralf Janowski (Obermeister),info@elektroinnungkoeln.de,https://www.facebook.com/ELEKTROINNUNG-K,https://www.instagram.com/elektroinnungkoeln/,,
+Koeln,Friseur-Innung Koeln,www.kopfarbeit-koeln.de,Mike Engels (Obermeister) / Julia Barth (Geschaeftsfuehrerin),info@kopfarbeit-koeln.de,,,,
+Koeln,Innung des Gebaeudereiniger-Handwerks Koeln-Aachen,www.gebaeudereiniger-koeln-aachen.de,Detlef Ptak (Obermeister) / Jennifer Schramm (Geschaeftsfuehrerin),info@gebaeudereiniger-koeln-aachen.de,,,,
+Koeln,Bundesinnung fuer das Geruestbauer-Handwerk,www.geruestbauhandwerk.de,Marcus Nachbauer (Bundesinnungsmeister) / Sabrina Luther (Geschaeftsfuehrerin),info@geruestbauhandwerk.de,,,,
+Koeln,Innung fuer Informationstechnik Koeln/Bonn/Rhein-Sieg/Rhein-Erft,,Nicolay Gassner (Obermeister),n.gassner@koenig-avt.de,,,,
+Koeln,Karosseriebauer-Innung Koeln,www.karosserie-innungkoeln.de,Oliver Nienhaus (Obermeister) / Claudia Weiler (Geschaeftsfuehrerin),info@karosserie-innungkoeln.de,https://www.facebook.com/KarosseriebauerKoeln/,,,
+Koeln,Konditoren-Innung Koeln - Bonn,,Rudolf Schoener (Obermeister),info@cafe-schoener.de,,,,
+Duesseldorf,Augenoptiker-Innung Duessel-Rhein-Ruhr,,Jens Schulz (Obermeister),,,,,
+Duesseldorf,Verband des Rheinischen Baeckerhandwerks,,Henning Funke (GF) / Johannes Dackweiler (Obermeister),,,,,
+Duesseldorf,Baugewerbe-Innung Duesseldorf,,Peter Szemenyei (GF) / Christoph Morick (Obermeister),,,,,
+Duesseldorf,Bestatter-Innung NRW,,Christian Jaeger (GF) / Frank Wesemann (Obermeister),,,,,
+Duesseldorf,Fleischer-Innung Duesseldorf-Mettmann-Solingen,,Daniela van der Valk (GF) / Lutz Kluke (Obermeister),,,,,
+Duesseldorf,Innung des Kraftfahrzeuggewerbes Duesseldorf,,Sven Gustavson (GF) / Hermann Goertz (Obermeister),,https://www.facebook.com/kfzgewerbenrw/,https://www.instagram.com/kfznrw/,,
+Duesseldorf,Innung fuer Orthopaedie-Schuhtechnik Rheinland/Westfalen,,Irene Zamponi (GF) / Philipp Radtke (Obermeister),,,,,
+Duesseldorf,Innung fuer Sanitaer- und Heizungstechnik Duesseldorf,,Horst Jansen (GF) / Hans Werner Eschrich (Obermeister),,,,,
+Duesseldorf,Schornsteinfeger-Innung Regierungsbezirk Duesseldorf,,Marcus Doerenkamp (GF),,,,,
+Duesseldorf,Stukkatuer-Innung Wuppertal und Kreis Mettmann,,Hermann Schulte-Hiltrop (HGF) / Wolfgang Wuestenhagen (Obermeister),,,,,
+Duesseldorf,Zahntechniker-Innung Duesseldorf,,Michael Knittel (GF) / Dominik Kruchen (Obermeister),,,,,
diff --git a/leads/raw/leads.csv b/leads/raw/leads.csv
new file mode 100644
index 0000000..3432cf1
--- /dev/null
+++ b/leads/raw/leads.csv
@@ -0,0 +1,143 @@
+Firm/Innung,Contact Person,Email,Region
+Bäckerinnung Bayerischer Untermain,N/A,v.hench@baeckerinnung-bayerischer-untermain.de,Unterfranken
+Bäckerinnung Bad Kissingen - Rhön-Grabfeld,Petra Schwab,khw-kg@t-online.de,Unterfranken
+Bäckerinnung Bad Kissingen - Rhön-Grabfeld,Ullrich Amthor,info@baeckerei-amthor.com,Unterfranken
+Bäckerinnung Kitzingen,Tilo Brönner,tilo-br@t-online.de,Unterfranken
+Bäckerinnung Schweinfurt - Haßberge,Brigitte Rapp,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+Bäckerinnung Schweinfurt - Haßberge,Gerhard Götz,baeckerei-goetz@web.de,Unterfranken
+Bäckerinnung Mainfranken,Christine Winterbauer,christine.winterbauer@baeckerbuchstelle.de,Unterfranken
+Bäckerinnung Mainfranken,Marcel Scherg,scherge.beck@t-online.de,Unterfranken
+Bauinnung Aschaffenburg,Nina Emeneth,info@bauinnung-aschaffenburg.de,Unterfranken
+Bauinnung Aschaffenburg,Felix Englert,felix.englert@bauinnung-aschaffenburg.de,Unterfranken
+Bauinnung Bad Kissingen / Rhön-Grabfeld,Stefan Goos,stefan.goos@zehe-gmbh.de,Unterfranken
+Bau-Innung Schweinfurt,Ramona Ziegler,info@bauinnung-schweinfurt.de,Unterfranken
+Bau-Innung Schweinfurt,Karl Böhner,boehner-bau@t-online.de,Unterfranken
+Bauinnung Mainfranken - Würzburg,Manfred Dallner,baugewerbe@lbb-unterfranken.de,Unterfranken
+Bauinnung Mainfranken - Würzburg,Ralf Stegmeier,trendbaugmbh@aol.com,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Nicole Brandler,info@innung-unterfranken.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Friedrun Schlagbauer-Werner,info@schneiderin-wuerzburg.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Friedrun Schlagbauer-Werner,info@private-brauereien-bayern.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Josef Göller,geschaeftsleitung@brauerei-goeller.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Josef Göller,lukas.thalheimer@thalheimer.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Lukas Thalheimer,info@mein-dachdecker.com,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Timo Markert,info@elektroinnung-bayerischeruntermain.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Edwin Palzer,info@elektroinnung-hassberge.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Ralf Jooß,info@elektro-jooss.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Ralf Jooß,info@elektroinnung-sw.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Rainer Walter-Helk,rwalter-helk@innotech-solar.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Rainer Walter-Helk,mailbox@elektro-innung-wuerzburg.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Sebastian Seynstahl,se@elektro-seynstahl.de,Unterfranken
+Berufsfotografen-Innung für Unterfranken,N/A,info@foto-alfen.de,Unterfranken
+Friseur-Innung Aschaffenburg Stadt und Land,N/A,friseurinnung-aschaffenburg@t-online.de,Unterfranken
+Friseur-Innung Aschaffenburg Stadt und Land,Corina Bayer,cbm.bayer@t-online.de,Unterfranken
+Friseur-Innung Haßberge,Heinz Göhr,info@team-art-of-hair.com,Unterfranken
+Friseurinnung Kitzingen,N/A,sabine.hack71@web.de,Unterfranken
+Friseurinnung Miltenberg,N/A,info@haarmonique.de,Unterfranken
+Friseurinnung Main-Rhön,Margit Rosentritt,katharinawalker88@gmx.de,Unterfranken
+Friseurinnung Main-Rhön,Katharina Walker,info@frank-bauglaserei.de,Unterfranken
+Kaminkehrer-Innung Unterfranken,N/A,info@kaminkehrerinnung-unterfranken.de,Unterfranken
+Kaminkehrer-Innung Unterfranken,Benjamin Schreck,benjamin.schreck@t-online.de,Unterfranken
+Kaminkehrer-Innung Unterfranken,Benjamin Schreck,info@khw-nuernberg.de,Unterfranken
+Kaminkehrer-Innung Unterfranken,Michael Seidel,info@seidel-karosserie.de,Unterfranken
+Kfz-Innung Unterfranken,Michael Frank,info@kfz-innung-ufr.de,Unterfranken
+Kfz-Innung Unterfranken,Roland Hoier,roland.hoier@autohaus-keller.de,Unterfranken
+Kfz-Innung Unterfranken,Bertram Muth,bertram.muth@outlook.de,Unterfranken
+Maler,N/A,maler_trageser@gmx.de,Unterfranken
+Maler,Karlheinz Trageser,uta.kern@kolb-kern.de,Unterfranken
+Maler,Ansgar Kern,ansgar.kern@kolb-kern.de,Unterfranken
+Maler,Mathias Stöth,mathias@stoeth-fuchsstadt.de,Unterfranken
+Maler,Mathias Stöth,obermeister@malerinnung-hassberge.de,Unterfranken
+Maler,Michael Ott,info@malerinnung-kitzingen.de,Unterfranken
+Maler,Thomas Wandler,mail@maler-wandler.de,Unterfranken
+Maler,Thomas Wandler,info@farbe-miltenberg.de,Unterfranken
+Maler,Jan Becker,info@malerinnung-rg.de,Unterfranken
+Malerinnung Schweinfurt Stadt- und Land,Andreas Spath,info@spath-tuencher.de,Unterfranken
+Malerinnung Schweinfurt Stadt- und Land,Andreas Spath,info@malerinnung-wuerzburg.de,Unterfranken
+Malerinnung Schweinfurt Stadt- und Land,Peter Killinger,info@manufatture-colori.de,Unterfranken
+Malerinnung Schweinfurt Stadt- und Land,Peter Killinger,info@innung-metallbau-feinwerktechnik.de,Unterfranken
+Malerinnung Schweinfurt Stadt- und Land,Matthias Kreß,m.kress@wassermannkress.de,Unterfranken
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,Klaus Engelmann,info@metallbau-engelmann.de,Unterfranken
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,René Dauelsberg,rd@mpi-dauelsberg.de,Unterfranken
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,René Dauelsberg,info@metallinnung-mainfranken.de,Unterfranken
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,Detlef Lurz,detlef.lurz@lurz-metalltec.de,Unterfranken
+Metzgerinnung Aschaffenburg,Dagobert Pfarr,metzgerei-pfarr@t-online.de,Unterfranken
+Metzgerinnung Aschaffenburg,Marco Häuser,marco.haeuser@haeuser-hra.de,Unterfranken
+Fleischer-Innung Main-Spessart,Sebastian Bumm,fleischerinnungMSP@gmx.de,Unterfranken
+Fleischer-Innung Main-Spessart,Sebastian Bumm,metzgerei-bumm@t-online.de,Unterfranken
+Metzgerinnung Miltenberg,N/A,j.neuberger@t-online.de,Unterfranken
+Metzgerinnung Main-Rhön,"Jürgen Straub, Sonja Grob",innung@fleischerring.de,Unterfranken
+Metzgerinnung Main-Rhön,Barbara Fink,metzgerei_dros_fladungen@outlook.de,Unterfranken
+Metzger-Innung Würzburg,N/A,horst@schoemig.eu,Unterfranken
+Metzger-Innung Würzburg,Horst Schömig,horst.schoemig@arcor.de,Unterfranken
+Metzger-Innung Würzburg,Horst Schömig,josef.bock60@gmail.com,Unterfranken
+Metzger-Innung Würzburg,Michael Heigel,heigel@heigel.de,Unterfranken
+Metzger-Innung Würzburg,Hermann Noske,mail@sofa-shop.de,Unterfranken
+Metzger-Innung Würzburg,Hermann Noske,shk-aschaffenburg@t-online.de,Unterfranken
+Metzger-Innung Würzburg,Christoph Winkler,c.winkler@cw-haustechnik.de,Unterfranken
+Metzger-Innung Würzburg,Christoph Winkler,innung-kitzingen@freenet.de,Unterfranken
+Metzger-Innung Würzburg,Thomas Lößlein,thomas_loesslein@t-online.de,Unterfranken
+Metzger-Innung Würzburg,Thomas Lößlein,info@shk-main-spessart.de,Unterfranken
+Metzger-Innung Würzburg,Johannes Reber,info@shk-schweinfurt.de,Unterfranken
+Metzger-Innung Würzburg,Heinz Schuchbauer,innung.shk@t-online.de,Unterfranken
+Metzger-Innung Würzburg,Werner Rath,info@dellers-werkstatt.de,Unterfranken
+Metzger-Innung Würzburg,Norbert Borst,service@norbert-borst.de,Unterfranken
+Metzger-Innung Würzburg,Norbert Borst,wt@reichert-betten.de,Unterfranken
+Metzger-Innung Würzburg,Werner Tausch,info@schreiner-rhoen-grabfeld.de,Unterfranken
+Metzger-Innung Würzburg,Michael Werner,michael@werner-objekteinrichtungen.de,Unterfranken
+Metzger-Innung Würzburg,Horst Zitterbart,schreinerei.zitterbart@t-online.de,Unterfranken
+Metzger-Innung Würzburg,Horst Zitterbart,info@schreinerinnung-mainfranken.de,Unterfranken
+Metzger-Innung Würzburg,Thomas Heußlein,info@schreinerei-heusslein.de,Unterfranken
+Metzger-Innung Würzburg,Thomas Heußlein,l.emge@t-online.de,Unterfranken
+Metzger-Innung Würzburg,Sebastian Ludwig,info@geisendoerfer-online.de,Unterfranken
+Metzger-Innung Würzburg,Sebastian Ludwig,m.graf@hwk-ufr.de,Unterfranken
+Metzger-Innung Würzburg,Klaus Imhof,kontakt@juwelier-imhof.de,Unterfranken
+Zimmerer-Innung Aschaffenburg - Miltenberg,Theresa Breunig,info@zimmerer-aschaffenburg-miltenberg.de,Unterfranken
+Zimmerer-Innung Aschaffenburg - Miltenberg,Jürgen Pfarr,info@zimmerei-juergen-pfarr.de,Unterfranken
+Zimmerer-Innung Bad Neustadt,N/A,info@holzbau-eyrich.de,Unterfranken
+Zimmerer-Innung Main-Spessart,Ulrike Feser,info@zimmerer-wuerzburg-kitzingen.de,Unterfranken
+Zimmerer-Innung Main-Spessart,Volker Schäfer,info@schaefer-halsbach.de,Unterfranken
+Zimmerer-Innung Schweinfurt-Haßberge,Marion Reichhold,zimmerei_klaus_treiber@gmx.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,lang@zimmerer-wuerzburg-kitzingen.de,Unterfranken
+Kreishandwerkerschaft Aschaffenburg,Claudia Find,info@khw-ab.de,Unterfranken
+Kreishandwerkerschaft Bad Kissingen,Ulrike Lochner-Erhard,lochner-baudekoration-gmbh@t-online.de,Unterfranken
+Kreishandwerkerschaft Haßberge,Udo Merz,u.merz@haustechnik-merz.de,Unterfranken
+Kreishandwerkerschaft Kitzingen,Elisabeth Hofmann,khw.kitzingen@gmail.com,Unterfranken
+Kreishandwerkerschaft Kitzingen,Monika Henneberger,monika.henneberger@t-online.de,Unterfranken
+Kreishandwerkerschaft Main-Spessart,Petra Stegerwald,petra@stegerwald.de,Unterfranken
+Kreishandwerkerschaft Miltenberg,N/A,kreishandwerker.mil@gmail.com,Unterfranken
+Kreishandwerkerschaft Miltenberg,Monique Haas,monique3003@arcor.de,Unterfranken
+Kreishandwerkerschaft Rhön-Grabfeld,N/A,khwsch-rhoen-grabfeld@mail.de,Unterfranken
+Kreishandwerkerschaft Rhön-Grabfeld,Bruno Werner,info@werner-objekteinrichtungen.de,Unterfranken
+E-Mail: rapp@Kreishandwerkerschaft-sw.de,N/A,rapp@Kreishandwerkerschaft-sw.de,Unterfranken
+Kreishandwerkerschaft Würzburg,Sandra Köller,info@kreishandwerkerschaft-wuerzburg.de,Unterfranken
+Kreishandwerkerschaft Würzburg,Martin Strobl,innung@elektro-strobl.de,Unterfranken
+Baugewerks-Innung Duisburg,Volker Blastik,info@baugewerksinnung-duisburg.de,Düsseldorf/Surrounding
+Graveur- und Metallbildner-Innung Rhein-Ruhr,Till Esser,info@kh-mo.de,Düsseldorf/Surrounding
+Metall-Innung Essen,Björn Bergmann,info@metallhandwerk-essen.de,Düsseldorf/Surrounding
+Innung für Metallhandwerk des Kreises Kleve,Johannes Flinterhoff,info@kh-kleve.de,Düsseldorf/Surrounding
+Bau-Innung Kreis Mettmann,Thomas Grünendahl,info@handwerk-me.de,Düsseldorf/Surrounding
+Innung für Metalltechnik Kreis Mettmann,Reiner Schumacher,info@handwerk-me.de,Düsseldorf/Surrounding
+Bau-Innung Mönchengladbach,Dipl.-Ing. Frank Bühler,info@kh-mg.de,Düsseldorf/Surrounding
+Metall-Innung Mönchengladbach-Rheydt,Adam Sautner,info@kh-mg.de,Düsseldorf/Surrounding
+Baugewerks-Innung Mülheim an der Ruhr-Oberhausen,Jürgen Bunk,info@kh-mo.de,Düsseldorf/Surrounding
+Innung für Metallhandwerke Mülheim an der Ruhr-Oberhausen,Johannes Arnzen,info@metallbauinnung-mh-ob.de,Düsseldorf/Surrounding
+Bau-Innung Neuss-Viersen,Thomas Goldmann,info@kh-niederrhein.de,Düsseldorf/Surrounding
+Innung für Land- und Baumaschinentechnik Niederrhein,Franz-Josef Schulte,info@kh-niederrhein.de,Düsseldorf/Surrounding
+Metall-Innung Niederrhein,Klaus Caris,info@kh-niederrhein.de,Düsseldorf/Surrounding
+Bau-Innung Remscheid,Carsten Hof,info@handwerk-remscheid.de,Düsseldorf/Surrounding
+Fachinnung Metall- und Graviertechnik Remscheid,Uwe Wiegand,info@handwerk-remscheid.de,Düsseldorf/Surrounding
+Bau-Innung Wuppertal-Solingen,Marcus Koch,info@bauinnung-wuppertal.de,Düsseldorf/Surrounding
+Innung der Metallhandwerke (Solingen),Thomas Blau,info@handwerk-sgw.de,Düsseldorf/Surrounding
+Innung für Metallhandwerke Wuppertal,Christian Flüss,info@handwerk-sgw.de,Düsseldorf/Surrounding
+Baugewerks-Innung des Kreises Wesel,Gerhard Landwehrs,info@khwesel.de,Düsseldorf/Surrounding
+Metall-Innung des Kreises Wesel,Rainer Theunissen,info@metallinnung-wesel.de,Düsseldorf/Surrounding
+Fotografen-Innung Düsseldorf-Aachen-Köln,Guido de Nardo,info@Fotografen-DUS.de,Düsseldorf/Surrounding
+Maßschneider-Innung Düsseldorf,Sandra Gronemeier,info@mass-schneider-innung.de,Düsseldorf/Surrounding
+Musikinstrumentenmacher-Innung Nordrhein,Christoph Böttcher,info@musikinstrumentenmacher-innung.de,Düsseldorf/Surrounding
+Straßen- und Tiefbauer-Innung Düsseldorf,André Grimmert,info@strassenbauer-innung-duesseldorf.de,Düsseldorf/Surrounding
+Drucker- (Buchdrucker-)- und Buchbinder-Innung Duisburg,Bodo H. Oppenberg,info@handwerk-duisburg.de,Düsseldorf/Surrounding
+Glasapparatebauer-Innung Duisburg,Dieter Verhees,hippler@handwerk-duisburg.de,Düsseldorf/Surrounding
+Innung des modeschaffenden Handwerks Duisburg,Charlotte Noé,info@handwerk-duisburg.de,Düsseldorf/Surrounding
+Raumausstatter-Innung Rhein-Ruhr,Kay Piller,info@handwerk-duisburg.de,Düsseldorf/Surrounding
+Zweiradmechaniker-Innung Rhein-Ruhr,Erwin Lohrmann,info@handwerk-duisburg.de,Düsseldorf/Surrounding
+Verband der Berufsfotografen Ruhr,Andreas Köhring,ak@koehring-fotografie.de,Düsseldorf/Surrounding
diff --git a/leads/raw/leads_unterfranken.csv b/leads/raw/leads_unterfranken.csv
new file mode 100644
index 0000000..53c93f8
--- /dev/null
+++ b/leads/raw/leads_unterfranken.csv
@@ -0,0 +1,146 @@
+Innung,Name,Email,Region
+"gen und Kreishandwerkerschaften, die ihren Sitz im Regierungsbezirk Unter-",Veronika Hench,v.hench@baeckerinnung-bayerischer-untermain.de,Unterfranken
+"gen und Kreishandwerkerschaften, die ihren Sitz im Regierungsbezirk Unter-",Veronika Hench,khw-kg@t-online.de,Unterfranken
+"gen und Kreishandwerkerschaften, die ihren Sitz im Regierungsbezirk Unter-",Ullrich Amthor,info@baeckerei-amthor.com,Unterfranken
+"gen und Kreishandwerkerschaften, die ihren Sitz im Regierungsbezirk Unter-",Tilo Brönner,tilo-br@t-online.de,Unterfranken
+"gen und Kreishandwerkerschaften, die ihren Sitz im Regierungsbezirk Unter-",Tilo Brönner,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+"gen und Kreishandwerkerschaften, die ihren Sitz im Regierungsbezirk Unter-",Gerhard Götz,baeckerei-goetz@web.de,Unterfranken
+"gen und Kreishandwerkerschaften, die ihren Sitz im Regierungsbezirk Unter-",Gerhard Götz,christine.winterbauer@baeckerbuchstelle.de,Unterfranken
+"gen und Kreishandwerkerschaften, die ihren Sitz im Regierungsbezirk Unter-",Marcel Scherg,scherge.beck@t-online.de,Unterfranken
+"gen und Kreishandwerkerschaften, die ihren Sitz im Regierungsbezirk Unter-",Marcel Scherg,info@bauinnung-aschaffenburg.de,Unterfranken
+"gen und Kreishandwerkerschaften, die ihren Sitz im Regierungsbezirk Unter-",Felix Englert,felix.englert@bauinnung-aschaffenburg.de,Unterfranken
+"gen und Kreishandwerkerschaften, die ihren Sitz im Regierungsbezirk Unter-",Felix Englert,khw-kg@t-online.de,Unterfranken
+"gen und Kreishandwerkerschaften, die ihren Sitz im Regierungsbezirk Unter-",Stefan Goos,stefan.goos@zehe-gmbh.de,Unterfranken
+"gen und Kreishandwerkerschaften, die ihren Sitz im Regierungsbezirk Unter-",Stefan Goos,info@bauinnung-schweinfurt.de,Unterfranken
+Bau-Innung Schweinfurt,Karl Böhner,boehner-bau@t-online.de,Unterfranken
+Bau-Innung Schweinfurt,Karl Böhner,baugewerbe@lbb-unterfranken.de,Unterfranken
+Bau-Innung Schweinfurt,Ralf Stegmeier,trendbaugmbh@aol.com,Unterfranken
+Bau-Innung Schweinfurt,Ralf Stegmeier,info@innung-unterfranken.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Friedrun Schlagbauer-Werner,info@schneiderin-wuerzburg.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Friedrun Schlagbauer-Werner,info@private-brauereien-bayern.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Josef Göller,geschaeftsleitung@brauerei-goeller.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Josef Göller,lukas.thalheimer@thalheimer.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Lukas Thalheimer,lukas.thalheimer@thalheimer.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Lukas Thalheimer,info@mein-dachdecker.com,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Timo Markert,info@mein-dachdecker.com,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Timo Markert,info@elektroinnung-bayerischeruntermain.de,Unterfranken
+Innung für Elektro- und Informationstechnik Bayerischer Untermain,Edwin Palzer,info@elektroinnung-hassberge.de,Unterfranken
+Innung für Elektro- und Informationstechnik Haßberge,Ralf Jooß,info@elektro-jooss.de,Unterfranken
+Innung für Elektro- und Informationstechnik Haßberge,Ralf Jooß,info@elektroinnung-sw.de,Unterfranken
+Innung für Elektro- und Informationstechnik Schweinfurt,Rainer Walter-Helk,rwalter-helk@innotech-solar.de,Unterfranken
+Innung für Elektro- und Informationstechnik Schweinfurt,Rainer Walter-Helk,mailbox@elektro-innung-wuerzburg.de,Unterfranken
+Innung für Elektro- und Informationstechnik Würzburg,Sebastian Seynstahl,se@elektro-seynstahl.de,Unterfranken
+Innung für Elektro- und Informationstechnik Würzburg,Sebastian Seynstahl,info@foto-alfen.de,Unterfranken
+Berufsfotografen-Innung für Unterfranken,Michael Alfen,info@foto-alfen.de,Unterfranken
+Berufsfotografen-Innung für Unterfranken,Michael Alfen,friseurinnung-aschaffenburg@t-online.de,Unterfranken
+Friseur-Innung Aschaffenburg Stadt und Land,Corina Bayer,cbm.bayer@t-online.de,Unterfranken
+Friseur-Innung Aschaffenburg Stadt und Land,Corina Bayer,info@team-art-of-hair.com,Unterfranken
+Friseur-Innung Haßberge,Oliver Merkl,info@team-art-of-hair.com,Unterfranken
+Friseur-Innung Haßberge,Oliver Merkl,sabine.hack71@web.de,Unterfranken
+Friseur-Innung Haßberge,Sabine Hack,sabine.hack71@web.de,Unterfranken
+Friseur-Innung Haßberge,Sabine Hack,info@haarmonique.de,Unterfranken
+Friseur-Innung Haßberge,Monique Haas,info@haarmonique.de,Unterfranken
+Friseur-Innung Haßberge,Monique Haas,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+Friseur-Innung Haßberge,Margit Rosentritt,katharinawalker88@gmx.de,Unterfranken
+"Friseur-Innung Würzburg, Main-Spessart und Bad Kissingen",Katharina Walker,katharinawalker88@gmx.de,Unterfranken
+"Friseur-Innung Würzburg, Main-Spessart und Bad Kissingen",Katharina Walker,info@frank-bauglaserei.de,Unterfranken
+"Friseur-Innung Würzburg, Main-Spessart und Bad Kissingen",Siegfried Frank,info@frank-bauglaserei.de,Unterfranken
+"Friseur-Innung Würzburg, Main-Spessart und Bad Kissingen",Siegfried Frank,info@kaminkehrerinnung-unterfranken.de,Unterfranken
+Kaminkehrer-Innung Unterfranken,Benjamin Schreck,benjamin.schreck@t-online.de,Unterfranken
+Kaminkehrer-Innung Unterfranken,Benjamin Schreck,info@khw-nuernberg.de,Unterfranken
+Karosserie- und Fahrzeugtechnik Innung Unterfranken,Michael Seidel,info@seidel-karosserie.de,Unterfranken
+Karosserie- und Fahrzeugtechnik Innung Unterfranken,Michael Seidel,info@kfz-innung-ufr.de,Unterfranken
+Kfz-Innung Unterfranken,Roland Hoier,roland.hoier@autohaus-keller.de,Unterfranken
+Kfz-Innung Unterfranken,Roland Hoier,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+Innung für Land- und Baumaschinentechnik Unterfranken,Bertram Muth,bertram.muth@outlook.de,Unterfranken
+Innung für Land- und Baumaschinentechnik Unterfranken,Bertram Muth,maler_trageser@gmx.de,Unterfranken
+"Maler -, Tüncher- und Lackierer Innung Alzenau",Karlheinz Trageser,maler_trageser@gmx.de,Unterfranken
+"Maler -, Tüncher- und Lackierer Innung Alzenau",Karlheinz Trageser,uta.kern@kolb-kern.de,Unterfranken
+Maler- und Lackierer-Innung Aschaffenburg Stadt und Land,Ansgar Kern,ansgar.kern@kolb-kern.de,Unterfranken
+Maler- und Lackierer-Innung Aschaffenburg Stadt und Land,Ansgar Kern,khw-kg@t-online.de,Unterfranken
+Maler- und Lackierer-Innung Aschaffenburg Stadt und Land,Mathias Stöth,mathias@stoeth-fuchsstadt.de,Unterfranken
+Maler- und Lackierer-Innung Aschaffenburg Stadt und Land,Mathias Stöth,obermeister@malerinnung-hassberge.de,Unterfranken
+Maler- und Lackierer-Innung Aschaffenburg Stadt und Land,Michael Ott,info@malerinnung-kitzingen.de,Unterfranken
+Maler- und Lackierer-Innung Aschaffenburg Stadt und Land,Thomas Wandler,mail@maler-wandler.de,Unterfranken
+Maler- und Lackierer-Innung Aschaffenburg Stadt und Land,Thomas Wandler,info@farbe-miltenberg.de,Unterfranken
+Maler- und Lackierer-Innung Aschaffenburg Stadt und Land,Jan Becker,info@malerinnung-rg.de,Unterfranken
+"Maler-, Tüncher- und Lackierer-Innung Rhön-Grabfeld",Stefan Neuhöfer,info@malerinnung-rg.de,Unterfranken
+"Maler-, Tüncher- und Lackierer-Innung Rhön-Grabfeld",Stefan Neuhöfer,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+"Maler-, Tüncher- und Lackierer-Innung Rhön-Grabfeld",Andreas Spath,info@spath-tuencher.de,Unterfranken
+"Maler-, Tüncher- und Lackierer-Innung Rhön-Grabfeld",Andreas Spath,info@malerinnung-wuerzburg.de,Unterfranken
+Maler- und Stuckateur-Innung Würzburg und Main-Spessart,Peter Killinger,info@manufatture-colori.de,Unterfranken
+Maler- und Stuckateur-Innung Würzburg und Main-Spessart,Peter Killinger,info@innung-metallbau-feinwerktechnik.de,Unterfranken
+Innung Metallbau- und Feinwerktechnik Bayerischer Untermain,Matthias Kreß,m.kress@wassermannkress.de,Unterfranken
+Innung Metallbau- und Feinwerktechnik Bayerischer Untermain,Matthias Kreß,khw-kg@t-online.de,Unterfranken
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,Klaus Engelmann,info@metallbau-engelmann.de,Unterfranken
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,Klaus Engelmann,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,René Dauelsberg,rd@mpi-dauelsberg.de,Unterfranken
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,René Dauelsberg,info@metallinnung-mainfranken.de,Unterfranken
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,Detlef Lurz,detlef.lurz@lurz-metalltec.de,Unterfranken
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,Detlef Lurz,metzgerei-pfarr@t-online.de,Unterfranken
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,Marco Häuser,marco.haeuser@haeuser-hra.de,Unterfranken
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,Marco Häuser,fleischerinnungMSP@gmx.de,Unterfranken
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,Marco Häuser,metzgerei-bumm@t-online.de,Unterfranken
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,Marco Häuser,j.neuberger@t-online.de,Unterfranken
+Fleischer-Innung Main-Spessart,Josef Neuberger,j.neuberger@t-online.de,Unterfranken
+Fleischer-Innung Main-Spessart,Josef Neuberger,innung@fleischerring.de,Unterfranken
+Fleischer-Innung Main-Spessart,Barbara Fink,metzgerei_dros_fladungen@outlook.de,Unterfranken
+Fleischer-Innung Main-Spessart,Barbara Fink,horst@schoemig.eu,Unterfranken
+Metzger-Innung Würzburg,Horst Schömig,horst.schoemig@arcor.de,Unterfranken
+Metzger-Innung Würzburg,Horst Schömig,josef.bock60@gmail.com,Unterfranken
+Unterfränkische Ofen- und Luftheizungsbauer-Innung,Michael Heigel,heigel@heigel.de,Unterfranken
+Unterfränkische Ofen- und Luftheizungsbauer-Innung,Michael Heigel,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+Unterfränkische Ofen- und Luftheizungsbauer-Innung,Hermann Noske,mail@sofa-shop.de,Unterfranken
+Unterfränkische Ofen- und Luftheizungsbauer-Innung,Hermann Noske,shk-aschaffenburg@t-online.de,Unterfranken
+"Spengler-, Sanitär- und Heizungstechnik Innung Aschaffenburg - Miltenberg",Christoph Winkler,c.winkler@cw-haustechnik.de,Unterfranken
+"Spengler-, Sanitär- und Heizungstechnik Innung Aschaffenburg - Miltenberg",Christoph Winkler,innung-kitzingen@freenet.de,Unterfranken
+"Innung für Spengler-, Sanitär-, und Heizungstechnik Kitzingen",Thomas Lößlein,thomas_loesslein@t-online.de,Unterfranken
+"Innung für Spengler-, Sanitär-, und Heizungstechnik Kitzingen",Thomas Lößlein,info@shk-main-spessart.de,Unterfranken
+"SHK-Innung Main-Spessart Innung Sanitär-, Heizungs- und Klimatechnik",Johannes Reber,info@shk-main-spessart.de,Unterfranken
+"SHK-Innung Main-Spessart Innung Sanitär-, Heizungs- und Klimatechnik",Johannes Reber,info@shk-schweinfurt.de,Unterfranken
+"Innung für Spengler-, Sanitär-, Heizungs- und Klimatechnik Schweinfurt - Main-Rhön",Heinz Schuchbauer,innung.shk@t-online.de,Unterfranken
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Werner Rath,info@dellers-werkstatt.de,Unterfranken
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Michael Deller,info@dellers-werkstatt.de,Unterfranken
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Michael Deller,khw-kg@t-online.de,Unterfranken
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Norbert Borst,service@norbert-borst.de,Unterfranken
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Norbert Borst,wt@reichert-betten.de,Unterfranken
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Werner Tausch,wt@reichert-betten.de,Unterfranken
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Werner Tausch,info@schreiner-rhoen-grabfeld.de,Unterfranken
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Michael Werner,michael@werner-objekteinrichtungen.de,Unterfranken
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Michael Werner,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Horst Zitterbart,schreinerei.zitterbart@t-online.de,Unterfranken
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Horst Zitterbart,info@schreinerinnung-mainfranken.de,Unterfranken
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Thomas Heußlein,info@schreinerei-heusslein.de,Unterfranken
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Thomas Heußlein,l.emge@t-online.de,Unterfranken
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Leo Emge,l.emge@t-online.de,Unterfranken
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Leo Emge,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Sebastian Ludwig,info@geisendoerfer-online.de,Unterfranken
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Sebastian Ludwig,m.graf@hwk-ufr.de,Unterfranken
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Klaus Imhof,kontakt@juwelier-imhof.de,Unterfranken
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Klaus Imhof,info@zimmerer-aschaffenburg-miltenberg.de,Unterfranken
+Zimmerer-Innung Aschaffenburg - Miltenberg,Jürgen Pfarr,info@zimmerei-juergen-pfarr.de,Unterfranken
+Zimmerer-Innung Aschaffenburg - Miltenberg,Jürgen Pfarr,info@holzbau-eyrich.de,Unterfranken
+Zimmerer-Innung Bad Neustadt,Michael Eyrich-Halbig,info@holzbau-eyrich.de,Unterfranken
+Zimmerer-Innung Bad Neustadt,Michael Eyrich-Halbig,info@zimmerer-wuerzburg-kitzingen.de,Unterfranken
+Zimmerer-Innung Main-Spessart,Volker Schäfer,info@schaefer-halsbach.de,Unterfranken
+Zimmerer-Innung Main-Spessart,Volker Schäfer,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+Zimmerer-Innung Schweinfurt-Haßberge,Marion Reichhold,zimmerei_klaus_treiber@gmx.de,Unterfranken
+Zimmerer-Innung Schweinfurt-Haßberge,Marion Reichhold,info@zimmerer-wuerzburg-kitzingen.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,lang@zimmerer-wuerzburg-kitzingen.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,info@khw-ab.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,m.kress@wassermannkress.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,khw-kg@t-online.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,lochner-baudekoration-gmbh@t-online.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,info@elektroinnung-hassberge.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,u.merz@haustechnik-merz.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,khw.kitzingen@gmail.com,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,monika.henneberger@t-online.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,petra@stegerwald.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,info@schreinerei-heusslein.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,kreishandwerker.mil@gmail.com,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,monique3003@arcor.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,khwsch-rhoen-grabfeld@mail.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,info@werner-objekteinrichtungen.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,rapp@Kreishandwerkerschaft-sw.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,info@kreishandwerkerschaft-wuerzburg.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,innung@elektro-strobl.de,Unterfranken
diff --git a/leads/raw/leads_unterfranken_v2.csv b/leads/raw/leads_unterfranken_v2.csv
new file mode 100644
index 0000000..eae5f75
--- /dev/null
+++ b/leads/raw/leads_unterfranken_v2.csv
@@ -0,0 +1,130 @@
+Firm/Innung,Contact Person,Email,Region
+Bäckerinnung Bayerischer Untermain,N/A,v.hench@baeckerinnung-bayerischer-untermain.de,Unterfranken
+Bäckerinnung Bad Kissingen - Rhön-Grabfeld,Petra Schwab,khw-kg@t-online.de,Unterfranken
+Bäckerinnung Bad Kissingen - Rhön-Grabfeld,Ullrich Amthor,info@baeckerei-amthor.com,Unterfranken
+Bäckerinnung Kitzingen,Tilo Brönner,tilo-br@t-online.de,Unterfranken
+Bäckerinnung Schweinfurt - Haßberge,Brigitte Rapp,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+Bäckerinnung Schweinfurt - Haßberge,Gerhard Götz,baeckerei-goetz@web.de,Unterfranken
+Bäckerinnung Mainfranken,Christine Winterbauer,christine.winterbauer@baeckerbuchstelle.de,Unterfranken
+Bäckerinnung Mainfranken,Marcel Scherg,scherge.beck@t-online.de,Unterfranken
+Bauinnung Aschaffenburg,Nina Emeneth,info@bauinnung-aschaffenburg.de,Unterfranken
+Bauinnung Aschaffenburg,Felix Englert,felix.englert@bauinnung-aschaffenburg.de,Unterfranken
+Bauinnung Bad Kissingen / Rhön-Grabfeld,Petra Schwab,khw-kg@t-online.de,Unterfranken
+Bauinnung Bad Kissingen / Rhön-Grabfeld,Stefan Goos,stefan.goos@zehe-gmbh.de,Unterfranken
+Bau-Innung Schweinfurt,Ramona Ziegler,info@bauinnung-schweinfurt.de,Unterfranken
+Bau-Innung Schweinfurt,Karl Böhner,boehner-bau@t-online.de,Unterfranken
+Bauinnung Mainfranken - Würzburg,Manfred Dallner,baugewerbe@lbb-unterfranken.de,Unterfranken
+Bauinnung Mainfranken - Würzburg,Ralf Stegmeier,trendbaugmbh@aol.com,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Nicole Brandler,info@innung-unterfranken.de,Unterfranken
+Innung des Bekleidungshandwerks Unterfranken,Friedrun Schlagbauer-Werner,info@schneiderin-wuerzburg.de,Unterfranken
+Brauer- und Mälzerinnung Unterfranken,N/A,info@private-brauereien-bayern.de,Unterfranken
+Brauer- und Mälzerinnung Unterfranken,Josef Göller,geschaeftsleitung@brauerei-goeller.de,Unterfranken
+Dachdeckerinnung Aschaffenburg - Miltenberg,N/A,lukas.thalheimer@thalheimer.de,Unterfranken
+Dachdeckerinnung Unterfranken,N/A,info@mein-dachdecker.com,Unterfranken
+Innung für Elektro- und Informationstechnik Bayerischer Untermain,Annett Kinzel,info@elektroinnung-bayerischeruntermain.de,Unterfranken
+Innung für Elektro- und Informationstechnik Haßberge,Gitta Klopf,info@elektroinnung-hassberge.de,Unterfranken
+Innung für Elektro- und Informationstechnik Haßberge,Ralf Jooß,info@elektro-jooss.de,Unterfranken
+Innung für Elektro- und Informationstechnik Schweinfurt,"Gaby Fröschel, Roland Klöffel, Ronald Niessner",info@elektroinnung-sw.de,Unterfranken
+Innung für Elektro- und Informationstechnik Schweinfurt,Rainer Walter-Helk,rwalter-helk@innotech-solar.de,Unterfranken
+Innung für Elektro- und Informationstechnik Würzburg,Heike Langner,mailbox@elektro-innung-wuerzburg.de,Unterfranken
+Innung für Elektro- und Informationstechnik Würzburg,Sebastian Seynstahl,se@elektro-seynstahl.de,Unterfranken
+Berufsfotografen-Innung für Unterfranken,N/A,info@foto-alfen.de,Unterfranken
+Friseur-Innung Aschaffenburg Stadt und Land,N/A,friseurinnung-aschaffenburg@t-online.de,Unterfranken
+Friseur-Innung Aschaffenburg Stadt und Land,Corina Bayer,cbm.bayer@t-online.de,Unterfranken
+Friseur-Innung Haßberge,Heinz Göhr,info@team-art-of-hair.com,Unterfranken
+Friseurinnung Kitzingen,N/A,sabine.hack71@web.de,Unterfranken
+Friseurinnung Miltenberg,N/A,info@haarmonique.de,Unterfranken
+Friseurinnung Main-Rhön,Brigitte Rapp,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+"Friseur-Innung Würzburg, Main-Spessart und Bad Kissingen",N/A,katharinawalker88@gmx.de,Unterfranken
+Glaserinnung Unterfranken,N/A,info@frank-bauglaserei.de,Unterfranken
+Kaminkehrer-Innung Unterfranken,N/A,info@kaminkehrerinnung-unterfranken.de,Unterfranken
+Kaminkehrer-Innung Unterfranken,Benjamin Schreck,benjamin.schreck@t-online.de,Unterfranken
+Karosserie- und Fahrzeugtechnik Innung Unterfranken,Manuela Wohlert,info@khw-nuernberg.de,Unterfranken
+Karosserie- und Fahrzeugtechnik Innung Unterfranken,Michael Seidel,info@seidel-karosserie.de,Unterfranken
+Kfz-Innung Unterfranken,Michael Frank,info@kfz-innung-ufr.de,Unterfranken
+Kfz-Innung Unterfranken,Roland Hoier,roland.hoier@autohaus-keller.de,Unterfranken
+Innung für Land- und Baumaschinentechnik Unterfranken,Brigitte Rapp,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+Innung für Land- und Baumaschinentechnik Unterfranken,Bertram Muth,bertram.muth@outlook.de,Unterfranken
+"Maler -, Tüncher- und Lackierer Innung Alzenau",N/A,maler_trageser@gmx.de,Unterfranken
+Maler- und Lackierer-Innung Aschaffenburg Stadt und Land,N/A,uta.kern@kolb-kern.de,Unterfranken
+Maler- und Lackierer-Innung Aschaffenburg Stadt und Land,Ansgar Kern,ansgar.kern@kolb-kern.de,Unterfranken
+Maler- und Lackiererinnung Bad Kissingen,Petra Schwab,khw-kg@t-online.de,Unterfranken
+Maler- und Lackiererinnung Bad Kissingen,Mathias Stöth,mathias@stoeth-fuchsstadt.de,Unterfranken
+Maler- und Tüncherinnung Haßberge,N/A,obermeister@malerinnung-hassberge.de,Unterfranken
+Maler- und Lackiererinnung Kitzingen,Sandra und Andreas Zobel,info@malerinnung-kitzingen.de,Unterfranken
+Maler- und Lackiererinnung Kitzingen,Thomas Wandler,mail@maler-wandler.de,Unterfranken
+Maler- und Lackiererinnung Miltenberg,Melitta Becker,info@farbe-miltenberg.de,Unterfranken
+"Maler-, Tüncher- und Lackierer-Innung Rhön-Grabfeld",Birgit Neuhöfer,info@malerinnung-rg.de,Unterfranken
+Malerinnung Schweinfurt Stadt- und Land,Brigitte Rapp,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+Malerinnung Schweinfurt Stadt- und Land,Andreas Spath,info@spath-tuencher.de,Unterfranken
+Maler- und Stuckateur-Innung Würzburg und Main-Spessart,Claudius Wolfrum,info@malerinnung-wuerzburg.de,Unterfranken
+Maler- und Stuckateur-Innung Würzburg und Main-Spessart,Peter Killinger,info@manufatture-colori.de,Unterfranken
+Innung Metallbau- und Feinwerktechnik Bayerischer Untermain,N/A,info@innung-metallbau-feinwerktechnik.de,Unterfranken
+Innung Metallbau- und Feinwerktechnik Bayerischer Untermain,Matthias Kreß,m.kress@wassermannkress.de,Unterfranken
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,Petra Schwab,khw-kg@t-online.de,Unterfranken
+Metall-Innung Bad Kissingen/Rhön-Grabfeld,Klaus Engelmann,info@metallbau-engelmann.de,Unterfranken
+Metallinnung Schweinfurt - Haßberge,Brigitte Rapp,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+Metallinnung Schweinfurt - Haßberge,René Dauelsberg,rd@mpi-dauelsberg.de,Unterfranken
+Metallinnung Mainfranken - Mitte,Birgit Beckmann,info@metallinnung-mainfranken.de,Unterfranken
+Metallinnung Mainfranken - Mitte,Detlef Lurz,detlef.lurz@lurz-metalltec.de,Unterfranken
+Metzgerinnung Aschaffenburg,Dagobert Pfarr,metzgerei-pfarr@t-online.de,Unterfranken
+Metzgerinnung Aschaffenburg,Marco Häuser,marco.haeuser@haeuser-hra.de,Unterfranken
+Fleischer-Innung Main-Spessart,Sebastian Bumm,fleischerinnungMSP@gmx.de,Unterfranken
+Fleischer-Innung Main-Spessart,Sebastian Bumm,metzgerei-bumm@t-online.de,Unterfranken
+Metzgerinnung Miltenberg,N/A,j.neuberger@t-online.de,Unterfranken
+Metzgerinnung Main-Rhön,"Jürgen Straub, Sonja Grob",innung@fleischerring.de,Unterfranken
+Metzgerinnung Main-Rhön,Barbara Fink,metzgerei_dros_fladungen@outlook.de,Unterfranken
+Metzger-Innung Würzburg,N/A,horst@schoemig.eu,Unterfranken
+Metzger-Innung Würzburg,Horst Schömig,horst.schoemig@arcor.de,Unterfranken
+Unterfränkische Ofen- und Luftheizungsbauer-Innung,Josef Bock,josef.bock60@gmail.com,Unterfranken
+Unterfränkische Ofen- und Luftheizungsbauer-Innung,Michael Heigel,heigel@heigel.de,Unterfranken
+Raumausstatter- und Sattlerinnung Unterfranken,Brigitte Rapp,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+Raumausstatter- und Sattlerinnung Unterfranken,Hermann Noske,mail@sofa-shop.de,Unterfranken
+"Spengler-, Sanitär- und Heizungstechnik Innung Aschaffenburg - Miltenberg",Michael Bramm,shk-aschaffenburg@t-online.de,Unterfranken
+"Spengler-, Sanitär- und Heizungstechnik Innung Aschaffenburg - Miltenberg",Christoph Winkler,c.winkler@cw-haustechnik.de,Unterfranken
+"Innung für Spengler-, Sanitär-, und Heizungstechnik Kitzingen",Christine Keppner-Siegert,innung-kitzingen@freenet.de,Unterfranken
+"Innung für Spengler-, Sanitär-, und Heizungstechnik Kitzingen",Thomas Lößlein,thomas_loesslein@t-online.de,Unterfranken
+"SHK-Innung Main-Spessart Innung Sanitär-, Heizungs- und Klimatechnik",N/A,info@shk-main-spessart.de,Unterfranken
+"Innung für Spengler-, Sanitär-, Heizungs- und Klimatechnik Schweinfurt - Main-Rhön",Stefan Köppe,info@shk-schweinfurt.de,Unterfranken
+"Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg",Sandra Köller,innung.shk@t-online.de,Unterfranken
+Schreinerinnung Aschaffenburg Stadt und Land,N/A,info@dellers-werkstatt.de,Unterfranken
+Schreinerinnung Bad Kissingen,Petra Schwab,khw-kg@t-online.de,Unterfranken
+Schreinerinnung Bad Kissingen,Norbert Borst,service@norbert-borst.de,Unterfranken
+Schreinerinnung Miltenberg-Obernburg,N/A,wt@reichert-betten.de,Unterfranken
+Schreinerinnung Rhön-Grabfeld,N/A,info@schreiner-rhoen-grabfeld.de,Unterfranken
+Schreinerinnung Rhön-Grabfeld,Michael Werner,michael@werner-objekteinrichtungen.de,Unterfranken
+Schreinerinnung Haßberge – Schweinfurt,Brigitte Rapp,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+Schreinerinnung Haßberge – Schweinfurt,Horst Zitterbart,schreinerei.zitterbart@t-online.de,Unterfranken
+Schreinerinnung Mainfranken,Ramona Pfenning,info@schreinerinnung-mainfranken.de,Unterfranken
+Schreinerinnung Mainfranken,Thomas Heußlein,info@schreinerei-heusslein.de,Unterfranken
+Schuhmacherinnung Unterfranken,N/A,l.emge@t-online.de,Unterfranken
+Steinmetz- und Steinbildhauerinnung Unterfranken,Brigitte Rapp,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+Steinmetz- und Steinbildhauerinnung Unterfranken,Sebastian Ludwig,info@geisendoerfer-online.de,Unterfranken
+"Uhrmacher-, Gold- und Silberschmiedeinnung Unterfranken",Markus Graf,m.graf@hwk-ufr.de,Unterfranken
+"Uhrmacher-, Gold- und Silberschmiedeinnung Unterfranken",Klaus Imhof,kontakt@juwelier-imhof.de,Unterfranken
+Zimmerer-Innung Aschaffenburg - Miltenberg,Theresa Breunig,info@zimmerer-aschaffenburg-miltenberg.de,Unterfranken
+Zimmerer-Innung Aschaffenburg - Miltenberg,Jürgen Pfarr,info@zimmerei-juergen-pfarr.de,Unterfranken
+Zimmerer-Innung Bad Neustadt,N/A,info@holzbau-eyrich.de,Unterfranken
+Zimmerer-Innung Main-Spessart,Ulrike Feser,info@zimmerer-wuerzburg-kitzingen.de,Unterfranken
+Zimmerer-Innung Main-Spessart,Volker Schäfer,info@schaefer-halsbach.de,Unterfranken
+Zimmerer-Innung Schweinfurt-Haßberge,Brigitte Rapp,rapp@kreishandwerkerschaft-sw.de,Unterfranken
+Zimmerer-Innung Schweinfurt-Haßberge,Marion Reichhold,zimmerei_klaus_treiber@gmx.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Ulrike Feser,info@zimmerer-wuerzburg-kitzingen.de,Unterfranken
+Zimmerer-Innung Würzburg - Kitzingen,Hermann Lang,lang@zimmerer-wuerzburg-kitzingen.de,Unterfranken
+Kreishandwerkerschaft Aschaffenburg,Claudia Find,info@khw-ab.de,Unterfranken
+Kreishandwerkerschaft Aschaffenburg,Matthias Kreß,m.kress@wassermannkress.de,Unterfranken
+Kreishandwerkerschaft Bad Kissingen,Petra Schwab,khw-kg@t-online.de,Unterfranken
+Kreishandwerkerschaft Bad Kissingen,Ulrike Lochner-Erhard,lochner-baudekoration-gmbh@t-online.de,Unterfranken
+Kreishandwerkerschaft Haßberge,Gitta Klopf,info@elektroinnung-hassberge.de,Unterfranken
+Kreishandwerkerschaft Haßberge,Udo Merz,u.merz@haustechnik-merz.de,Unterfranken
+Kreishandwerkerschaft Kitzingen,Elisabeth Hofmann,khw.kitzingen@gmail.com,Unterfranken
+Kreishandwerkerschaft Kitzingen,Monika Henneberger,monika.henneberger@t-online.de,Unterfranken
+Kreishandwerkerschaft Main-Spessart,Petra Stegerwald,petra@stegerwald.de,Unterfranken
+Kreishandwerkerschaft Main-Spessart,Thomas Heußlein,info@schreinerei-heusslein.de,Unterfranken
+Kreishandwerkerschaft Miltenberg,N/A,kreishandwerker.mil@gmail.com,Unterfranken
+Kreishandwerkerschaft Miltenberg,Monique Haas,monique3003@arcor.de,Unterfranken
+Kreishandwerkerschaft Rhön-Grabfeld,N/A,khwsch-rhoen-grabfeld@mail.de,Unterfranken
+Kreishandwerkerschaft Rhön-Grabfeld,Bruno Werner,info@werner-objekteinrichtungen.de,Unterfranken
+Kreishandwerkerschaft Schweinfurt,Brigitte Rapp,rapp@Kreishandwerkerschaft-sw.de,Unterfranken
+Kreishandwerkerschaft Würzburg,Sandra Köller,info@kreishandwerkerschaft-wuerzburg.de,Unterfranken
+Kreishandwerkerschaft Würzburg,Martin Strobl,innung@elektro-strobl.de,Unterfranken
diff --git a/leads/raw/unterfranken.pdf b/leads/raw/unterfranken.pdf
new file mode 100644
index 0000000..40f2775
Binary files /dev/null and b/leads/raw/unterfranken.pdf differ
diff --git a/recover_cologne_leads.py b/recover_cologne_leads.py
new file mode 100644
index 0000000..db4a86e
--- /dev/null
+++ b/recover_cologne_leads.py
@@ -0,0 +1,67 @@
+import pandas as pd
+import os
+
+def normalize(text):
+ if not isinstance(text, str):
+ return ""
+ return text.strip().lower()
+
+def recover_cologne():
+ leads_csv_path = 'leads/leads.csv'
+ cologne_raw_path = 'leads/raw/innungen_leads_koeln_duesseldorf.csv'
+
+ if not os.path.exists(leads_csv_path) or not os.path.exists(cologne_raw_path):
+ print("Files not found.")
+ return
+
+ # Load existing leads
+ leads_df = pd.read_csv(leads_csv_path)
+ done_emails = set(leads_df['Email'].apply(normalize))
+ done_names = set(leads_df['Firm/Innung'].apply(normalize))
+
+ # Load raw Cologne data
+ cologne_df = pd.read_csv(cologne_raw_path)
+
+ new_rows = []
+
+ print(f"Scanning {len(cologne_df)} raw entries...")
+
+ for _, row in cologne_df.iterrows():
+ name = row.get('organisation', '')
+ region = row.get('region', '')
+ email = row.get('email', '')
+
+ # We only care about Cologne for this recovery
+ if str(region).lower() != 'koeln':
+ continue
+
+ # Must have a valid email
+ if pd.isna(email) or email.strip() == '':
+ continue
+
+ # Check if already in leads.csv
+ if normalize(email) in done_emails or normalize(name) in done_names:
+ continue
+
+ # It's a valid new lead!
+ new_row = {
+ 'Firm/Innung': name,
+ 'Contact Person': 'N/A', # Raw data might not have person, or we need to check columns
+ 'Email': email,
+ 'Region': 'Köln'
+ }
+ new_rows.append(new_row)
+ done_emails.add(normalize(email)) # Prevent dupes within batch
+
+ print(f"Found {len(new_rows)} new Cologne leads to add.")
+
+ if new_rows:
+ new_df = pd.DataFrame(new_rows)
+ # Append to CSV
+ new_df.to_csv(leads_csv_path, mode='a', header=False, index=False)
+ print("Successfully appended to leads.csv")
+ else:
+ print("No new leads found.")
+
+if __name__ == "__main__":
+ recover_cologne()
diff --git a/scripts/analyze_leads_quality.py b/scripts/analyze_leads_quality.py
new file mode 100644
index 0000000..cb20ed2
--- /dev/null
+++ b/scripts/analyze_leads_quality.py
@@ -0,0 +1,93 @@
+
+import pandas as pd
+import re
+
+def analyze_leads():
+ input_csv = 'leads/leads.csv'
+ output_report = 'leads/analysis/red_flags.md'
+
+ df = pd.read_csv(input_csv)
+
+ # 1. Apply Specific Fixes
+ # Dachdeckerinnung Unterfranken -> info@dachdecker-unterfranken.de
+ mask = df['Firm/Innung'].str.contains('Dachdeckerinnung Unterfranken', case=False, na=False)
+ if mask.any():
+ print("Fixing Dachdeckerinnung Unterfranken email...")
+ df.loc[mask, 'Email'] = 'info@dachdecker-unterfranken.de'
+
+ # Save the fixes back to CSV
+ df.to_csv(input_csv, index=False)
+
+ # 2. Red Flag Analysis
+ red_flags = []
+
+ # Patterns
+ freemail_domains = ['t-online.de', 'web.de', 'gmx.de', 'gmail.com', 'hotmail.com', 'yahoo.de', 'aol.com', 'freenet.de', 'arcor.de']
+ kh_patterns = ['kh-', 'handwerk-', 'kreishandwerkerschaft', '-kh']
+
+ # Check for Duplicates
+ email_counts = df['Email'].value_counts()
+ duplicate_emails = email_counts[email_counts > 1]
+
+ if not duplicate_emails.empty:
+ red_flags.append("## 🚩 Duplicate Emails (Potential Central Administration)")
+ red_flags.append("| Email | Count | Innungen |")
+ red_flags.append("|---|---|---|")
+ for email, count in duplicate_emails.items():
+ innungen = df[df['Email'] == email]['Firm/Innung'].tolist()
+ innungen_str = "
".join(innungen[:3]) + ("..." if len(innungen) > 3 else "")
+ red_flags.append(f"| `{email}` | {count} | {innungen_str} |")
+ red_flags.append("")
+
+ # Check for Freemail Addresses
+ red_flags.append("## 🟡 Freemail Addresses (Check Professionality)")
+ red_flags.append("| Innung | Contact | Email |")
+ red_flags.append("|---|---|---|")
+
+ found_freemail = False
+ for idx, row in df.iterrows():
+ email = str(row['Email']).lower()
+ domain = email.split('@')[-1] if '@' in email else ''
+
+ if domain in freemail_domains:
+ red_flags.append(f"| {row['Firm/Innung']} | {row['Contact Person']} | `{email}` |")
+ found_freemail = True
+
+ if not found_freemail:
+ red_flags.append("No freemail addresses found.")
+ red_flags.append("")
+
+ # Check for Generic KH Domains vs Specific Innung Name
+ # Heuristic: If email has 'kh-' or 'handwerk' but Innung name is specific (like "Bäckerinnung")
+ # This might indicate the email goes to the KH office, not the Obermeister directly.
+ red_flags.append("## ℹ️ Kreishandwerkerschaft (KH) Generic Contacts")
+ red_flags.append("These emails likely reach the administrative office, not necessarily the specific trade representative directly.")
+ red_flags.append("| Innung | Email | Note |")
+ red_flags.append("|---|---|---|")
+
+ for idx, row in df.iterrows():
+ email = str(row['Email']).lower()
+ innung = str(row['Firm/Innung'])
+
+ is_kh_email = any(p in email for p in kh_patterns)
+
+ # If it's a specific guild but uses a generic KH email
+ if is_kh_email:
+ red_flags.append(f"| {innung} | `{email}` | Generic KH Domain |")
+
+ # Domain Mismatch (Simple)
+ # Check if the domain is totally unrelated to the Innung name
+ # Difficult to do reliably without extensive lists, but we can look for "shop", "portal", etc.
+
+ # Save Report
+ import os
+ os.makedirs(os.path.dirname(output_report), exist_ok=True)
+
+ with open(output_report, 'w', encoding='utf-8') as f:
+ f.write("# Lead Quality Audit & Red Flags\n\n")
+ f.write("\n".join(red_flags))
+
+ print(f"Report generated at {output_report}")
+
+if __name__ == "__main__":
+ analyze_leads()
diff --git a/scripts/apply_verification_fixes.py b/scripts/apply_verification_fixes.py
new file mode 100644
index 0000000..d784620
--- /dev/null
+++ b/scripts/apply_verification_fixes.py
@@ -0,0 +1,76 @@
+
+import pandas as pd
+
+def apply_verification_fixes():
+ csv_path = 'leads/leads.csv'
+ df = pd.read_csv(csv_path)
+
+ # Helper to update row based on Innung name
+ def update_lead(innung, new_email=None, new_contact=None, new_phone=None, new_address=None):
+ mask = df['Firm/Innung'].str.contains(innung, case=False, na=False)
+ if mask.any():
+ if new_email: df.loc[mask, 'Email'] = new_email
+ if new_contact: df.loc[mask, 'Contact Person'] = new_contact
+ if new_phone: df.loc[mask, 'Phone'] = new_phone
+ if new_address: df.loc[mask, 'Address'] = new_address
+ print(f"Updated {innung}")
+
+ # --- Schweinfurt Fixes ---
+ # Bäckerinnung Schweinfurt - Haßberge -> Fusioniert? Keeping KH contact but noting it might be Mainfranken now.
+ # Actually, let's keep the KH contact if it's the only one, but maybe update the name if we found a better one?
+ # Search said: "Bäckerinnung Schweinfurt-Haßberge... fusioniert... zur neuen Bäcker-Innung Mainfranken"
+ # So we should probably rename it or at least acknowledge it. checking Mainfranken entry?
+ # For now, let's Stick to the specific Obermeister emails we found.
+
+ # Friseurinnung Main-Rhön -> Margit Rosentritt? Search said website is www.friseurinnung-main-rhoen.de
+ # Email: info@friseurinnung-main-rhoen.de (Guess? Website didn't explicitly say email, but likely).
+ # Re-reading search: "Adresse: Galgenleite 3... E-Mail: rapp@kreishandwerkerschaft-sw.de".
+ # So the KH email IS the official one for the Innung.
+
+ # Innung für Land- und Baumaschinentechnik Unterfranken
+ update_lead("Innung für Land- und Baumaschinentechnik Unterfranken", new_email="info@innung-landbautechnik.de")
+
+ # Malerinnung Schweinfurt Stadt- und Land
+ update_lead("Malerinnung Schweinfurt Stadt- und Land", new_email="info@malerinnung-schweinfurt.de")
+
+ # Metallinnung Schweinfurt - Haßberge -> rapp@... confirmed.
+
+ # Zimmerer-Innung Schweinfurt-Haßberge -> Reichhold.
+ # Search confirms KH manages it. But maybe add Reichhold's email if available?
+ # Only found phone. Keeping KH email but maybe adding Obermeister name if missing.
+ update_lead("Zimmerer-Innung Schweinfurt-Haßberge", new_contact="Marion Reichhold")
+
+ # Steinmetz- und Steinbildhauerinnung Unterfranken
+ update_lead("Steinmetz- und Steinbildhauerinnung Unterfranken", new_contact="Josef Hofmann", new_email="info@stein-welten.com")
+
+ # Schreinerinnung Haßberge – Schweinfurt
+ update_lead("Schreinerinnung Haßberge – Schweinfurt", new_contact="Horst Zitterbart", new_email="schreinerei.zitterbart@t-online.de")
+
+ # --- Bad Kissingen Fixes ---
+ # Bauinnung Bad Kissingen / Rhön-Grabfeld
+ # Stefan Goos. Email not explicitly found, but "info@bauunternehmen-zehe.de" is likely for his company.
+ # Safe bet: Keep KH or try to find his specific one?
+ # Let's stick to KH if we are unsure, but maybe update Contact Person.
+ update_lead("Bauinnung Bad Kissingen / Rhön-Grabfeld", new_contact="Stefan Goos")
+
+ # Metall-Innung Bad Kissingen/Rhön-Grabfeld
+ update_lead("Metall-Innung Bad Kissingen/Rhön-Grabfeld", new_contact="Klaus Engelmann", new_email="info@metallinnung-kg-nes.de")
+
+ # Schreinerinnung Bad Kissingen
+ update_lead("Schreinerinnung Bad Kissingen", new_contact="Norbert Borst", new_email="khw-kg@t-online.de") # Confirmed
+
+ # Maler- und Lackiererinnung Bad Kissingen
+ update_lead("Maler- und Lackiererinnung Bad Kissingen", new_contact="Mathias Stöth", new_email="khw-kg@t-online.de") # Confirmed
+
+ # --- Freemail Fixes ---
+ # Bau-Innung Schweinfurt -> Karl Böhner
+ update_lead("Bau-Innung Schweinfurt", new_email="info@bauinnung-schweinfurt.de", new_contact="Karl Böhner")
+
+ # Bauinnung Mainfranken - Würzburg -> Ralf Stegmeier
+ update_lead("Bauinnung Mainfranken - Würzburg", new_email="info@trend-bau.com", new_contact="Ralf Stegmeier")
+
+ df.to_csv(csv_path, index=False)
+ print("Verification fixes applied.")
+
+if __name__ == "__main__":
+ apply_verification_fixes()
diff --git a/scripts/debug_pdf.py b/scripts/debug_pdf.py
new file mode 100644
index 0000000..ab8d43b
--- /dev/null
+++ b/scripts/debug_pdf.py
@@ -0,0 +1,36 @@
+import pypdf
+
+pdf_path = 'cologne_duesseldorf_data/duesseldorf_innungen.pdf'
+
+def debug_pdf():
+ try:
+ reader = pypdf.PdfReader(pdf_path)
+ text = ""
+ for page in reader.pages:
+ text += page.extract_text() + "\n"
+
+ # Search for known name
+ target = "Jens Schulz"
+ idx = text.find(target)
+ if idx != -1:
+ print(f"Found '{target}' at index {idx}")
+ context = text[max(0, idx-200):min(len(text), idx+500)]
+ print("--- CONTEXT AROUND JENS SCHULZ ---")
+ print(context)
+ print("--- END CONTEXT ---")
+ else:
+ print(f"'{target}' not found!")
+
+ # Search for @
+ at_indices = [i for i, c in enumerate(text) if c == '@']
+ print(f"Found {len(at_indices)} '@' symbols.")
+ if at_indices:
+ first_at = at_indices[0]
+ print(f"Context around first '@':")
+ print(text[max(0, first_at-50):min(len(text), first_at+50)])
+
+ except Exception as e:
+ print(f"Error: {e}")
+
+if __name__ == "__main__":
+ debug_pdf()
diff --git a/scripts/deduplicate_leads.py b/scripts/deduplicate_leads.py
new file mode 100644
index 0000000..b952b42
--- /dev/null
+++ b/scripts/deduplicate_leads.py
@@ -0,0 +1,22 @@
+
+import pandas as pd
+
+def deduplicate_leads():
+ filepath = 'leads/leads.csv'
+ df = pd.read_csv(filepath)
+
+ initial_count = len(df)
+
+ # Remove duplicates based on 'Firm/Innung' column, keeping the first occurrence
+ # (Assuming first occurrence is valid or same as others since they were duplicates)
+ df_dedup = df.drop_duplicates(subset=['Firm/Innung'], keep='first')
+
+ final_count = len(df_dedup)
+
+ print(f"Removed {initial_count - final_count} duplicates.")
+
+ df_dedup.to_csv(filepath, index=False)
+ print("Deduplication complete.")
+
+if __name__ == "__main__":
+ deduplicate_leads()
diff --git a/scripts/download_cologne.py b/scripts/download_cologne.py
new file mode 100644
index 0000000..e7f1439
--- /dev/null
+++ b/scripts/download_cologne.py
@@ -0,0 +1,15 @@
+import requests
+
+url = "https://www.handwerk.koeln/innungen/innungen-kh/"
+headers = {
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
+}
+
+try:
+ response = requests.get(url, headers=headers)
+ response.raise_for_status()
+ with open("cologne_duesseldorf_data/cologne_innungen.html", "w", encoding="utf-8") as f:
+ f.write(response.text)
+ print(f"Successfully downloaded {len(response.text)} characters.")
+except Exception as e:
+ print(f"Error downloading: {e}")
diff --git a/scripts/dump_duesseldorf_text.py b/scripts/dump_duesseldorf_text.py
new file mode 100644
index 0000000..ceaaf6c
--- /dev/null
+++ b/scripts/dump_duesseldorf_text.py
@@ -0,0 +1,15 @@
+import pypdf
+
+pdf_path = 'cologne_duesseldorf_data/duesseldorf_innungen.pdf'
+
+try:
+ reader = pypdf.PdfReader(pdf_path)
+ text = ""
+ for page in reader.pages:
+ text += page.extract_text() + "\n"
+
+ with open('cologne_duesseldorf_data/duesseldorf_raw.txt', 'w', encoding='utf-8') as f:
+ f.write(text)
+ print(f"Dumped {len(text)} characters to duesseldorf_raw.txt")
+except Exception as e:
+ print(f"Error: {e}")
diff --git a/scripts/extract_duesseldorf.py b/scripts/extract_duesseldorf.py
new file mode 100644
index 0000000..85edf71
--- /dev/null
+++ b/scripts/extract_duesseldorf.py
@@ -0,0 +1,62 @@
+import pypdf
+import re
+import csv
+
+pdf_path = 'cologne_duesseldorf_data/duesseldorf_innungen.pdf'
+output_csv = 'cologne_duesseldorf_data/duesseldorf_leads.csv'
+
+def extract_duesseldorf_leads():
+ try:
+ reader = pypdf.PdfReader(pdf_path)
+ text = ""
+ for page in reader.pages:
+ text += page.extract_text() + "\n"
+
+ lines = text.split('\n')
+ leads = []
+ current_innung = "Unknown Innung"
+
+ # Regex for email
+ email_regex = re.compile(r'[\w\.-]+@[\w\.-]+\.\w+')
+
+ for i, line in enumerate(lines):
+ line = line.strip()
+ if not line:
+ continue
+
+ # Update current Innung if line looks like a title (pure text, no email, short-ish)
+ # This is still heuristic but let's try to capture lines with "Innung" OR "Verband"
+ if ("Innung" in line or "Verband" in line) and "@" not in line and len(line) < 100:
+ current_innung = line
+
+ emails = email_regex.findall(line)
+ for email in emails:
+ email = email.rstrip('.')
+
+ if any(l['Email'] == email for l in leads):
+ continue
+
+ leads.append({
+ 'Firm/Innung': current_innung,
+ 'Contact': "N/A",
+ 'Email': email,
+ 'Phone': "N/A",
+ 'Region': 'Düsseldorf'
+ })
+
+ # Write to CSV
+ with open(output_csv, 'w', newline='', encoding='utf-8') as f:
+ writer = csv.DictWriter(f, fieldnames=['Firm/Innung', 'Contact', 'Email', 'Phone', 'Region'])
+ writer.writeheader()
+ writer.writerows(leads)
+
+ print(f"Extracted {len(leads)} leads from Düsseldorf PDF.")
+ # Print first 5 for verification
+ for l in leads[:5]:
+ print(f"- {l['Firm/Innung']}: {l['Email']}")
+
+ except Exception as e:
+ print(f"Error extracting Düsseldorf leads: {e}")
+
+if __name__ == "__main__":
+ extract_duesseldorf_leads()
diff --git a/scripts/extract_emails_direct.py b/scripts/extract_emails_direct.py
new file mode 100644
index 0000000..632c992
--- /dev/null
+++ b/scripts/extract_emails_direct.py
@@ -0,0 +1,35 @@
+import pypdf
+import re
+
+pdf_path = 'cologne_duesseldorf_data/duesseldorf_innungen.pdf'
+
+def extract_emails_direct():
+ try:
+ reader = pypdf.PdfReader(pdf_path)
+ print(f"PDF matches {len(reader.pages)} pages.")
+
+ full_text = ""
+ for i, page in enumerate(reader.pages):
+ text = page.extract_text()
+ full_text += text + "\n"
+ print(f"--- Page {i+1} Text Sample (First 200 chars) ---")
+ print(text[:200])
+ print("------------------------------------------------")
+
+ emails = re.findall(r'[\w\.-]+@[\w\.-]+\.\w+', full_text)
+ print(f"Total extracted text length: {len(full_text)}")
+ print(f"Found {len(emails)} emails.")
+
+ for email in emails:
+ print(f"Email: {email}")
+ # Find context
+ idx = full_text.find(email)
+ start = max(0, idx - 50)
+ end = min(len(full_text), idx + 50 + len(email))
+ print(f"Context: {full_text[start:end].replace(chr(10), ' ')}")
+
+ except Exception as e:
+ print(f"Error: {e}")
+
+if __name__ == "__main__":
+ extract_emails_direct()
diff --git a/scripts/extract_leads.py b/scripts/extract_leads.py
new file mode 100644
index 0000000..1e2829d
--- /dev/null
+++ b/scripts/extract_leads.py
@@ -0,0 +1,85 @@
+
+import re
+import csv
+from pypdf import PdfReader
+
+def extract_leads(pdf_path, output_csv):
+ reader = PdfReader(pdf_path)
+ text = ""
+ for page in reader.pages:
+ text += page.extract_text() + "\n"
+
+ lines = text.split('\n')
+
+ leads = []
+ seen_emails = set()
+
+ current_innung = "Unbekannte Innung"
+ current_contact = None
+
+ # Improved patterns
+ # Innung usually starts the line, maybe bolded in PDF (not visible here).
+ # We look for keywords.
+ innung_start_keywords = ["Innung", "Kreishandwerkerschaft", "Bäckerinnung", "Bauinnung", "Metzgerinnung", "Friseurinnung", "Maler", "Zimmerer"]
+
+ email_pattern = re.compile(r"E-Mail:\s*([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})")
+ obermeister_pattern = re.compile(r"Obermeister(?:in)?:\s*(.*)")
+ ansprechpartner_pattern = re.compile(r"Ansprechpartner(?:in)?:\s*(.*)")
+ kreishandwerksmeister_pattern = re.compile(r"Kreishandwerksmeister(?:in)?:\s*(.*)")
+
+ for line in lines:
+ line = line.strip()
+ if not line:
+ continue
+
+ # Heuristic for Innung name: contains "Innung" or "schaft", is not a sentence (no " und ", " die ", etc in middle usually?), short length.
+ # The PDF seems to use headers like "Bäckerinnung Bayerischer Untermain"
+ if any(k in line for k in innung_start_keywords) and len(line) < 80 and " und " not in line[5:-5] and "," not in line:
+ if " die " not in line and " der " not in line:
+ current_innung = line
+ current_contact = None # New Innung, reset contact?
+
+ # Capture contact
+ match_om = obermeister_pattern.match(line)
+ if match_om:
+ current_contact = match_om.group(1)
+
+ match_ap = ansprechpartner_pattern.match(line)
+ if match_ap and not current_contact:
+ current_contact = match_ap.group(1)
+
+ match_khm = kreishandwerksmeister_pattern.match(line)
+ if match_khm:
+ current_contact = match_khm.group(1)
+
+ # Capture Email
+ match_email = email_pattern.search(line)
+ if match_email:
+ email = match_email.group(1)
+
+ # Additional cleanup
+ if email in seen_emails:
+ continue
+
+ # validation
+ if len(email) < 5 or "@" not in email:
+ continue
+
+ seen_emails.add(email)
+ leads.append({
+ "Firm/Innung": current_innung,
+ "Contact Person": current_contact if current_contact else "N/A",
+ "Email": email,
+ "Region": "Unterfranken"
+ })
+
+ # Write to CSV
+ with open(output_csv, 'w', newline='', encoding='utf-8') as f:
+ writer = csv.DictWriter(f, fieldnames=["Firm/Innung", "Contact Person", "Email", "Region"])
+ writer.writeheader()
+ writer.writerows(leads)
+
+ print(f"Extracted {len(leads)} unique leads to {output_csv}")
+
+if __name__ == "__main__":
+ extract_leads("unterfranken.pdf", "leads.csv")
diff --git a/scripts/extract_leads_unterfranken_v2.py b/scripts/extract_leads_unterfranken_v2.py
new file mode 100644
index 0000000..e3ddd80
--- /dev/null
+++ b/scripts/extract_leads_unterfranken_v2.py
@@ -0,0 +1,180 @@
+
+import re
+import csv
+from pypdf import PdfReader
+
+def extract_leads_v2(pdf_path, output_csv):
+ print(f"Extracting from {pdf_path}...")
+ reader = PdfReader(pdf_path)
+ text_lines = []
+
+ # Extract text and split into lines
+ for page in reader.pages:
+ page_text = page.extract_text()
+ if page_text:
+ text_lines.extend(page_text.split('\n'))
+
+ leads = []
+ current_innung = "Unbekannte Innung"
+
+ # regex patterns
+ email_pattern = re.compile(r"E-Mail:\s*([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})", re.IGNORECASE)
+ obermeister_pattern = re.compile(r"Obermeister(?:in)?:\s*(.*)", re.IGNORECASE)
+ ansprechpartner_pattern = re.compile(r"Ansprechpartner(?:in)?:\s*(.*)", re.IGNORECASE)
+ kreishandwerksmeister_pattern = re.compile(r"Kreishandwerksmeister(?:in)?:\s*(.*)", re.IGNORECASE)
+ landkreis_pattern = re.compile(r"^Landkreis(e?):", re.IGNORECASE)
+
+ # Temporary storage for the current Innung's data
+ # We need to be careful: a single Innung block might have multiple contacts?
+ # Based on the PDF, usually contacts follow the Innung header.
+
+ # Strategy:
+ # Iterate through lines.
+ # If we detect "Landkreis:", look back for Innung Name. Update current_innung.
+ # Process lines for contacts/emails. Assign to current_innung.
+
+ extracted_entries = [] # List of dicts
+
+ # Clean lines first
+ lines = [l.strip() for l in text_lines]
+
+ seen_combinations = set()
+
+ for i, line in enumerate(lines):
+ if not line:
+ continue
+
+ # Detect Innung Name via Lookahead/Lookbehind context
+ # Check if this line is "Landkreis: ..."
+ if landkreis_pattern.match(line):
+ # The Innung Name is likely the previous non-empty line
+ # Look backwards from i-1
+ k = i - 1
+ while k >= 0 and not lines[k]:
+ k -= 1
+
+ if k >= 0:
+ potential_name = lines[k]
+ # Sanity check: Name shouldn't be too long or look like a page number "5.12.2025 8"
+ if len(potential_name) < 100 and not re.match(r'^\d{2}\.\d{2}\.\d{4}', potential_name):
+ current_innung = potential_name
+ # print(f"Found Innung: {current_innung}")
+
+ # Capture People
+ contact_person = None
+ match_om = obermeister_pattern.match(line)
+ if match_om:
+ contact_person = match_om.group(1).strip()
+
+ match_ap = ansprechpartner_pattern.match(line)
+ if match_ap: # We take Ansprechpartner too
+ contact_person = match_ap.group(1).strip()
+
+ match_khm = kreishandwerksmeister_pattern.match(line)
+ if match_khm:
+ contact_person = match_khm.group(1).strip()
+
+ # Capture Email
+ match_email = email_pattern.search(line)
+ if match_email:
+ email = match_email.group(1).strip()
+
+ # If we found an email, we verify if valid
+ if len(email) < 5 or "@" not in email:
+ continue
+
+ # Check if we have a contact person on this line or previous line?
+ # The loop structure is linear. If we found a contact person 3 lines ago, should we link it?
+ # A simple heuristic: Keep the last seen contact person for this Innung block.
+ # But the block might define "Obermeister" then "Email", then "Ansprechpartner" then "Email".
+ # So we need `current_contact` state that resets somewhat?
+ # Actually, usually getting the email is the trigger to save a lead.
+ # We use the most recently seen contact person *since the last email or Innung change*.
+
+ entry = {
+ "Firm/Innung": current_innung,
+ "Contact Person": contact_person if contact_person else "N/A", # Use local var if found on same line, else need state
+ "Email": email,
+ "Region": "Unterfranken"
+ }
+
+ # Improvement: If contact_person is None on this line, try to use a "running" contact person
+ # But we must be careful not to apply Obermeister to Ansprechpartner's email.
+ # Let's verify the text dump.
+ # 117: Obermeister: Ullrich Amthor
+ # ...
+ # 123: E-Mail: ...
+
+ # So the contact person appears BEFORE the email.
+ pass
+
+ # Refined loop with state
+ current_contact = "N/A"
+
+ # Reset loop
+ current_innung = "Unbekannte Innung"
+
+ for i, line in enumerate(lines):
+ if not line:
+ continue
+
+ # 1. Check for Innung Header (Landkreis pattern)
+ if landkreis_pattern.match(line):
+ # Backtrack to find name
+ k = i - 1
+ while k >= 0 and not lines[k]:
+ k -= 1
+ if k >= 0:
+ potential_name = lines[k]
+ if len(potential_name) < 100 and not re.match(r'^\d{2}\.\d{2}\.\d{4}', potential_name):
+ current_innung = potential_name
+ current_contact = "N/A" # Reset contact for new Innung
+
+
+ # 2. Check for Contact Person
+ # If line starts with Obermeister/Ansprechpartner, store it.
+ match_om = obermeister_pattern.match(line)
+ if match_om:
+ current_contact = match_om.group(1).strip()
+ continue # Move to next line (don't expect email on same line usually, but check pdf)
+
+ match_ap = ansprechpartner_pattern.match(line)
+ if match_ap:
+ current_contact = match_ap.group(1).strip()
+ continue
+
+ match_khm = kreishandwerksmeister_pattern.match(line)
+ if match_khm:
+ current_contact = match_khm.group(1).strip()
+ continue
+
+
+ # 3. Check for Email description on same line (rare but possible) or email line
+ match_email = email_pattern.search(line)
+ if match_email:
+ email = match_email.group(1).strip()
+
+ # Dedup
+ combo = (current_innung, email)
+ if combo in seen_combinations:
+ continue
+ seen_combinations.add(combo)
+
+ leads.append({
+ "Firm/Innung": current_innung,
+ "Contact Person": current_contact,
+ "Email": email,
+ "Region": "Unterfranken"
+ })
+
+
+ # Write to CSV
+ with open(output_csv, 'w', newline='', encoding='utf-8') as f:
+ writer = csv.DictWriter(f, fieldnames=["Firm/Innung", "Contact Person", "Email", "Region"])
+ writer.writeheader()
+ writer.writerows(leads)
+
+ print(f"Extracted {len(leads)} leads to {output_csv}")
+
+if __name__ == "__main__":
+ extract_leads_v2("leads/raw/unterfranken.pdf", "leads/raw/leads_unterfranken_v2.csv")
diff --git a/scripts/extract_pdf_links.py b/scripts/extract_pdf_links.py
new file mode 100644
index 0000000..c79632d
--- /dev/null
+++ b/scripts/extract_pdf_links.py
@@ -0,0 +1,28 @@
+import pypdf
+
+pdf_path = 'cologne_duesseldorf_data/duesseldorf_innungen.pdf'
+
+def extract_links():
+ try:
+ reader = pypdf.PdfReader(pdf_path)
+ links = []
+ for page in reader.pages:
+ if "/Annots" in page:
+ for annot in page["/Annots"]:
+ obj = annot.get_object()
+ if "/A" in obj and "/URI" in obj["/A"]:
+ uri = obj["/A"]["/URI"]
+ links.append(uri)
+
+ print(f"Found {len(links)} links.")
+ for link in links:
+ if "mailto:" in link:
+ print(f"Mailto: {link}")
+ else:
+ print(f"Link: {link}")
+
+ except Exception as e:
+ print(f"Error: {e}")
+
+if __name__ == "__main__":
+ extract_links()
diff --git a/scripts/filter_duesseldorf.py b/scripts/filter_duesseldorf.py
new file mode 100644
index 0000000..4debbdb
--- /dev/null
+++ b/scripts/filter_duesseldorf.py
@@ -0,0 +1,55 @@
+import json
+
+processed = [
+ "Baugewerbe", "Dachdecker", "Elektro", "Sanitär", "Stahl", "Tischler", "Maler", "Kraftfahrzeug", "Friseur", "Fleischer",
+ "Zimmerer", "Glaser", "Rollladen", "Gebäudereiniger", "Augenoptiker", "Bäcker", "Konditoren", "Schornsteinfeger", "Steinmetz", "Straßenbauer",
+ "Stukkateur", "Boots", "Gold", "Informationstechnik", "Kachel", "Karosserie", "Schneider", "Instrumenten", "Orthopädie", "Parkett", "Sattler", "Werbe", "Zahn"
+]
+
+def check_processed(name):
+ for p in processed:
+ if p in name:
+ # Check if it was definitely done. "Sanitär" matches "Sanitär-Heizung...".
+ # "Gold" matches "Gold- und Silberschmiede".
+ return True
+ return False
+
+def get_duesseldorf_targets():
+ with open('cologne_duesseldorf_data/duesseldorf_targets.json', 'r', encoding='utf-8') as f:
+ targets = json.load(f)
+
+ duesseldorf_targets = []
+ for t in targets:
+ if "Düsseldorf" in t['innung']:
+ # Check if likely processed
+ # This is a loose check, but good enough to find NEW ones.
+ # actually, let's just list them and I will visually pick or blindly take them.
+ # I want to avoid duplicates.
+ # The processed list above is manually typed and might miss some matches or be too broad.
+ # e.g. "Baugewerbe-Innung Düsseldorf" matches "Baugewerbe".
+
+ # Let's just output ALL Düsseldorf guilds and I will see which ones are new.
+ duesseldorf_targets.append(t)
+
+ print(f"Found {len(duesseldorf_targets)} Düsseldorf guilds total.")
+
+ # Filter out obvious ones
+ new_targets = []
+ for t in duesseldorf_targets:
+ is_done = False
+ for p in processed:
+ if p in t['innung'] and "Düsseldorf" in t['innung']:
+ # This logic is flawed because "Baugewerbe-Innung Düsseldorf" contains "Baugewerbe".
+ # So it will be marked as done.
+ # But I WANT to exclude done ones.
+ is_done = True
+ break
+ if not is_done:
+ new_targets.append(t)
+
+ print(f"Found {len(new_targets)} potentially new Düsseldorf guilds.")
+ for t in new_targets[:30]:
+ print(f"NEW: {t['innung']}")
+
+if __name__ == "__main__":
+ get_duesseldorf_targets()
diff --git a/scripts/finalize_leads.py b/scripts/finalize_leads.py
new file mode 100644
index 0000000..d3dec91
--- /dev/null
+++ b/scripts/finalize_leads.py
@@ -0,0 +1,78 @@
+import csv
+import json
+import os
+
+def normalize_name(name):
+ return name.strip()
+
+def finalize_leads():
+ existing_leads = []
+ seen_names = set()
+
+ if os.path.exists('leads.csv'):
+ with open('leads.csv', 'r', encoding='utf-8') as f:
+ reader = csv.DictReader(f)
+ for row in reader:
+ existing_leads.append(row)
+ seen_names.add(normalize_name(row['Firm/Innung']))
+
+ print(f"Loaded {len(existing_leads)} existing leads.")
+
+ new_leads = []
+
+ # Load person mapping
+ innung_to_person = {}
+ with open('cologne_duesseldorf_data/batch6_targets.json', 'r', encoding='utf-8') as f:
+ targets = json.load(f)
+ for t in targets:
+ innung_to_person[normalize_name(t['innung'])] = t.get('person', 'N/A')
+
+ # Batch 6 Part 1
+ with open('cologne_duesseldorf_data/batch6_results_part1.json', 'r', encoding='utf-8') as f:
+ part1 = json.load(f)
+ for item in part1:
+ name = normalize_name(item['innung'])
+ if name not in seen_names:
+ person = innung_to_person.get(name, 'N/A')
+ new_leads.append({
+ "Firm/Innung": name,
+ "Contact Person": person,
+ "Email": item['email'],
+ "Region": "Düsseldorf/Surrounding"
+ })
+ seen_names.add(name)
+
+ # Batch 6 Part 2
+ with open('cologne_duesseldorf_data/batch6_results_part2.json', 'r', encoding='utf-8') as f:
+ part2 = json.load(f)
+ for item in part2:
+ name = normalize_name(item['innung'])
+ if name not in seen_names:
+ person = innung_to_person.get(name, 'N/A')
+ new_leads.append({
+ "Firm/Innung": name,
+ "Contact Person": person,
+ "Email": item['email'],
+ "Region": "Düsseldorf/Surrounding"
+ })
+ seen_names.add(name)
+
+ print(f"Added {len(new_leads)} new leads.")
+
+ all_leads = existing_leads + new_leads
+ print(f"Total leads: {len(all_leads)}")
+
+ fieldnames = ['Firm/Innung', 'Contact Person', 'Email', 'Region']
+
+ with open('final_leads.csv', 'w', newline='', encoding='utf-8') as f:
+ writer = csv.DictWriter(f, fieldnames=fieldnames)
+ writer.writeheader()
+ writer.writerows(all_leads)
+
+ with open('leads.csv', 'w', newline='', encoding='utf-8') as f:
+ writer = csv.DictWriter(f, fieldnames=fieldnames)
+ writer.writeheader()
+ writer.writerows(all_leads)
+
+if __name__ == "__main__":
+ finalize_leads()
diff --git a/scripts/find_emails_in_dump.py b/scripts/find_emails_in_dump.py
new file mode 100644
index 0000000..839f8d0
--- /dev/null
+++ b/scripts/find_emails_in_dump.py
@@ -0,0 +1,20 @@
+import re
+
+file_path = 'cologne_duesseldorf_data/duesseldorf_raw.txt'
+
+try:
+ with open(file_path, 'r', encoding='utf-8') as f:
+ lines = f.readlines()
+
+ print(f"Total lines: {len(lines)}")
+
+ found_emails = 0
+ for i, line in enumerate(lines):
+ if "@" in line:
+ print(f"Line {i+1}: {line.strip()}")
+ found_emails += 1
+
+ print(f"Found {found_emails} lines with '@'")
+
+except Exception as e:
+ print(f"Error: {e}")
diff --git a/scripts/generate_leads.py b/scripts/generate_leads.py
new file mode 100644
index 0000000..75f8b01
--- /dev/null
+++ b/scripts/generate_leads.py
@@ -0,0 +1,280 @@
+import csv, sys
+sys.stdout.reconfigure(encoding='utf-8')
+
+leads = [
+ # === KOELN ===
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Kreishandwerkerschaft Koeln',
+ 'url': 'www.handwerk.koeln',
+ 'kontaktperson': 'Roberto Lepore (Hauptgeschaeftsfuehrer) / Nicolai Lucks (Kreishandwerksmeister)',
+ 'email': 'lepore@handwerk.koeln',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Buechsenmacher-Innung Nordrhein, RLP und Saarland',
+ 'url': '',
+ 'kontaktperson': 'Klaus-Bernd Liedl (Obermeister)',
+ 'email': 'kliedl@t-online.de',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Fleischer-Innung Koeln',
+ 'url': '',
+ 'kontaktperson': 'Astrid Schmitz (Obermeisterin)',
+ 'email': 'obermeister@fleischer-koeln.de',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Glaser-Innung Koeln-Bonn-Aachen',
+ 'url': '',
+ 'kontaktperson': 'Anne Bong (Obermeisterin)',
+ 'email': 'mail@glas-bong.de',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Juwelier-, Gold- und Silberschmiede-Innung Koeln',
+ 'url': '',
+ 'kontaktperson': 'Ingo Telkmann (Obermeister)',
+ 'email': 'info@sotos-schmuck.de',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Innung Farbe Koeln',
+ 'url': '',
+ 'kontaktperson': 'Sebastian Epe (Obermeister)',
+ 'email': 's.epe@epe-maler.de',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Innung des Massschneiderhandwerks Koeln / Textileiniger-Innung Koeln/Bonn',
+ 'url': '',
+ 'kontaktperson': 'Thomas Wien-Pegelow (Obermeister)',
+ 'email': 'twp.koeln@gmail.com',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Innung fuer Metalltechnik Koeln',
+ 'url': '',
+ 'kontaktperson': 'Sascha Franke (Obermeister)',
+ 'email': 'info@van-broek.de',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Innung fuer Orthopaedie-Technik Koeln',
+ 'url': '',
+ 'kontaktperson': 'Sebastian Malzkorn (Obermeister)',
+ 'email': 'sebastian@malzkorn.at',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Raumausstatter-Innung Koeln',
+ 'url': '',
+ 'kontaktperson': 'Diana Goeddertz (Obermeisterin)',
+ 'email': 'info@diana-breidenbach.de',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Innung Koeln Rollladen und Sonnenschutz',
+ 'url': '',
+ 'kontaktperson': 'Andre Urban (Obermeister)',
+ 'email': 'info@rhp-online.de',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Stuckateur-Innung Koeln - Ausbau + Fassade',
+ 'url': '',
+ 'kontaktperson': 'Sarah M. Rettig (Obermeisterin)',
+ 'email': 's.rettig@hhhuerth.de',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Werbetechniker-Innung Koeln - Bonn - Aachen',
+ 'url': '',
+ 'kontaktperson': 'Markus Boecker (Obermeister)',
+ 'email': 'info@werbetechnik-baecker.de',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Augenoptiker-Innung Koeln-Aachen',
+ 'url': 'www.optikerinnung.de/aoi/',
+ 'kontaktperson': 'Hans Josef Schuemmer (Obermeister)',
+ 'email': 'info@optikerinnung.de',
+ 'facebook': '', 'instagram': '', 'linkedin': 'https://www.linkedin.com/company/aov-nrw', 'twitter': ''
+ },
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Dachdecker- und Zimmerer-Innung Koeln',
+ 'url': 'www.dachdecker-innung-koeln.de',
+ 'kontaktperson': 'Oliver Miesen (Obermeister) / Bettina Dietrich (Geschaeftsfuehrerin)',
+ 'email': 'e-mail@dachdecker-innung-koeln.de',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Elektroinnung Koeln',
+ 'url': 'www.elektroinnungkoeln.de',
+ 'kontaktperson': 'Ralf Janowski (Obermeister)',
+ 'email': 'info@elektroinnungkoeln.de',
+ 'facebook': 'https://www.facebook.com/ELEKTROINNUNG-K', 'instagram': 'https://www.instagram.com/elektroinnungkoeln/', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Friseur-Innung Koeln',
+ 'url': 'www.kopfarbeit-koeln.de',
+ 'kontaktperson': 'Mike Engels (Obermeister) / Julia Barth (Geschaeftsfuehrerin)',
+ 'email': 'info@kopfarbeit-koeln.de',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Innung des Gebaeudereiniger-Handwerks Koeln-Aachen',
+ 'url': 'www.gebaeudereiniger-koeln-aachen.de',
+ 'kontaktperson': 'Detlef Ptak (Obermeister) / Jennifer Schramm (Geschaeftsfuehrerin)',
+ 'email': 'info@gebaeudereiniger-koeln-aachen.de',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Bundesinnung fuer das Geruestbauer-Handwerk',
+ 'url': 'www.geruestbauhandwerk.de',
+ 'kontaktperson': 'Marcus Nachbauer (Bundesinnungsmeister) / Sabrina Luther (Geschaeftsfuehrerin)',
+ 'email': 'info@geruestbauhandwerk.de',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Innung fuer Informationstechnik Koeln/Bonn/Rhein-Sieg/Rhein-Erft',
+ 'url': '',
+ 'kontaktperson': 'Nicolay Gassner (Obermeister)',
+ 'email': 'n.gassner@koenig-avt.de',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Karosseriebauer-Innung Koeln',
+ 'url': 'www.karosserie-innungkoeln.de',
+ 'kontaktperson': 'Oliver Nienhaus (Obermeister) / Claudia Weiler (Geschaeftsfuehrerin)',
+ 'email': 'info@karosserie-innungkoeln.de',
+ 'facebook': 'https://www.facebook.com/KarosseriebauerKoeln/', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ # Konditoren
+ {
+ 'region': 'Koeln',
+ 'organisation': 'Konditoren-Innung Koeln - Bonn',
+ 'url': '',
+ 'kontaktperson': 'Rudolf Schoener (Obermeister)',
+ 'email': 'info@cafe-schoener.de',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ # === DUESSELDORF ===
+ {
+ 'region': 'Duesseldorf',
+ 'organisation': 'Augenoptiker-Innung Duessel-Rhein-Ruhr',
+ 'url': '',
+ 'kontaktperson': 'Jens Schulz (Obermeister)',
+ 'email': '',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Duesseldorf',
+ 'organisation': 'Verband des Rheinischen Baeckerhandwerks',
+ 'url': '',
+ 'kontaktperson': 'Henning Funke (GF) / Johannes Dackweiler (Obermeister)',
+ 'email': '',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Duesseldorf',
+ 'organisation': 'Baugewerbe-Innung Duesseldorf',
+ 'url': '',
+ 'kontaktperson': 'Peter Szemenyei (GF) / Christoph Morick (Obermeister)',
+ 'email': '',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Duesseldorf',
+ 'organisation': 'Bestatter-Innung NRW',
+ 'url': '',
+ 'kontaktperson': 'Christian Jaeger (GF) / Frank Wesemann (Obermeister)',
+ 'email': '',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Duesseldorf',
+ 'organisation': 'Fleischer-Innung Duesseldorf-Mettmann-Solingen',
+ 'url': '',
+ 'kontaktperson': 'Daniela van der Valk (GF) / Lutz Kluke (Obermeister)',
+ 'email': '',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Duesseldorf',
+ 'organisation': 'Innung des Kraftfahrzeuggewerbes Duesseldorf',
+ 'url': '',
+ 'kontaktperson': 'Sven Gustavson (GF) / Hermann Goertz (Obermeister)',
+ 'email': '',
+ 'facebook': 'https://www.facebook.com/kfzgewerbenrw/', 'instagram': 'https://www.instagram.com/kfznrw/', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Duesseldorf',
+ 'organisation': 'Innung fuer Orthopaedie-Schuhtechnik Rheinland/Westfalen',
+ 'url': '',
+ 'kontaktperson': 'Irene Zamponi (GF) / Philipp Radtke (Obermeister)',
+ 'email': '',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Duesseldorf',
+ 'organisation': 'Innung fuer Sanitaer- und Heizungstechnik Duesseldorf',
+ 'url': '',
+ 'kontaktperson': 'Horst Jansen (GF) / Hans Werner Eschrich (Obermeister)',
+ 'email': '',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Duesseldorf',
+ 'organisation': 'Schornsteinfeger-Innung Regierungsbezirk Duesseldorf',
+ 'url': '',
+ 'kontaktperson': 'Marcus Doerenkamp (GF)',
+ 'email': '',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Duesseldorf',
+ 'organisation': 'Stukkatuer-Innung Wuppertal und Kreis Mettmann',
+ 'url': '',
+ 'kontaktperson': 'Hermann Schulte-Hiltrop (HGF) / Wolfgang Wuestenhagen (Obermeister)',
+ 'email': '',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+ {
+ 'region': 'Duesseldorf',
+ 'organisation': 'Zahntechniker-Innung Duesseldorf',
+ 'url': '',
+ 'kontaktperson': 'Michael Knittel (GF) / Dominik Kruchen (Obermeister)',
+ 'email': '',
+ 'facebook': '', 'instagram': '', 'linkedin': '', 'twitter': ''
+ },
+]
+
+output_file = 'innungen_leads_koeln_duesseldorf.csv'
+with open(output_file, 'w', newline='', encoding='utf-8-sig') as f:
+ writer = csv.DictWriter(f, fieldnames=['region','organisation','url','kontaktperson','email','facebook','instagram','linkedin','twitter'])
+ writer.writeheader()
+ writer.writerows(leads)
+
+print(f'Fertig! {len(leads)} Leads gespeichert in {output_file}')
diff --git a/scripts/merge_leads.py b/scripts/merge_leads.py
new file mode 100644
index 0000000..171d27c
--- /dev/null
+++ b/scripts/merge_leads.py
@@ -0,0 +1,39 @@
+
+import pandas as pd
+import os
+
+def merge_and_sort_leads():
+ main_csv = 'leads/leads.csv'
+ new_unterfranken_csv = 'leads/raw/leads_unterfranken_v2.csv'
+
+ # Read existing leads
+ if os.path.exists(main_csv):
+ df_main = pd.read_csv(main_csv)
+ else:
+ df_main = pd.DataFrame(columns=["Firm/Innung", "Contact Person", "Email", "Region"])
+
+ # Read new Unterfranken leads
+ df_uf = pd.read_csv(new_unterfranken_csv)
+
+ # Remove old Unterfranken entries from main df
+ # We assume 'Region' column exists and is populated correctly
+ df_others = df_main[df_main['Region'] != 'Unterfranken']
+
+ # Combine
+ df_final = pd.concat([df_others, df_uf], ignore_index=True)
+
+ # Clean whitespace in columns (just in case)
+ for col in df_final.columns:
+ if df_final[col].dtype == 'object':
+ df_final[col] = df_final[col].str.strip()
+
+ # Sort by Firm/Innung
+ df_final = df_final.sort_values(by='Firm/Innung', key=lambda col: col.str.lower())
+
+ # Save
+ df_final.to_csv(main_csv, index=False)
+ print(f"Merged and sorted. Total rows: {len(df_final)}")
+ print(f"Unterfranken rows: {len(df_final[df_final['Region'] == 'Unterfranken'])}")
+
+if __name__ == "__main__":
+ merge_and_sort_leads()
diff --git a/scripts/organize_project.py b/scripts/organize_project.py
new file mode 100644
index 0000000..2a2f6bd
--- /dev/null
+++ b/scripts/organize_project.py
@@ -0,0 +1,85 @@
+import os
+import shutil
+import csv
+import glob
+
+def normalize(text):
+ return text.strip() if text else ""
+
+def organize():
+ # 1. Create Directories
+ for d in ['leads', 'leads/raw', 'scripts']:
+ if not os.path.exists(d):
+ os.makedirs(d)
+ print(f"Created directory: {d}")
+
+ # 2. Consolidate and Deduplicate Leads
+ all_leads = []
+ seen = set()
+
+ # Files to load leads from (priority order)
+ lead_files = ['final_leads.csv', 'leads.csv']
+
+ for fname in lead_files:
+ if os.path.exists(fname):
+ with open(fname, 'r', encoding='utf-8') as f:
+ reader = csv.DictReader(f)
+ for row in reader:
+ # Key for dedupe: Email is strongest, then Name
+ email = normalize(row.get('Email', ''))
+ name = normalize(row.get('Firm/Innung') or row.get('Innung', ''))
+
+ if not email and not name:
+ continue
+
+ key = email if email else name
+
+ if key not in seen:
+ # Normalize headers
+ clean_row = {
+ 'Firm/Innung': name,
+ 'Contact Person': normalize(row.get('Contact Person', '')),
+ 'Email': email,
+ 'Region': normalize(row.get('Region') or row.get('Source', ''))
+ }
+
+ all_leads.append(clean_row)
+ seen.add(key)
+
+ # Write optimized master file
+ if all_leads:
+ out_path = 'leads/all_leads.csv'
+ with open(out_path, 'w', newline='', encoding='utf-8') as f:
+ fieldnames = ['Firm/Innung', 'Contact Person', 'Email', 'Region']
+ writer = csv.DictWriter(f, fieldnames=fieldnames)
+ writer.writeheader()
+ writer.writerows(all_leads)
+ print(f"Successfully created {out_path} with {len(all_leads)} unique leads.")
+
+ # 3. Move Files
+ # Move Python scripts
+ for py_file in glob.glob("*.py"):
+ if py_file == "organize_project.py": continue
+ shutil.move(py_file, os.path.join("scripts", py_file))
+ print(f"Moved {py_file} to scripts/")
+
+ # Move raw CSVs and PDFs
+ raw_files = [
+ 'leads_unterfranken.csv',
+ 'innungen_leads_koeln_duesseldorf.csv',
+ 'unterfranken.pdf',
+ 'leads.csv',
+ 'final_leads.csv'
+ ]
+
+ for rf in raw_files:
+ if os.path.exists(rf):
+ dst = os.path.join("leads/raw", rf)
+ # Handle collision
+ if os.path.exists(dst):
+ os.remove(dst)
+ shutil.move(rf, dst)
+ print(f"Moved {rf} to leads/raw/")
+
+if __name__ == "__main__":
+ organize()
diff --git a/scripts/parse_cologne_serp.py b/scripts/parse_cologne_serp.py
new file mode 100644
index 0000000..f810a8a
--- /dev/null
+++ b/scripts/parse_cologne_serp.py
@@ -0,0 +1,55 @@
+import json
+import csv
+import re
+
+# Parse the SERP output file (it's JSON content inside a text file, usually)
+# The previous view_file showed it's valid JSON.
+
+input_file = r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\141\output.txt'
+output_csv = 'cologne_duesseldorf_data/cologne_leads.csv'
+
+def parse_serp():
+ with open(input_file, 'r', encoding='utf-8') as f:
+ data = json.load(f)
+
+ leads = []
+ items = data.get('items', [])
+
+ email_regex = re.compile(r'[\w\.-]+@[\w\.-]+\.\w+')
+
+ for item in items:
+ if item.get('type') == 'organic':
+ desc = item.get('description', '')
+ title = item.get('title', '')
+ snippet = item.get('pre_snippet', '')
+ full_text = f"{title} {desc} {snippet}"
+
+ emails = email_regex.findall(full_text)
+ for email in emails:
+ email = email.rstrip('.')
+
+ # Use title or domain as Innung name
+ innung_name = item.get('website_name') or item.get('domain') or title
+
+ if any(l['Email'] == email for l in leads):
+ continue
+
+ leads.append({
+ 'Firm/Innung': innung_name,
+ 'Contact': "N/A",
+ 'Email': email,
+ 'Phone': "N/A",
+ 'Region': 'Köln'
+ })
+
+ with open(output_csv, 'w', newline='', encoding='utf-8') as f:
+ writer = csv.DictWriter(f, fieldnames=['Firm/Innung', 'Contact', 'Email', 'Phone', 'Region'])
+ writer.writeheader()
+ writer.writerows(leads)
+
+ print(f"Extracted {len(leads)} leads from Cologne SERP.")
+ for l in leads:
+ print(f"{l['Firm/Innung']}: {l['Email']}")
+
+if __name__ == "__main__":
+ parse_serp()
diff --git a/scripts/parse_duesseldorf_batch1.py b/scripts/parse_duesseldorf_batch1.py
new file mode 100644
index 0000000..2d7a887
--- /dev/null
+++ b/scripts/parse_duesseldorf_batch1.py
@@ -0,0 +1,74 @@
+import json
+import csv
+import re
+import os
+
+# Files from the previous step
+files = [
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\219\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\220\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\221\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\222\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\223\output.txt'
+]
+
+output_csv = 'cologne_duesseldorf_data/duesseldorf_batch1.csv'
+names = ["Baugewerbe", "Metall", "Dachdecker", "Elektro", "Sanitär"]
+
+def parse_batch1():
+ leads = []
+ email_regex = re.compile(r'[\w\.-]+@[\w\.-]+\.\w+')
+
+ for i, file_path in enumerate(files):
+ try:
+ with open(file_path, 'r', encoding='utf-8') as f:
+ data = json.load(f)
+
+ items = data.get('items', [])
+ innung_name = names[i]
+
+ found_email = False
+ for item in items:
+ if item.get('type') == 'organic':
+ desc = item.get('description', '')
+ title = item.get('title', '')
+ snippet = item.get('pre_snippet', '')
+ full_text = f"{title} {desc} {snippet}"
+
+ emails = email_regex.findall(full_text)
+ for email in emails:
+ email = email.rstrip('.')
+ # Filter out trash
+ if email.endswith('png') or email.endswith('jpg') or 'datenschutz' in email:
+ continue
+
+ # Avoid duplicates in this batch
+ if any(l['Email'] == email for l in leads):
+ continue
+
+ leads.append({
+ 'Firm/Innung': f"{innung_name} Düsseldorf",
+ 'Contact': "N/A",
+ 'Email': email,
+ 'Phone': "N/A",
+ 'Region': 'Düsseldorf'
+ })
+ found_email = True
+ break # Take first good email per Innung to avoid scraping junk
+ if found_email:
+ break
+ except Exception as e:
+ print(f"Error parsing {file_path}: {e}")
+
+ # Append to main list if exists, else match header
+ with open(output_csv, 'w', newline='', encoding='utf-8') as f:
+ writer = csv.DictWriter(f, fieldnames=['Firm/Innung', 'Contact', 'Email', 'Phone', 'Region'])
+ writer.writeheader()
+ writer.writerows(leads)
+
+ print(f"Extracted {len(leads)} leads from Batch 1.")
+ for l in leads:
+ print(f"{l['Firm/Innung']}: {l['Email']}")
+
+if __name__ == "__main__":
+ parse_batch1()
diff --git a/scripts/parse_duesseldorf_batch2.py b/scripts/parse_duesseldorf_batch2.py
new file mode 100644
index 0000000..dd9840f
--- /dev/null
+++ b/scripts/parse_duesseldorf_batch2.py
@@ -0,0 +1,73 @@
+import json
+import csv
+import re
+import os
+
+# Files from step 232-236
+files = [
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\232\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\233\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\234\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\235\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\236\output.txt'
+]
+
+output_csv = 'cologne_duesseldorf_data/duesseldorf_batch2.csv'
+names = ["Tischler", "Maler", "KFZ", "Friseur", "Fleischer"]
+
+def parse_batch2():
+ leads = []
+ email_regex = re.compile(r'[\w\.-]+@[\w\.-]+\.\w+')
+
+ for i, file_path in enumerate(files):
+ try:
+ with open(file_path, 'r', encoding='utf-8') as f:
+ data = json.load(f)
+
+ items = data.get('items', [])
+ innung_name = names[i]
+
+ found_email = False
+ for item in items:
+ if item.get('type') == 'organic':
+ desc = item.get('description', '')
+ title = item.get('title', '')
+ snippet = item.get('pre_snippet', '')
+ full_text = f"{title} {desc} {snippet}"
+
+ emails = email_regex.findall(full_text)
+ for email in emails:
+ email = email.rstrip('.')
+ # Filter out trash
+ if email.endswith('png') or email.endswith('jpg') or 'datenschutz' in email:
+ continue
+
+ # Avoid duplicates in this batch
+ if any(l['Email'] == email for l in leads):
+ continue
+
+ leads.append({
+ 'Firm/Innung': f"{innung_name} Düsseldorf",
+ 'Contact': "N/A",
+ 'Email': email,
+ 'Phone': "N/A",
+ 'Region': 'Düsseldorf'
+ })
+ found_email = True
+ break # Take first good email per Innung
+ if found_email:
+ break
+ except Exception as e:
+ print(f"Error parsing {file_path}: {e}")
+
+ with open(output_csv, 'w', newline='', encoding='utf-8') as f:
+ writer = csv.DictWriter(f, fieldnames=['Firm/Innung', 'Contact', 'Email', 'Phone', 'Region'])
+ writer.writeheader()
+ writer.writerows(leads)
+
+ print(f"Extracted {len(leads)} leads from Batch 2.")
+ for l in leads:
+ print(f"{l['Firm/Innung']}: {l['Email']}")
+
+if __name__ == "__main__":
+ parse_batch2()
diff --git a/scripts/parse_duesseldorf_batch5.py b/scripts/parse_duesseldorf_batch5.py
new file mode 100644
index 0000000..7be697e
--- /dev/null
+++ b/scripts/parse_duesseldorf_batch5.py
@@ -0,0 +1,82 @@
+import json
+import csv
+import re
+import os
+
+# Files from step 255-268
+files = [
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\255\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\256\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\257\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\258\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\259\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\260\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\261\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\262\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\263\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\264\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\265\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\266\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\267\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\268\output.txt'
+]
+
+output_csv = 'cologne_duesseldorf_data/duesseldorf_batch5.csv'
+names = [
+ "Stukkateur", "Bootsbauer", "Goldschmiede", "IT", "Kachel",
+ "Karosserie", "Schneider", "Instrumenten", "Ortho-Technik", "Ortho-Schuh",
+ "Parkett", "Sattler", "Werbe", "Zahn"
+]
+
+def parse_batch5():
+ leads = []
+ email_regex = re.compile(r'[\w\.-]+@[\w\.-]+\.\w+')
+
+ for i, file_path in enumerate(files):
+ try:
+ with open(file_path, 'r', encoding='utf-8') as f:
+ data = json.load(f)
+
+ items = data.get('items', [])
+ innung_name = names[i]
+
+ found_email = False
+ for item in items:
+ if item.get('type') == 'organic':
+ desc = item.get('description', '')
+ title = item.get('title', '')
+ snippet = item.get('pre_snippet', '')
+ full_text = f"{title} {desc} {snippet}"
+
+ emails = email_regex.findall(full_text)
+ for email in emails:
+ email = email.rstrip('.')
+ # Filter out trash
+ if email.endswith('png') or email.endswith('jpg') or 'datenschutz' in email:
+ continue
+
+ leads.append({
+ 'Firm/Innung': f"{innung_name} Düsseldorf",
+ 'Contact': "N/A",
+ 'Email': email,
+ 'Phone': "N/A",
+ 'Region': 'Düsseldorf'
+ })
+ found_email = True
+ break
+ if found_email:
+ break
+ except Exception as e:
+ print(f"Error parsing {file_path}: {e}")
+
+ with open(output_csv, 'w', newline='', encoding='utf-8') as f:
+ writer = csv.DictWriter(f, fieldnames=['Firm/Innung', 'Contact', 'Email', 'Phone', 'Region'])
+ writer.writeheader()
+ writer.writerows(leads)
+
+ print(f"Extracted {len(leads)} leads from Batch 5.")
+ for l in leads:
+ print(f"{l['Firm/Innung']}: {l['Email']}")
+
+if __name__ == "__main__":
+ parse_batch5()
diff --git a/scripts/parse_duesseldorf_batches_3_4.py b/scripts/parse_duesseldorf_batches_3_4.py
new file mode 100644
index 0000000..d36b34f
--- /dev/null
+++ b/scripts/parse_duesseldorf_batches_3_4.py
@@ -0,0 +1,77 @@
+import json
+import csv
+import re
+import os
+
+# Files from step 242-251
+files = [
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\242\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\243\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\244\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\245\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\246\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\247\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\248\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\249\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\250\output.txt',
+ r'C:\Users\a931627\.gemini\antigravity\brain\6060ab5d-4406-4d40-803f-c8d1df8bb430\.system_generated\steps\251\output.txt'
+]
+
+output_csv = 'cologne_duesseldorf_data/duesseldorf_batch3_4.csv'
+names = [
+ "Zimmerer", "Glaser", "Rollladen", "Gebäudereiniger", "Augenoptiker",
+ "Bäcker", "Konditoren", "Schornsteinfeger", "Steinmetz", "Straßenbauer"
+]
+
+def parse_batches_3_4():
+ leads = []
+ email_regex = re.compile(r'[\w\.-]+@[\w\.-]+\.\w+')
+
+ for i, file_path in enumerate(files):
+ try:
+ with open(file_path, 'r', encoding='utf-8') as f:
+ data = json.load(f)
+
+ items = data.get('items', [])
+ innung_name = names[i]
+
+ found_email = False
+ for item in items:
+ if item.get('type') == 'organic':
+ desc = item.get('description', '')
+ title = item.get('title', '')
+ snippet = item.get('pre_snippet', '')
+ full_text = f"{title} {desc} {snippet}"
+
+ emails = email_regex.findall(full_text)
+ for email in emails:
+ email = email.rstrip('.')
+ # Filter out trash
+ if email.endswith('png') or email.endswith('jpg') or 'datenschutz' in email:
+ continue
+
+ leads.append({
+ 'Firm/Innung': f"{innung_name} Düsseldorf",
+ 'Contact': "N/A",
+ 'Email': email,
+ 'Phone': "N/A",
+ 'Region': 'Düsseldorf'
+ })
+ found_email = True
+ break
+ if found_email:
+ break
+ except Exception as e:
+ print(f"Error parsing {file_path}: {e}")
+
+ with open(output_csv, 'w', newline='', encoding='utf-8') as f:
+ writer = csv.DictWriter(f, fieldnames=['Firm/Innung', 'Contact', 'Email', 'Phone', 'Region'])
+ writer.writeheader()
+ writer.writerows(leads)
+
+ print(f"Extracted {len(leads)} leads from Batches 3 & 4.")
+ for l in leads:
+ print(f"{l['Firm/Innung']}: {l['Email']}")
+
+if __name__ == "__main__":
+ parse_batches_3_4()
diff --git a/scripts/parse_duesseldorf_targets.py b/scripts/parse_duesseldorf_targets.py
new file mode 100644
index 0000000..59fc5e5
--- /dev/null
+++ b/scripts/parse_duesseldorf_targets.py
@@ -0,0 +1,42 @@
+import re
+import json
+
+input_file = 'cologne_duesseldorf_data/duesseldorf_raw.txt'
+output_json = 'cologne_duesseldorf_data/duesseldorf_targets.json'
+
+def parse_targets():
+ with open(input_file, 'r', encoding='utf-8') as f:
+ lines = f.readlines()
+
+ targets = []
+ # Pattern: • {Innung}/OM: {Name}
+ # Example: • Augenoptiker-Innung Düssel-Rhein-Ruhr/OM: Jens Schulz
+
+ pattern = re.compile(r'•\s*(.*?)/OM:\s*(.*)')
+
+ for line in lines:
+ line = line.strip()
+ match = pattern.match(line)
+ if match:
+ innung = match.group(1).strip()
+ name = match.group(2).strip()
+ targets.append({
+ "query": f"{innung} Düsseldorf Kontakt Email",
+ "innung": innung,
+ "person": name
+ })
+
+ print(f"Found {len(targets)} targets.")
+
+ # Prioritize "Bau", "Elektro", "Sanitär", "Metall", "Dach"
+ priority_keywords = ["Bau", "Elektro", "Sanitär", "Metall", "Dach", "Tischler"]
+ sorted_targets = sorted(targets, key=lambda x: any(k in x['innung'] for k in priority_keywords), reverse=True)
+
+ with open(output_json, 'w', encoding='utf-8') as f:
+ json.dump(sorted_targets, f, indent=2)
+
+ for t in sorted_targets[:5]:
+ print(f"Target: {t['innung']} ({t['person']})")
+
+if __name__ == "__main__":
+ parse_targets()
diff --git a/scripts/prepare_batch6.py b/scripts/prepare_batch6.py
new file mode 100644
index 0000000..2c43e87
--- /dev/null
+++ b/scripts/prepare_batch6.py
@@ -0,0 +1,16 @@
+import json
+
+def get_batch6():
+ with open('cologne_duesseldorf_data/duesseldorf_targets.json', 'r', encoding='utf-8') as f:
+ targets = json.load(f)
+
+ # We have already processed ~34 targets (indices 0-33)
+ # Let's take 34-64
+ batch6 = targets[34:64]
+
+ print(f"Preparing {len(batch6)} targets for Batch 6:")
+ for t in batch6:
+ print(f"Search: {t['innung']} {t['person']} Kontakt Email")
+
+if __name__ == "__main__":
+ get_batch6()
diff --git a/scripts/prepare_batch6_v2.py b/scripts/prepare_batch6_v2.py
new file mode 100644
index 0000000..528c0ee
--- /dev/null
+++ b/scripts/prepare_batch6_v2.py
@@ -0,0 +1,40 @@
+import json
+
+processed_proximates = [
+ "Baugewerbe", "Dachdecker", "Elektro", "Sanitär", "Stahl", "Tischler", "Maler", "Kraftfahrzeug", "Friseur", "Fleischer",
+ "Zimmerer", "Glaser", "Rollladen", "Gebäudereiniger", "Augenoptiker", "Bäcker", "Konditoren", "Schornsteinfeger", "Steinmetz", "Straßenbauer",
+ "Stukkateur", "Boots", "Gold", "Informationstechnik", "Kachel", "Karosserie", "Schneider", "Instrumenten", "Orthopädie", "Parkett", "Sattler", "Werbe", "Zahn"
+]
+
+def is_processed(name):
+ for p in processed_proximates:
+ # Check for word boundary or similar to avoid false positives if possible, but simple substring is mostly fine
+ # "Sanitär" matches "Innung Sanitär-Heizung..."
+ if p in name:
+ return True
+ return False
+
+def prepare_batch6():
+ with open('cologne_duesseldorf_data/duesseldorf_targets.json', 'r', encoding='utf-8') as f:
+ targets = json.load(f)
+
+ new_targets = []
+ skipped_count = 0
+ for t in targets:
+ if not is_processed(t['innung']):
+ new_targets.append(t)
+ else:
+ skipped_count += 1
+
+ print(f"Skipped {skipped_count} processed targets.")
+ print(f"Found {len(new_targets)} unprocessed targets.")
+
+ batch6 = new_targets[:30]
+ with open('cologne_duesseldorf_data/batch6_targets.json', 'w', encoding='utf-8') as f:
+ json.dump(batch6, f, indent=2)
+
+ for i, t in enumerate(batch6):
+ print(f"Target {i+1}: {t['innung']}")
+
+if __name__ == "__main__":
+ prepare_batch6()
diff --git a/scripts/preview_duesseldorf_pdf.py b/scripts/preview_duesseldorf_pdf.py
new file mode 100644
index 0000000..5199e43
--- /dev/null
+++ b/scripts/preview_duesseldorf_pdf.py
@@ -0,0 +1,22 @@
+import pypdf
+import re
+
+pdf_path = 'cologne_duesseldorf_data/duesseldorf_innungen.pdf'
+
+try:
+ reader = pypdf.PdfReader(pdf_path)
+ text = ""
+ for page in reader.pages:
+ text += page.extract_text() + "\n"
+
+ print(f"Extracted {len(text)} characters.")
+ print("--- PREVIEW ---")
+ print(text[:1000])
+ print("--- END PREVIEW ---")
+
+ # Simple regex check for emails
+ emails = re.findall(r'[\w\.-]+@[\w\.-]+', text)
+ print(f"Found {len(emails)} potential email addresses.")
+
+except Exception as e:
+ print(f"Error reading PDF: {e}")
diff --git a/unique_guilds.txt b/unique_guilds.txt
new file mode 100644
index 0000000..490fbac
--- /dev/null
+++ b/unique_guilds.txt
@@ -0,0 +1,77 @@
+Bäckerinnung Bayerischer Untermain
+Bäckerinnung Bad Kissingen - Rhön-Grabfeld
+Bäckerinnung Kitzingen
+Bäckerinnung Schweinfurt - Haßberge
+Bäckerinnung Mainfranken
+Bauinnung Aschaffenburg
+Bauinnung Bad Kissingen / Rhön-Grabfeld
+Bau-Innung Schweinfurt
+Bauinnung Mainfranken - Würzburg
+Innung des Bekleidungshandwerks Unterfranken
+Brauer- und Mälzerinnung Unterfranken
+Dachdeckerinnung Aschaffenburg - Miltenberg
+Dachdeckerinnung Unterfranken
+Innung für Elektro- und Informationstechnik Bayerischer Untermain
+Innung für Elektro- und Informationstechnik Haßberge
+Innung für Elektro- und Informationstechnik Schweinfurt
+Innung für Elektro- und Informationstechnik Würzburg
+Berufsfotografen-Innung für Unterfranken
+Friseur-Innung Aschaffenburg Stadt und Land
+Friseur-Innung Haßberge
+Friseurinnung Kitzingen
+Friseurinnung Miltenberg
+Friseurinnung Main-Rhön
+Friseur-Innung Würzburg, Main-Spessart und Bad Kissingen
+Glaserinnung Unterfranken
+Kaminkehrer-Innung Unterfranken
+Karosserie- und Fahrzeugtechnik Innung Unterfranken
+Kfz-Innung Unterfranken
+Innung für Land- und Baumaschinentechnik Unterfranken
+Maler -, Tüncher- und Lackierer Innung Alzenau
+Maler- und Lackierer-Innung Aschaffenburg Stadt und Land
+Maler- und Lackiererinnung Bad Kissingen
+Maler- und Tüncherinnung Haßberge
+Maler- und Lackiererinnung Kitzingen
+Maler- und Lackiererinnung Miltenberg
+Maler-, Tüncher- und Lackierer-Innung Rhön-Grabfeld
+Malerinnung Schweinfurt Stadt- und Land
+Maler- und Stuckateur-Innung Würzburg und Main-Spessart
+Innung Metallbau- und Feinwerktechnik Bayerischer Untermain
+Metall-Innung Bad Kissingen/Rhön-Grabfeld
+Metallinnung Schweinfurt - Haßberge
+Metallinnung Mainfranken - Mitte
+Metzgerinnung Aschaffenburg
+Fleischer-Innung Main-Spessart
+Metzgerinnung Miltenberg
+Metzgerinnung Main-Rhön
+Metzger-Innung Würzburg
+Unterfränkische Ofen- und Luftheizungsbauer-Innung
+Raumausstatter- und Sattlerinnung Unterfranken
+Spengler-, Sanitär- und Heizungstechnik Innung Aschaffenburg - Miltenberg
+Innung für Spengler-, Sanitär-, und Heizungstechnik Kitzingen
+SHK-Innung Main-Spessart Innung Sanitär-, Heizungs- und Klimatechnik
+Innung für Spengler-, Sanitär-, Heizungs- und Klimatechnik Schweinfurt - Main-Rhön
+Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg
+Schreinerinnung Aschaffenburg Stadt und Land
+Schreinerinnung Bad Kissingen
+Schreinerinnung Miltenberg-Obernburg
+Schreinerinnung Rhön-Grabfeld
+Schreinerinnung Haßberge – Schweinfurt
+Schreinerinnung Mainfranken
+Schuhmacherinnung Unterfranken
+Steinmetz- und Steinbildhauerinnung Unterfranken
+Uhrmacher-, Gold- und Silberschmiedeinnung Unterfranken
+Zimmerer-Innung Aschaffenburg - Miltenberg
+Zimmerer-Innung Bad Neustadt
+Zimmerer-Innung Main-Spessart
+Zimmerer-Innung Schweinfurt-Haßberge
+Zimmerer-Innung Würzburg - Kitzingen
+Kreishandwerkerschaft Aschaffenburg
+Kreishandwerkerschaft Bad Kissingen
+Kreishandwerkerschaft Haßberge
+Kreishandwerkerschaft Kitzingen
+Kreishandwerkerschaft Main-Spessart
+Kreishandwerkerschaft Miltenberg
+Kreishandwerkerschaft Rhön-Grabfeld
+Kreishandwerkerschaft Schweinfurt
+Kreishandwerkerschaft Würzburg
\ No newline at end of file
diff --git a/unterfranken_dump.txt b/unterfranken_dump.txt
new file mode 100644
index 0000000..5cba60d
--- /dev/null
+++ b/unterfranken_dump.txt
@@ -0,0 +1,1808 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+Verzeichnis der Innungen und Kreishandwerkerschaften
+in Unterfranken
+
+
+Stand: 5. Dezember 2025
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Inhaltsverzeichnis
+
+Bäcker .................................................................................................................... 3
+Bau ......................................................................................................................... 6
+Bekleidung ............................................................................................................. 8
+Brauer und Mälzer ................................................................................................. 9
+Dachdecker .......................................................................................................... 10
+Elektro .................................................................................................................. 11
+Fotografen ........................................................................................................... 13
+Friseure ................................................................................................................ 14
+Glaser ................................................................................................................... 17
+Kaminkehrer (Schornsteinfeger) .......................................................................... 18
+Karosserie- und Fahrzeugbauer ........................................................................... 19
+Kraftfahrzeugtechniker ........................................................................................ 20
+Landmaschinenmechaniker ................................................................................. 21
+Maler .................................................................................................................... 22
+Metall ................................................................................................................... 27
+Metzger (Fleischer) .............................................................................................. 29
+Ofen- und Luftheizungsbauer .............................................................................. 32
+Raumausstatter ................................................................................................... 33
+Sanitär, Heizung und Klima .................................................................................. 34
+Schreiner (Tischler) .............................................................................................. 37
+Schuhmacher ....................................................................................................... 40
+Steinmetzen und Steinbildhauer ......................................................................... 41
+Uhrmacher, Gold- und Silberschmiede ............................................................... 42
+Zimmerer ............................................................................................................. 43
+Kreishandwerkerschaften .................................................................................... 46
+
+
+
+
+Der Aufsicht der Handwerkskammer für Unterfranken unterliegen alle Innun-
+gen und Kreishandwerkerschaften, die ihren Sitz im Regierungsbezirk Unter-
+franken haben.
+
+Einen Überblick über Organisationen, die nicht der Aufsicht der Handwerks-
+kammer für Unterfranken unterliegen, geben der Zentralverband des Deut-
+schen Handwerks (ZDH) hier und der Bayerische Handwerkstag (BHT) hier.
+
+Der Aufbau der Handwerksorganisation insgesamt ist hier grafisch dargestellt.
+
+
+
+05.12.2025 3
+Bäcker
+
+Bäckerinnung Bayerischer Untermain
+
+Landkreise: Aschaffenburg, Miltenberg
+
+Behringstraße 17
+63814 Mainaschaff
+Tel.: 06021 790777
+E-Mail: v.hench@baeckerinnung-bayerischer-untermain.de
+
+Obermeister: Veronika Hench
+
+Behringstraße 19
+63814 Mainaschaff
+Tel.: 06021 790777
+E-Mail: v.hench@baeckerinnung-bayerischer-untermain.de
+
+
+Bäckerinnung Bad Kissingen - Rhön-Grabfeld
+
+Landkreise: Bad Kissingen, Rhön-Grabfeld
+
+Ansprechpartnerin: Petra Schwab
+
+Sparkassenpassage 6
+97688 Bad Kissingen
+Tel.: 0971 78536971
+Fax: 0971 78536972
+E-Mail: khw-kg@t-online.de
+
+Obermeister: Ullrich Amthor
+
+Im Schlosshof 11
+97633 Saal
+Tel.: 09762 897
+Fax: 09762 9397904
+E-Mail: info@baeckerei-amthor.com
+
+
+
+
+05.12.2025 4
+Bäckerinnung Kitzingen
+
+Landkreis: Kitzingen
+
+Ansprechpartnerin: Elisabeth Hofmann
+
+Marktbreiter Straße 4 a
+97342 Obernbreit
+Tel.: 09332 590636
+Fax: 09332 590479
+
+Obermeister: Tilo Brönner
+
+Obere Gräbengasse 12
+97346 Iphofen
+Tel.: 09323 3354
+E-Mail: tilo-br@t-online.de
+
+
+Bäckerinnung Schweinfurt - Haßberge
+
+Landkreise: Schweinfurt, Haßberge
+
+Ansprechpartnerin: Brigitte Rapp
+
+Galgenleite 3
+97424 Schweinfurt
+Tel.: 09721 473578
+E-Mail: rapp@kreishandwerkerschaft-sw.de
+
+Obermeister: Gerhard Götz
+
+Ernst-Sachs-Straße 110
+97424 Schweinfurt
+Tel.: 09721 89990
+E-Mail: baeckerei-goetz@web.de
+
+
+
+
+05.12.2025 5
+Bäckerinnung Mainfranken
+
+Landkreise: Würzburg, Main-Spessart
+
+Ansprechpartnerin: Christine Winterbauer
+
+Schießhausstraße 17
+97228 Rottendorf
+Tel.: 09302 909431
+Fax: 09302 909434
+E-Mail: christine.winterbauer@baeckerbuchstelle.de
+
+Obermeister: Marcel Scherg
+
+Rathausstraße 7
+97854 Steinfeld
+Tel.: 09359 288
+Fax: 09359 8265
+E-Mail: scherge.beck@t-online.de
+
+
+
+
+05.12.2025 6
+Bau
+
+Bauinnung Aschaffenburg
+
+Landkreis: Aschaffenburg
+
+Ansprechpartnerin: Nina Emeneth
+
+Hasenhägweg 71
+63741 Aschaffenburg
+Tel.: 06021 421086
+Fax: 06021 450684
+E-Mail: info@bauinnung-aschaffenburg.de
+Internet: www.bauinnung-aschaffenburg.de
+
+Obermeister: Felix Englert
+
+c/o Theo Albert Bau GmbH
+Am Heerbach 8 a
+63857 Waldaschaff
+E-Mail: felix.englert@bauinnung-aschaffenburg.de
+
+
+Bauinnung Bad Kissingen / Rhön-Grabfeld
+
+Landkreise: Bad Kissingen, Rhön-Grabfeld
+
+Ansprechpartnerin: Petra Schwab
+
+Sparkassenpassage 6
+97688 Bad Kissingen
+Tel.: 0971 78536971
+Fax: 0971 78536972
+E-Mail: khw-kg@t-online.de
+
+Obermeister: Stefan Goos
+
+Brückenstraße 2
+97705 Burkardroth
+Tel.: 09701 91020
+Fax: 09701 910222
+E-Mail: stefan.goos@zehe-gmbh.de
+
+
+
+05.12.2025 7
+Bau-Innung Schweinfurt
+
+Landkreise: Schweinfurt, Haßberge
+
+Ansprechpartnerin: Ramona Ziegler
+
+Galgenleite 3 a
+97424 Schweinfurt
+Tel.: 09721 74220
+Fax: 09721 742222
+E-Mail: info@bauinnung-schweinfurt.de
+Internet: www.bauinnung-schweinfurt.de
+
+Obermeister: Karl Böhner
+
+Raiffeisenstraße 19
+97508 Grettstadt
+Tel.: 09729 9226
+Fax: 09729 9227
+E-Mail: boehner-bau@t-online.de
+
+
+Bauinnung Mainfranken - Würzburg
+
+Landkreise: Würzburg, Kitzingen, Main-Spessart, Miltenberg
+
+Ansprechpartner: Manfred Dallner
+
+Daimlerstraße 4
+97082 Würzburg
+Tel.: 0931 454440
+Fax: 0931 4544419
+E-Mail: baugewerbe@lbb-unterfranken.de
+
+Obermeister: Ralf Stegmeier
+
+Strüther Straße 25
+97285 Röttingen
+Tel.: 09338 1006
+Fax: 09338 309
+E-Mail: trendbaugmbh@aol.com
+
+
+
+
+05.12.2025 8
+Bekleidung
+
+Innung des Bekleidungshandwerks Unterfranken
+
+Landkreise: alle des Regierungsbezirks Unterfranken
+
+Ansprechpartnerin: Nicole Brandler
+
+Am Stiegel 1
+97762 Hammelburg
+Tel.: 09732 2277
+E-Mail: info@innung-unterfranken.de
+Internet: www.innung-unterfranken.de
+
+Obermeisterin: Friedrun Schlagbauer-Werner
+
+Kister Straße 11 a
+97204 Höchberg
+Tel.: 0173 3249788
+E-Mail: info@schneiderin-wuerzburg.de
+
+
+
+
+05.12.2025 9
+Brauer und Mälzer
+
+Brauer- und Mälzerinnung Unterfranken
+
+Landkreise: alle des Regierungsbezirks Unterfranken
+
+Brauer- und Mälzerinnung Unterfranken
+c/o Private Brauereien Bayern e.V.
+Thomas-Wimmer-Ring 9
+80539 München
+Tel.: 089 2909560
+Fax: 089 220179
+E-Mail: info@private-brauereien-bayern.de
+
+Obermeister: Josef Göller
+
+Speiersgasse 21
+97475 Zeil
+E-Mail: geschaeftsleitung@brauerei-goeller.de
+
+
+
+
+05.12.2025 10
+Dachdecker
+
+Dachdeckerinnung Aschaffenburg - Miltenberg
+
+Landkreise: Aschaffenburg, Miltenberg
+
+Kahlgrundstraße 121
+63776 Mömbris
+Tel.: 0160 8480279
+Fax: 06029 5910
+E-Mail: lukas.thalheimer@thalheimer.de
+Internet: www.dachdecker-innung-aschaffenburg-miltenberg.de
+
+Obermeister: Lukas Thalheimer
+
+Kahlgrundstraße 121
+63776 Mömbris
+Tel.: 0160 8480279
+Fax: 06029 5910
+E-Mail: lukas.thalheimer@thalheimer.de
+
+
+Dachdeckerinnung Unterfranken
+
+Landkreise: Würzburg, Kitzingen, Main-Spessart, Schweinfurt, Bad Kissingen, Rhön-Grabfeld, Haß-
+berge
+
+Birkachstrasse 6
+97320 Albertshofen
+Tel.: 09321 3905830
+E-Mail: info@mein-dachdecker.com
+Internet: www.dachdecker-unterfranken.de
+
+Obermeister: Timo Markert
+
+Birkachstrasse 6
+97320 Albertshofen
+Tel.: 09321 3905830
+E-Mail: info@mein-dachdecker.com
+
+
+
+
+05.12.2025 11
+Elektro
+
+Innung für Elektro- und Informationstechnik Bayerischer Untermain
+
+Landkreise: Aschaffenburg, Miltenberg
+
+Ansprechpartnerin: Annett Kinzel
+
+Hasenhägweg 71
+63741 Aschaffenburg
+Tel.: 06021 480331
+Fax: 06021 411619
+E-Mail: info@elektroinnung-bayerischeruntermain.de
+
+Obermeister: Edwin Palzer
+
+Hauptstraße 26
+63773 Goldbach
+
+
+Innung für Elektro- und Informationstechnik Haßberge
+
+Landkreis: Haßberge
+
+Ansprechpartnerin: Gitta Klopf
+
+Martinsweg 4
+97491 Aidhausen
+Tel.: 09526 8250
+E-Mail: info@elektroinnung-hassberge.de
+
+Obermeister: Ralf Jooß
+
+Ringstraße 15
+97461 Hofheim
+Tel.: 09523 7348
+Fax: 09523 501218
+E-Mail: info@elektro-jooss.de
+
+
+
+
+05.12.2025 12
+Innung für Elektro- und Informationstechnik Schweinfurt
+
+Landkreise: Schweinfurt, Bad Kissingen, Rhön-Grabfeld
+
+Ansprechpartner: Gaby Fröschel, Roland Klöffel, Ronald Niessner
+
+Galgenleite 3
+97424 Schweinfurt
+Tel.: 09721 41175
+Fax: 09721 41211
+E-Mail: info@elektroinnung-sw.de
+Internet: www.elektroinnung-sw.de
+
+Obermeister: Rainer Walter-Helk
+
+Oberwerrner Weg 34
+97502 Euerbach
+Tel.: 09726 905500
+Fax: 09726 9055019
+E-Mail: rwalter-helk@innotech-solar.de
+
+
+Innung für Elektro- und Informationstechnik Würzburg
+
+Landkreise: Würzburg, Kitzingen, Main-Spessart
+
+Ansprechpartnerin: Heike Langner
+
+Daimlerstraße 7
+97082 Würzburg
+Tel.: 0931 4501790
+Fax: 0931 45017999
+E-Mail: mailbox@elektro-innung-wuerzburg.de
+Internet: www.elektro-innung-wuerzburg.de
+
+Obermeister: Sebastian Seynstahl
+
+Rudolf-Diesel-Straße 8
+97318 Kitzingen
+Tel.: 09321 36745
+E-Mail: se@elektro-seynstahl.de
+
+
+
+
+05.12.2025 13
+Fotografen
+
+Berufsfotografen-Innung für Unterfranken
+
+Landkreise: alle des Regierungsbezirks Unterfranken
+
+Alexandrastraße 1
+63739 Aschaffenburg
+Tel.: 06021 23807
+E-Mail: info@foto-alfen.de
+
+Obermeister: Michael Alfen
+
+Alexandrastraße 1
+63739 Aschaffenburg
+Tel.: 06021 23807
+E-Mail: info@foto-alfen.de
+
+
+
+
+05.12.2025 14
+Friseure
+
+Friseur-Innung Aschaffenburg Stadt und Land
+
+Landkreis: Aschaffenburg
+
+Cunibertstraße 1
+63739 Aschaffenburg
+Tel.: 06021 12646
+Fax: 06021 12664
+E-Mail: friseurinnung-aschaffenburg@t-online.de
+Internet: www.friseurinnung-aschaffenburg.de
+
+Obermeisterin: Corina Bayer
+
+Raingartenstraße 4
+63825 Schöllkrippen
+Tel.: 06024 2002
+E-Mail: cbm.bayer@t-online.de
+
+
+Friseur-Innung Haßberge
+
+Landkreis: Haßberge
+
+Ansprechpartner: Heinz Göhr
+
+Herrensteige 9
+97500 Ebelsbach
+Tel.: 09522 7948
+E-Mail: info@team-art-of-hair.com
+
+Obermeister: Oliver Merkl
+
+Bahnhofstraße 2
+97437 Haßfurt
+Tel.: 09521 3890
+E-Mail: info@team-art-of-hair.com
+
+
+
+
+05.12.2025 15
+Friseurinnung Kitzingen
+
+Landkreis: Kitzingen
+
+Hindenburgstraße 6
+97320 Albertshofen
+Tel.: 09321 389988
+E-Mail: sabine.hack71@web.de
+Internet: www.friseurinnung-kitzingen.de
+
+Obermeisterin: Sabine Hack
+
+Hindenburgstraße 6
+97320 Albertshofen
+Tel.: 09321 389988
+E-Mail: sabine.hack71@web.de
+
+
+Friseurinnung Miltenberg
+
+Landkreis: Miltenberg
+
+Marktstraße 26
+63924 Kleinheubach
+Tel.: 0160 1405397
+E-Mail: info@haarmonique.de
+
+Obermeisterin: Monique Haas
+
+Marktstraße 26
+63924 Kleinheubach
+Tel.: 0160 1405397
+E-Mail: info@haarmonique.de
+
+
+
+
+05.12.2025 16
+Friseurinnung Main-Rhön
+
+Landkreise: Schweinfurt, Rhön-Grabfeld
+
+Ansprechpartnerin: Brigitte Rapp
+
+Galgenleite 3
+97424 Schweinfurt
+Tel.: 09721 473578
+E-Mail: rapp@kreishandwerkerschaft-sw.de
+Internet: www.friseurinnung-main-rhoen.de
+
+Obermeisterin: Margit Rosentritt
+
+Hadergasse 6
+97421 Schweinfurt
+Tel.: 09721 22727
+
+
+Friseur-Innung Würzburg, Main-Spessart und Bad Kissingen
+
+Landkreise: Würzburg, Main-Spessart, Bad Kissingen
+
+Ludwigstraße 1 a
+97070 Würzburg
+Tel.: 0931 4605400
+E-Mail: katharinawalker88@gmx.de
+Internet: www.wuerzburg-friseurinnung.de
+
+
+Obermeisterin: Katharina Walker
+
+Ludwigstraße 1 a
+97070 Würzburg
+Tel.: 0931 4605400
+E-Mail: katharinawalker88@gmx.de
+
+
+
+
+05.12.2025 17
+Glaser
+
+Glaserinnung Unterfranken
+
+Landkreise: alle des Regierungsbezirks Unterfranken
+
+Obere Neue Gasse 15
+97318 Kitzingen
+Tel.: 09321 31890
+Fax: 09321 33523
+E-Mail: info@frank-bauglaserei.de
+
+Obermeister: Siegfried Frank
+
+Flugplatzstraße 4
+97318 Kitzingen
+Tel.: 09321 31890
+Fax: 09321 33523
+E-Mail: info@frank-bauglaserei.de
+
+
+
+
+05.12.2025 18
+Kaminkehrer (Schornsteinfeger)
+
+Kaminkehrer-Innung Unterfranken
+
+Landkreise: alle des Regierungsbezirks Unterfranken
+
+Kirchplatz 3
+97228 Rottendorf
+Tel.: 09302 2187
+E-Mail: info@kaminkehrerinnung-unterfranken.de
+Internet: www.kaminkehrerinnung-unterfranken.de
+
+Obermeister: Benjamin Schreck
+
+Buchrain 1 a
+63872 Heimbuchenthal
+Tel.: 06092 821252
+Fax: 06092 821253
+E-Mail: benjamin.schreck@t-online.de
+
+
+
+
+05.12.2025 19
+Karosserie- und Fahrzeugbauer
+
+Karosserie- und Fahrzeugtechnik Innung Unterfranken
+
+Landkreise: alle des Regierungsbezirks Unterfranken
+
+Ansprechpartner: Manuela Wohlert
+
+Rosenplütstraße 2
+90439 Nürnberg
+Tel.: 0911 2358880
+Fax: 0911 2358885
+E-Mail: info@khw-nuernberg.de
+Internet: www.khw-nuernberg.de
+
+Obermeister: Michael Seidel
+
+Johann-Dahlem-Straße 25
+63814 Mainaschaff
+Tel.: 06021 27406
+Fax: 06021 15300
+E-Mail: info@seidel-karosserie.de
+
+
+
+
+05.12.2025 20
+Kraftfahrzeugtechniker
+
+Kfz-Innung Unterfranken
+
+Landkreise: alle des Regierungsbezirks Unterfranken
+
+Ansprechpartner: Michael Frank
+
+Sandäcker 10
+97076 Würzburg
+Tel.: 0931 279910
+Fax: 0931 2799140
+E-Mail: info@kfz-innung-ufr.de
+Internet: www.kfz-innung-ufr.de
+
+Obermeister: Roland Hoier
+
+Scheffelstraße 1
+97209 Veitshöchheim
+E-Mail: roland.hoier@autohaus-keller.de
+
+
+
+
+05.12.2025 21
+Landmaschinenmechaniker
+
+Innung für Land- und Baumaschinentechnik Unterfranken
+
+Landkreise: alle des Regierungsbezirks Unterfranken
+
+Ansprechpartnerin: Brigitte Rapp
+
+Galgenleite 3
+97424 Schweinfurt
+Tel.: 09721 473578
+Fax: 09721 473576
+E-Mail: rapp@kreishandwerkerschaft-sw.de
+
+Obermeister: Bertram Muth
+
+Hutweg 5
+97789 Oberleichtersbach
+Tel.: 09741 5573
+E-Mail: bertram.muth@outlook.de
+
+
+
+
+05.12.2025 22
+Maler
+
+Maler -, Tüncher- und Lackierer Innung Alzenau
+
+Landkreis: Alt-Landkreis Alzenau
+
+Gunkelsrainstraße 10
+63755 Alzenau
+Tel.: 06023 8736
+Fax: 06023 32372
+E-Mail: maler_trageser@gmx.de
+
+Obermeister: Karlheinz Trageser
+
+Gunkelsrainstraße 10
+63755 Alzenau
+Tel.: 06023 8736
+Fax: 06023 32372
+E-Mail: maler_trageser@gmx.de
+
+
+Maler- und Lackierer-Innung Aschaffenburg Stadt und Land
+
+Landkreis: Aschaffenburg
+
+Lauestraße 5
+63741 Aschaffenburg
+Tel.: 06021 859120
+Fax: 06021 859133
+E-Mail: uta.kern@kolb-kern.de
+
+Obermeister: Ansgar Kern
+
+Lauestraße 5
+63741 Aschaffenburg
+Tel.: 06021 859120
+Fax: 06021 859133
+E-Mail: ansgar.kern@kolb-kern.de
+
+
+
+
+05.12.2025 23
+Maler- und Lackiererinnung Bad Kissingen
+
+Landkreis: Bad Kissingen
+
+Ansprechpartnerin: Petra Schwab
+
+Sparkassenpassage 6
+97688 Bad Kissingen
+Tel.: 0971 78536971
+Fax: 0971 78536972
+E-Mail: khw-kg@t-online.de
+
+Obermeister: Mathias Stöth
+
+Schweinfurter Straße 14
+97727 Fuchsstadt
+Tel.: 09732 5658
+Fax: 09732 5014
+E-Mail: mathias@stoeth-fuchsstadt.de
+
+
+Maler- und Tüncherinnung Haßberge
+
+Landkreis: Haßberge
+
+Hauptstraße 12
+97496 Burgpreppach
+Tel.: 09534 173330
+Fax: 09534 1700171
+E-Mail: obermeister@malerinnung-hassberge.de
+
+Obermeister: Michael Ott
+
+Hauptstraße 12
+97496 Burgpreppach
+Tel.: 09534 173330
+Fax: 09534 1700171
+
+
+
+
+05.12.2025 24
+Maler- und Lackiererinnung Kitzingen
+
+Landkreis: Kitzingen
+
+Ansprechpartner: Sandra und Andreas Zobel
+
+Gartenstraße 18
+97334 Sommerach
+Tel.: 09381 9141
+Fax: 09381 4467
+E-Mail: info@malerinnung-kitzingen.de
+Internet: www.malerinnung-kitzingen.de
+
+Obermeister: Thomas Wandler
+
+Crailsheimstraße 1
+97348 Rödelsee
+Tel.: 09323 3006
+Fax: 09323 5006
+E-Mail: mail@maler-wandler.de
+
+
+Maler- und Lackiererinnung Miltenberg
+
+Landkreis: Miltenberg
+
+Ansprechpartnerin: Melitta Becker
+
+Pulverich 13
+63897 Miltenberg
+Tel.: 09371 1090
+Fax: 09371 67141
+E-Mail: info@farbe-miltenberg.de
+Internet: www.farbe-miltenberg.de
+
+Obermeister: Jan Becker
+
+Pulverich 13
+63897 Miltenberg
+Tel.: 09371 1090
+Fax: 09371 67141
+
+
+
+
+05.12.2025 25
+Maler-, Tüncher- und Lackierer-Innung Rhön-Grabfeld
+
+Landkreis: Rhön-Grabfeld
+
+Ansprechpartnerin: Birgit Neuhöfer
+
+Hauptstraße 23
+97633 Großbardorf
+Tel.: 09766 1555
+Fax: 09766 1515
+E-Mail: info@malerinnung-rg.de
+Internet: www.malerinnung-rhoen-grabfeld.de
+
+Obermeister: Stefan Neuhöfer
+
+Hauptstraße 23
+97633 Großbardorf
+Tel.: 09766 1555
+Fax: 09766 1515
+E-Mail: info@malerinnung-rg.de
+
+
+Malerinnung Schweinfurt Stadt- und Land
+
+Landkreis: Schweinfurt
+
+Ansprechpartnerin: Brigitte Rapp
+
+Galgenleite 3
+97424 Schweinfurt
+Tel.: 09721 473578
+E-Mail: rapp@kreishandwerkerschaft-sw.de
+
+Obermeister: Andreas Spath
+
+Am Bonland 4
+97464 Oberwerrn
+Tel.: 0171 1479629
+Fax: 09726 9218
+E-Mail: info@spath-tuencher.de
+
+
+
+
+05.12.2025 26
+Maler- und Stuckateur-Innung Würzburg und Main-Spessart
+
+Landkreise: Würzburg, Main-Spessart
+
+Ansprechpartner: Claudius Wolfrum
+
+Ungsteiner Straße 27
+81539 München
+Tel.: 0931 54306
+Fax: 089 600876635
+E-Mail: info@malerinnung-wuerzburg.de
+Internet: www.malerinnung-wuerzburg.de
+
+Obermeister: Peter Killinger
+
+Fahrentalstraße 6
+97261 Güntersleben
+Tel.: 09365 881068
+E-Mail: info@manufatture-colori.de
+
+
+
+
+05.12.2025 27
+Metall
+
+Innung Metallbau- und Feinwerktechnik Bayerischer Untermain
+
+Landkreise: Aschaffenburg, Miltenberg
+
+Ansprechpartnerinnen: Claudia Find, Stefanie Belle
+
+Hasenhägweg 71
+63741 Aschaffenburg
+Tel.: 06021 401286
+Fax: 06021 412386
+E-Mail: info@innung-metallbau-feinwerktechnik.de
+Internet: www.innung-metallbau-feinwerktechnik.de
+
+Obermeister: Matthias Kreß
+
+Hemsbach 7 e
+63776 Mömbris
+E-Mail: m.kress@wassermannkress.de
+
+
+Metall-Innung Bad Kissingen/Rhön-Grabfeld
+
+Landkreise: Bad Kissingen, Rhön-Grabfeld
+
+Ansprechpartnerin: Petra Schwab
+
+Sparkassenpassage 6
+97688 Bad Kissingen
+Tel.: 0971 78536971
+Fax: 0971 78536972
+E-Mail: khw-kg@t-online.de
+Internet: www.metallinnung-kg-nes.de
+
+Obermeister: Klaus Engelmann
+
+An der Sauerwiese 20
+97618 Wollbach
+Tel.: 09773 6780
+Fax: 09773 5595
+E-Mail: info@metallbau-engelmann.de
+
+
+
+05.12.2025 28
+Metallinnung Schweinfurt - Haßberge
+
+Landkreise: Schweinfurt, Haßberge
+
+Ansprechpartnerin: Brigitte Rapp
+
+Galgenleite 3
+97424 Schweinfurt
+Tel.: 09721 473578
+E-Mail: rapp@kreishandwerkerschaft-sw.de
+
+Obermeister: René Dauelsberg
+
+Haßbergring 19
+97461 Hofheim
+Tel.: 0171 2060932
+E-Mail: rd@mpi-dauelsberg.de
+
+
+Metallinnung Mainfranken - Mitte
+
+Landkreise: Würzburg, Kitzingen, Main-Spessart
+
+Ansprechpartnerin: Birgit Beckmann
+
+Dieselstraße 10
+97082 Würzburg
+Tel.: 0931 412614
+Fax: 0931 412655
+E-Mail: info@metallinnung-mainfranken.de
+Internet: www.metallinnung-mainfranken.de
+
+Obermeister: Detlef Lurz
+
+Raiffeisenstraße 6
+97209 Veitshöchheim
+Tel.: 0931 329780
+Fax: 0931 3297813
+E-Mail: detlef.lurz@lurz-metalltec.de
+
+
+
+
+05.12.2025 29
+Metzger (Fleischer)
+
+Metzgerinnung Aschaffenburg
+
+Landkreis: Aschaffenburg
+
+Ansprechpartner: Dagobert Pfarr
+
+Schillerstraße 71
+63801 Kleinostheim
+Tel.: 06027 8468
+Fax: 06027 8473
+E-Mail: metzgerei-pfarr@t-online.de
+
+Obermeister: Marco Häuser
+
+Friedrich-Wilhelm-Dükerstraße 1
+63846 Laufach
+Tel.: 06021 3633
+E-Mail: marco.haeuser@haeuser-hra.de
+
+
+Fleischer-Innung Main-Spessart
+
+Landkreis: Main-Spessart
+
+Ansprechpartner: Sebastian Bumm
+
+Hauptstraße 32
+97855 Triefenstein
+E-Mail: fleischerinnungMSP@gmx.de
+
+Stellvertretender Obermeister: Eberhard Bumm (kommissarische Leitung)
+
+Hauptstraße 32
+97855 Triefenstein
+Tel.: 09395 363
+Fax: 09395 997924
+E-Mail: metzgerei-bumm@t-online.de
+
+
+
+
+05.12.2025 30
+Metzgerinnung Miltenberg
+
+Landkreis: Miltenberg
+
+Hauptstraße 5
+63927 Bürgstadt
+Tel.: 09371 2671
+Fax: 09371 2810
+E-Mail: j.neuberger@t-online.de
+
+Obermeister: Josef Neuberger
+
+Hauptstraße 5
+63927 Bürgstadt
+Tel.: 09371 2671
+Fax: 09371 2810
+E-Mail: j.neuberger@t-online.de
+
+
+Metzgerinnung Main-Rhön
+
+Landkreise: Schweinfurt, Bad Kissingen, Rhön-Grabfeld, Haßberge, Kitzingen
+
+Ansprechpartner: Jürgen Straub, Sonja Grob
+
+Straßburgstraße 8
+97424 Schweinfurt
+Tel.: 09721 65050
+Fax: 09721 650555
+E-Mail: innung@fleischerring.de
+
+Obermeisterin: Barbara Fink
+
+Ludwigstraße 32
+97650 Fladungen
+Tel.: 09778 215
+E-Mail: metzgerei_dros_fladungen@outlook.de
+
+
+
+
+05.12.2025 31
+Metzger-Innung Würzburg
+
+Landkreis: Würzburg
+
+Franz-Ludwig-Straße 1
+97072 Würzburg
+Tel.: 0931 73926
+Fax: 0931 886217
+E-Mail: horst@schoemig.eu
+
+Obermeister: Horst Schömig
+
+Franz-Ludwig-Straße 1
+97072 Würzburg
+Tel.: 0931 73920
+Fax: 0931 886217
+E-Mail: horst.schoemig@arcor.de
+
+
+
+
+05.12.2025 32
+Ofen- und Luftheizungsbauer
+
+Unterfränkische Ofen- und Luftheizungsbauer-Innung
+
+Landkreise: alle des Regierungsbezirks Unterfranken
+
+Ansprechpartner: Josef Bock
+
+Matthäus-Stäblein-Straße 5
+97424 Schweinfurt
+Tel.: 0175 8855931
+E-Mail: josef.bock60@gmail.com
+Internet: www.kachelofenbau-ufr.de
+
+Obermeister: Michael Heigel
+
+Bussardweg 44
+63741 Aschaffenburg
+E-Mail: heigel@heigel.de
+
+
+
+
+05.12.2025 33
+Raumausstatter
+
+Raumausstatter- und Sattlerinnung Unterfranken
+
+Landkreise: alle des Regierungsbezirks Unterfranken
+
+Ansprechpartnerin: Brigitte Rapp
+
+Galgenleite 3
+97424 Schweinfurt
+Tel.: 09721 473578
+E-Mail: rapp@kreishandwerkerschaft-sw.de
+
+Obermeister: Hermann Noske
+
+Waldstraße 1
+97618 Heustreu
+Tel.: 09773 8431
+Fax: 09773 8428
+E-Mail: mail@sofa-shop.de
+
+
+
+05.12.2025 34
+Sanitär, Heizung und Klima
+
+Spengler-, Sanitär- und Heizungstechnik Innung Aschaffenburg - Miltenberg
+
+Landkreise: Aschaffenburg, Miltenberg
+
+Ansprechpartner: Michael Bramm
+
+Cunibertstraße 1
+63739 Aschaffenburg
+Tel.: 06021 28731
+Fax: 06021 28732
+E-Mail: shk-aschaffenburg@t-online.de
+Internet: www.shk-aschaffenburg.de
+
+Obermeister: Christoph Winkler
+
+Eichenbühler Straße 79
+63927 Bürgstadt
+Tel.: 09371 959391
+Fax: 09371 959226
+E-Mail: c.winkler@cw-haustechnik.de
+
+
+Innung für Spengler-, Sanitär-, und Heizungstechnik Kitzingen
+
+Landkreis: Kitzingen
+
+Ansprechpartnerin: Christine Keppner-Siegert
+
+Sonnenstraße 32
+97359 Schwarzach am Main
+Tel.: 09324 978667
+Fax: 09324 978668
+E-Mail: innung-kitzingen@freenet.de
+
+Obermeister: Thomas Lößlein
+
+An der Ziegelhütte 16
+97320 Mainstockheim
+Tel.: 09321 921300
+Fax: 09321 921311
+E-Mail: thomas_loesslein@t-online.de
+
+
+
+05.12.2025 35
+SHK-Innung Main-Spessart Innung Sanitär-, Heizungs- und Klimatechnik
+
+Landkreis: Main-Spessart
+
+Wiesener Straße 99
+97833 Frammersbach
+Tel.: 09355 97400
+Fax: 09355 99776
+E-Mail: info@shk-main-spessart.de
+Internet: www.shk-main-spessart.de
+
+Obermeister: Johannes Reber
+
+Wiesener Straße 99
+97833 Frammersbach
+Tel.: 09355 97400
+Fax: 09355 99776
+E-Mail: info@shk-main-spessart.de
+
+
+Innung für Spengler-, Sanitär-, Heizungs- und Klimatechnik Schweinfurt - Main-Rhön
+
+Landkreise: Schweinfurt, Bad Kissingen, Rhön-Grabfeld, Haßberge
+
+Ansprechpartner: Stefan Köppe
+
+Matthäus-Stäblein-Straße 5
+97424 Schweinfurt
+Tel.: 09721 471526
+Fax: 09721 471529
+E-Mail: info@shk-schweinfurt.de
+Internet: www.shk-schweinfurt.de
+
+Obermeister: Heinz Schuchbauer
+
+Schuhstraße 4 - 6
+97447 Gerolzhofen
+
+
+
+
+05.12.2025 36
+Innung für Sanitär-, Heizungs-, Klempner- und Klimatechnik Würzburg
+
+Landkreis: Würzburg
+
+Ansprechpartnerin: Sandra Köller
+
+Virchowstraße 1 b Rückgebäude
+97072 Würzburg
+Tel.: 0931 7841878
+Fax: 0931 7841843
+E-Mail: innung.shk@t-online.de
+
+Obermeister: Werner Rath
+
+Obere Straße 1
+97262 Hausen
+Tel.: 09722 4550
+Fax: 09722 4540
+
+
+
+
+05.12.2025 37
+Schreiner (Tischler)
+
+Schreinerinnung Aschaffenburg Stadt und Land
+
+Landkreis: Aschaffenburg
+
+Hauptstraße 157 a
+63864 Glattbach
+Tel.: 06021 460428
+Fax: 06021 423868
+E-Mail: info@dellers-werkstatt.de
+
+Obermeister: Michael Deller
+
+Hauptstraße 157 a
+63864 Glattbach
+Tel.: 06021 460428
+Fax: 06021 423868
+E-Mail: info@dellers-werkstatt.de
+
+
+Schreinerinnung Bad Kissingen
+
+Landkreis: Bad Kissingen
+
+Ansprechpartnerin: Petra Schwab
+
+Sparkassenpassage 6
+97688 Bad Kissingen
+Tel.: 0971 785369 71
+Fax: 0971 785369 72
+E-Mail: khw-kg@t-online.de
+Internet: www.schreiner-kg.de
+
+Obermeister: Norbert Borst
+
+Alter Dorfring 46
+97688 Bad Kissingen
+Tel.: 0971 66466
+Fax: 0971 69119
+E-Mail: service@norbert-borst.de
+
+
+
+
+05.12.2025 38
+Schreinerinnung Miltenberg-Obernburg
+
+Landkreis: Miltenberg
+
+Freudenberger Straße 56 - 58
+63927 Bürgstadt
+Tel.: 09371 97770
+Fax: 09371 977725
+E-Mail: wt@reichert-betten.de
+
+Obermeister: Werner Tausch
+
+Goethestraße 15
+63927 Bürgstadt
+Tel.: 09371 97770
+Fax: 09371 977725
+E-Mail: wt@reichert-betten.de
+
+
+Schreinerinnung Rhön-Grabfeld
+
+Landkreis: Rhön-Grabfeld
+
+Strutweg 15
+97653 Bischofsheim
+Tel.: 09772 9300990
+Fax: 09772 93009930
+E-Mail: info@schreiner-rhoen-grabfeld.de
+
+Obermeister: Michael Werner
+
+Brendstraße 23
+97653 Bischofsheim
+Tel.: 09772 93009913
+Fax: 09772 93009930
+E-Mail: michael@werner-objekteinrichtungen.de
+
+
+
+
+05.12.2025 39
+Schreinerinnung Haßberge – Schweinfurt
+
+Landkreise: Schweinfurt, Haßberge
+
+Ansprechpartnerin: Brigitte Rapp
+
+Galgenleite 3
+97424 Schweinfurt
+Tel.: 09721 473578
+E-Mail: rapp@kreishandwerkerschaft-sw.de
+
+Obermeister: Horst Zitterbart
+
+Bergstraße 11
+97478 Knetzgau
+Tel.: 09527 1533
+Fax: 09527 7034
+E-Mail: schreinerei.zitterbart@t-online.de
+
+
+Schreinerinnung Mainfranken
+
+Landkreise: Würzburg, Kitzingen, Main-Spessart
+
+Ansprechpartnerin: Ramona Pfenning
+
+Am Rain 6
+97852 Schollbrunn
+Tel.: 09394 9957944
+E-Mail: info@schreinerinnung-mainfranken.de
+Internet: www.schreinerinnung-mainfranken.de
+
+Obermeister: Thomas Heußlein
+
+Reiterwiesen 3
+97834 Billingshausen
+Tel.: 09398 221
+Fax: 09398 713
+E-Mail: info@schreinerei-heusslein.de
+
+
+
+
+05.12.2025 40
+Schuhmacher
+
+Schuhmacherinnung Unterfranken
+
+Landkreise: alle des Regierungsbezirks Unterfranken
+
+Friedhofstraße 2
+63741 Aschaffenburg
+Tel.: 06021 423235
+Fax: 06021 4449416
+E-Mail: l.emge@t-online.de
+
+Obermeister: Leo Emge
+
+Friedhofstraße 2
+63741 Aschaffenburg
+Tel.: 06021 423235
+Fax: 06021 4449416
+E-Mail: l.emge@t-online.de
+
+
+
+
+05.12.2025 41
+Steinmetzen und Steinbildhauer
+
+Steinmetz- und Steinbildhauerinnung Unterfranken
+
+Landkreise: alle des Regierungsbezirks Unterfranken
+
+Ansprechpartnerin: Brigitte Rapp
+
+Galgenleite 3
+97424 Schweinfurt
+Tel.: 09721 473578
+E-Mail: rapp@kreishandwerkerschaft-sw.de
+Internet: www.steinmetz-unterfranken.de
+
+Obermeister: Sebastian Ludwig
+
+Martin-Luther-Straße 11
+97072 Würzburg
+Tel.: 0931 52803
+Fax 0931 52150
+E-Mail: info@geisendoerfer-online.de
+
+
+
+
+05.12.2025 42
+Uhrmacher, Gold- und Silberschmiede
+
+Uhrmacher-, Gold- und Silberschmiedeinnung Unterfranken
+
+Landkreise: alle des Regierungsbezirks Unterfranken
+
+Ansprechpartner: Markus Graf
+
+Rennweger Ring 3
+97070 Würzburg
+Tel.: 0931 309081132
+Fax: 0931 309081632
+E-Mail: m.graf@hwk-ufr.de
+
+Obermeister: Klaus Imhof
+
+Aschaffenburger Straße 32
+63825 Schöllkrippen
+Tel.: 06024 9470
+E-Mail: kontakt@juwelier-imhof.de
+
+
+
+
+05.12.2025 43
+Zimmerer
+
+Zimmerer-Innung Aschaffenburg - Miltenberg
+
+Landkreise: Aschaffenburg, Miltenberg
+
+Ansprechpartnerin: Theresa Breunig
+
+Lange Straße 2 a
+63860 Rothenbuch
+Tel.: 06094 1361
+Fax: 06094 8105
+E-Mail: info@zimmerer-aschaffenburg-miltenberg.de
+Internet: www.zimmerer-aschaffenburg-miltenberg.de
+
+Obermeister: Jürgen Pfarr
+
+Frankenstraße 19
+63776 Mömbris
+Tel.: 06029 997966
+Fax: 06029 997967
+E-Mail: info@zimmerei-juergen-pfarr.de
+
+
+Zimmerer-Innung Bad Neustadt
+
+Landkreise: Bad Kissingen, Rhön-Grabfeld
+
+Schlimpfhoferstraße 4
+97723 Oberthulba
+Tel.: 09736 223
+Fax: 09736 1481
+E-Mail: info@holzbau-eyrich.de
+Internet: www.zimmerer-neustadt-kissingen.de
+
+Obermeister: Michael Eyrich-Halbig
+
+Schlimpfhoferstraße 4
+97723 Oberthulba
+Tel.: 09736 223
+Fax: 09736 1481
+E-Mail: info@holzbau-eyrich.de
+
+
+
+
+05.12.2025 44
+Zimmerer-Innung Main-Spessart
+
+Landkreis: Main-Spessart
+
+Ansprechpartnerin: Ulrike Feser
+
+Bentheimstraße 9
+97072 Würzburg
+Tel.: 0931 72760
+Fax: 0931 72527
+E-Mail: info@zimmerer-wuerzburg-kitzingen.de
+Internet: www.zimmerer-main-spessart.de
+
+Obermeister: Volker Schäfer
+
+Hemmenhausweg 13
+97816 Lohr
+Tel.: 09359 344
+Fax: 09359 8254
+E-Mail: info@schaefer-halsbach.de
+
+
+Zimmerer-Innung Schweinfurt-Haßberge
+
+Landkreise: Schweinfurt, Haßberge
+
+Ansprechpartnerin: Brigitte Rapp
+
+Galgenleite 3
+97424 Schweinfurt
+Tel.: 09721 473578
+Fax: 09721 473576
+E-Mail: rapp@kreishandwerkerschaft-sw.de
+Internet: www.zimmerer-schweinfurt.de
+
+Obermeisterin: Marion Reichhold
+
+Coburger Straße 8
+96126 Maroldsweisach
+Tel.: 09567 247
+Fax: 09567 758
+E-Mail: zimmerei_klaus_treiber@gmx.de
+
+
+
+
+05.12.2025 45
+Zimmerer-Innung Würzburg - Kitzingen
+
+Landkreise: Würzburg, Kitzingen
+
+Ansprechpartnerin: Ulrike Feser
+
+Bentheimstraße 9
+97072 Würzburg
+Tel.: 0931 72760
+Fax: 0931 72527
+E-Mail: info@zimmerer-wuerzburg-kitzingen.de
+Internet: www.zimmerer-wuerzburg-kitzingen.de
+
+Obermeister: Hermann Lang
+
+Bestlenstraße 7
+97252 Frickenhausen
+Tel.: 09331 2491
+Fax: 09331 20242
+E-Mail: lang@zimmerer-wuerzburg-kitzingen.de
+
+
+
+
+05.12.2025 46
+Kreishandwerkerschaften
+
+Kreishandwerkerschaft Aschaffenburg
+
+Landkreis: Aschaffenburg
+
+Ansprechpartnerin: Claudia Find
+
+Hasenhägweg 71
+63741 Aschaffenburg
+Tel.: 06021 401286
+Fax: 06021 412386
+E-Mail: info@khw-ab.de
+
+Kreishandwerksmeister: Matthias Kreß
+
+Hemsbach 7 e
+63776 Mömbris
+E-Mail: m.kress@wassermannkress.de
+
+
+Kreishandwerkerschaft Bad Kissingen
+
+Landkreis: Bad Kissingen
+
+Ansprechpartnerin: Petra Schwab
+
+Sparkassenpassage 6
+97688 Bad Kissingen
+Tel.: 0971 78536971
+Fax: 0971 78536972
+E-Mail: khw-kg@t-online.de
+Internet: www.khw-kg.de
+
+Kreishandwerksmeisterin: Ulrike Lochner-Erhard
+
+Jörgentorgasse 1
+97702 Münnerstadt
+Tel.: 09733 781521
+Fax: 09733 781522
+E-Mail: lochner-baudekoration-gmbh@t-online.de
+
+
+
+
+05.12.2025 47
+Kreishandwerkerschaft Haßberge
+
+Landkreis: Haßberge
+
+Ansprechpartnerin: Gitta Klopf
+
+Martinsweg 4
+97491 Aidhausen
+E-Mail: info@elektroinnung-hassberge.de
+
+Kreishandwerksmeister: Udo Merz
+
+Krum 41
+97475 Zeil am Main
+Tel.: 09524 7492
+Mobil: 0151 72460290
+E-Mail: u.merz@haustechnik-merz.de
+
+
+Kreishandwerkerschaft Kitzingen
+
+Landkreis: Kitzingen
+
+Ansprechpartnerin: Elisabeth Hofmann
+
+Marktbreiter Straße 4 a
+97342 Obernbreit
+Tel.: 09332 590636
+Fax: 09332 590479
+E-Mail: khw.kitzingen@gmail.com
+
+Kreishandwerksmeisterin: Monika Henneberger
+
+Schützenstraße 4 a
+97350 Mainbernheim
+Tel.: 09323 279
+Fax: 09323 5419
+E-Mail: monika.henneberger@t-online.de
+
+
+
+
+05.12.2025 48
+Kreishandwerkerschaft Main-Spessart
+
+Landkreis: Main-Spessart
+
+Ansprechpartnerin: Petra Stegerwald
+
+Sendelbacher Straße 10 a
+97816 Lohr am Main
+Tel.: 09352 6056495
+Fax: 0172 4294456
+E-Mail: petra@stegerwald.de
+
+Kreishandwerksmeister: Thomas Heußlein
+
+Reiterwiesen 5
+97834 Birkenfeld
+Tel.: 09398 221
+Fax: 09398 713
+E-Mail: info@schreinerei-heusslein.de
+
+
+Kreishandwerkerschaft Miltenberg
+
+Landkreis: Miltenberg
+
+Marktstraße 26
+63924 Kleinheubach
+Tel.: 09371 6693681
+E-Mail: kreishandwerker.mil@gmail.com
+
+Kreishandwerksmeisterin: Monique Haas
+
+Marktstraße 26
+63924 Kleinheubach
+E-Mail: monique3003@arcor.de
+
+
+
+
+05.12.2025 49
+Kreishandwerkerschaft Rhön-Grabfeld
+
+Landkreis: Rhön-Grabfeld
+
+Strutweg 15
+97653 Bischofsheim
+Tel.: 09772 9300990
+Fax: 09772 93009930
+E-Mail: khwsch-rhoen-grabfeld@mail.de
+
+Kreishandwerksmeister: Bruno Werner
+
+Strutweg 15
+97653 Bischofsheim
+Tel.: 09772 9300990
+Fax: 09772 93009930
+E-Mail: info@werner-objekteinrichtungen.de
+
+
+Kreishandwerkerschaft Schweinfurt
+
+Landkreis: Schweinfurt
+
+Ansprechpartnerin: Brigitte Rapp
+
+Galgenleite 3
+97424 Schweinfurt
+Tel.: 09721 473578
+E-Mail: rapp@Kreishandwerkerschaft-sw.de
+Internet: www.khw-sw.de
+
+Kreishandwerksmeisterin: Margit Rosentritt
+
+Hadergasse 6
+97421 Schweinfurt
+Tel.: 09721 22727
+
+
+
+
+05.12.2025 50
+Kreishandwerkerschaft Würzburg
+
+Landkreis: Würzburg
+
+Ansprechpartnerin: Sandra Köller
+
+Virchowstraße 1 b Rückgebäude
+97072 Würzburg
+Tel.: 0931 7841879
+E-Mail: info@kreishandwerkerschaft-wuerzburg.de
+Internet: www.kreishandwerkerschaft-wuerzburg.de
+
+Kreishandwerksmeister: Martin Strobl
+
+Vorderer Talweg 31
+97228 Rottendorf
+Tel.: 09302 2999
+Fax: 09302 2933
+E-Mail: innung@elektro-strobl.de
\ No newline at end of file