From f158845279ad45641133097039d5029bf9044812 Mon Sep 17 00:00:00 2001 From: Jose Selesan Date: Thu, 16 Apr 2026 20:05:08 -0300 Subject: [PATCH] refactor: migrate authentication from Supabase to Better Auth and update Prisma schema models --- apps/backend/.env | 4 +- apps/backend/package.json | 1 - apps/backend/prisma/auth.prisma | 1 + apps/backend/prisma/complex.prisma | 48 +- .../migration.sql | 18 + apps/backend/src/app.ts | 3 + apps/backend/src/generated/prisma/browser.ts | 25 +- apps/backend/src/generated/prisma/client.ts | 29 +- .../src/generated/prisma/commonInputTypes.ts | 260 +++++----- apps/backend/src/generated/prisma/enums.ts | 3 +- .../src/generated/prisma/internal/class.ts | 66 ++- .../prisma/internal/prismaNamespace.ts | 468 ++++++++++++++---- .../prisma/internal/prismaNamespaceBrowser.ts | 77 ++- apps/backend/src/generated/prisma/models.ts | 5 +- .../src/generated/prisma/models/Complex.ts | 12 - .../generated/prisma/models/ComplexUser.ts | 196 ++++---- .../prisma/models/OnboardingRequest.ts | 4 - .../src/generated/prisma/models/Sport.ts | 4 - .../src/generated/prisma/models/User.ts | 468 ++++++++++++++---- apps/backend/src/lib/auth.ts | 27 + .../middlewares/require-auth.middleware.ts | 89 +--- apps/backend/src/modules/auth/auth.routes.ts | 9 + .../onboarding/services/onboarding.service.ts | 30 +- apps/backend/src/register-routes.ts | 3 + apps/backend/tsconfig.json | 11 +- apps/frontend/package.json | 3 +- apps/frontend/src/lib/api-client.ts | 17 +- bun.lock | 2 +- 28 files changed, 1275 insertions(+), 608 deletions(-) create mode 100644 apps/backend/prisma/migrations/20260416194944_add_complex_user/migration.sql create mode 100644 apps/backend/src/lib/auth.ts create mode 100644 apps/backend/src/modules/auth/auth.routes.ts diff --git a/apps/backend/.env b/apps/backend/.env index 8987705..e14d869 100644 --- a/apps/backend/.env +++ b/apps/backend/.env @@ -9,4 +9,6 @@ SMTP_HOST=sandbox.smtp.mailtrap.io SMTP_PORT=587 SMTP_USER=6af2bf58132d12 SMTP_PASS=1253b2fe0fc47a -SMTP_FROM=Playzer \ No newline at end of file +SMTP_FROM=Playzer +BETTER_AUTH_SECRET=R1MfeeeekXSNdE65hOhhr0Mt0KLwczYr +BETTER_AUTH_URL=http://localhost:3000 \ No newline at end of file diff --git a/apps/backend/package.json b/apps/backend/package.json index 876899c..c152452 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -18,7 +18,6 @@ "@prisma/adapter-pg": "^7.6.0", "@prisma/client": "^7", "@repo/api-contract": "workspace:*", - "@supabase/supabase-js": "2.101.1", "better-auth": "^1.6.4", "dotenv": "^17.4.1", "hono": "4.12.10", diff --git a/apps/backend/prisma/auth.prisma b/apps/backend/prisma/auth.prisma index fb9d53e..1a6f00b 100644 --- a/apps/backend/prisma/auth.prisma +++ b/apps/backend/prisma/auth.prisma @@ -8,6 +8,7 @@ model User { updatedAt DateTime @updatedAt sessions Session[] accounts Account[] + complexes ComplexUser[] @@unique([email]) @@map("users") diff --git a/apps/backend/prisma/complex.prisma b/apps/backend/prisma/complex.prisma index 768fef2..70ead3d 100644 --- a/apps/backend/prisma/complex.prisma +++ b/apps/backend/prisma/complex.prisma @@ -1,17 +1,17 @@ model Complex { - id String @id @db.Uuid - complexName String @map("complex_name") - physicalAddress String? @map("physical_address") @db.VarChar(200) - city String? @map("city") @db.VarChar(100) - state String? @map("state") @db.VarChar(100) - country String? @map("country") @db.VarChar(100) - complexSlug String @unique @map("complex_slug") - adminEmail String @map("admin_email") - planCode String? @map("plan_code") @db.VarChar(10) - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @updatedAt @map("updated_at") - plan Plan? @relation(fields: [planCode], references: [code]) - // users ComplexUser[] + id String @id @db.Uuid + complexName String @map("complex_name") + physicalAddress String? @map("physical_address") @db.VarChar(200) + city String? @map("city") @db.VarChar(100) + state String? @map("state") @db.VarChar(100) + country String? @map("country") @db.VarChar(100) + complexSlug String @unique @map("complex_slug") + adminEmail String @map("admin_email") + planCode String? @map("plan_code") @db.VarChar(10) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + plan Plan? @relation(fields: [planCode], references: [code]) + users ComplexUser[] courts Court[] @@index([planCode]) @@ -24,15 +24,15 @@ enum ComplexUserRole { EMPLOYEE } -// model ComplexUser { -// complexId String @map("complex_id") @db.Uuid -// userId String @map("user_id") @db.Uuid -// role ComplexUserRole @default(ADMIN) -// createdAt DateTime @default(now()) @map("created_at") -// complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade) -// user User @relation(fields: [userId], references: [id], onDelete: Cascade) +model ComplexUser { + complexId String @map("complex_id") @db.Uuid + userId String @map("user_id") + role ComplexUserRole @default(ADMIN) + createdAt DateTime @default(now()) @map("created_at") + complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade) + user User @relation(fields: [userId], references: [id], onDelete: Cascade) -// @@id([complexId, userId]) -// @@index([userId]) -// @@map("complex_users") -// } + @@id([complexId, userId]) + @@index([userId]) + @@map("complex_users") +} diff --git a/apps/backend/prisma/migrations/20260416194944_add_complex_user/migration.sql b/apps/backend/prisma/migrations/20260416194944_add_complex_user/migration.sql new file mode 100644 index 0000000..28e3945 --- /dev/null +++ b/apps/backend/prisma/migrations/20260416194944_add_complex_user/migration.sql @@ -0,0 +1,18 @@ +-- CreateTable +CREATE TABLE "complex_users" ( + "complex_id" UUID NOT NULL, + "user_id" TEXT NOT NULL, + "role" "ComplexUserRole" NOT NULL DEFAULT 'ADMIN', + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "complex_users_pkey" PRIMARY KEY ("complex_id","user_id") +); + +-- CreateIndex +CREATE INDEX "complex_users_user_id_idx" ON "complex_users"("user_id"); + +-- AddForeignKey +ALTER TABLE "complex_users" ADD CONSTRAINT "complex_users_complex_id_fkey" FOREIGN KEY ("complex_id") REFERENCES "complexes"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "complex_users" ADD CONSTRAINT "complex_users_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/apps/backend/src/app.ts b/apps/backend/src/app.ts index a7bb377..8b753a4 100644 --- a/apps/backend/src/app.ts +++ b/apps/backend/src/app.ts @@ -21,6 +21,9 @@ export function createApp() { }, allowHeaders: ['Authorization', 'Content-Type'], allowMethods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'], + exposeHeaders: ["Content-Length"], + maxAge: 600, + credentials: true, }) ); diff --git a/apps/backend/src/generated/prisma/browser.ts b/apps/backend/src/generated/prisma/browser.ts index 46b2af3..b662900 100644 --- a/apps/backend/src/generated/prisma/browser.ts +++ b/apps/backend/src/generated/prisma/browser.ts @@ -17,6 +17,26 @@ import * as Prisma from './internal/prismaNamespaceBrowser' export { Prisma } export * as $Enums from './enums' export * from './enums'; +/** + * Model User + * + */ +export type User = Prisma.UserModel +/** + * Model Session + * + */ +export type Session = Prisma.SessionModel +/** + * Model Account + * + */ +export type Account = Prisma.AccountModel +/** + * Model Verification + * + */ +export type Verification = Prisma.VerificationModel /** * Model Complex * @@ -67,8 +87,3 @@ export type PasswordResetRequest = Prisma.PasswordResetRequestModel * */ export type Plan = Prisma.PlanModel -/** - * Model User - * - */ -export type User = Prisma.UserModel diff --git a/apps/backend/src/generated/prisma/client.ts b/apps/backend/src/generated/prisma/client.ts index c4d2875..d74e463 100644 --- a/apps/backend/src/generated/prisma/client.ts +++ b/apps/backend/src/generated/prisma/client.ts @@ -31,8 +31,8 @@ export * from "./enums" * const prisma = new PrismaClient({ * adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL }) * }) - * // Fetch zero or more Complexes - * const complexes = await prisma.complex.findMany() + * // Fetch zero or more Users + * const users = await prisma.user.findMany() * ``` * * Read more in our [docs](https://pris.ly/d/client). @@ -41,6 +41,26 @@ export const PrismaClient = $Class.getPrismaClientClass() export type PrismaClient = $Class.PrismaClient export { Prisma } +/** + * Model User + * + */ +export type User = Prisma.UserModel +/** + * Model Session + * + */ +export type Session = Prisma.SessionModel +/** + * Model Account + * + */ +export type Account = Prisma.AccountModel +/** + * Model Verification + * + */ +export type Verification = Prisma.VerificationModel /** * Model Complex * @@ -91,8 +111,3 @@ export type PasswordResetRequest = Prisma.PasswordResetRequestModel * */ export type Plan = Prisma.PlanModel -/** - * Model User - * - */ -export type User = Prisma.UserModel diff --git a/apps/backend/src/generated/prisma/commonInputTypes.ts b/apps/backend/src/generated/prisma/commonInputTypes.ts index f527e11..6787d9c 100644 --- a/apps/backend/src/generated/prisma/commonInputTypes.ts +++ b/apps/backend/src/generated/prisma/commonInputTypes.ts @@ -14,18 +14,6 @@ import * as $Enums from "./enums" import type * as Prisma from "./internal/prismaNamespace" -export type UuidFilter<$PrismaModel = never> = { - equals?: string | Prisma.StringFieldRefInput<$PrismaModel> - in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> - notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> - lt?: string | Prisma.StringFieldRefInput<$PrismaModel> - lte?: string | Prisma.StringFieldRefInput<$PrismaModel> - gt?: string | Prisma.StringFieldRefInput<$PrismaModel> - gte?: string | Prisma.StringFieldRefInput<$PrismaModel> - mode?: Prisma.QueryMode - not?: Prisma.NestedUuidFilter<$PrismaModel> | string -} - export type StringFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> @@ -41,6 +29,11 @@ export type StringFilter<$PrismaModel = never> = { not?: Prisma.NestedStringFilter<$PrismaModel> | string } +export type BoolFilter<$PrismaModel = never> = { + equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel> + not?: Prisma.NestedBoolFilter<$PrismaModel> | boolean +} + export type StringNullableFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> | null in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null @@ -72,21 +65,6 @@ export type SortOrderInput = { nulls?: Prisma.NullsOrder } -export type UuidWithAggregatesFilter<$PrismaModel = never> = { - equals?: string | Prisma.StringFieldRefInput<$PrismaModel> - in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> - notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> - lt?: string | Prisma.StringFieldRefInput<$PrismaModel> - lte?: string | Prisma.StringFieldRefInput<$PrismaModel> - gt?: string | Prisma.StringFieldRefInput<$PrismaModel> - gte?: string | Prisma.StringFieldRefInput<$PrismaModel> - mode?: Prisma.QueryMode - not?: Prisma.NestedUuidWithAggregatesFilter<$PrismaModel> | string - _count?: Prisma.NestedIntFilter<$PrismaModel> - _min?: Prisma.NestedStringFilter<$PrismaModel> - _max?: Prisma.NestedStringFilter<$PrismaModel> -} - export type StringWithAggregatesFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> @@ -105,6 +83,14 @@ export type StringWithAggregatesFilter<$PrismaModel = never> = { _max?: Prisma.NestedStringFilter<$PrismaModel> } +export type BoolWithAggregatesFilter<$PrismaModel = never> = { + equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel> + not?: Prisma.NestedBoolWithAggregatesFilter<$PrismaModel> | boolean + _count?: Prisma.NestedIntFilter<$PrismaModel> + _min?: Prisma.NestedBoolFilter<$PrismaModel> + _max?: Prisma.NestedBoolFilter<$PrismaModel> +} + export type StringNullableWithAggregatesFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> | null in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null @@ -137,6 +123,58 @@ export type DateTimeWithAggregatesFilter<$PrismaModel = never> = { _max?: Prisma.NestedDateTimeFilter<$PrismaModel> } +export type DateTimeNullableFilter<$PrismaModel = never> = { + equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null + in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null + notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null + lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + not?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> | Date | string | null +} + +export type DateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null + in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null + notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null + lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + not?: Prisma.NestedDateTimeNullableWithAggregatesFilter<$PrismaModel> | Date | string | null + _count?: Prisma.NestedIntNullableFilter<$PrismaModel> + _min?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> + _max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> +} + +export type UuidFilter<$PrismaModel = never> = { + equals?: string | Prisma.StringFieldRefInput<$PrismaModel> + in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> + notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> + lt?: string | Prisma.StringFieldRefInput<$PrismaModel> + lte?: string | Prisma.StringFieldRefInput<$PrismaModel> + gt?: string | Prisma.StringFieldRefInput<$PrismaModel> + gte?: string | Prisma.StringFieldRefInput<$PrismaModel> + mode?: Prisma.QueryMode + not?: Prisma.NestedUuidFilter<$PrismaModel> | string +} + +export type UuidWithAggregatesFilter<$PrismaModel = never> = { + equals?: string | Prisma.StringFieldRefInput<$PrismaModel> + in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> + notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> + lt?: string | Prisma.StringFieldRefInput<$PrismaModel> + lte?: string | Prisma.StringFieldRefInput<$PrismaModel> + gt?: string | Prisma.StringFieldRefInput<$PrismaModel> + gte?: string | Prisma.StringFieldRefInput<$PrismaModel> + mode?: Prisma.QueryMode + not?: Prisma.NestedUuidWithAggregatesFilter<$PrismaModel> | string + _count?: Prisma.NestedIntFilter<$PrismaModel> + _min?: Prisma.NestedStringFilter<$PrismaModel> + _max?: Prisma.NestedStringFilter<$PrismaModel> +} + export type EnumComplexUserRoleFilter<$PrismaModel = never> = { equals?: $Enums.ComplexUserRole | Prisma.EnumComplexUserRoleFieldRefInput<$PrismaModel> in?: $Enums.ComplexUserRole[] | Prisma.ListEnumComplexUserRoleFieldRefInput<$PrismaModel> @@ -154,19 +192,6 @@ export type EnumComplexUserRoleWithAggregatesFilter<$PrismaModel = never> = { _max?: Prisma.NestedEnumComplexUserRoleFilter<$PrismaModel> } -export type BoolFilter<$PrismaModel = never> = { - equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel> - not?: Prisma.NestedBoolFilter<$PrismaModel> | boolean -} - -export type BoolWithAggregatesFilter<$PrismaModel = never> = { - equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel> - not?: Prisma.NestedBoolWithAggregatesFilter<$PrismaModel> | boolean - _count?: Prisma.NestedIntFilter<$PrismaModel> - _min?: Prisma.NestedBoolFilter<$PrismaModel> - _max?: Prisma.NestedBoolFilter<$PrismaModel> -} - export type IntFilter<$PrismaModel = never> = { equals?: number | Prisma.IntFieldRefInput<$PrismaModel> in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> @@ -272,31 +297,6 @@ export type EnumCourtBookingStatusWithAggregatesFilter<$PrismaModel = never> = { _max?: Prisma.NestedEnumCourtBookingStatusFilter<$PrismaModel> } -export type DateTimeNullableFilter<$PrismaModel = never> = { - equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null - in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null - notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null - lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - not?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> | Date | string | null -} - -export type DateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { - equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null - in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null - notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null - lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - not?: Prisma.NestedDateTimeNullableWithAggregatesFilter<$PrismaModel> | Date | string | null - _count?: Prisma.NestedIntNullableFilter<$PrismaModel> - _min?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> - _max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> -} - export type JsonFilter<$PrismaModel = never> = | Prisma.PatchUndefined< Prisma.Either>, Exclude>, 'path'>>, @@ -348,17 +348,6 @@ export type JsonWithAggregatesFilterBase<$PrismaModel = never> = { _max?: Prisma.NestedJsonFilter<$PrismaModel> } -export type NestedUuidFilter<$PrismaModel = never> = { - equals?: string | Prisma.StringFieldRefInput<$PrismaModel> - in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> - notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> - lt?: string | Prisma.StringFieldRefInput<$PrismaModel> - lte?: string | Prisma.StringFieldRefInput<$PrismaModel> - gt?: string | Prisma.StringFieldRefInput<$PrismaModel> - gte?: string | Prisma.StringFieldRefInput<$PrismaModel> - not?: Prisma.NestedUuidFilter<$PrismaModel> | string -} - export type NestedStringFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> @@ -373,6 +362,11 @@ export type NestedStringFilter<$PrismaModel = never> = { not?: Prisma.NestedStringFilter<$PrismaModel> | string } +export type NestedBoolFilter<$PrismaModel = never> = { + equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel> + not?: Prisma.NestedBoolFilter<$PrismaModel> | boolean +} + export type NestedStringNullableFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> | null in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null @@ -398,7 +392,7 @@ export type NestedDateTimeFilter<$PrismaModel = never> = { not?: Prisma.NestedDateTimeFilter<$PrismaModel> | Date | string } -export type NestedUuidWithAggregatesFilter<$PrismaModel = never> = { +export type NestedStringWithAggregatesFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> @@ -406,7 +400,10 @@ export type NestedUuidWithAggregatesFilter<$PrismaModel = never> = { lte?: string | Prisma.StringFieldRefInput<$PrismaModel> gt?: string | Prisma.StringFieldRefInput<$PrismaModel> gte?: string | Prisma.StringFieldRefInput<$PrismaModel> - not?: Prisma.NestedUuidWithAggregatesFilter<$PrismaModel> | string + contains?: string | Prisma.StringFieldRefInput<$PrismaModel> + startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel> + endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel> + not?: Prisma.NestedStringWithAggregatesFilter<$PrismaModel> | string _count?: Prisma.NestedIntFilter<$PrismaModel> _min?: Prisma.NestedStringFilter<$PrismaModel> _max?: Prisma.NestedStringFilter<$PrismaModel> @@ -423,21 +420,12 @@ export type NestedIntFilter<$PrismaModel = never> = { not?: Prisma.NestedIntFilter<$PrismaModel> | number } -export type NestedStringWithAggregatesFilter<$PrismaModel = never> = { - equals?: string | Prisma.StringFieldRefInput<$PrismaModel> - in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> - notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> - lt?: string | Prisma.StringFieldRefInput<$PrismaModel> - lte?: string | Prisma.StringFieldRefInput<$PrismaModel> - gt?: string | Prisma.StringFieldRefInput<$PrismaModel> - gte?: string | Prisma.StringFieldRefInput<$PrismaModel> - contains?: string | Prisma.StringFieldRefInput<$PrismaModel> - startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel> - endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel> - not?: Prisma.NestedStringWithAggregatesFilter<$PrismaModel> | string +export type NestedBoolWithAggregatesFilter<$PrismaModel = never> = { + equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel> + not?: Prisma.NestedBoolWithAggregatesFilter<$PrismaModel> | boolean _count?: Prisma.NestedIntFilter<$PrismaModel> - _min?: Prisma.NestedStringFilter<$PrismaModel> - _max?: Prisma.NestedStringFilter<$PrismaModel> + _min?: Prisma.NestedBoolFilter<$PrismaModel> + _max?: Prisma.NestedBoolFilter<$PrismaModel> } export type NestedStringNullableWithAggregatesFilter<$PrismaModel = never> = { @@ -482,6 +470,56 @@ export type NestedDateTimeWithAggregatesFilter<$PrismaModel = never> = { _max?: Prisma.NestedDateTimeFilter<$PrismaModel> } +export type NestedDateTimeNullableFilter<$PrismaModel = never> = { + equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null + in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null + notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null + lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + not?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> | Date | string | null +} + +export type NestedDateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null + in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null + notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null + lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> + not?: Prisma.NestedDateTimeNullableWithAggregatesFilter<$PrismaModel> | Date | string | null + _count?: Prisma.NestedIntNullableFilter<$PrismaModel> + _min?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> + _max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> +} + +export type NestedUuidFilter<$PrismaModel = never> = { + equals?: string | Prisma.StringFieldRefInput<$PrismaModel> + in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> + notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> + lt?: string | Prisma.StringFieldRefInput<$PrismaModel> + lte?: string | Prisma.StringFieldRefInput<$PrismaModel> + gt?: string | Prisma.StringFieldRefInput<$PrismaModel> + gte?: string | Prisma.StringFieldRefInput<$PrismaModel> + not?: Prisma.NestedUuidFilter<$PrismaModel> | string +} + +export type NestedUuidWithAggregatesFilter<$PrismaModel = never> = { + equals?: string | Prisma.StringFieldRefInput<$PrismaModel> + in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> + notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> + lt?: string | Prisma.StringFieldRefInput<$PrismaModel> + lte?: string | Prisma.StringFieldRefInput<$PrismaModel> + gt?: string | Prisma.StringFieldRefInput<$PrismaModel> + gte?: string | Prisma.StringFieldRefInput<$PrismaModel> + not?: Prisma.NestedUuidWithAggregatesFilter<$PrismaModel> | string + _count?: Prisma.NestedIntFilter<$PrismaModel> + _min?: Prisma.NestedStringFilter<$PrismaModel> + _max?: Prisma.NestedStringFilter<$PrismaModel> +} + export type NestedEnumComplexUserRoleFilter<$PrismaModel = never> = { equals?: $Enums.ComplexUserRole | Prisma.EnumComplexUserRoleFieldRefInput<$PrismaModel> in?: $Enums.ComplexUserRole[] | Prisma.ListEnumComplexUserRoleFieldRefInput<$PrismaModel> @@ -499,19 +537,6 @@ export type NestedEnumComplexUserRoleWithAggregatesFilter<$PrismaModel = never> _max?: Prisma.NestedEnumComplexUserRoleFilter<$PrismaModel> } -export type NestedBoolFilter<$PrismaModel = never> = { - equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel> - not?: Prisma.NestedBoolFilter<$PrismaModel> | boolean -} - -export type NestedBoolWithAggregatesFilter<$PrismaModel = never> = { - equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel> - not?: Prisma.NestedBoolWithAggregatesFilter<$PrismaModel> | boolean - _count?: Prisma.NestedIntFilter<$PrismaModel> - _min?: Prisma.NestedBoolFilter<$PrismaModel> - _max?: Prisma.NestedBoolFilter<$PrismaModel> -} - export type NestedDecimalFilter<$PrismaModel = never> = { equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel> @@ -617,31 +642,6 @@ export type NestedEnumCourtBookingStatusWithAggregatesFilter<$PrismaModel = neve _max?: Prisma.NestedEnumCourtBookingStatusFilter<$PrismaModel> } -export type NestedDateTimeNullableFilter<$PrismaModel = never> = { - equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null - in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null - notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null - lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - not?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> | Date | string | null -} - -export type NestedDateTimeNullableWithAggregatesFilter<$PrismaModel = never> = { - equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null - in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null - notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null - lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> - not?: Prisma.NestedDateTimeNullableWithAggregatesFilter<$PrismaModel> | Date | string | null - _count?: Prisma.NestedIntNullableFilter<$PrismaModel> - _min?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> - _max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> -} - export type NestedJsonFilter<$PrismaModel = never> = | Prisma.PatchUndefined< Prisma.Either>, Exclude>, 'path'>>, diff --git a/apps/backend/src/generated/prisma/enums.ts b/apps/backend/src/generated/prisma/enums.ts index 0455865..e1a8e31 100644 --- a/apps/backend/src/generated/prisma/enums.ts +++ b/apps/backend/src/generated/prisma/enums.ts @@ -10,7 +10,8 @@ */ export const ComplexUserRole = { - ADMIN: 'ADMIN' + ADMIN: 'ADMIN', + EMPLOYEE: 'EMPLOYEE' } as const export type ComplexUserRole = (typeof ComplexUserRole)[keyof typeof ComplexUserRole] diff --git a/apps/backend/src/generated/prisma/internal/class.ts b/apps/backend/src/generated/prisma/internal/class.ts index 5719c39..56aaa76 100644 --- a/apps/backend/src/generated/prisma/internal/class.ts +++ b/apps/backend/src/generated/prisma/internal/class.ts @@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = { "clientVersion": "7.6.0", "engineVersion": "75cbdc1eb7150937890ad5465d861175c6624711", "activeProvider": "postgresql", - "inlineSchema": "model Complex {\n id String @id @db.Uuid\n complexName String @map(\"complex_name\")\n physicalAddress String? @map(\"physical_address\") @db.VarChar(200)\n city String? @map(\"city\") @db.VarChar(100)\n state String? @map(\"state\") @db.VarChar(100)\n country String? @map(\"country\") @db.VarChar(100)\n complexSlug String @unique @map(\"complex_slug\")\n adminEmail String @map(\"admin_email\")\n planCode String? @map(\"plan_code\") @db.VarChar(10)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n plan Plan? @relation(fields: [planCode], references: [code])\n users ComplexUser[]\n courts Court[]\n\n @@index([planCode])\n @@index([complexSlug])\n @@map(\"complexes\")\n}\n\nenum ComplexUserRole {\n ADMIN\n}\n\nmodel ComplexUser {\n complexId String @map(\"complex_id\") @db.Uuid\n userId String @map(\"user_id\") @db.Uuid\n role ComplexUserRole @default(ADMIN)\n createdAt DateTime @default(now()) @map(\"created_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@id([complexId, userId])\n @@index([userId])\n @@map(\"complex_users\")\n}\n\nenum DayOfWeek {\n MONDAY\n TUESDAY\n WEDNESDAY\n THURSDAY\n FRIDAY\n SATURDAY\n SUNDAY\n}\n\nenum CourtBookingStatus {\n CONFIRMED\n CANCELLED\n COMPLETED\n}\n\nmodel Sport {\n id String @id @db.Uuid\n name String @unique\n slug String @unique\n isActive Boolean @default(true) @map(\"is_active\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n courts Court[]\n\n @@map(\"sports\")\n}\n\nmodel Court {\n id String @id @db.Uuid\n complexId String @map(\"complex_id\") @db.Uuid\n sportId String @map(\"sport_id\") @db.Uuid\n name String\n slotDurationMinutes Int @map(\"slot_duration_minutes\")\n basePrice Decimal @map(\"base_price\") @db.Decimal(19, 2)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n sport Sport @relation(fields: [sportId], references: [id])\n availabilities CourtAvailability[]\n priceRules CourtPriceRule[]\n bookings CourtBooking[]\n\n @@index([complexId])\n @@index([sportId])\n @@map(\"courts\")\n}\n\nmodel CourtAvailability {\n id String @id @db.Uuid\n courtId String @map(\"court_id\") @db.Uuid\n dayOfWeek DayOfWeek @map(\"day_of_week\")\n startTime String @map(\"start_time\") @db.VarChar(5)\n endTime String @map(\"end_time\") @db.VarChar(5)\n createdAt DateTime @default(now()) @map(\"created_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@index([courtId, dayOfWeek])\n @@map(\"court_availabilities\")\n}\n\nmodel CourtPriceRule {\n id String @id @db.Uuid\n courtId String @map(\"court_id\") @db.Uuid\n dayOfWeek DayOfWeek? @map(\"day_of_week\")\n startTime String? @map(\"start_time\") @db.VarChar(5)\n endTime String? @map(\"end_time\") @db.VarChar(5)\n price Decimal @db.Decimal(19, 2)\n isActive Boolean @default(true) @map(\"is_active\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@index([courtId, isActive])\n @@map(\"court_price_rules\")\n}\n\nmodel CourtBooking {\n id String @id @db.Uuid\n bookingCode String @unique @map(\"booking_code\") @db.VarChar(8)\n courtId String @map(\"court_id\") @db.Uuid\n bookingDate DateTime @map(\"booking_date\") @db.Date\n startTime String @map(\"start_time\") @db.VarChar(5)\n endTime String @map(\"end_time\") @db.VarChar(5)\n customerName String @map(\"customer_name\") @db.VarChar(120)\n customerPhone String @map(\"customer_phone\") @db.VarChar(30)\n status CourtBookingStatus @default(CONFIRMED)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@unique([courtId, bookingDate, startTime])\n @@index([courtId, bookingDate])\n @@index([bookingDate])\n @@map(\"court_bookings\")\n}\n\nmodel OnboardingRequest {\n id String @id @db.Uuid\n fullName String @map(\"full_name\")\n email String\n otpHash String @map(\"otp_hash\")\n otpExpiresAt DateTime @map(\"otp_expires_at\")\n otpAttempts Int @default(0) @map(\"otp_attempts\")\n otpLastSentAt DateTime @map(\"otp_last_sent_at\")\n otpResendCount Int @default(0) @map(\"otp_resend_count\")\n emailVerifiedAt DateTime? @map(\"email_verified_at\")\n completedAt DateTime? @map(\"completed_at\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n\n @@index([email])\n @@index([otpExpiresAt])\n @@map(\"onboarding_requests\")\n}\n\nmodel PasswordResetRequest {\n id String @id @db.Uuid\n email String\n otpHash String @map(\"otp_hash\")\n otpExpiresAt DateTime @map(\"otp_expires_at\")\n otpAttempts Int @default(0) @map(\"otp_attempts\")\n otpLastSentAt DateTime @map(\"otp_last_sent_at\")\n otpResendCount Int @default(0) @map(\"otp_resend_count\")\n usedAt DateTime? @map(\"used_at\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n\n @@index([email])\n @@index([otpExpiresAt])\n @@map(\"password_reset_requests\")\n}\n\nmodel Plan {\n code String @id @db.VarChar(10)\n name String @db.VarChar(30)\n price Decimal @db.Decimal(19, 2)\n rules Json\n lastUpdatedAt DateTime @default(now()) @map(\"last_updated_at\")\n complexes Complex[]\n\n @@map(\"plans\")\n}\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../src/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nmodel User {\n id String @id @db.Uuid\n supabaseUserId String @unique @map(\"supabase_user_id\") @db.Uuid\n email String @unique\n fullName String @map(\"full_name\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n complexes ComplexUser[]\n\n @@map(\"users\")\n}\n", + "inlineSchema": "model User {\n id String @id\n name String\n email String\n emailVerified Boolean @default(false)\n image String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n sessions Session[]\n accounts Account[]\n complexes ComplexUser[]\n\n @@unique([email])\n @@map(\"users\")\n}\n\nmodel Session {\n id String @id\n expiresAt DateTime\n token String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n ipAddress String?\n userAgent String?\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([token])\n @@index([userId])\n @@map(\"sessions\")\n}\n\nmodel Account {\n id String @id\n accountId String\n providerId String\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessToken String?\n refreshToken String?\n idToken String?\n accessTokenExpiresAt DateTime?\n refreshTokenExpiresAt DateTime?\n scope String?\n password String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@map(\"accounts\")\n}\n\nmodel Verification {\n id String @id\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n @@map(\"verification\")\n}\n\nmodel Complex {\n id String @id @db.Uuid\n complexName String @map(\"complex_name\")\n physicalAddress String? @map(\"physical_address\") @db.VarChar(200)\n city String? @map(\"city\") @db.VarChar(100)\n state String? @map(\"state\") @db.VarChar(100)\n country String? @map(\"country\") @db.VarChar(100)\n complexSlug String @unique @map(\"complex_slug\")\n adminEmail String @map(\"admin_email\")\n planCode String? @map(\"plan_code\") @db.VarChar(10)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n plan Plan? @relation(fields: [planCode], references: [code])\n users ComplexUser[]\n courts Court[]\n\n @@index([planCode])\n @@index([complexSlug])\n @@map(\"complexes\")\n}\n\nenum ComplexUserRole {\n ADMIN\n EMPLOYEE\n}\n\nmodel ComplexUser {\n complexId String @map(\"complex_id\") @db.Uuid\n userId String @map(\"user_id\")\n role ComplexUserRole @default(ADMIN)\n createdAt DateTime @default(now()) @map(\"created_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@id([complexId, userId])\n @@index([userId])\n @@map(\"complex_users\")\n}\n\nenum DayOfWeek {\n MONDAY\n TUESDAY\n WEDNESDAY\n THURSDAY\n FRIDAY\n SATURDAY\n SUNDAY\n}\n\nenum CourtBookingStatus {\n CONFIRMED\n CANCELLED\n COMPLETED\n}\n\nmodel Sport {\n id String @id @db.Uuid\n name String @unique\n slug String @unique\n isActive Boolean @default(true) @map(\"is_active\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n courts Court[]\n\n @@map(\"sports\")\n}\n\nmodel Court {\n id String @id @db.Uuid\n complexId String @map(\"complex_id\") @db.Uuid\n sportId String @map(\"sport_id\") @db.Uuid\n name String\n slotDurationMinutes Int @map(\"slot_duration_minutes\")\n basePrice Decimal @map(\"base_price\") @db.Decimal(19, 2)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n sport Sport @relation(fields: [sportId], references: [id])\n availabilities CourtAvailability[]\n priceRules CourtPriceRule[]\n bookings CourtBooking[]\n\n @@index([complexId])\n @@index([sportId])\n @@map(\"courts\")\n}\n\nmodel CourtAvailability {\n id String @id @db.Uuid\n courtId String @map(\"court_id\") @db.Uuid\n dayOfWeek DayOfWeek @map(\"day_of_week\")\n startTime String @map(\"start_time\") @db.VarChar(5)\n endTime String @map(\"end_time\") @db.VarChar(5)\n createdAt DateTime @default(now()) @map(\"created_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@index([courtId, dayOfWeek])\n @@map(\"court_availabilities\")\n}\n\nmodel CourtPriceRule {\n id String @id @db.Uuid\n courtId String @map(\"court_id\") @db.Uuid\n dayOfWeek DayOfWeek? @map(\"day_of_week\")\n startTime String? @map(\"start_time\") @db.VarChar(5)\n endTime String? @map(\"end_time\") @db.VarChar(5)\n price Decimal @db.Decimal(19, 2)\n isActive Boolean @default(true) @map(\"is_active\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@index([courtId, isActive])\n @@map(\"court_price_rules\")\n}\n\nmodel CourtBooking {\n id String @id @db.Uuid\n bookingCode String @unique @map(\"booking_code\") @db.VarChar(8)\n courtId String @map(\"court_id\") @db.Uuid\n bookingDate DateTime @map(\"booking_date\") @db.Date\n startTime String @map(\"start_time\") @db.VarChar(5)\n endTime String @map(\"end_time\") @db.VarChar(5)\n customerName String @map(\"customer_name\") @db.VarChar(120)\n customerPhone String @map(\"customer_phone\") @db.VarChar(30)\n status CourtBookingStatus @default(CONFIRMED)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@unique([courtId, bookingDate, startTime])\n @@index([courtId, bookingDate])\n @@index([bookingDate])\n @@map(\"court_bookings\")\n}\n\nmodel OnboardingRequest {\n id String @id @db.Uuid\n fullName String @map(\"full_name\")\n email String\n otpHash String @map(\"otp_hash\")\n otpExpiresAt DateTime @map(\"otp_expires_at\")\n otpAttempts Int @default(0) @map(\"otp_attempts\")\n otpLastSentAt DateTime @map(\"otp_last_sent_at\")\n otpResendCount Int @default(0) @map(\"otp_resend_count\")\n emailVerifiedAt DateTime? @map(\"email_verified_at\")\n completedAt DateTime? @map(\"completed_at\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n\n @@index([email])\n @@index([otpExpiresAt])\n @@map(\"onboarding_requests\")\n}\n\nmodel PasswordResetRequest {\n id String @id @db.Uuid\n email String\n otpHash String @map(\"otp_hash\")\n otpExpiresAt DateTime @map(\"otp_expires_at\")\n otpAttempts Int @default(0) @map(\"otp_attempts\")\n otpLastSentAt DateTime @map(\"otp_last_sent_at\")\n otpResendCount Int @default(0) @map(\"otp_resend_count\")\n usedAt DateTime? @map(\"used_at\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n\n @@index([email])\n @@index([otpExpiresAt])\n @@map(\"password_reset_requests\")\n}\n\nmodel Plan {\n code String @id @db.VarChar(10)\n name String @db.VarChar(30)\n price Decimal @db.Decimal(19, 2)\n rules Json\n lastUpdatedAt DateTime @default(now()) @map(\"last_updated_at\")\n complexes Complex[]\n\n @@map(\"plans\")\n}\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../src/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\n// model User {\n// id String @id @db.Uuid\n// supabaseUserId String @unique @map(\"supabase_user_id\") @db.Uuid\n// email String @unique\n// fullName String @map(\"full_name\")\n// createdAt DateTime @default(now()) @map(\"created_at\")\n// updatedAt DateTime @updatedAt @map(\"updated_at\")\n// complexes ComplexUser[]\n\n// @@map(\"users\")\n// }\n", "runtimeDataModel": { "models": {}, "enums": {}, @@ -32,10 +32,10 @@ const config: runtime.GetPrismaClientConfig = { } } -config.runtimeDataModel = JSON.parse("{\"models\":{\"Complex\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_name\"},{\"name\":\"physicalAddress\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"physical_address\"},{\"name\":\"city\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"city\"},{\"name\":\"state\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"state\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"country\"},{\"name\":\"complexSlug\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_slug\"},{\"name\":\"adminEmail\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"admin_email\"},{\"name\":\"planCode\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"plan_code\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"plan\",\"kind\":\"object\",\"type\":\"Plan\",\"relationName\":\"ComplexToPlan\"},{\"name\":\"users\",\"kind\":\"object\",\"type\":\"ComplexUser\",\"relationName\":\"ComplexToComplexUser\"},{\"name\":\"courts\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"ComplexToCourt\"}],\"dbName\":\"complexes\"},\"ComplexUser\":{\"fields\":[{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"user_id\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"ComplexUserRole\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToComplexUser\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ComplexUserToUser\"}],\"dbName\":\"complex_users\"},\"Sport\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\",\"dbName\":\"is_active\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"courts\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToSport\"}],\"dbName\":\"sports\"},\"Court\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"sportId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"sport_id\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slotDurationMinutes\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"slot_duration_minutes\"},{\"name\":\"basePrice\",\"kind\":\"scalar\",\"type\":\"Decimal\",\"dbName\":\"base_price\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToCourt\"},{\"name\":\"sport\",\"kind\":\"object\",\"type\":\"Sport\",\"relationName\":\"CourtToSport\"},{\"name\":\"availabilities\",\"kind\":\"object\",\"type\":\"CourtAvailability\",\"relationName\":\"CourtToCourtAvailability\"},{\"name\":\"priceRules\",\"kind\":\"object\",\"type\":\"CourtPriceRule\",\"relationName\":\"CourtToCourtPriceRule\"},{\"name\":\"bookings\",\"kind\":\"object\",\"type\":\"CourtBooking\",\"relationName\":\"CourtToCourtBooking\"}],\"dbName\":\"courts\"},\"CourtAvailability\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"dayOfWeek\",\"kind\":\"enum\",\"type\":\"DayOfWeek\",\"dbName\":\"day_of_week\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtAvailability\"}],\"dbName\":\"court_availabilities\"},\"CourtPriceRule\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"dayOfWeek\",\"kind\":\"enum\",\"type\":\"DayOfWeek\",\"dbName\":\"day_of_week\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\",\"dbName\":\"is_active\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtPriceRule\"}],\"dbName\":\"court_price_rules\"},\"CourtBooking\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"bookingCode\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"booking_code\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"bookingDate\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"booking_date\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"customerName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_name\"},{\"name\":\"customerPhone\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_phone\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"CourtBookingStatus\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtBooking\"}],\"dbName\":\"court_bookings\"},\"OnboardingRequest\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fullName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"full_name\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"otpHash\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"otp_hash\"},{\"name\":\"otpExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_expires_at\"},{\"name\":\"otpAttempts\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_attempts\"},{\"name\":\"otpLastSentAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_last_sent_at\"},{\"name\":\"otpResendCount\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_resend_count\"},{\"name\":\"emailVerifiedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"email_verified_at\"},{\"name\":\"completedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"completed_at\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"}],\"dbName\":\"onboarding_requests\"},\"PasswordResetRequest\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"otpHash\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"otp_hash\"},{\"name\":\"otpExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_expires_at\"},{\"name\":\"otpAttempts\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_attempts\"},{\"name\":\"otpLastSentAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_last_sent_at\"},{\"name\":\"otpResendCount\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_resend_count\"},{\"name\":\"usedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"used_at\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"}],\"dbName\":\"password_reset_requests\"},\"Plan\":{\"fields\":[{\"name\":\"code\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"rules\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"lastUpdatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"last_updated_at\"},{\"name\":\"complexes\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToPlan\"}],\"dbName\":\"plans\"},\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"supabaseUserId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"supabase_user_id\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fullName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"full_name\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"complexes\",\"kind\":\"object\",\"type\":\"ComplexUser\",\"relationName\":\"ComplexUserToUser\"}],\"dbName\":\"users\"}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"image\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"sessions\",\"kind\":\"object\",\"type\":\"Session\",\"relationName\":\"SessionToUser\"},{\"name\":\"accounts\",\"kind\":\"object\",\"type\":\"Account\",\"relationName\":\"AccountToUser\"},{\"name\":\"complexes\",\"kind\":\"object\",\"type\":\"ComplexUser\",\"relationName\":\"ComplexUserToUser\"}],\"dbName\":\"users\"},\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"SessionToUser\"}],\"dbName\":\"sessions\"},\"Account\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AccountToUser\"},{\"name\":\"accessToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"idToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"refreshTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"accounts\"},\"Verification\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"identifier\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"verification\"},\"Complex\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_name\"},{\"name\":\"physicalAddress\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"physical_address\"},{\"name\":\"city\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"city\"},{\"name\":\"state\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"state\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"country\"},{\"name\":\"complexSlug\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_slug\"},{\"name\":\"adminEmail\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"admin_email\"},{\"name\":\"planCode\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"plan_code\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"plan\",\"kind\":\"object\",\"type\":\"Plan\",\"relationName\":\"ComplexToPlan\"},{\"name\":\"users\",\"kind\":\"object\",\"type\":\"ComplexUser\",\"relationName\":\"ComplexToComplexUser\"},{\"name\":\"courts\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"ComplexToCourt\"}],\"dbName\":\"complexes\"},\"ComplexUser\":{\"fields\":[{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"user_id\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"ComplexUserRole\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToComplexUser\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ComplexUserToUser\"}],\"dbName\":\"complex_users\"},\"Sport\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\",\"dbName\":\"is_active\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"courts\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToSport\"}],\"dbName\":\"sports\"},\"Court\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"sportId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"sport_id\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slotDurationMinutes\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"slot_duration_minutes\"},{\"name\":\"basePrice\",\"kind\":\"scalar\",\"type\":\"Decimal\",\"dbName\":\"base_price\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToCourt\"},{\"name\":\"sport\",\"kind\":\"object\",\"type\":\"Sport\",\"relationName\":\"CourtToSport\"},{\"name\":\"availabilities\",\"kind\":\"object\",\"type\":\"CourtAvailability\",\"relationName\":\"CourtToCourtAvailability\"},{\"name\":\"priceRules\",\"kind\":\"object\",\"type\":\"CourtPriceRule\",\"relationName\":\"CourtToCourtPriceRule\"},{\"name\":\"bookings\",\"kind\":\"object\",\"type\":\"CourtBooking\",\"relationName\":\"CourtToCourtBooking\"}],\"dbName\":\"courts\"},\"CourtAvailability\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"dayOfWeek\",\"kind\":\"enum\",\"type\":\"DayOfWeek\",\"dbName\":\"day_of_week\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtAvailability\"}],\"dbName\":\"court_availabilities\"},\"CourtPriceRule\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"dayOfWeek\",\"kind\":\"enum\",\"type\":\"DayOfWeek\",\"dbName\":\"day_of_week\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\",\"dbName\":\"is_active\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtPriceRule\"}],\"dbName\":\"court_price_rules\"},\"CourtBooking\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"bookingCode\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"booking_code\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"bookingDate\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"booking_date\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"customerName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_name\"},{\"name\":\"customerPhone\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_phone\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"CourtBookingStatus\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtBooking\"}],\"dbName\":\"court_bookings\"},\"OnboardingRequest\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fullName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"full_name\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"otpHash\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"otp_hash\"},{\"name\":\"otpExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_expires_at\"},{\"name\":\"otpAttempts\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_attempts\"},{\"name\":\"otpLastSentAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_last_sent_at\"},{\"name\":\"otpResendCount\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_resend_count\"},{\"name\":\"emailVerifiedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"email_verified_at\"},{\"name\":\"completedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"completed_at\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"}],\"dbName\":\"onboarding_requests\"},\"PasswordResetRequest\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"otpHash\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"otp_hash\"},{\"name\":\"otpExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_expires_at\"},{\"name\":\"otpAttempts\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_attempts\"},{\"name\":\"otpLastSentAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_last_sent_at\"},{\"name\":\"otpResendCount\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_resend_count\"},{\"name\":\"usedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"used_at\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"}],\"dbName\":\"password_reset_requests\"},\"Plan\":{\"fields\":[{\"name\":\"code\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"rules\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"lastUpdatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"last_updated_at\"},{\"name\":\"complexes\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToPlan\"}],\"dbName\":\"plans\"}},\"enums\":{},\"types\":{}}") config.parameterizationSchema = { - strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"complexes\",\"_count\",\"plan\",\"complex\",\"user\",\"users\",\"courts\",\"sport\",\"court\",\"availabilities\",\"priceRules\",\"bookings\",\"Complex.findUnique\",\"Complex.findUniqueOrThrow\",\"Complex.findFirst\",\"Complex.findFirstOrThrow\",\"Complex.findMany\",\"data\",\"Complex.createOne\",\"Complex.createMany\",\"Complex.createManyAndReturn\",\"Complex.updateOne\",\"Complex.updateMany\",\"Complex.updateManyAndReturn\",\"create\",\"update\",\"Complex.upsertOne\",\"Complex.deleteOne\",\"Complex.deleteMany\",\"having\",\"_min\",\"_max\",\"Complex.groupBy\",\"Complex.aggregate\",\"ComplexUser.findUnique\",\"ComplexUser.findUniqueOrThrow\",\"ComplexUser.findFirst\",\"ComplexUser.findFirstOrThrow\",\"ComplexUser.findMany\",\"ComplexUser.createOne\",\"ComplexUser.createMany\",\"ComplexUser.createManyAndReturn\",\"ComplexUser.updateOne\",\"ComplexUser.updateMany\",\"ComplexUser.updateManyAndReturn\",\"ComplexUser.upsertOne\",\"ComplexUser.deleteOne\",\"ComplexUser.deleteMany\",\"ComplexUser.groupBy\",\"ComplexUser.aggregate\",\"Sport.findUnique\",\"Sport.findUniqueOrThrow\",\"Sport.findFirst\",\"Sport.findFirstOrThrow\",\"Sport.findMany\",\"Sport.createOne\",\"Sport.createMany\",\"Sport.createManyAndReturn\",\"Sport.updateOne\",\"Sport.updateMany\",\"Sport.updateManyAndReturn\",\"Sport.upsertOne\",\"Sport.deleteOne\",\"Sport.deleteMany\",\"Sport.groupBy\",\"Sport.aggregate\",\"Court.findUnique\",\"Court.findUniqueOrThrow\",\"Court.findFirst\",\"Court.findFirstOrThrow\",\"Court.findMany\",\"Court.createOne\",\"Court.createMany\",\"Court.createManyAndReturn\",\"Court.updateOne\",\"Court.updateMany\",\"Court.updateManyAndReturn\",\"Court.upsertOne\",\"Court.deleteOne\",\"Court.deleteMany\",\"_avg\",\"_sum\",\"Court.groupBy\",\"Court.aggregate\",\"CourtAvailability.findUnique\",\"CourtAvailability.findUniqueOrThrow\",\"CourtAvailability.findFirst\",\"CourtAvailability.findFirstOrThrow\",\"CourtAvailability.findMany\",\"CourtAvailability.createOne\",\"CourtAvailability.createMany\",\"CourtAvailability.createManyAndReturn\",\"CourtAvailability.updateOne\",\"CourtAvailability.updateMany\",\"CourtAvailability.updateManyAndReturn\",\"CourtAvailability.upsertOne\",\"CourtAvailability.deleteOne\",\"CourtAvailability.deleteMany\",\"CourtAvailability.groupBy\",\"CourtAvailability.aggregate\",\"CourtPriceRule.findUnique\",\"CourtPriceRule.findUniqueOrThrow\",\"CourtPriceRule.findFirst\",\"CourtPriceRule.findFirstOrThrow\",\"CourtPriceRule.findMany\",\"CourtPriceRule.createOne\",\"CourtPriceRule.createMany\",\"CourtPriceRule.createManyAndReturn\",\"CourtPriceRule.updateOne\",\"CourtPriceRule.updateMany\",\"CourtPriceRule.updateManyAndReturn\",\"CourtPriceRule.upsertOne\",\"CourtPriceRule.deleteOne\",\"CourtPriceRule.deleteMany\",\"CourtPriceRule.groupBy\",\"CourtPriceRule.aggregate\",\"CourtBooking.findUnique\",\"CourtBooking.findUniqueOrThrow\",\"CourtBooking.findFirst\",\"CourtBooking.findFirstOrThrow\",\"CourtBooking.findMany\",\"CourtBooking.createOne\",\"CourtBooking.createMany\",\"CourtBooking.createManyAndReturn\",\"CourtBooking.updateOne\",\"CourtBooking.updateMany\",\"CourtBooking.updateManyAndReturn\",\"CourtBooking.upsertOne\",\"CourtBooking.deleteOne\",\"CourtBooking.deleteMany\",\"CourtBooking.groupBy\",\"CourtBooking.aggregate\",\"OnboardingRequest.findUnique\",\"OnboardingRequest.findUniqueOrThrow\",\"OnboardingRequest.findFirst\",\"OnboardingRequest.findFirstOrThrow\",\"OnboardingRequest.findMany\",\"OnboardingRequest.createOne\",\"OnboardingRequest.createMany\",\"OnboardingRequest.createManyAndReturn\",\"OnboardingRequest.updateOne\",\"OnboardingRequest.updateMany\",\"OnboardingRequest.updateManyAndReturn\",\"OnboardingRequest.upsertOne\",\"OnboardingRequest.deleteOne\",\"OnboardingRequest.deleteMany\",\"OnboardingRequest.groupBy\",\"OnboardingRequest.aggregate\",\"PasswordResetRequest.findUnique\",\"PasswordResetRequest.findUniqueOrThrow\",\"PasswordResetRequest.findFirst\",\"PasswordResetRequest.findFirstOrThrow\",\"PasswordResetRequest.findMany\",\"PasswordResetRequest.createOne\",\"PasswordResetRequest.createMany\",\"PasswordResetRequest.createManyAndReturn\",\"PasswordResetRequest.updateOne\",\"PasswordResetRequest.updateMany\",\"PasswordResetRequest.updateManyAndReturn\",\"PasswordResetRequest.upsertOne\",\"PasswordResetRequest.deleteOne\",\"PasswordResetRequest.deleteMany\",\"PasswordResetRequest.groupBy\",\"PasswordResetRequest.aggregate\",\"Plan.findUnique\",\"Plan.findUniqueOrThrow\",\"Plan.findFirst\",\"Plan.findFirstOrThrow\",\"Plan.findMany\",\"Plan.createOne\",\"Plan.createMany\",\"Plan.createManyAndReturn\",\"Plan.updateOne\",\"Plan.updateMany\",\"Plan.updateManyAndReturn\",\"Plan.upsertOne\",\"Plan.deleteOne\",\"Plan.deleteMany\",\"Plan.groupBy\",\"Plan.aggregate\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"User.createOne\",\"User.createMany\",\"User.createManyAndReturn\",\"User.updateOne\",\"User.updateMany\",\"User.updateManyAndReturn\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"User.groupBy\",\"User.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"supabaseUserId\",\"email\",\"fullName\",\"createdAt\",\"updatedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"contains\",\"startsWith\",\"endsWith\",\"every\",\"some\",\"none\",\"code\",\"name\",\"price\",\"rules\",\"lastUpdatedAt\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"otpHash\",\"otpExpiresAt\",\"otpAttempts\",\"otpLastSentAt\",\"otpResendCount\",\"usedAt\",\"emailVerifiedAt\",\"completedAt\",\"bookingCode\",\"courtId\",\"bookingDate\",\"startTime\",\"endTime\",\"customerName\",\"customerPhone\",\"CourtBookingStatus\",\"status\",\"DayOfWeek\",\"dayOfWeek\",\"isActive\",\"complexId\",\"sportId\",\"slotDurationMinutes\",\"basePrice\",\"slug\",\"userId\",\"ComplexUserRole\",\"role\",\"complexName\",\"physicalAddress\",\"city\",\"state\",\"country\",\"complexSlug\",\"adminEmail\",\"planCode\",\"courtId_bookingDate_startTime\",\"complexId_userId\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), - graph: "6gRosAERBQAA_gIAIAgAALUCACAJAADkAgAgxwEAAP0CADDIAQAABQAQyQEAAP0CADDKAQEAAAABzgFAALQCACHPAUAAtAIAIYUCAQCzAgAhhgIBAPACACGHAgEA8AIAIYgCAQDwAgAhiQIBAPACACGKAgEAAAABiwIBALMCACGMAgEA8AIAIQEAAAABACAJAwAAwAIAIMcBAAC9AgAwyAEAAAMAEMkBAAC9AgAw3gEBALMCACHfAQEAswIAIeABEAC-AgAh4QEAAL8CACDiAUAAtAIAIQEAAAADACARBQAA_gIAIAgAALUCACAJAADkAgAgxwEAAP0CADDIAQAABQAQyQEAAP0CADDKAQEAsgIAIc4BQAC0AgAhzwFAALQCACGFAgEAswIAIYYCAQDwAgAhhwIBAPACACGIAgEA8AIAIYkCAQDwAgAhigIBALMCACGLAgEAswIAIYwCAQDwAgAhCAUAALoEACAIAACVAwAgCQAAqgQAIIYCAAD4AwAghwIAAPgDACCIAgAA-AMAIIkCAAD4AwAgjAIAAPgDACADAAAABQAgAQAABgAwAgAAAQAgAQAAAAUAIAkGAAD0AgAgBwAA_AIAIMcBAAD6AgAwyAEAAAkAEMkBAAD6AgAwzgFAALQCACH9AQEAsgIAIYICAQCyAgAhhAIAAPsChAIiAgYAALQEACAHAAC5BAAgCgYAAPQCACAHAAD8AgAgxwEAAPoCADDIAQAACQAQyQEAAPoCADDOAUAAtAIAIf0BAQCyAgAhggIBALICACGEAgAA-wKEAiKOAgAA-QIAIAMAAAAJACABAAAKADACAAALACADAAAACQAgAQAACgAwAgAACwAgAQAAAAkAIBAGAAD0AgAgCgAA9QIAIAwAAPYCACANAAD3AgAgDgAA-AIAIMcBAADzAgAwyAEAAA8AEMkBAADzAgAwygEBALICACHOAUAAtAIAIc8BQAC0AgAh3wEBALMCACH9AQEAsgIAIf4BAQCyAgAh_wECAMoCACGAAhAAvgIAIQUGAAC0BAAgCgAAtQQAIAwAALYEACANAAC3BAAgDgAAuAQAIBAGAAD0AgAgCgAA9QIAIAwAAPYCACANAAD3AgAgDgAA-AIAIMcBAADzAgAwyAEAAA8AEMkBAADzAgAwygEBAAAAAc4BQAC0AgAhzwFAALQCACHfAQEAswIAIf0BAQCyAgAh_gEBALICACH_AQIAygIAIYACEAC-AgAhAwAAAA8AIAEAABAAMAIAABEAIAMAAAAPACABAAAQADACAAARACABAAAADwAgCgsAAO0CACDHAQAA8QIAMMgBAAAVABDJAQAA8QIAMMoBAQCyAgAhzgFAALQCACHyAQEAsgIAIfQBAQCzAgAh9QEBALMCACH7AQAA8gL7ASIBCwAAswQAIAoLAADtAgAgxwEAAPECADDIAQAAFQAQyQEAAPECADDKAQEAAAABzgFAALQCACHyAQEAsgIAIfQBAQCzAgAh9QEBALMCACH7AQAA8gL7ASIDAAAAFQAgAQAAFgAwAgAAFwAgDQsAAO0CACDHAQAA7gIAMMgBAAAZABDJAQAA7gIAMMoBAQCyAgAhzgFAALQCACHPAUAAtAIAIeABEAC-AgAh8gEBALICACH0AQEA8AIAIfUBAQDwAgAh-wEAAO8C-wEj_AEgAOMCACEECwAAswQAIPQBAAD4AwAg9QEAAPgDACD7AQAA-AMAIA0LAADtAgAgxwEAAO4CADDIAQAAGQAQyQEAAO4CADDKAQEAAAABzgFAALQCACHPAUAAtAIAIeABEAC-AgAh8gEBALICACH0AQEA8AIAIfUBAQDwAgAh-wEAAO8C-wEj_AEgAOMCACEDAAAAGQAgAQAAGgAwAgAAGwAgDwsAAO0CACDHAQAA6wIAMMgBAAAdABDJAQAA6wIAMMoBAQCyAgAhzgFAALQCACHPAUAAtAIAIfEBAQCzAgAh8gEBALICACHzAUAAtAIAIfQBAQCzAgAh9QEBALMCACH2AQEAswIAIfcBAQCzAgAh-QEAAOwC-QEiAQsAALMEACAQCwAA7QIAIMcBAADrAgAwyAEAAB0AEMkBAADrAgAwygEBAAAAAc4BQAC0AgAhzwFAALQCACHxAQEAAAAB8gEBALICACHzAUAAtAIAIfQBAQCzAgAh9QEBALMCACH2AQEAswIAIfcBAQCzAgAh-QEAAOwC-QEijQIAAOoCACADAAAAHQAgAQAAHgAwAgAAHwAgAQAAABUAIAEAAAAZACABAAAAHQAgAQAAAAkAIAEAAAAPACABAAAAAQAgAwAAAAUAIAEAAAYAMAIAAAEAIAMAAAAFACABAAAGADACAAABACADAAAABQAgAQAABgAwAgAAAQAgDgUAALIEACAIAAD0AwAgCQAA9QMAIMoBAQAAAAHOAUAAAAABzwFAAAAAAYUCAQAAAAGGAgEAAAABhwIBAAAAAYgCAQAAAAGJAgEAAAABigIBAAAAAYsCAQAAAAGMAgEAAAABARQAACoAIAvKAQEAAAABzgFAAAAAAc8BQAAAAAGFAgEAAAABhgIBAAAAAYcCAQAAAAGIAgEAAAABiQIBAAAAAYoCAQAAAAGLAgEAAAABjAIBAAAAAQEUAAAsADABFAAALAAwAQAAAAMAIA4FAACxBAAgCAAAqQMAIAkAAKoDACDKAQEAggMAIc4BQACDAwAhzwFAAIMDACGFAgEAggMAIYYCAQCnAwAhhwIBAKcDACGIAgEApwMAIYkCAQCnAwAhigIBAIIDACGLAgEAggMAIYwCAQCnAwAhAgAAAAEAIBQAADAAIAvKAQEAggMAIc4BQACDAwAhzwFAAIMDACGFAgEAggMAIYYCAQCnAwAhhwIBAKcDACGIAgEApwMAIYkCAQCnAwAhigIBAIIDACGLAgEAggMAIYwCAQCnAwAhAgAAAAUAIBQAADIAIAIAAAAFACAUAAAyACABAAAAAwAgAwAAAAEAIBsAACoAIBwAADAAIAEAAAABACABAAAABQAgCAQAAK4EACAhAACwBAAgIgAArwQAIIYCAAD4AwAghwIAAPgDACCIAgAA-AMAIIkCAAD4AwAgjAIAAPgDACAOxwEAAOkCADDIAQAAOgAQyQEAAOkCADDKAQEAqAIAIc4BQACqAgAhzwFAAKoCACGFAgEAqQIAIYYCAQDUAgAhhwIBANQCACGIAgEA1AIAIYkCAQDUAgAhigIBAKkCACGLAgEAqQIAIYwCAQDUAgAhAwAAAAUAIAEAADkAMCAAADoAIAMAAAAFACABAAAGADACAAABACABAAAACwAgAQAAAAsAIAMAAAAJACABAAAKADACAAALACADAAAACQAgAQAACgAwAgAACwAgAwAAAAkAIAEAAAoAMAIAAAsAIAYGAACTAwAgBwAA8gMAIM4BQAAAAAH9AQEAAAABggIBAAAAAYQCAAAAhAICARQAAEIAIATOAUAAAAAB_QEBAAAAAYICAQAAAAGEAgAAAIQCAgEUAABEADABFAAARAAwBgYAAJEDACAHAADwAwAgzgFAAIMDACH9AQEAggMAIYICAQCCAwAhhAIAAI8DhAIiAgAAAAsAIBQAAEcAIATOAUAAgwMAIf0BAQCCAwAhggIBAIIDACGEAgAAjwOEAiICAAAACQAgFAAASQAgAgAAAAkAIBQAAEkAIAMAAAALACAbAABCACAcAABHACABAAAACwAgAQAAAAkAIAMEAACrBAAgIQAArQQAICIAAKwEACAHxwEAAOUCADDIAQAAUAAQyQEAAOUCADDOAUAAqgIAIf0BAQCoAgAhggIBAKgCACGEAgAA5gKEAiIDAAAACQAgAQAATwAwIAAAUAAgAwAAAAkAIAEAAAoAMAIAAAsAIAoJAADkAgAgxwEAAOICADDIAQAAVgAQyQEAAOICADDKAQEAAAABzgFAALQCACHPAUAAtAIAId8BAQAAAAH8ASAA4wIAIYECAQAAAAEBAAAAUwAgAQAAAFMAIAoJAADkAgAgxwEAAOICADDIAQAAVgAQyQEAAOICADDKAQEAsgIAIc4BQAC0AgAhzwFAALQCACHfAQEAswIAIfwBIADjAgAhgQIBALMCACEBCQAAqgQAIAMAAABWACABAABXADACAABTACADAAAAVgAgAQAAVwAwAgAAUwAgAwAAAFYAIAEAAFcAMAIAAFMAIAcJAACpBAAgygEBAAAAAc4BQAAAAAHPAUAAAAAB3wEBAAAAAfwBIAAAAAGBAgEAAAABARQAAFsAIAbKAQEAAAABzgFAAAAAAc8BQAAAAAHfAQEAAAAB_AEgAAAAAYECAQAAAAEBFAAAXQAwARQAAF0AMAcJAACfBAAgygEBAIIDACHOAUAAgwMAIc8BQACDAwAh3wEBAIIDACH8ASAA0wMAIYECAQCCAwAhAgAAAFMAIBQAAGAAIAbKAQEAggMAIc4BQACDAwAhzwFAAIMDACHfAQEAggMAIfwBIADTAwAhgQIBAIIDACECAAAAVgAgFAAAYgAgAgAAAFYAIBQAAGIAIAMAAABTACAbAABbACAcAABgACABAAAAUwAgAQAAAFYAIAMEAACcBAAgIQAAngQAICIAAJ0EACAJxwEAAOECADDIAQAAaQAQyQEAAOECADDKAQEAqAIAIc4BQACqAgAhzwFAAKoCACHfAQEAqQIAIfwBIADVAgAhgQIBAKkCACEDAAAAVgAgAQAAaAAwIAAAaQAgAwAAAFYAIAEAAFcAMAIAAFMAIAEAAAARACABAAAAEQAgAwAAAA8AIAEAABAAMAIAABEAIAMAAAAPACABAAAQADACAAARACADAAAADwAgAQAAEAAwAgAAEQAgDQYAAJsEACAKAADkAwAgDAAA5QMAIA0AAOYDACAOAADnAwAgygEBAAAAAc4BQAAAAAHPAUAAAAAB3wEBAAAAAf0BAQAAAAH-AQEAAAAB_wECAAAAAYACEAAAAAEBFAAAcQAgCMoBAQAAAAHOAUAAAAABzwFAAAAAAd8BAQAAAAH9AQEAAAAB_gEBAAAAAf8BAgAAAAGAAhAAAAABARQAAHMAMAEUAABzADANBgAAmgQAIAoAALcDACAMAAC4AwAgDQAAuQMAIA4AALoDACDKAQEAggMAIc4BQACDAwAhzwFAAIMDACHfAQEAggMAIf0BAQCCAwAh_gEBAIIDACH_AQIAtQMAIYACEACbAwAhAgAAABEAIBQAAHYAIAjKAQEAggMAIc4BQACDAwAhzwFAAIMDACHfAQEAggMAIf0BAQCCAwAh_gEBAIIDACH_AQIAtQMAIYACEACbAwAhAgAAAA8AIBQAAHgAIAIAAAAPACAUAAB4ACADAAAAEQAgGwAAcQAgHAAAdgAgAQAAABEAIAEAAAAPACAFBAAAlQQAICEAAJgEACAiAACXBAAgUwAAlgQAIFQAAJkEACALxwEAAOACADDIAQAAfwAQyQEAAOACADDKAQEAqAIAIc4BQACqAgAhzwFAAKoCACHfAQEAqQIAIf0BAQCoAgAh_gEBAKgCACH_AQIAwgIAIYACEAC4AgAhAwAAAA8AIAEAAH4AMCAAAH8AIAMAAAAPACABAAAQADACAAARACABAAAAFwAgAQAAABcAIAMAAAAVACABAAAWADACAAAXACADAAAAFQAgAQAAFgAwAgAAFwAgAwAAABUAIAEAABYAMAIAABcAIAcLAACUBAAgygEBAAAAAc4BQAAAAAHyAQEAAAAB9AEBAAAAAfUBAQAAAAH7AQAAAPsBAgEUAACHAQAgBsoBAQAAAAHOAUAAAAAB8gEBAAAAAfQBAQAAAAH1AQEAAAAB-wEAAAD7AQIBFAAAiQEAMAEUAACJAQAwBwsAAJMEACDKAQEAggMAIc4BQACDAwAh8gEBAIIDACH0AQEAggMAIfUBAQCCAwAh-wEAAOAD-wEiAgAAABcAIBQAAIwBACAGygEBAIIDACHOAUAAgwMAIfIBAQCCAwAh9AEBAIIDACH1AQEAggMAIfsBAADgA_sBIgIAAAAVACAUAACOAQAgAgAAABUAIBQAAI4BACADAAAAFwAgGwAAhwEAIBwAAIwBACABAAAAFwAgAQAAABUAIAMEAACQBAAgIQAAkgQAICIAAJEEACAJxwEAANwCADDIAQAAlQEAEMkBAADcAgAwygEBAKgCACHOAUAAqgIAIfIBAQCoAgAh9AEBAKkCACH1AQEAqQIAIfsBAADdAvsBIgMAAAAVACABAACUAQAwIAAAlQEAIAMAAAAVACABAAAWADACAAAXACABAAAAGwAgAQAAABsAIAMAAAAZACABAAAaADACAAAbACADAAAAGQAgAQAAGgAwAgAAGwAgAwAAABkAIAEAABoAMAIAABsAIAoLAACPBAAgygEBAAAAAc4BQAAAAAHPAUAAAAAB4AEQAAAAAfIBAQAAAAH0AQEAAAAB9QEBAAAAAfsBAAAA-wED_AEgAAAAAQEUAACdAQAgCcoBAQAAAAHOAUAAAAABzwFAAAAAAeABEAAAAAHyAQEAAAAB9AEBAAAAAfUBAQAAAAH7AQAAAPsBA_wBIAAAAAEBFAAAnwEAMAEUAACfAQAwCgsAAI4EACDKAQEAggMAIc4BQACDAwAhzwFAAIMDACHgARAAmwMAIfIBAQCCAwAh9AEBAKcDACH1AQEApwMAIfsBAADSA_sBI_wBIADTAwAhAgAAABsAIBQAAKIBACAJygEBAIIDACHOAUAAgwMAIc8BQACDAwAh4AEQAJsDACHyAQEAggMAIfQBAQCnAwAh9QEBAKcDACH7AQAA0gP7ASP8ASAA0wMAIQIAAAAZACAUAACkAQAgAgAAABkAIBQAAKQBACADAAAAGwAgGwAAnQEAIBwAAKIBACABAAAAGwAgAQAAABkAIAgEAACJBAAgIQAAjAQAICIAAIsEACBTAACKBAAgVAAAjQQAIPQBAAD4AwAg9QEAAPgDACD7AQAA-AMAIAzHAQAA0gIAMMgBAACrAQAQyQEAANICADDKAQEAqAIAIc4BQACqAgAhzwFAAKoCACHgARAAuAIAIfIBAQCoAgAh9AEBANQCACH1AQEA1AIAIfsBAADTAvsBI_wBIADVAgAhAwAAABkAIAEAAKoBADAgAACrAQAgAwAAABkAIAEAABoAMAIAABsAIAEAAAAfACABAAAAHwAgAwAAAB0AIAEAAB4AMAIAAB8AIAMAAAAdACABAAAeADACAAAfACADAAAAHQAgAQAAHgAwAgAAHwAgDAsAAIgEACDKAQEAAAABzgFAAAAAAc8BQAAAAAHxAQEAAAAB8gEBAAAAAfMBQAAAAAH0AQEAAAAB9QEBAAAAAfYBAQAAAAH3AQEAAAAB-QEAAAD5AQIBFAAAswEAIAvKAQEAAAABzgFAAAAAAc8BQAAAAAHxAQEAAAAB8gEBAAAAAfMBQAAAAAH0AQEAAAAB9QEBAAAAAfYBAQAAAAH3AQEAAAAB-QEAAAD5AQIBFAAAtQEAMAEUAAC1AQAwDAsAAIcEACDKAQEAggMAIc4BQACDAwAhzwFAAIMDACHxAQEAggMAIfIBAQCCAwAh8wFAAIMDACH0AQEAggMAIfUBAQCCAwAh9gEBAIIDACH3AQEAggMAIfkBAADFA_kBIgIAAAAfACAUAAC4AQAgC8oBAQCCAwAhzgFAAIMDACHPAUAAgwMAIfEBAQCCAwAh8gEBAIIDACHzAUAAgwMAIfQBAQCCAwAh9QEBAIIDACH2AQEAggMAIfcBAQCCAwAh-QEAAMUD-QEiAgAAAB0AIBQAALoBACACAAAAHQAgFAAAugEAIAMAAAAfACAbAACzAQAgHAAAuAEAIAEAAAAfACABAAAAHQAgAwQAAIQEACAhAACGBAAgIgAAhQQAIA7HAQAAzgIAMMgBAADBAQAQyQEAAM4CADDKAQEAqAIAIc4BQACqAgAhzwFAAKoCACHxAQEAqQIAIfIBAQCoAgAh8wFAAKoCACH0AQEAqQIAIfUBAQCpAgAh9gEBAKkCACH3AQEAqQIAIfkBAADPAvkBIgMAAAAdACABAADAAQAwIAAAwQEAIAMAAAAdACABAAAeADACAAAfACAPxwEAAM0CADDIAQAAxwEAEMkBAADNAgAwygEBAAAAAcwBAQCzAgAhzQEBALMCACHOAUAAtAIAIc8BQAC0AgAh6QEBALMCACHqAUAAtAIAIesBAgDKAgAh7AFAALQCACHtAQIAygIAIe8BQADLAgAh8AFAAMsCACEBAAAAxAEAIAEAAADEAQAgD8cBAADNAgAwyAEAAMcBABDJAQAAzQIAMMoBAQCyAgAhzAEBALMCACHNAQEAswIAIc4BQAC0AgAhzwFAALQCACHpAQEAswIAIeoBQAC0AgAh6wECAMoCACHsAUAAtAIAIe0BAgDKAgAh7wFAAMsCACHwAUAAywIAIQLvAQAA-AMAIPABAAD4AwAgAwAAAMcBACABAADIAQAwAgAAxAEAIAMAAADHAQAgAQAAyAEAMAIAAMQBACADAAAAxwEAIAEAAMgBADACAADEAQAgDMoBAQAAAAHMAQEAAAABzQEBAAAAAc4BQAAAAAHPAUAAAAAB6QEBAAAAAeoBQAAAAAHrAQIAAAAB7AFAAAAAAe0BAgAAAAHvAUAAAAAB8AFAAAAAAQEUAADMAQAgDMoBAQAAAAHMAQEAAAABzQEBAAAAAc4BQAAAAAHPAUAAAAAB6QEBAAAAAeoBQAAAAAHrAQIAAAAB7AFAAAAAAe0BAgAAAAHvAUAAAAAB8AFAAAAAAQEUAADOAQAwARQAAM4BADAMygEBAIIDACHMAQEAggMAIc0BAQCCAwAhzgFAAIMDACHPAUAAgwMAIekBAQCCAwAh6gFAAIMDACHrAQIAtQMAIewBQACDAwAh7QECALUDACHvAUAA_gMAIfABQAD-AwAhAgAAAMQBACAUAADRAQAgDMoBAQCCAwAhzAEBAIIDACHNAQEAggMAIc4BQACDAwAhzwFAAIMDACHpAQEAggMAIeoBQACDAwAh6wECALUDACHsAUAAgwMAIe0BAgC1AwAh7wFAAP4DACHwAUAA_gMAIQIAAADHAQAgFAAA0wEAIAIAAADHAQAgFAAA0wEAIAMAAADEAQAgGwAAzAEAIBwAANEBACABAAAAxAEAIAEAAADHAQAgBwQAAP8DACAhAACCBAAgIgAAgQQAIFMAAIAEACBUAACDBAAg7wEAAPgDACDwAQAA-AMAIA_HAQAAzAIAMMgBAADaAQAQyQEAAMwCADDKAQEAqAIAIcwBAQCpAgAhzQEBAKkCACHOAUAAqgIAIc8BQACqAgAh6QEBAKkCACHqAUAAqgIAIesBAgDCAgAh7AFAAKoCACHtAQIAwgIAIe8BQADDAgAh8AFAAMMCACEDAAAAxwEAIAEAANkBADAgAADaAQAgAwAAAMcBACABAADIAQAwAgAAxAEAIA3HAQAAyQIAMMgBAADgAQAQyQEAAMkCADDKAQEAAAABzAEBALMCACHOAUAAtAIAIc8BQAC0AgAh6QEBALMCACHqAUAAtAIAIesBAgDKAgAh7AFAALQCACHtAQIAygIAIe4BQADLAgAhAQAAAN0BACABAAAA3QEAIA3HAQAAyQIAMMgBAADgAQAQyQEAAMkCADDKAQEAsgIAIcwBAQCzAgAhzgFAALQCACHPAUAAtAIAIekBAQCzAgAh6gFAALQCACHrAQIAygIAIewBQAC0AgAh7QECAMoCACHuAUAAywIAIQHuAQAA-AMAIAMAAADgAQAgAQAA4QEAMAIAAN0BACADAAAA4AEAIAEAAOEBADACAADdAQAgAwAAAOABACABAADhAQAwAgAA3QEAIArKAQEAAAABzAEBAAAAAc4BQAAAAAHPAUAAAAAB6QEBAAAAAeoBQAAAAAHrAQIAAAAB7AFAAAAAAe0BAgAAAAHuAUAAAAABARQAAOUBACAKygEBAAAAAcwBAQAAAAHOAUAAAAABzwFAAAAAAekBAQAAAAHqAUAAAAAB6wECAAAAAewBQAAAAAHtAQIAAAAB7gFAAAAAAQEUAADnAQAwARQAAOcBADAKygEBAIIDACHMAQEAggMAIc4BQACDAwAhzwFAAIMDACHpAQEAggMAIeoBQACDAwAh6wECALUDACHsAUAAgwMAIe0BAgC1AwAh7gFAAP4DACECAAAA3QEAIBQAAOoBACAKygEBAIIDACHMAQEAggMAIc4BQACDAwAhzwFAAIMDACHpAQEAggMAIeoBQACDAwAh6wECALUDACHsAUAAgwMAIe0BAgC1AwAh7gFAAP4DACECAAAA4AEAIBQAAOwBACACAAAA4AEAIBQAAOwBACADAAAA3QEAIBsAAOUBACAcAADqAQAgAQAAAN0BACABAAAA4AEAIAYEAAD5AwAgIQAA_AMAICIAAPsDACBTAAD6AwAgVAAA_QMAIO4BAAD4AwAgDccBAADBAgAwyAEAAPMBABDJAQAAwQIAMMoBAQCoAgAhzAEBAKkCACHOAUAAqgIAIc8BQACqAgAh6QEBAKkCACHqAUAAqgIAIesBAgDCAgAh7AFAAKoCACHtAQIAwgIAIe4BQADDAgAhAwAAAOABACABAADyAQAwIAAA8wEAIAMAAADgAQAgAQAA4QEAMAIAAN0BACAJAwAAwAIAIMcBAAC9AgAwyAEAAAMAEMkBAAC9AgAw3gEBAAAAAd8BAQCzAgAh4AEQAL4CACHhAQAAvwIAIOIBQAC0AgAhAQAAAPYBACABAAAA9gEAIAEDAAD3AwAgAwAAAAMAIAEAAPkBADACAAD2AQAgAwAAAAMAIAEAAPkBADACAAD2AQAgAwAAAAMAIAEAAPkBADACAAD2AQAgBgMAAPYDACDeAQEAAAAB3wEBAAAAAeABEAAAAAHhAYAAAAAB4gFAAAAAAQEUAAD9AQAgBd4BAQAAAAHfAQEAAAAB4AEQAAAAAeEBgAAAAAHiAUAAAAABARQAAP8BADABFAAA_wEAMAYDAACcAwAg3gEBAIIDACHfAQEAggMAIeABEACbAwAh4QGAAAAAAeIBQACDAwAhAgAAAPYBACAUAACCAgAgBd4BAQCCAwAh3wEBAIIDACHgARAAmwMAIeEBgAAAAAHiAUAAgwMAIQIAAAADACAUAACEAgAgAgAAAAMAIBQAAIQCACADAAAA9gEAIBsAAP0BACAcAACCAgAgAQAAAPYBACABAAAAAwAgBQQAAJYDACAhAACZAwAgIgAAmAMAIFMAAJcDACBUAACaAwAgCMcBAAC3AgAwyAEAAIsCABDJAQAAtwIAMN4BAQCpAgAh3wEBAKkCACHgARAAuAIAIeEBAAC5AgAg4gFAAKoCACEDAAAAAwAgAQAAigIAMCAAAIsCACADAAAAAwAgAQAA-QEAMAIAAPYBACAKAwAAtQIAIMcBAACxAgAwyAEAAJECABDJAQAAsQIAMMoBAQAAAAHLAQEAAAABzAEBAAAAAc0BAQCzAgAhzgFAALQCACHPAUAAtAIAIQEAAACOAgAgAQAAAI4CACAKAwAAtQIAIMcBAACxAgAwyAEAAJECABDJAQAAsQIAMMoBAQCyAgAhywEBALICACHMAQEAswIAIc0BAQCzAgAhzgFAALQCACHPAUAAtAIAIQEDAACVAwAgAwAAAJECACABAACSAgAwAgAAjgIAIAMAAACRAgAgAQAAkgIAMAIAAI4CACADAAAAkQIAIAEAAJICADACAACOAgAgBwMAAJQDACDKAQEAAAABywEBAAAAAcwBAQAAAAHNAQEAAAABzgFAAAAAAc8BQAAAAAEBFAAAlgIAIAbKAQEAAAABywEBAAAAAcwBAQAAAAHNAQEAAAABzgFAAAAAAc8BQAAAAAEBFAAAmAIAMAEUAACYAgAwBwMAAIQDACDKAQEAggMAIcsBAQCCAwAhzAEBAIIDACHNAQEAggMAIc4BQACDAwAhzwFAAIMDACECAAAAjgIAIBQAAJsCACAGygEBAIIDACHLAQEAggMAIcwBAQCCAwAhzQEBAIIDACHOAUAAgwMAIc8BQACDAwAhAgAAAJECACAUAACdAgAgAgAAAJECACAUAACdAgAgAwAAAI4CACAbAACWAgAgHAAAmwIAIAEAAACOAgAgAQAAAJECACADBAAA_wIAICEAAIEDACAiAACAAwAgCccBAACnAgAwyAEAAKQCABDJAQAApwIAMMoBAQCoAgAhywEBAKgCACHMAQEAqQIAIc0BAQCpAgAhzgFAAKoCACHPAUAAqgIAIQMAAACRAgAgAQAAowIAMCAAAKQCACADAAAAkQIAIAEAAJICADACAACOAgAgCccBAACnAgAwyAEAAKQCABDJAQAApwIAMMoBAQCoAgAhywEBAKgCACHMAQEAqQIAIc0BAQCpAgAhzgFAAKoCACHPAUAAqgIAIQsEAACsAgAgIQAArwIAICIAAK8CACDQAQEAAAAB0QEBAAAABNIBAQAAAATTAQEAAAAB1AEBAAAAAdUBAQAAAAHWAQEAAAAB1wEBALACACEOBAAArAIAICEAAK8CACAiAACvAgAg0AEBAAAAAdEBAQAAAATSAQEAAAAE0wEBAAAAAdQBAQAAAAHVAQEAAAAB1gEBAAAAAdcBAQCuAgAh2AEBAAAAAdkBAQAAAAHaAQEAAAABCwQAAKwCACAhAACtAgAgIgAArQIAINABQAAAAAHRAUAAAAAE0gFAAAAABNMBQAAAAAHUAUAAAAAB1QFAAAAAAdYBQAAAAAHXAUAAqwIAIQsEAACsAgAgIQAArQIAICIAAK0CACDQAUAAAAAB0QFAAAAABNIBQAAAAATTAUAAAAAB1AFAAAAAAdUBQAAAAAHWAUAAAAAB1wFAAKsCACEI0AECAAAAAdEBAgAAAATSAQIAAAAE0wECAAAAAdQBAgAAAAHVAQIAAAAB1gECAAAAAdcBAgCsAgAhCNABQAAAAAHRAUAAAAAE0gFAAAAABNMBQAAAAAHUAUAAAAAB1QFAAAAAAdYBQAAAAAHXAUAArQIAIQ4EAACsAgAgIQAArwIAICIAAK8CACDQAQEAAAAB0QEBAAAABNIBAQAAAATTAQEAAAAB1AEBAAAAAdUBAQAAAAHWAQEAAAAB1wEBAK4CACHYAQEAAAAB2QEBAAAAAdoBAQAAAAEL0AEBAAAAAdEBAQAAAATSAQEAAAAE0wEBAAAAAdQBAQAAAAHVAQEAAAAB1gEBAAAAAdcBAQCvAgAh2AEBAAAAAdkBAQAAAAHaAQEAAAABCwQAAKwCACAhAACvAgAgIgAArwIAINABAQAAAAHRAQEAAAAE0gEBAAAABNMBAQAAAAHUAQEAAAAB1QEBAAAAAdYBAQAAAAHXAQEAsAIAIQoDAAC1AgAgxwEAALECADDIAQAAkQIAEMkBAACxAgAwygEBALICACHLAQEAsgIAIcwBAQCzAgAhzQEBALMCACHOAUAAtAIAIc8BQAC0AgAhCNABAQAAAAHRAQEAAAAE0gEBAAAABNMBAQAAAAHUAQEAAAAB1QEBAAAAAdYBAQAAAAHXAQEAtgIAIQvQAQEAAAAB0QEBAAAABNIBAQAAAATTAQEAAAAB1AEBAAAAAdUBAQAAAAHWAQEAAAAB1wEBAK8CACHYAQEAAAAB2QEBAAAAAdoBAQAAAAEI0AFAAAAAAdEBQAAAAATSAUAAAAAE0wFAAAAAAdQBQAAAAAHVAUAAAAAB1gFAAAAAAdcBQACtAgAhA9sBAAAJACDcAQAACQAg3QEAAAkAIAjQAQEAAAAB0QEBAAAABNIBAQAAAATTAQEAAAAB1AEBAAAAAdUBAQAAAAHWAQEAAAAB1wEBALYCACEIxwEAALcCADDIAQAAiwIAEMkBAAC3AgAw3gEBAKkCACHfAQEAqQIAIeABEAC4AgAh4QEAALkCACDiAUAAqgIAIQ0EAACsAgAgIQAAvAIAICIAALwCACBTAAC8AgAgVAAAvAIAINABEAAAAAHRARAAAAAE0gEQAAAABNMBEAAAAAHUARAAAAAB1QEQAAAAAdYBEAAAAAHXARAAuwIAIQ8EAACsAgAgIQAAugIAICIAALoCACDQAYAAAAAB0wGAAAAAAdQBgAAAAAHVAYAAAAAB1gGAAAAAAdcBgAAAAAHjAQEAAAAB5AEBAAAAAeUBAQAAAAHmAYAAAAAB5wGAAAAAAegBgAAAAAEM0AGAAAAAAdMBgAAAAAHUAYAAAAAB1QGAAAAAAdYBgAAAAAHXAYAAAAAB4wEBAAAAAeQBAQAAAAHlAQEAAAAB5gGAAAAAAecBgAAAAAHoAYAAAAABDQQAAKwCACAhAAC8AgAgIgAAvAIAIFMAALwCACBUAAC8AgAg0AEQAAAAAdEBEAAAAATSARAAAAAE0wEQAAAAAdQBEAAAAAHVARAAAAAB1gEQAAAAAdcBEAC7AgAhCNABEAAAAAHRARAAAAAE0gEQAAAABNMBEAAAAAHUARAAAAAB1QEQAAAAAdYBEAAAAAHXARAAvAIAIQkDAADAAgAgxwEAAL0CADDIAQAAAwAQyQEAAL0CADDeAQEAswIAId8BAQCzAgAh4AEQAL4CACHhAQAAvwIAIOIBQAC0AgAhCNABEAAAAAHRARAAAAAE0gEQAAAABNMBEAAAAAHUARAAAAAB1QEQAAAAAdYBEAAAAAHXARAAvAIAIQzQAYAAAAAB0wGAAAAAAdQBgAAAAAHVAYAAAAAB1gGAAAAAAdcBgAAAAAHjAQEAAAAB5AEBAAAAAeUBAQAAAAHmAYAAAAAB5wGAAAAAAegBgAAAAAED2wEAAAUAINwBAAAFACDdAQAABQAgDccBAADBAgAwyAEAAPMBABDJAQAAwQIAMMoBAQCoAgAhzAEBAKkCACHOAUAAqgIAIc8BQACqAgAh6QEBAKkCACHqAUAAqgIAIesBAgDCAgAh7AFAAKoCACHtAQIAwgIAIe4BQADDAgAhDQQAAKwCACAhAACsAgAgIgAArAIAIFMAAMgCACBUAACsAgAg0AECAAAAAdEBAgAAAATSAQIAAAAE0wECAAAAAdQBAgAAAAHVAQIAAAAB1gECAAAAAdcBAgDHAgAhCwQAAMUCACAhAADGAgAgIgAAxgIAINABQAAAAAHRAUAAAAAF0gFAAAAABdMBQAAAAAHUAUAAAAAB1QFAAAAAAdYBQAAAAAHXAUAAxAIAIQsEAADFAgAgIQAAxgIAICIAAMYCACDQAUAAAAAB0QFAAAAABdIBQAAAAAXTAUAAAAAB1AFAAAAAAdUBQAAAAAHWAUAAAAAB1wFAAMQCACEI0AECAAAAAdEBAgAAAAXSAQIAAAAF0wECAAAAAdQBAgAAAAHVAQIAAAAB1gECAAAAAdcBAgDFAgAhCNABQAAAAAHRAUAAAAAF0gFAAAAABdMBQAAAAAHUAUAAAAAB1QFAAAAAAdYBQAAAAAHXAUAAxgIAIQ0EAACsAgAgIQAArAIAICIAAKwCACBTAADIAgAgVAAArAIAINABAgAAAAHRAQIAAAAE0gECAAAABNMBAgAAAAHUAQIAAAAB1QECAAAAAdYBAgAAAAHXAQIAxwIAIQjQAQgAAAAB0QEIAAAABNIBCAAAAATTAQgAAAAB1AEIAAAAAdUBCAAAAAHWAQgAAAAB1wEIAMgCACENxwEAAMkCADDIAQAA4AEAEMkBAADJAgAwygEBALICACHMAQEAswIAIc4BQAC0AgAhzwFAALQCACHpAQEAswIAIeoBQAC0AgAh6wECAMoCACHsAUAAtAIAIe0BAgDKAgAh7gFAAMsCACEI0AECAAAAAdEBAgAAAATSAQIAAAAE0wECAAAAAdQBAgAAAAHVAQIAAAAB1gECAAAAAdcBAgCsAgAhCNABQAAAAAHRAUAAAAAF0gFAAAAABdMBQAAAAAHUAUAAAAAB1QFAAAAAAdYBQAAAAAHXAUAAxgIAIQ_HAQAAzAIAMMgBAADaAQAQyQEAAMwCADDKAQEAqAIAIcwBAQCpAgAhzQEBAKkCACHOAUAAqgIAIc8BQACqAgAh6QEBAKkCACHqAUAAqgIAIesBAgDCAgAh7AFAAKoCACHtAQIAwgIAIe8BQADDAgAh8AFAAMMCACEPxwEAAM0CADDIAQAAxwEAEMkBAADNAgAwygEBALICACHMAQEAswIAIc0BAQCzAgAhzgFAALQCACHPAUAAtAIAIekBAQCzAgAh6gFAALQCACHrAQIAygIAIewBQAC0AgAh7QECAMoCACHvAUAAywIAIfABQADLAgAhDscBAADOAgAwyAEAAMEBABDJAQAAzgIAMMoBAQCoAgAhzgFAAKoCACHPAUAAqgIAIfEBAQCpAgAh8gEBAKgCACHzAUAAqgIAIfQBAQCpAgAh9QEBAKkCACH2AQEAqQIAIfcBAQCpAgAh-QEAAM8C-QEiBwQAAKwCACAhAADRAgAgIgAA0QIAINABAAAA-QEC0QEAAAD5AQjSAQAAAPkBCNcBAADQAvkBIgcEAACsAgAgIQAA0QIAICIAANECACDQAQAAAPkBAtEBAAAA-QEI0gEAAAD5AQjXAQAA0AL5ASIE0AEAAAD5AQLRAQAAAPkBCNIBAAAA-QEI1wEAANEC-QEiDMcBAADSAgAwyAEAAKsBABDJAQAA0gIAMMoBAQCoAgAhzgFAAKoCACHPAUAAqgIAIeABEAC4AgAh8gEBAKgCACH0AQEA1AIAIfUBAQDUAgAh-wEAANMC-wEj_AEgANUCACEHBAAAxQIAICEAANsCACAiAADbAgAg0AEAAAD7AQPRAQAAAPsBCdIBAAAA-wEJ1wEAANoC-wEjDgQAAMUCACAhAADZAgAgIgAA2QIAINABAQAAAAHRAQEAAAAF0gEBAAAABdMBAQAAAAHUAQEAAAAB1QEBAAAAAdYBAQAAAAHXAQEA2AIAIdgBAQAAAAHZAQEAAAAB2gEBAAAAAQUEAACsAgAgIQAA1wIAICIAANcCACDQASAAAAAB1wEgANYCACEFBAAArAIAICEAANcCACAiAADXAgAg0AEgAAAAAdcBIADWAgAhAtABIAAAAAHXASAA1wIAIQ4EAADFAgAgIQAA2QIAICIAANkCACDQAQEAAAAB0QEBAAAABdIBAQAAAAXTAQEAAAAB1AEBAAAAAdUBAQAAAAHWAQEAAAAB1wEBANgCACHYAQEAAAAB2QEBAAAAAdoBAQAAAAEL0AEBAAAAAdEBAQAAAAXSAQEAAAAF0wEBAAAAAdQBAQAAAAHVAQEAAAAB1gEBAAAAAdcBAQDZAgAh2AEBAAAAAdkBAQAAAAHaAQEAAAABBwQAAMUCACAhAADbAgAgIgAA2wIAINABAAAA-wED0QEAAAD7AQnSAQAAAPsBCdcBAADaAvsBIwTQAQAAAPsBA9EBAAAA-wEJ0gEAAAD7AQnXAQAA2wL7ASMJxwEAANwCADDIAQAAlQEAEMkBAADcAgAwygEBAKgCACHOAUAAqgIAIfIBAQCoAgAh9AEBAKkCACH1AQEAqQIAIfsBAADdAvsBIgcEAACsAgAgIQAA3wIAICIAAN8CACDQAQAAAPsBAtEBAAAA-wEI0gEAAAD7AQjXAQAA3gL7ASIHBAAArAIAICEAAN8CACAiAADfAgAg0AEAAAD7AQLRAQAAAPsBCNIBAAAA-wEI1wEAAN4C-wEiBNABAAAA-wEC0QEAAAD7AQjSAQAAAPsBCNcBAADfAvsBIgvHAQAA4AIAMMgBAAB_ABDJAQAA4AIAMMoBAQCoAgAhzgFAAKoCACHPAUAAqgIAId8BAQCpAgAh_QEBAKgCACH-AQEAqAIAIf8BAgDCAgAhgAIQALgCACEJxwEAAOECADDIAQAAaQAQyQEAAOECADDKAQEAqAIAIc4BQACqAgAhzwFAAKoCACHfAQEAqQIAIfwBIADVAgAhgQIBAKkCACEKCQAA5AIAIMcBAADiAgAwyAEAAFYAEMkBAADiAgAwygEBALICACHOAUAAtAIAIc8BQAC0AgAh3wEBALMCACH8ASAA4wIAIYECAQCzAgAhAtABIAAAAAHXASAA1wIAIQPbAQAADwAg3AEAAA8AIN0BAAAPACAHxwEAAOUCADDIAQAAUAAQyQEAAOUCADDOAUAAqgIAIf0BAQCoAgAhggIBAKgCACGEAgAA5gKEAiIHBAAArAIAICEAAOgCACAiAADoAgAg0AEAAACEAgLRAQAAAIQCCNIBAAAAhAII1wEAAOcChAIiBwQAAKwCACAhAADoAgAgIgAA6AIAINABAAAAhAIC0QEAAACEAgjSAQAAAIQCCNcBAADnAoQCIgTQAQAAAIQCAtEBAAAAhAII0gEAAACEAgjXAQAA6AKEAiIOxwEAAOkCADDIAQAAOgAQyQEAAOkCADDKAQEAqAIAIc4BQACqAgAhzwFAAKoCACGFAgEAqQIAIYYCAQDUAgAhhwIBANQCACGIAgEA1AIAIYkCAQDUAgAhigIBAKkCACGLAgEAqQIAIYwCAQDUAgAhA_IBAQAAAAHzAUAAAAAB9AEBAAAAAQ8LAADtAgAgxwEAAOsCADDIAQAAHQAQyQEAAOsCADDKAQEAsgIAIc4BQAC0AgAhzwFAALQCACHxAQEAswIAIfIBAQCyAgAh8wFAALQCACH0AQEAswIAIfUBAQCzAgAh9gEBALMCACH3AQEAswIAIfkBAADsAvkBIgTQAQAAAPkBAtEBAAAA-QEI0gEAAAD5AQjXAQAA0QL5ASISBgAA9AIAIAoAAPUCACAMAAD2AgAgDQAA9wIAIA4AAPgCACDHAQAA8wIAMMgBAAAPABDJAQAA8wIAMMoBAQCyAgAhzgFAALQCACHPAUAAtAIAId8BAQCzAgAh_QEBALICACH-AQEAsgIAIf8BAgDKAgAhgAIQAL4CACGPAgAADwAgkAIAAA8AIA0LAADtAgAgxwEAAO4CADDIAQAAGQAQyQEAAO4CADDKAQEAsgIAIc4BQAC0AgAhzwFAALQCACHgARAAvgIAIfIBAQCyAgAh9AEBAPACACH1AQEA8AIAIfsBAADvAvsBI_wBIADjAgAhBNABAAAA-wED0QEAAAD7AQnSAQAAAPsBCdcBAADbAvsBIwvQAQEAAAAB0QEBAAAABdIBAQAAAAXTAQEAAAAB1AEBAAAAAdUBAQAAAAHWAQEAAAAB1wEBANkCACHYAQEAAAAB2QEBAAAAAdoBAQAAAAEKCwAA7QIAIMcBAADxAgAwyAEAABUAEMkBAADxAgAwygEBALICACHOAUAAtAIAIfIBAQCyAgAh9AEBALMCACH1AQEAswIAIfsBAADyAvsBIgTQAQAAAPsBAtEBAAAA-wEI0gEAAAD7AQjXAQAA3wL7ASIQBgAA9AIAIAoAAPUCACAMAAD2AgAgDQAA9wIAIA4AAPgCACDHAQAA8wIAMMgBAAAPABDJAQAA8wIAMMoBAQCyAgAhzgFAALQCACHPAUAAtAIAId8BAQCzAgAh_QEBALICACH-AQEAsgIAIf8BAgDKAgAhgAIQAL4CACETBQAA_gIAIAgAALUCACAJAADkAgAgxwEAAP0CADDIAQAABQAQyQEAAP0CADDKAQEAsgIAIc4BQAC0AgAhzwFAALQCACGFAgEAswIAIYYCAQDwAgAhhwIBAPACACGIAgEA8AIAIYkCAQDwAgAhigIBALMCACGLAgEAswIAIYwCAQDwAgAhjwIAAAUAIJACAAAFACAMCQAA5AIAIMcBAADiAgAwyAEAAFYAEMkBAADiAgAwygEBALICACHOAUAAtAIAIc8BQAC0AgAh3wEBALMCACH8ASAA4wIAIYECAQCzAgAhjwIAAFYAIJACAABWACAD2wEAABUAINwBAAAVACDdAQAAFQAgA9sBAAAZACDcAQAAGQAg3QEAABkAIAPbAQAAHQAg3AEAAB0AIN0BAAAdACAC_QEBAAAAAYICAQAAAAEJBgAA9AIAIAcAAPwCACDHAQAA-gIAMMgBAAAJABDJAQAA-gIAMM4BQAC0AgAh_QEBALICACGCAgEAsgIAIYQCAAD7AoQCIgTQAQAAAIQCAtEBAAAAhAII0gEAAACEAgjXAQAA6AKEAiIMAwAAtQIAIMcBAACxAgAwyAEAAJECABDJAQAAsQIAMMoBAQCyAgAhywEBALICACHMAQEAswIAIc0BAQCzAgAhzgFAALQCACHPAUAAtAIAIY8CAACRAgAgkAIAAJECACARBQAA_gIAIAgAALUCACAJAADkAgAgxwEAAP0CADDIAQAABQAQyQEAAP0CADDKAQEAsgIAIc4BQAC0AgAhzwFAALQCACGFAgEAswIAIYYCAQDwAgAhhwIBAPACACGIAgEA8AIAIYkCAQDwAgAhigIBALMCACGLAgEAswIAIYwCAQDwAgAhCwMAAMACACDHAQAAvQIAMMgBAAADABDJAQAAvQIAMN4BAQCzAgAh3wEBALMCACHgARAAvgIAIeEBAAC_AgAg4gFAALQCACGPAgAAAwAgkAIAAAMAIAAAAAGUAgEAAAABAZQCQAAAAAELGwAAhQMAMBwAAIoDADCRAgAAhgMAMJICAACHAwAwkwIAAIgDACCUAgAAiQMAMJUCAACJAwAwlgIAAIkDADCXAgAAiQMAMJgCAACLAwAwmQIAAIwDADAEBgAAkwMAIM4BQAAAAAH9AQEAAAABhAIAAACEAgICAAAACwAgGwAAkgMAIAMAAAALACAbAACSAwAgHAAAkAMAIAEUAADqBAAwCgYAAPQCACAHAAD8AgAgxwEAAPoCADDIAQAACQAQyQEAAPoCADDOAUAAtAIAIf0BAQCyAgAhggIBALICACGEAgAA-wKEAiKOAgAA-QIAIAIAAAALACAUAACQAwAgAgAAAI0DACAUAACOAwAgB8cBAACMAwAwyAEAAI0DABDJAQAAjAMAMM4BQAC0AgAh_QEBALICACGCAgEAsgIAIYQCAAD7AoQCIgfHAQAAjAMAMMgBAACNAwAQyQEAAIwDADDOAUAAtAIAIf0BAQCyAgAhggIBALICACGEAgAA-wKEAiIDzgFAAIMDACH9AQEAggMAIYQCAACPA4QCIgGUAgAAAIQCAgQGAACRAwAgzgFAAIMDACH9AQEAggMAIYQCAACPA4QCIgUbAADlBAAgHAAA6AQAIJECAADmBAAgkgIAAOcEACCXAgAAAQAgBAYAAJMDACDOAUAAAAAB_QEBAAAAAYQCAAAAhAICAxsAAOUEACCRAgAA5gQAIJcCAAABACAEGwAAhQMAMJECAACGAwAwkwIAAIgDACCXAgAAiQMAMAAAAAAAAAWUAhAAAAABmgIQAAAAAZsCEAAAAAGcAhAAAAABnQIQAAAAAQsbAACdAwAwHAAAogMAMJECAACeAwAwkgIAAJ8DADCTAgAAoAMAIJQCAAChAwAwlQIAAKEDADCWAgAAoQMAMJcCAAChAwAwmAIAAKMDADCZAgAApAMAMAwIAAD0AwAgCQAA9QMAIMoBAQAAAAHOAUAAAAABzwFAAAAAAYUCAQAAAAGGAgEAAAABhwIBAAAAAYgCAQAAAAGJAgEAAAABigIBAAAAAYsCAQAAAAECAAAAAQAgGwAA8wMAIAMAAAABACAbAADzAwAgHAAAqAMAIAEUAADkBAAwEQUAAP4CACAIAAC1AgAgCQAA5AIAIMcBAAD9AgAwyAEAAAUAEMkBAAD9AgAwygEBAAAAAc4BQAC0AgAhzwFAALQCACGFAgEAswIAIYYCAQDwAgAhhwIBAPACACGIAgEA8AIAIYkCAQDwAgAhigIBAAAAAYsCAQCzAgAhjAIBAPACACECAAAAAQAgFAAAqAMAIAIAAAClAwAgFAAApgMAIA7HAQAApAMAMMgBAAClAwAQyQEAAKQDADDKAQEAsgIAIc4BQAC0AgAhzwFAALQCACGFAgEAswIAIYYCAQDwAgAhhwIBAPACACGIAgEA8AIAIYkCAQDwAgAhigIBALMCACGLAgEAswIAIYwCAQDwAgAhDscBAACkAwAwyAEAAKUDABDJAQAApAMAMMoBAQCyAgAhzgFAALQCACHPAUAAtAIAIYUCAQCzAgAhhgIBAPACACGHAgEA8AIAIYgCAQDwAgAhiQIBAPACACGKAgEAswIAIYsCAQCzAgAhjAIBAPACACEKygEBAIIDACHOAUAAgwMAIc8BQACDAwAhhQIBAIIDACGGAgEApwMAIYcCAQCnAwAhiAIBAKcDACGJAgEApwMAIYoCAQCCAwAhiwIBAIIDACEBlAIBAAAAAQwIAACpAwAgCQAAqgMAIMoBAQCCAwAhzgFAAIMDACHPAUAAgwMAIYUCAQCCAwAhhgIBAKcDACGHAgEApwMAIYgCAQCnAwAhiQIBAKcDACGKAgEAggMAIYsCAQCCAwAhCxsAAOgDADAcAADsAwAwkQIAAOkDADCSAgAA6gMAMJMCAADrAwAglAIAAIkDADCVAgAAiQMAMJYCAACJAwAwlwIAAIkDADCYAgAA7QMAMJkCAACMAwAwCxsAAKsDADAcAACwAwAwkQIAAKwDADCSAgAArQMAMJMCAACuAwAglAIAAK8DADCVAgAArwMAMJYCAACvAwAwlwIAAK8DADCYAgAAsQMAMJkCAACyAwAwCwoAAOQDACAMAADlAwAgDQAA5gMAIA4AAOcDACDKAQEAAAABzgFAAAAAAc8BQAAAAAHfAQEAAAAB_gEBAAAAAf8BAgAAAAGAAhAAAAABAgAAABEAIBsAAOMDACADAAAAEQAgGwAA4wMAIBwAALYDACABFAAA4wQAMBAGAAD0AgAgCgAA9QIAIAwAAPYCACANAAD3AgAgDgAA-AIAIMcBAADzAgAwyAEAAA8AEMkBAADzAgAwygEBAAAAAc4BQAC0AgAhzwFAALQCACHfAQEAswIAIf0BAQCyAgAh_gEBALICACH_AQIAygIAIYACEAC-AgAhAgAAABEAIBQAALYDACACAAAAswMAIBQAALQDACALxwEAALIDADDIAQAAswMAEMkBAACyAwAwygEBALICACHOAUAAtAIAIc8BQAC0AgAh3wEBALMCACH9AQEAsgIAIf4BAQCyAgAh_wECAMoCACGAAhAAvgIAIQvHAQAAsgMAMMgBAACzAwAQyQEAALIDADDKAQEAsgIAIc4BQAC0AgAhzwFAALQCACHfAQEAswIAIf0BAQCyAgAh_gEBALICACH_AQIAygIAIYACEAC-AgAhB8oBAQCCAwAhzgFAAIMDACHPAUAAgwMAId8BAQCCAwAh_gEBAIIDACH_AQIAtQMAIYACEACbAwAhBZQCAgAAAAGaAgIAAAABmwICAAAAAZwCAgAAAAGdAgIAAAABCwoAALcDACAMAAC4AwAgDQAAuQMAIA4AALoDACDKAQEAggMAIc4BQACDAwAhzwFAAIMDACHfAQEAggMAIf4BAQCCAwAh_wECALUDACGAAhAAmwMAIQUbAADbBAAgHAAA4QQAIJECAADcBAAgkgIAAOAEACCXAgAAUwAgCxsAANYDADAcAADbAwAwkQIAANcDADCSAgAA2AMAMJMCAADZAwAglAIAANoDADCVAgAA2gMAMJYCAADaAwAwlwIAANoDADCYAgAA3AMAMJkCAADdAwAwCxsAAMgDADAcAADNAwAwkQIAAMkDADCSAgAAygMAMJMCAADLAwAglAIAAMwDADCVAgAAzAMAMJYCAADMAwAwlwIAAMwDADCYAgAAzgMAMJkCAADPAwAwCxsAALsDADAcAADAAwAwkQIAALwDADCSAgAAvQMAMJMCAAC-AwAglAIAAL8DADCVAgAAvwMAMJYCAAC_AwAwlwIAAL8DADCYAgAAwQMAMJkCAADCAwAwCsoBAQAAAAHOAUAAAAABzwFAAAAAAfEBAQAAAAHzAUAAAAAB9AEBAAAAAfUBAQAAAAH2AQEAAAAB9wEBAAAAAfkBAAAA-QECAgAAAB8AIBsAAMcDACADAAAAHwAgGwAAxwMAIBwAAMYDACABFAAA3wQAMBALAADtAgAgxwEAAOsCADDIAQAAHQAQyQEAAOsCADDKAQEAAAABzgFAALQCACHPAUAAtAIAIfEBAQAAAAHyAQEAsgIAIfMBQAC0AgAh9AEBALMCACH1AQEAswIAIfYBAQCzAgAh9wEBALMCACH5AQAA7AL5ASKNAgAA6gIAIAIAAAAfACAUAADGAwAgAgAAAMMDACAUAADEAwAgDscBAADCAwAwyAEAAMMDABDJAQAAwgMAMMoBAQCyAgAhzgFAALQCACHPAUAAtAIAIfEBAQCzAgAh8gEBALICACHzAUAAtAIAIfQBAQCzAgAh9QEBALMCACH2AQEAswIAIfcBAQCzAgAh-QEAAOwC-QEiDscBAADCAwAwyAEAAMMDABDJAQAAwgMAMMoBAQCyAgAhzgFAALQCACHPAUAAtAIAIfEBAQCzAgAh8gEBALICACHzAUAAtAIAIfQBAQCzAgAh9QEBALMCACH2AQEAswIAIfcBAQCzAgAh-QEAAOwC-QEiCsoBAQCCAwAhzgFAAIMDACHPAUAAgwMAIfEBAQCCAwAh8wFAAIMDACH0AQEAggMAIfUBAQCCAwAh9gEBAIIDACH3AQEAggMAIfkBAADFA_kBIgGUAgAAAPkBAgrKAQEAggMAIc4BQACDAwAhzwFAAIMDACHxAQEAggMAIfMBQACDAwAh9AEBAIIDACH1AQEAggMAIfYBAQCCAwAh9wEBAIIDACH5AQAAxQP5ASIKygEBAAAAAc4BQAAAAAHPAUAAAAAB8QEBAAAAAfMBQAAAAAH0AQEAAAAB9QEBAAAAAfYBAQAAAAH3AQEAAAAB-QEAAAD5AQIIygEBAAAAAc4BQAAAAAHPAUAAAAAB4AEQAAAAAfQBAQAAAAH1AQEAAAAB-wEAAAD7AQP8ASAAAAABAgAAABsAIBsAANUDACADAAAAGwAgGwAA1QMAIBwAANQDACABFAAA3gQAMA0LAADtAgAgxwEAAO4CADDIAQAAGQAQyQEAAO4CADDKAQEAAAABzgFAALQCACHPAUAAtAIAIeABEAC-AgAh8gEBALICACH0AQEA8AIAIfUBAQDwAgAh-wEAAO8C-wEj_AEgAOMCACECAAAAGwAgFAAA1AMAIAIAAADQAwAgFAAA0QMAIAzHAQAAzwMAMMgBAADQAwAQyQEAAM8DADDKAQEAsgIAIc4BQAC0AgAhzwFAALQCACHgARAAvgIAIfIBAQCyAgAh9AEBAPACACH1AQEA8AIAIfsBAADvAvsBI_wBIADjAgAhDMcBAADPAwAwyAEAANADABDJAQAAzwMAMMoBAQCyAgAhzgFAALQCACHPAUAAtAIAIeABEAC-AgAh8gEBALICACH0AQEA8AIAIfUBAQDwAgAh-wEAAO8C-wEj_AEgAOMCACEIygEBAIIDACHOAUAAgwMAIc8BQACDAwAh4AEQAJsDACH0AQEApwMAIfUBAQCnAwAh-wEAANID-wEj_AEgANMDACEBlAIAAAD7AQMBlAIgAAAAAQjKAQEAggMAIc4BQACDAwAhzwFAAIMDACHgARAAmwMAIfQBAQCnAwAh9QEBAKcDACH7AQAA0gP7ASP8ASAA0wMAIQjKAQEAAAABzgFAAAAAAc8BQAAAAAHgARAAAAAB9AEBAAAAAfUBAQAAAAH7AQAAAPsBA_wBIAAAAAEFygEBAAAAAc4BQAAAAAH0AQEAAAAB9QEBAAAAAfsBAAAA-wECAgAAABcAIBsAAOIDACADAAAAFwAgGwAA4gMAIBwAAOEDACABFAAA3QQAMAoLAADtAgAgxwEAAPECADDIAQAAFQAQyQEAAPECADDKAQEAAAABzgFAALQCACHyAQEAsgIAIfQBAQCzAgAh9QEBALMCACH7AQAA8gL7ASICAAAAFwAgFAAA4QMAIAIAAADeAwAgFAAA3wMAIAnHAQAA3QMAMMgBAADeAwAQyQEAAN0DADDKAQEAsgIAIc4BQAC0AgAh8gEBALICACH0AQEAswIAIfUBAQCzAgAh-wEAAPIC-wEiCccBAADdAwAwyAEAAN4DABDJAQAA3QMAMMoBAQCyAgAhzgFAALQCACHyAQEAsgIAIfQBAQCzAgAh9QEBALMCACH7AQAA8gL7ASIFygEBAIIDACHOAUAAgwMAIfQBAQCCAwAh9QEBAIIDACH7AQAA4AP7ASIBlAIAAAD7AQIFygEBAIIDACHOAUAAgwMAIfQBAQCCAwAh9QEBAIIDACH7AQAA4AP7ASIFygEBAAAAAc4BQAAAAAH0AQEAAAAB9QEBAAAAAfsBAAAA-wECCwoAAOQDACAMAADlAwAgDQAA5gMAIA4AAOcDACDKAQEAAAABzgFAAAAAAc8BQAAAAAHfAQEAAAAB_gEBAAAAAf8BAgAAAAGAAhAAAAABAxsAANsEACCRAgAA3AQAIJcCAABTACAEGwAA1gMAMJECAADXAwAwkwIAANkDACCXAgAA2gMAMAQbAADIAwAwkQIAAMkDADCTAgAAywMAIJcCAADMAwAwBBsAALsDADCRAgAAvAMAMJMCAAC-AwAglwIAAL8DADAEBwAA8gMAIM4BQAAAAAGCAgEAAAABhAIAAACEAgICAAAACwAgGwAA8QMAIAMAAAALACAbAADxAwAgHAAA7wMAIAEUAADaBAAwAgAAAAsAIBQAAO8DACACAAAAjQMAIBQAAO4DACADzgFAAIMDACGCAgEAggMAIYQCAACPA4QCIgQHAADwAwAgzgFAAIMDACGCAgEAggMAIYQCAACPA4QCIgUbAADVBAAgHAAA2AQAIJECAADWBAAgkgIAANcEACCXAgAAjgIAIAQHAADyAwAgzgFAAAAAAYICAQAAAAGEAgAAAIQCAgMbAADVBAAgkQIAANYEACCXAgAAjgIAIAwIAAD0AwAgCQAA9QMAIMoBAQAAAAHOAUAAAAABzwFAAAAAAYUCAQAAAAGGAgEAAAABhwIBAAAAAYgCAQAAAAGJAgEAAAABigIBAAAAAYsCAQAAAAEEGwAA6AMAMJECAADpAwAwkwIAAOsDACCXAgAAiQMAMAQbAACrAwAwkQIAAKwDADCTAgAArgMAIJcCAACvAwAwBBsAAJ0DADCRAgAAngMAMJMCAACgAwAglwIAAKEDADAAAAAAAAAAAZQCQAAAAAEAAAAAAAAAAAUbAADQBAAgHAAA0wQAIJECAADRBAAgkgIAANIEACCXAgAAEQAgAxsAANAEACCRAgAA0QQAIJcCAAARACAAAAAAAAUbAADLBAAgHAAAzgQAIJECAADMBAAgkgIAAM0EACCXAgAAEQAgAxsAAMsEACCRAgAAzAQAIJcCAAARACAAAAAFGwAAxgQAIBwAAMkEACCRAgAAxwQAIJICAADIBAAglwIAABEAIAMbAADGBAAgkQIAAMcEACCXAgAAEQAgAAAAAAAFGwAAwQQAIBwAAMQEACCRAgAAwgQAIJICAADDBAAglwIAAAEAIAMbAADBBAAgkQIAAMIEACCXAgAAAQAgAAAACxsAAKAEADAcAACkBAAwkQIAAKEEADCSAgAAogQAMJMCAACjBAAglAIAAK8DADCVAgAArwMAMJYCAACvAwAwlwIAAK8DADCYAgAApQQAMJkCAACyAwAwCwYAAJsEACAMAADlAwAgDQAA5gMAIA4AAOcDACDKAQEAAAABzgFAAAAAAc8BQAAAAAHfAQEAAAAB_QEBAAAAAf8BAgAAAAGAAhAAAAABAgAAABEAIBsAAKgEACADAAAAEQAgGwAAqAQAIBwAAKcEACABFAAAwAQAMAIAAAARACAUAACnBAAgAgAAALMDACAUAACmBAAgB8oBAQCCAwAhzgFAAIMDACHPAUAAgwMAId8BAQCCAwAh_QEBAIIDACH_AQIAtQMAIYACEACbAwAhCwYAAJoEACAMAAC4AwAgDQAAuQMAIA4AALoDACDKAQEAggMAIc4BQACDAwAhzwFAAIMDACHfAQEAggMAIf0BAQCCAwAh_wECALUDACGAAhAAmwMAIQsGAACbBAAgDAAA5QMAIA0AAOYDACAOAADnAwAgygEBAAAAAc4BQAAAAAHPAUAAAAAB3wEBAAAAAf0BAQAAAAH_AQIAAAABgAIQAAAAAQQbAACgBAAwkQIAAKEEADCTAgAAowQAIJcCAACvAwAwAAAAAAAAAAcbAAC7BAAgHAAAvgQAIJECAAC8BAAgkgIAAL0EACCVAgAAAwAglgIAAAMAIJcCAAD2AQAgAxsAALsEACCRAgAAvAQAIJcCAAD2AQAgBQYAALQEACAKAAC1BAAgDAAAtgQAIA0AALcEACAOAAC4BAAgCAUAALoEACAIAACVAwAgCQAAqgQAIIYCAAD4AwAghwIAAPgDACCIAgAA-AMAIIkCAAD4AwAgjAIAAPgDACABCQAAqgQAIAAAAAEDAACVAwAgAQMAAPcDACAF3gEBAAAAAd8BAQAAAAHgARAAAAAB4QGAAAAAAeIBQAAAAAECAAAA9gEAIBsAALsEACADAAAAAwAgGwAAuwQAIBwAAL8EACAHAAAAAwAgFAAAvwQAIN4BAQCCAwAh3wEBAIIDACHgARAAmwMAIeEBgAAAAAHiAUAAgwMAIQXeAQEAggMAId8BAQCCAwAh4AEQAJsDACHhAYAAAAAB4gFAAIMDACEHygEBAAAAAc4BQAAAAAHPAUAAAAAB3wEBAAAAAf0BAQAAAAH_AQIAAAABgAIQAAAAAQ0FAACyBAAgCAAA9AMAIMoBAQAAAAHOAUAAAAABzwFAAAAAAYUCAQAAAAGGAgEAAAABhwIBAAAAAYgCAQAAAAGJAgEAAAABigIBAAAAAYsCAQAAAAGMAgEAAAABAgAAAAEAIBsAAMEEACADAAAABQAgGwAAwQQAIBwAAMUEACAPAAAABQAgBQAAsQQAIAgAAKkDACAUAADFBAAgygEBAIIDACHOAUAAgwMAIc8BQACDAwAhhQIBAIIDACGGAgEApwMAIYcCAQCnAwAhiAIBAKcDACGJAgEApwMAIYoCAQCCAwAhiwIBAIIDACGMAgEApwMAIQ0FAACxBAAgCAAAqQMAIMoBAQCCAwAhzgFAAIMDACHPAUAAgwMAIYUCAQCCAwAhhgIBAKcDACGHAgEApwMAIYgCAQCnAwAhiQIBAKcDACGKAgEAggMAIYsCAQCCAwAhjAIBAKcDACEMBgAAmwQAIAoAAOQDACANAADmAwAgDgAA5wMAIMoBAQAAAAHOAUAAAAABzwFAAAAAAd8BAQAAAAH9AQEAAAAB_gEBAAAAAf8BAgAAAAGAAhAAAAABAgAAABEAIBsAAMYEACADAAAADwAgGwAAxgQAIBwAAMoEACAOAAAADwAgBgAAmgQAIAoAALcDACANAAC5AwAgDgAAugMAIBQAAMoEACDKAQEAggMAIc4BQACDAwAhzwFAAIMDACHfAQEAggMAIf0BAQCCAwAh_gEBAIIDACH_AQIAtQMAIYACEACbAwAhDAYAAJoEACAKAAC3AwAgDQAAuQMAIA4AALoDACDKAQEAggMAIc4BQACDAwAhzwFAAIMDACHfAQEAggMAIf0BAQCCAwAh_gEBAIIDACH_AQIAtQMAIYACEACbAwAhDAYAAJsEACAKAADkAwAgDAAA5QMAIA4AAOcDACDKAQEAAAABzgFAAAAAAc8BQAAAAAHfAQEAAAAB_QEBAAAAAf4BAQAAAAH_AQIAAAABgAIQAAAAAQIAAAARACAbAADLBAAgAwAAAA8AIBsAAMsEACAcAADPBAAgDgAAAA8AIAYAAJoEACAKAAC3AwAgDAAAuAMAIA4AALoDACAUAADPBAAgygEBAIIDACHOAUAAgwMAIc8BQACDAwAh3wEBAIIDACH9AQEAggMAIf4BAQCCAwAh_wECALUDACGAAhAAmwMAIQwGAACaBAAgCgAAtwMAIAwAALgDACAOAAC6AwAgygEBAIIDACHOAUAAgwMAIc8BQACDAwAh3wEBAIIDACH9AQEAggMAIf4BAQCCAwAh_wECALUDACGAAhAAmwMAIQwGAACbBAAgCgAA5AMAIAwAAOUDACANAADmAwAgygEBAAAAAc4BQAAAAAHPAUAAAAAB3wEBAAAAAf0BAQAAAAH-AQEAAAAB_wECAAAAAYACEAAAAAECAAAAEQAgGwAA0AQAIAMAAAAPACAbAADQBAAgHAAA1AQAIA4AAAAPACAGAACaBAAgCgAAtwMAIAwAALgDACANAAC5AwAgFAAA1AQAIMoBAQCCAwAhzgFAAIMDACHPAUAAgwMAId8BAQCCAwAh_QEBAIIDACH-AQEAggMAIf8BAgC1AwAhgAIQAJsDACEMBgAAmgQAIAoAALcDACAMAAC4AwAgDQAAuQMAIMoBAQCCAwAhzgFAAIMDACHPAUAAgwMAId8BAQCCAwAh_QEBAIIDACH-AQEAggMAIf8BAgC1AwAhgAIQAJsDACEGygEBAAAAAcsBAQAAAAHMAQEAAAABzQEBAAAAAc4BQAAAAAHPAUAAAAABAgAAAI4CACAbAADVBAAgAwAAAJECACAbAADVBAAgHAAA2QQAIAgAAACRAgAgFAAA2QQAIMoBAQCCAwAhywEBAIIDACHMAQEAggMAIc0BAQCCAwAhzgFAAIMDACHPAUAAgwMAIQbKAQEAggMAIcsBAQCCAwAhzAEBAIIDACHNAQEAggMAIc4BQACDAwAhzwFAAIMDACEDzgFAAAAAAYICAQAAAAGEAgAAAIQCAgbKAQEAAAABzgFAAAAAAc8BQAAAAAHfAQEAAAAB_AEgAAAAAYECAQAAAAECAAAAUwAgGwAA2wQAIAXKAQEAAAABzgFAAAAAAfQBAQAAAAH1AQEAAAAB-wEAAAD7AQIIygEBAAAAAc4BQAAAAAHPAUAAAAAB4AEQAAAAAfQBAQAAAAH1AQEAAAAB-wEAAAD7AQP8ASAAAAABCsoBAQAAAAHOAUAAAAABzwFAAAAAAfEBAQAAAAHzAUAAAAAB9AEBAAAAAfUBAQAAAAH2AQEAAAAB9wEBAAAAAfkBAAAA-QECAwAAAFYAIBsAANsEACAcAADiBAAgCAAAAFYAIBQAAOIEACDKAQEAggMAIc4BQACDAwAhzwFAAIMDACHfAQEAggMAIfwBIADTAwAhgQIBAIIDACEGygEBAIIDACHOAUAAgwMAIc8BQACDAwAh3wEBAIIDACH8ASAA0wMAIYECAQCCAwAhB8oBAQAAAAHOAUAAAAABzwFAAAAAAd8BAQAAAAH-AQEAAAAB_wECAAAAAYACEAAAAAEKygEBAAAAAc4BQAAAAAHPAUAAAAABhQIBAAAAAYYCAQAAAAGHAgEAAAABiAIBAAAAAYkCAQAAAAGKAgEAAAABiwIBAAAAAQ0FAACyBAAgCQAA9QMAIMoBAQAAAAHOAUAAAAABzwFAAAAAAYUCAQAAAAGGAgEAAAABhwIBAAAAAYgCAQAAAAGJAgEAAAABigIBAAAAAYsCAQAAAAGMAgEAAAABAgAAAAEAIBsAAOUEACADAAAABQAgGwAA5QQAIBwAAOkEACAPAAAABQAgBQAAsQQAIAkAAKoDACAUAADpBAAgygEBAIIDACHOAUAAgwMAIc8BQACDAwAhhQIBAIIDACGGAgEApwMAIYcCAQCnAwAhiAIBAKcDACGJAgEApwMAIYoCAQCCAwAhiwIBAIIDACGMAgEApwMAIQ0FAACxBAAgCQAAqgMAIMoBAQCCAwAhzgFAAIMDACHPAUAAgwMAIYUCAQCCAwAhhgIBAKcDACGHAgEApwMAIYgCAQCnAwAhiQIBAKcDACGKAgEAggMAIYsCAQCCAwAhjAIBAKcDACEDzgFAAAAAAf0BAQAAAAGEAgAAAIQCAgQEAA4FBAIIDAQJEgcCAwcBBAADAQMIAAIGAAEHAAUCAw0EBAAGAQMOAAYEAA0GAAEKAAgMGAoNHAsOIAwCBAAJCRMHAQkUAAELAAcBCwAHAQsABwMMIQANIgAOIwACCCQACSUAAAEFLwIBBTUCAwQAEyEAFCIAFQAAAAMEABMhABQiABUCBgABBwAFAgYAAQcABQMEABohABsiABwAAAADBAAaIQAbIgAcAAADBAAhIQAiIgAjAAAAAwQAISEAIiIAIwIGAAEKAAgCBgABCgAIBQQAKCEAKyIALFMAKVQAKgAAAAAABQQAKCEAKyIALFMAKVQAKgELAAcBCwAHAwQAMSEAMiIAMwAAAAMEADEhADIiADMBCwAHAQsABwUEADghADsiADxTADlUADoAAAAAAAUEADghADsiADxTADlUADoBCwAHAQsABwMEAEEhAEIiAEMAAAADBABBIQBCIgBDAAAABQQASSEATCIATVMASlQASwAAAAAABQQASSEATCIATVMASlQASwAAAAUEAFMhAFYiAFdTAFRUAFUAAAAAAAUEAFMhAFYiAFdTAFRUAFUAAAUEAFwhAF8iAGBTAF1UAF4AAAAAAAUEAFwhAF8iAGBTAF1UAF4AAAMEAGUhAGYiAGcAAAADBABlIQBmIgBnDwIBECYBEScBEigBEykBFSsBFi0PFy4QGDEBGTMPGjQRHTYBHjcBHzgPIzsSJDwWJT0EJj4EJz8EKEAEKUEEKkMEK0UPLEYXLUgELkoPL0sYMEwEMU0EMk4PM1EZNFIdNVQINlUIN1gIOFkIOVoIOlwIO14PPF8ePWEIPmMPP2QfQGUIQWYIQmcPQ2ogRGskRWwHRm0HR24HSG8HSXAHSnIHS3QPTHUlTXcHTnkPT3omUHsHUXwHUn0PVYABJ1aBAS1XggEKWIMBClmEAQpahQEKW4YBClyIAQpdigEPXosBLl-NAQpgjwEPYZABL2KRAQpjkgEKZJMBD2WWATBmlwE0Z5gBC2iZAQtpmgELapsBC2ucAQtsngELbaABD26hATVvowELcKUBD3GmATZypwELc6gBC3SpAQ91rAE3dq0BPXeuAQx4rwEMebABDHqxAQx7sgEMfLQBDH22AQ9-twE-f7kBDIABuwEPgQG8AT-CAb0BDIMBvgEMhAG_AQ-FAcIBQIYBwwFEhwHFAUWIAcYBRYkByQFFigHKAUWLAcsBRYwBzQFFjQHPAQ-OAdABRo8B0gFFkAHUAQ-RAdUBR5IB1gFFkwHXAUWUAdgBD5UB2wFIlgHcAU6XAd4BT5gB3wFPmQHiAU-aAeMBT5sB5AFPnAHmAU-dAegBD54B6QFQnwHrAU-gAe0BD6EB7gFRogHvAU-jAfABT6QB8QEPpQH0AVKmAfUBWKcB9wECqAH4AQKpAfoBAqoB-wECqwH8AQKsAf4BAq0BgAIPrgGBAlmvAYMCArABhQIPsQGGAlqyAYcCArMBiAICtAGJAg-1AYwCW7YBjQJhtwGPAgW4AZACBbkBkwIFugGUAgW7AZUCBbwBlwIFvQGZAg--AZoCYr8BnAIFwAGeAg_BAZ8CY8IBoAIFwwGhAgXEAaICD8UBpQJkxgGmAmg" + strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"user\",\"sessions\",\"accounts\",\"complexes\",\"_count\",\"plan\",\"users\",\"complex\",\"courts\",\"sport\",\"court\",\"availabilities\",\"priceRules\",\"bookings\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.createManyAndReturn\",\"User.updateOne\",\"User.updateMany\",\"User.updateManyAndReturn\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Session.findUnique\",\"Session.findUniqueOrThrow\",\"Session.findFirst\",\"Session.findFirstOrThrow\",\"Session.findMany\",\"Session.createOne\",\"Session.createMany\",\"Session.createManyAndReturn\",\"Session.updateOne\",\"Session.updateMany\",\"Session.updateManyAndReturn\",\"Session.upsertOne\",\"Session.deleteOne\",\"Session.deleteMany\",\"Session.groupBy\",\"Session.aggregate\",\"Account.findUnique\",\"Account.findUniqueOrThrow\",\"Account.findFirst\",\"Account.findFirstOrThrow\",\"Account.findMany\",\"Account.createOne\",\"Account.createMany\",\"Account.createManyAndReturn\",\"Account.updateOne\",\"Account.updateMany\",\"Account.updateManyAndReturn\",\"Account.upsertOne\",\"Account.deleteOne\",\"Account.deleteMany\",\"Account.groupBy\",\"Account.aggregate\",\"Verification.findUnique\",\"Verification.findUniqueOrThrow\",\"Verification.findFirst\",\"Verification.findFirstOrThrow\",\"Verification.findMany\",\"Verification.createOne\",\"Verification.createMany\",\"Verification.createManyAndReturn\",\"Verification.updateOne\",\"Verification.updateMany\",\"Verification.updateManyAndReturn\",\"Verification.upsertOne\",\"Verification.deleteOne\",\"Verification.deleteMany\",\"Verification.groupBy\",\"Verification.aggregate\",\"Complex.findUnique\",\"Complex.findUniqueOrThrow\",\"Complex.findFirst\",\"Complex.findFirstOrThrow\",\"Complex.findMany\",\"Complex.createOne\",\"Complex.createMany\",\"Complex.createManyAndReturn\",\"Complex.updateOne\",\"Complex.updateMany\",\"Complex.updateManyAndReturn\",\"Complex.upsertOne\",\"Complex.deleteOne\",\"Complex.deleteMany\",\"Complex.groupBy\",\"Complex.aggregate\",\"ComplexUser.findUnique\",\"ComplexUser.findUniqueOrThrow\",\"ComplexUser.findFirst\",\"ComplexUser.findFirstOrThrow\",\"ComplexUser.findMany\",\"ComplexUser.createOne\",\"ComplexUser.createMany\",\"ComplexUser.createManyAndReturn\",\"ComplexUser.updateOne\",\"ComplexUser.updateMany\",\"ComplexUser.updateManyAndReturn\",\"ComplexUser.upsertOne\",\"ComplexUser.deleteOne\",\"ComplexUser.deleteMany\",\"ComplexUser.groupBy\",\"ComplexUser.aggregate\",\"Sport.findUnique\",\"Sport.findUniqueOrThrow\",\"Sport.findFirst\",\"Sport.findFirstOrThrow\",\"Sport.findMany\",\"Sport.createOne\",\"Sport.createMany\",\"Sport.createManyAndReturn\",\"Sport.updateOne\",\"Sport.updateMany\",\"Sport.updateManyAndReturn\",\"Sport.upsertOne\",\"Sport.deleteOne\",\"Sport.deleteMany\",\"Sport.groupBy\",\"Sport.aggregate\",\"Court.findUnique\",\"Court.findUniqueOrThrow\",\"Court.findFirst\",\"Court.findFirstOrThrow\",\"Court.findMany\",\"Court.createOne\",\"Court.createMany\",\"Court.createManyAndReturn\",\"Court.updateOne\",\"Court.updateMany\",\"Court.updateManyAndReturn\",\"Court.upsertOne\",\"Court.deleteOne\",\"Court.deleteMany\",\"_avg\",\"_sum\",\"Court.groupBy\",\"Court.aggregate\",\"CourtAvailability.findUnique\",\"CourtAvailability.findUniqueOrThrow\",\"CourtAvailability.findFirst\",\"CourtAvailability.findFirstOrThrow\",\"CourtAvailability.findMany\",\"CourtAvailability.createOne\",\"CourtAvailability.createMany\",\"CourtAvailability.createManyAndReturn\",\"CourtAvailability.updateOne\",\"CourtAvailability.updateMany\",\"CourtAvailability.updateManyAndReturn\",\"CourtAvailability.upsertOne\",\"CourtAvailability.deleteOne\",\"CourtAvailability.deleteMany\",\"CourtAvailability.groupBy\",\"CourtAvailability.aggregate\",\"CourtPriceRule.findUnique\",\"CourtPriceRule.findUniqueOrThrow\",\"CourtPriceRule.findFirst\",\"CourtPriceRule.findFirstOrThrow\",\"CourtPriceRule.findMany\",\"CourtPriceRule.createOne\",\"CourtPriceRule.createMany\",\"CourtPriceRule.createManyAndReturn\",\"CourtPriceRule.updateOne\",\"CourtPriceRule.updateMany\",\"CourtPriceRule.updateManyAndReturn\",\"CourtPriceRule.upsertOne\",\"CourtPriceRule.deleteOne\",\"CourtPriceRule.deleteMany\",\"CourtPriceRule.groupBy\",\"CourtPriceRule.aggregate\",\"CourtBooking.findUnique\",\"CourtBooking.findUniqueOrThrow\",\"CourtBooking.findFirst\",\"CourtBooking.findFirstOrThrow\",\"CourtBooking.findMany\",\"CourtBooking.createOne\",\"CourtBooking.createMany\",\"CourtBooking.createManyAndReturn\",\"CourtBooking.updateOne\",\"CourtBooking.updateMany\",\"CourtBooking.updateManyAndReturn\",\"CourtBooking.upsertOne\",\"CourtBooking.deleteOne\",\"CourtBooking.deleteMany\",\"CourtBooking.groupBy\",\"CourtBooking.aggregate\",\"OnboardingRequest.findUnique\",\"OnboardingRequest.findUniqueOrThrow\",\"OnboardingRequest.findFirst\",\"OnboardingRequest.findFirstOrThrow\",\"OnboardingRequest.findMany\",\"OnboardingRequest.createOne\",\"OnboardingRequest.createMany\",\"OnboardingRequest.createManyAndReturn\",\"OnboardingRequest.updateOne\",\"OnboardingRequest.updateMany\",\"OnboardingRequest.updateManyAndReturn\",\"OnboardingRequest.upsertOne\",\"OnboardingRequest.deleteOne\",\"OnboardingRequest.deleteMany\",\"OnboardingRequest.groupBy\",\"OnboardingRequest.aggregate\",\"PasswordResetRequest.findUnique\",\"PasswordResetRequest.findUniqueOrThrow\",\"PasswordResetRequest.findFirst\",\"PasswordResetRequest.findFirstOrThrow\",\"PasswordResetRequest.findMany\",\"PasswordResetRequest.createOne\",\"PasswordResetRequest.createMany\",\"PasswordResetRequest.createManyAndReturn\",\"PasswordResetRequest.updateOne\",\"PasswordResetRequest.updateMany\",\"PasswordResetRequest.updateManyAndReturn\",\"PasswordResetRequest.upsertOne\",\"PasswordResetRequest.deleteOne\",\"PasswordResetRequest.deleteMany\",\"PasswordResetRequest.groupBy\",\"PasswordResetRequest.aggregate\",\"Plan.findUnique\",\"Plan.findUniqueOrThrow\",\"Plan.findFirst\",\"Plan.findFirstOrThrow\",\"Plan.findMany\",\"Plan.createOne\",\"Plan.createMany\",\"Plan.createManyAndReturn\",\"Plan.updateOne\",\"Plan.updateMany\",\"Plan.updateManyAndReturn\",\"Plan.upsertOne\",\"Plan.deleteOne\",\"Plan.deleteMany\",\"Plan.groupBy\",\"Plan.aggregate\",\"AND\",\"OR\",\"NOT\",\"code\",\"name\",\"price\",\"rules\",\"lastUpdatedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"contains\",\"startsWith\",\"endsWith\",\"every\",\"some\",\"none\",\"id\",\"email\",\"otpHash\",\"otpExpiresAt\",\"otpAttempts\",\"otpLastSentAt\",\"otpResendCount\",\"usedAt\",\"createdAt\",\"updatedAt\",\"fullName\",\"emailVerifiedAt\",\"completedAt\",\"bookingCode\",\"courtId\",\"bookingDate\",\"startTime\",\"endTime\",\"customerName\",\"customerPhone\",\"CourtBookingStatus\",\"status\",\"DayOfWeek\",\"dayOfWeek\",\"isActive\",\"complexId\",\"sportId\",\"slotDurationMinutes\",\"basePrice\",\"slug\",\"userId\",\"ComplexUserRole\",\"role\",\"complexName\",\"physicalAddress\",\"city\",\"state\",\"country\",\"complexSlug\",\"adminEmail\",\"planCode\",\"identifier\",\"value\",\"expiresAt\",\"accountId\",\"providerId\",\"accessToken\",\"refreshToken\",\"idToken\",\"accessTokenExpiresAt\",\"refreshTokenExpiresAt\",\"scope\",\"password\",\"token\",\"ipAddress\",\"userAgent\",\"emailVerified\",\"image\",\"courtId_bookingDate_startTime\",\"complexId_userId\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), + graph: "-AWAAeABDQQAAL0DACAFAAC-AwAgBgAAvwMAIPkBAAC7AwAw-gEAADIAEPsBAAC7AwAw_QEBAIQDACGVAgEAAAABlgIBAAAAAZ0CQACHAwAhngJAAIcDACHNAiAArwMAIc4CAQC8AwAhAQAAAAEAIAwDAADTAwAg-QEAANUDADD6AQAAAwAQ-wEAANUDADCVAgEAhAMAIZ0CQACHAwAhngJAAIcDACGzAgEAhAMAIcACQACHAwAhygIBAIQDACHLAgEAvAMAIcwCAQC8AwAhAwMAALwFACDLAgAAvgQAIMwCAAC-BAAgDAMAANMDACD5AQAA1QMAMPoBAAADABD7AQAA1QMAMJUCAQAAAAGdAkAAhwMAIZ4CQACHAwAhswIBAIQDACHAAkAAhwMAIcoCAQAAAAHLAgEAvAMAIcwCAQC8AwAhAwAAAAMAIAEAAAQAMAIAAAUAIBEDAADTAwAg-QEAANQDADD6AQAABwAQ-wEAANQDADCVAgEAhAMAIZ0CQACHAwAhngJAAIcDACGzAgEAhAMAIcECAQCEAwAhwgIBAIQDACHDAgEAvAMAIcQCAQC8AwAhxQIBALwDACHGAkAAlgMAIccCQACWAwAhyAIBALwDACHJAgEAvAMAIQgDAAC8BQAgwwIAAL4EACDEAgAAvgQAIMUCAAC-BAAgxgIAAL4EACDHAgAAvgQAIMgCAAC-BAAgyQIAAL4EACARAwAA0wMAIPkBAADUAwAw-gEAAAcAEPsBAADUAwAwlQIBAAAAAZ0CQACHAwAhngJAAIcDACGzAgEAhAMAIcECAQCEAwAhwgIBAIQDACHDAgEAvAMAIcQCAQC8AwAhxQIBALwDACHGAkAAlgMAIccCQACWAwAhyAIBALwDACHJAgEAvAMAIQMAAAAHACABAAAIADACAAAJACAJAwAA0wMAIAoAAMkDACD5AQAA0QMAMPoBAAALABD7AQAA0QMAMJ0CQACHAwAhrgIBAJQDACGzAgEAhAMAIbUCAADSA7UCIgIDAAC8BQAgCgAAtgUAIAoDAADTAwAgCgAAyQMAIPkBAADRAwAw-gEAAAsAEPsBAADRAwAwnQJAAIcDACGuAgEAlAMAIbMCAQCEAwAhtQIAANIDtQIi0AIAANADACADAAAACwAgAQAADAAwAgAADQAgCQYAAIgDACD5AQAAgwMAMPoBAAAPABD7AQAAgwMAMPwBAQCEAwAh_QEBAIQDACH-ARAAhQMAIf8BAACGAwAggAJAAIcDACEBAAAADwAgEQgAAM8DACAJAAC_AwAgCwAAsAMAIPkBAADOAwAw-gEAABEAEPsBAADOAwAwlQIBAJQDACGdAkAAhwMAIZ4CQACHAwAhtgIBAIQDACG3AgEAvAMAIbgCAQC8AwAhuQIBALwDACG6AgEAvAMAIbsCAQCEAwAhvAIBAIQDACG9AgEAvAMAIQgIAAC7BQAgCQAAtAUAIAsAAPAEACC3AgAAvgQAILgCAAC-BAAguQIAAL4EACC6AgAAvgQAIL0CAAC-BAAgEQgAAM8DACAJAAC_AwAgCwAAsAMAIPkBAADOAwAw-gEAABEAEPsBAADOAwAwlQIBAAAAAZ0CQACHAwAhngJAAIcDACG2AgEAhAMAIbcCAQC8AwAhuAIBALwDACG5AgEAvAMAIboCAQC8AwAhuwIBAAAAAbwCAQCEAwAhvQIBALwDACEDAAAAEQAgAQAAEgAwAgAAEwAgAQAAABEAIAMAAAALACABAAAMADACAAANACAQCgAAyQMAIAwAAMoDACAOAADLAwAgDwAAzAMAIBAAAM0DACD5AQAAyAMAMPoBAAAXABD7AQAAyAMAMP0BAQCEAwAhlQIBAJQDACGdAkAAhwMAIZ4CQACHAwAhrgIBAJQDACGvAgEAlAMAIbACAgCVAwAhsQIQAIUDACEFCgAAtgUAIAwAALcFACAOAAC4BQAgDwAAuQUAIBAAALoFACAQCgAAyQMAIAwAAMoDACAOAADLAwAgDwAAzAMAIBAAAM0DACD5AQAAyAMAMPoBAAAXABD7AQAAyAMAMP0BAQCEAwAhlQIBAAAAAZ0CQACHAwAhngJAAIcDACGuAgEAlAMAIa8CAQCUAwAhsAICAJUDACGxAhAAhQMAIQMAAAAXACABAAAYADACAAAZACADAAAAFwAgAQAAGAAwAgAAGQAgAQAAABcAIAoNAADDAwAg-QEAAMYDADD6AQAAHQAQ-wEAAMYDADCVAgEAlAMAIZ0CQACHAwAhowIBAJQDACGlAgEAhAMAIaYCAQCEAwAhrAIAAMcDrAIiAQ0AALUFACAKDQAAwwMAIPkBAADGAwAw-gEAAB0AEPsBAADGAwAwlQIBAAAAAZ0CQACHAwAhowIBAJQDACGlAgEAhAMAIaYCAQCEAwAhrAIAAMcDrAIiAwAAAB0AIAEAAB4AMAIAAB8AIA0NAADDAwAg-QEAAMQDADD6AQAAIQAQ-wEAAMQDADD-ARAAhQMAIZUCAQCUAwAhnQJAAIcDACGeAkAAhwMAIaMCAQCUAwAhpQIBALwDACGmAgEAvAMAIawCAADFA6wCI60CIACvAwAhBA0AALUFACClAgAAvgQAIKYCAAC-BAAgrAIAAL4EACANDQAAwwMAIPkBAADEAwAw-gEAACEAEPsBAADEAwAw_gEQAIUDACGVAgEAAAABnQJAAIcDACGeAkAAhwMAIaMCAQCUAwAhpQIBALwDACGmAgEAvAMAIawCAADFA6wCI60CIACvAwAhAwAAACEAIAEAACIAMAIAACMAIA8NAADDAwAg-QEAAMEDADD6AQAAJQAQ-wEAAMEDADCVAgEAlAMAIZ0CQACHAwAhngJAAIcDACGiAgEAhAMAIaMCAQCUAwAhpAJAAIcDACGlAgEAhAMAIaYCAQCEAwAhpwIBAIQDACGoAgEAhAMAIaoCAADCA6oCIgENAAC1BQAgEA0AAMMDACD5AQAAwQMAMPoBAAAlABD7AQAAwQMAMJUCAQAAAAGdAkAAhwMAIZ4CQACHAwAhogIBAAAAAaMCAQCUAwAhpAJAAIcDACGlAgEAhAMAIaYCAQCEAwAhpwIBAIQDACGoAgEAhAMAIaoCAADCA6oCIs8CAADAAwAgAwAAACUAIAEAACYAMAIAACcAIAEAAAAdACABAAAAIQAgAQAAACUAIAEAAAALACABAAAAFwAgAQAAAAMAIAEAAAAHACABAAAACwAgAQAAAAEAIA0EAAC9AwAgBQAAvgMAIAYAAL8DACD5AQAAuwMAMPoBAAAyABD7AQAAuwMAMP0BAQCEAwAhlQIBAIQDACGWAgEAhAMAIZ0CQACHAwAhngJAAIcDACHNAiAArwMAIc4CAQC8AwAhBAQAALIFACAFAACzBQAgBgAAtAUAIM4CAAC-BAAgAwAAADIAIAEAADMAMAIAAAEAIAMAAAAyACABAAAzADACAAABACADAAAAMgAgAQAAMwAwAgAAAQAgCgQAAK8FACAFAACwBQAgBgAAsQUAIP0BAQAAAAGVAgEAAAABlgIBAAAAAZ0CQAAAAAGeAkAAAAABzQIgAAAAAc4CAQAAAAEBFgAANwAgB_0BAQAAAAGVAgEAAAABlgIBAAAAAZ0CQAAAAAGeAkAAAAABzQIgAAAAAc4CAQAAAAEBFgAAOQAwARYAADkAMAoEAACLBQAgBQAAjAUAIAYAAI0FACD9AQEA2wMAIZUCAQDbAwAhlgIBANsDACGdAkAA3QMAIZ4CQADdAwAhzQIgAJUEACHOAgEA6QMAIQIAAAABACAWAAA8ACAH_QEBANsDACGVAgEA2wMAIZYCAQDbAwAhnQJAAN0DACGeAkAA3QMAIc0CIACVBAAhzgIBAOkDACECAAAAMgAgFgAAPgAgAgAAADIAIBYAAD4AIAMAAAABACAdAAA3ACAeAAA8ACABAAAAAQAgAQAAADIAIAQHAACIBQAgIwAAigUAICQAAIkFACDOAgAAvgQAIAr5AQAAugMAMPoBAABFABD7AQAAugMAMP0BAQD3AgAhlQIBAPcCACGWAgEA9wIAIZ0CQAD6AgAhngJAAPoCACHNAiAAoQMAIc4CAQCgAwAhAwAAADIAIAEAAEQAMCIAAEUAIAMAAAAyACABAAAzADACAAABACABAAAABQAgAQAAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIAkDAACHBQAglQIBAAAAAZ0CQAAAAAGeAkAAAAABswIBAAAAAcACQAAAAAHKAgEAAAABywIBAAAAAcwCAQAAAAEBFgAATQAgCJUCAQAAAAGdAkAAAAABngJAAAAAAbMCAQAAAAHAAkAAAAABygIBAAAAAcsCAQAAAAHMAgEAAAABARYAAE8AMAEWAABPADAJAwAAhgUAIJUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbMCAQDbAwAhwAJAAN0DACHKAgEA2wMAIcsCAQDpAwAhzAIBAOkDACECAAAABQAgFgAAUgAgCJUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbMCAQDbAwAhwAJAAN0DACHKAgEA2wMAIcsCAQDpAwAhzAIBAOkDACECAAAAAwAgFgAAVAAgAgAAAAMAIBYAAFQAIAMAAAAFACAdAABNACAeAABSACABAAAABQAgAQAAAAMAIAUHAACDBQAgIwAAhQUAICQAAIQFACDLAgAAvgQAIMwCAAC-BAAgC_kBAAC5AwAw-gEAAFsAEPsBAAC5AwAwlQIBAPcCACGdAkAA-gIAIZ4CQAD6AgAhswIBAPcCACHAAkAA-gIAIcoCAQD3AgAhywIBAKADACHMAgEAoAMAIQMAAAADACABAABaADAiAABbACADAAAAAwAgAQAABAAwAgAABQAgAQAAAAkAIAEAAAAJACADAAAABwAgAQAACAAwAgAACQAgAwAAAAcAIAEAAAgAMAIAAAkAIAMAAAAHACABAAAIADACAAAJACAOAwAAggUAIJUCAQAAAAGdAkAAAAABngJAAAAAAbMCAQAAAAHBAgEAAAABwgIBAAAAAcMCAQAAAAHEAgEAAAABxQIBAAAAAcYCQAAAAAHHAkAAAAAByAIBAAAAAckCAQAAAAEBFgAAYwAgDZUCAQAAAAGdAkAAAAABngJAAAAAAbMCAQAAAAHBAgEAAAABwgIBAAAAAcMCAQAAAAHEAgEAAAABxQIBAAAAAcYCQAAAAAHHAkAAAAAByAIBAAAAAckCAQAAAAEBFgAAZQAwARYAAGUAMA4DAACBBQAglQIBANsDACGdAkAA3QMAIZ4CQADdAwAhswIBANsDACHBAgEA2wMAIcICAQDbAwAhwwIBAOkDACHEAgEA6QMAIcUCAQDpAwAhxgJAAMQEACHHAkAAxAQAIcgCAQDpAwAhyQIBAOkDACECAAAACQAgFgAAaAAgDZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbMCAQDbAwAhwQIBANsDACHCAgEA2wMAIcMCAQDpAwAhxAIBAOkDACHFAgEA6QMAIcYCQADEBAAhxwJAAMQEACHIAgEA6QMAIckCAQDpAwAhAgAAAAcAIBYAAGoAIAIAAAAHACAWAABqACADAAAACQAgHQAAYwAgHgAAaAAgAQAAAAkAIAEAAAAHACAKBwAA_gQAICMAAIAFACAkAAD_BAAgwwIAAL4EACDEAgAAvgQAIMUCAAC-BAAgxgIAAL4EACDHAgAAvgQAIMgCAAC-BAAgyQIAAL4EACAQ-QEAALgDADD6AQAAcQAQ-wEAALgDADCVAgEA9wIAIZ0CQAD6AgAhngJAAPoCACGzAgEA9wIAIcECAQD3AgAhwgIBAPcCACHDAgEAoAMAIcQCAQCgAwAhxQIBAKADACHGAkAAjAMAIccCQACMAwAhyAIBAKADACHJAgEAoAMAIQMAAAAHACABAABwADAiAABxACADAAAABwAgAQAACAAwAgAACQAgCfkBAAC3AwAw-gEAAHcAEPsBAAC3AwAwlQIBAAAAAZ0CQACHAwAhngJAAIcDACG-AgEAhAMAIb8CAQCEAwAhwAJAAIcDACEBAAAAdAAgAQAAAHQAIAn5AQAAtwMAMPoBAAB3ABD7AQAAtwMAMJUCAQCEAwAhnQJAAIcDACGeAkAAhwMAIb4CAQCEAwAhvwIBAIQDACHAAkAAhwMAIQADAAAAdwAgAQAAeAAwAgAAdAAgAwAAAHcAIAEAAHgAMAIAAHQAIAMAAAB3ACABAAB4ADACAAB0ACAGlQIBAAAAAZ0CQAAAAAGeAkAAAAABvgIBAAAAAb8CAQAAAAHAAkAAAAABARYAAHwAIAaVAgEAAAABnQJAAAAAAZ4CQAAAAAG-AgEAAAABvwIBAAAAAcACQAAAAAEBFgAAfgAwARYAAH4AMAaVAgEA2wMAIZ0CQADdAwAhngJAAN0DACG-AgEA2wMAIb8CAQDbAwAhwAJAAN0DACECAAAAdAAgFgAAgQEAIAaVAgEA2wMAIZ0CQADdAwAhngJAAN0DACG-AgEA2wMAIb8CAQDbAwAhwAJAAN0DACECAAAAdwAgFgAAgwEAIAIAAAB3ACAWAACDAQAgAwAAAHQAIB0AAHwAIB4AAIEBACABAAAAdAAgAQAAAHcAIAMHAAD7BAAgIwAA_QQAICQAAPwEACAJ-QEAALYDADD6AQAAigEAEPsBAAC2AwAwlQIBAPcCACGdAkAA-gIAIZ4CQAD6AgAhvgIBAPcCACG_AgEA9wIAIcACQAD6AgAhAwAAAHcAIAEAAIkBADAiAACKAQAgAwAAAHcAIAEAAHgAMAIAAHQAIAEAAAATACABAAAAEwAgAwAAABEAIAEAABIAMAIAABMAIAMAAAARACABAAASADACAAATACADAAAAEQAgAQAAEgAwAgAAEwAgDggAAPoEACAJAAC6BAAgCwAAuwQAIJUCAQAAAAGdAkAAAAABngJAAAAAAbYCAQAAAAG3AgEAAAABuAIBAAAAAbkCAQAAAAG6AgEAAAABuwIBAAAAAbwCAQAAAAG9AgEAAAABARYAAJIBACALlQIBAAAAAZ0CQAAAAAGeAkAAAAABtgIBAAAAAbcCAQAAAAG4AgEAAAABuQIBAAAAAboCAQAAAAG7AgEAAAABvAIBAAAAAb0CAQAAAAEBFgAAlAEAMAEWAACUAQAwAQAAAA8AIA4IAAD5BAAgCQAA6wMAIAsAAOwDACCVAgEA2wMAIZ0CQADdAwAhngJAAN0DACG2AgEA2wMAIbcCAQDpAwAhuAIBAOkDACG5AgEA6QMAIboCAQDpAwAhuwIBANsDACG8AgEA2wMAIb0CAQDpAwAhAgAAABMAIBYAAJgBACALlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhtgIBANsDACG3AgEA6QMAIbgCAQDpAwAhuQIBAOkDACG6AgEA6QMAIbsCAQDbAwAhvAIBANsDACG9AgEA6QMAIQIAAAARACAWAACaAQAgAgAAABEAIBYAAJoBACABAAAADwAgAwAAABMAIB0AAJIBACAeAACYAQAgAQAAABMAIAEAAAARACAIBwAA9gQAICMAAPgEACAkAAD3BAAgtwIAAL4EACC4AgAAvgQAILkCAAC-BAAgugIAAL4EACC9AgAAvgQAIA75AQAAtQMAMPoBAACiAQAQ-wEAALUDADCVAgEAigMAIZ0CQAD6AgAhngJAAPoCACG2AgEA9wIAIbcCAQCgAwAhuAIBAKADACG5AgEAoAMAIboCAQCgAwAhuwIBAPcCACG8AgEA9wIAIb0CAQCgAwAhAwAAABEAIAEAAKEBADAiAACiAQAgAwAAABEAIAEAABIAMAIAABMAIAEAAAANACABAAAADQAgAwAAAAsAIAEAAAwAMAIAAA0AIAMAAAALACABAAAMADACAAANACADAAAACwAgAQAADAAwAgAADQAgBgMAALgEACAKAAD1BAAgnQJAAAAAAa4CAQAAAAGzAgEAAAABtQIAAAC1AgIBFgAAqgEAIASdAkAAAAABrgIBAAAAAbMCAQAAAAG1AgAAALUCAgEWAACsAQAwARYAAKwBADAGAwAAtgQAIAoAAPQEACCdAkAA3QMAIa4CAQDbAwAhswIBANsDACG1AgAAtAS1AiICAAAADQAgFgAArwEAIASdAkAA3QMAIa4CAQDbAwAhswIBANsDACG1AgAAtAS1AiICAAAACwAgFgAAsQEAIAIAAAALACAWAACxAQAgAwAAAA0AIB0AAKoBACAeAACvAQAgAQAAAA0AIAEAAAALACADBwAA8QQAICMAAPMEACAkAADyBAAgB_kBAACxAwAw-gEAALgBABD7AQAAsQMAMJ0CQAD6AgAhrgIBAIoDACGzAgEA9wIAIbUCAACyA7UCIgMAAAALACABAAC3AQAwIgAAuAEAIAMAAAALACABAAAMADACAAANACAKCwAAsAMAIPkBAACuAwAw-gEAAL4BABD7AQAArgMAMP0BAQAAAAGVAgEAAAABnQJAAIcDACGeAkAAhwMAIa0CIACvAwAhsgIBAAAAAQEAAAC7AQAgAQAAALsBACAKCwAAsAMAIPkBAACuAwAw-gEAAL4BABD7AQAArgMAMP0BAQCEAwAhlQIBAJQDACGdAkAAhwMAIZ4CQACHAwAhrQIgAK8DACGyAgEAhAMAIQELAADwBAAgAwAAAL4BACABAAC_AQAwAgAAuwEAIAMAAAC-AQAgAQAAvwEAMAIAALsBACADAAAAvgEAIAEAAL8BADACAAC7AQAgBwsAAO8EACD9AQEAAAABlQIBAAAAAZ0CQAAAAAGeAkAAAAABrQIgAAAAAbICAQAAAAEBFgAAwwEAIAb9AQEAAAABlQIBAAAAAZ0CQAAAAAGeAkAAAAABrQIgAAAAAbICAQAAAAEBFgAAxQEAMAEWAADFAQAwBwsAAOUEACD9AQEA2wMAIZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIa0CIACVBAAhsgIBANsDACECAAAAuwEAIBYAAMgBACAG_QEBANsDACGVAgEA2wMAIZ0CQADdAwAhngJAAN0DACGtAiAAlQQAIbICAQDbAwAhAgAAAL4BACAWAADKAQAgAgAAAL4BACAWAADKAQAgAwAAALsBACAdAADDAQAgHgAAyAEAIAEAAAC7AQAgAQAAAL4BACADBwAA4gQAICMAAOQEACAkAADjBAAgCfkBAACtAwAw-gEAANEBABD7AQAArQMAMP0BAQD3AgAhlQIBAIoDACGdAkAA-gIAIZ4CQAD6AgAhrQIgAKEDACGyAgEA9wIAIQMAAAC-AQAgAQAA0AEAMCIAANEBACADAAAAvgEAIAEAAL8BADACAAC7AQAgAQAAABkAIAEAAAAZACADAAAAFwAgAQAAGAAwAgAAGQAgAwAAABcAIAEAABgAMAIAABkAIAMAAAAXACABAAAYADACAAAZACANCgAA4QQAIAwAAKYEACAOAACnBAAgDwAAqAQAIBAAAKkEACD9AQEAAAABlQIBAAAAAZ0CQAAAAAGeAkAAAAABrgIBAAAAAa8CAQAAAAGwAgIAAAABsQIQAAAAAQEWAADZAQAgCP0BAQAAAAGVAgEAAAABnQJAAAAAAZ4CQAAAAAGuAgEAAAABrwIBAAAAAbACAgAAAAGxAhAAAAABARYAANsBADABFgAA2wEAMA0KAADgBAAgDAAA-QMAIA4AAPoDACAPAAD7AwAgEAAA_AMAIP0BAQDbAwAhlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhrgIBANsDACGvAgEA2wMAIbACAgD3AwAhsQIQANwDACECAAAAGQAgFgAA3gEAIAj9AQEA2wMAIZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIa4CAQDbAwAhrwIBANsDACGwAgIA9wMAIbECEADcAwAhAgAAABcAIBYAAOABACACAAAAFwAgFgAA4AEAIAMAAAAZACAdAADZAQAgHgAA3gEAIAEAAAAZACABAAAAFwAgBQcAANsEACAjAADeBAAgJAAA3QQAIJUBAADcBAAglgEAAN8EACAL-QEAAKwDADD6AQAA5wEAEPsBAACsAwAw_QEBAPcCACGVAgEAigMAIZ0CQAD6AgAhngJAAPoCACGuAgEAigMAIa8CAQCKAwAhsAICAIsDACGxAhAA-AIAIQMAAAAXACABAADmAQAwIgAA5wEAIAMAAAAXACABAAAYADACAAAZACABAAAAHwAgAQAAAB8AIAMAAAAdACABAAAeADACAAAfACADAAAAHQAgAQAAHgAwAgAAHwAgAwAAAB0AIAEAAB4AMAIAAB8AIAcNAADaBAAglQIBAAAAAZ0CQAAAAAGjAgEAAAABpQIBAAAAAaYCAQAAAAGsAgAAAKwCAgEWAADvAQAgBpUCAQAAAAGdAkAAAAABowIBAAAAAaUCAQAAAAGmAgEAAAABrAIAAACsAgIBFgAA8QEAMAEWAADxAQAwBw0AANkEACCVAgEA2wMAIZ0CQADdAwAhowIBANsDACGlAgEA2wMAIaYCAQDbAwAhrAIAAKIErAIiAgAAAB8AIBYAAPQBACAGlQIBANsDACGdAkAA3QMAIaMCAQDbAwAhpQIBANsDACGmAgEA2wMAIawCAACiBKwCIgIAAAAdACAWAAD2AQAgAgAAAB0AIBYAAPYBACADAAAAHwAgHQAA7wEAIB4AAPQBACABAAAAHwAgAQAAAB0AIAMHAADWBAAgIwAA2AQAICQAANcEACAJ-QEAAKgDADD6AQAA_QEAEPsBAACoAwAwlQIBAIoDACGdAkAA-gIAIaMCAQCKAwAhpQIBAPcCACGmAgEA9wIAIawCAACpA6wCIgMAAAAdACABAAD8AQAwIgAA_QEAIAMAAAAdACABAAAeADACAAAfACABAAAAIwAgAQAAACMAIAMAAAAhACABAAAiADACAAAjACADAAAAIQAgAQAAIgAwAgAAIwAgAwAAACEAIAEAACIAMAIAACMAIAoNAADVBAAg_gEQAAAAAZUCAQAAAAGdAkAAAAABngJAAAAAAaMCAQAAAAGlAgEAAAABpgIBAAAAAawCAAAArAIDrQIgAAAAAQEWAACFAgAgCf4BEAAAAAGVAgEAAAABnQJAAAAAAZ4CQAAAAAGjAgEAAAABpQIBAAAAAaYCAQAAAAGsAgAAAKwCA60CIAAAAAEBFgAAhwIAMAEWAACHAgAwCg0AANQEACD-ARAA3AMAIZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIaMCAQDbAwAhpQIBAOkDACGmAgEA6QMAIawCAACUBKwCI60CIACVBAAhAgAAACMAIBYAAIoCACAJ_gEQANwDACGVAgEA2wMAIZ0CQADdAwAhngJAAN0DACGjAgEA2wMAIaUCAQDpAwAhpgIBAOkDACGsAgAAlASsAiOtAiAAlQQAIQIAAAAhACAWAACMAgAgAgAAACEAIBYAAIwCACADAAAAIwAgHQAAhQIAIB4AAIoCACABAAAAIwAgAQAAACEAIAgHAADPBAAgIwAA0gQAICQAANEEACCVAQAA0AQAIJYBAADTBAAgpQIAAL4EACCmAgAAvgQAIKwCAAC-BAAgDPkBAACeAwAw-gEAAJMCABD7AQAAngMAMP4BEAD4AgAhlQIBAIoDACGdAkAA-gIAIZ4CQAD6AgAhowIBAIoDACGlAgEAoAMAIaYCAQCgAwAhrAIAAJ8DrAIjrQIgAKEDACEDAAAAIQAgAQAAkgIAMCIAAJMCACADAAAAIQAgAQAAIgAwAgAAIwAgAQAAACcAIAEAAAAnACADAAAAJQAgAQAAJgAwAgAAJwAgAwAAACUAIAEAACYAMAIAACcAIAMAAAAlACABAAAmADACAAAnACAMDQAAzgQAIJUCAQAAAAGdAkAAAAABngJAAAAAAaICAQAAAAGjAgEAAAABpAJAAAAAAaUCAQAAAAGmAgEAAAABpwIBAAAAAagCAQAAAAGqAgAAAKoCAgEWAACbAgAgC5UCAQAAAAGdAkAAAAABngJAAAAAAaICAQAAAAGjAgEAAAABpAJAAAAAAaUCAQAAAAGmAgEAAAABpwIBAAAAAagCAQAAAAGqAgAAAKoCAgEWAACdAgAwARYAAJ0CADAMDQAAzQQAIJUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIaICAQDbAwAhowIBANsDACGkAkAA3QMAIaUCAQDbAwAhpgIBANsDACGnAgEA2wMAIagCAQDbAwAhqgIAAIcEqgIiAgAAACcAIBYAAKACACALlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhogIBANsDACGjAgEA2wMAIaQCQADdAwAhpQIBANsDACGmAgEA2wMAIacCAQDbAwAhqAIBANsDACGqAgAAhwSqAiICAAAAJQAgFgAAogIAIAIAAAAlACAWAACiAgAgAwAAACcAIB0AAJsCACAeAACgAgAgAQAAACcAIAEAAAAlACADBwAAygQAICMAAMwEACAkAADLBAAgDvkBAACaAwAw-gEAAKkCABD7AQAAmgMAMJUCAQCKAwAhnQJAAPoCACGeAkAA-gIAIaICAQD3AgAhowIBAIoDACGkAkAA-gIAIaUCAQD3AgAhpgIBAPcCACGnAgEA9wIAIagCAQD3AgAhqgIAAJsDqgIiAwAAACUAIAEAAKgCADAiAACpAgAgAwAAACUAIAEAACYAMAIAACcAIA_5AQAAmQMAMPoBAACvAgAQ-wEAAJkDADCVAgEAAAABlgIBAIQDACGXAgEAhAMAIZgCQACHAwAhmQICAJUDACGaAkAAhwMAIZsCAgCVAwAhnQJAAIcDACGeAkAAhwMAIZ8CAQCEAwAhoAJAAJYDACGhAkAAlgMAIQEAAACsAgAgAQAAAKwCACAP-QEAAJkDADD6AQAArwIAEPsBAACZAwAwlQIBAJQDACGWAgEAhAMAIZcCAQCEAwAhmAJAAIcDACGZAgIAlQMAIZoCQACHAwAhmwICAJUDACGdAkAAhwMAIZ4CQACHAwAhnwIBAIQDACGgAkAAlgMAIaECQACWAwAhAqACAAC-BAAgoQIAAL4EACADAAAArwIAIAEAALACADACAACsAgAgAwAAAK8CACABAACwAgAwAgAArAIAIAMAAACvAgAgAQAAsAIAMAIAAKwCACAMlQIBAAAAAZYCAQAAAAGXAgEAAAABmAJAAAAAAZkCAgAAAAGaAkAAAAABmwICAAAAAZ0CQAAAAAGeAkAAAAABnwIBAAAAAaACQAAAAAGhAkAAAAABARYAALQCACAMlQIBAAAAAZYCAQAAAAGXAgEAAAABmAJAAAAAAZkCAgAAAAGaAkAAAAABmwICAAAAAZ0CQAAAAAGeAkAAAAABnwIBAAAAAaACQAAAAAGhAkAAAAABARYAALYCADABFgAAtgIAMAyVAgEA2wMAIZYCAQDbAwAhlwIBANsDACGYAkAA3QMAIZkCAgD3AwAhmgJAAN0DACGbAgIA9wMAIZ0CQADdAwAhngJAAN0DACGfAgEA2wMAIaACQADEBAAhoQJAAMQEACECAAAArAIAIBYAALkCACAMlQIBANsDACGWAgEA2wMAIZcCAQDbAwAhmAJAAN0DACGZAgIA9wMAIZoCQADdAwAhmwICAPcDACGdAkAA3QMAIZ4CQADdAwAhnwIBANsDACGgAkAAxAQAIaECQADEBAAhAgAAAK8CACAWAAC7AgAgAgAAAK8CACAWAAC7AgAgAwAAAKwCACAdAAC0AgAgHgAAuQIAIAEAAACsAgAgAQAAAK8CACAHBwAAxQQAICMAAMgEACAkAADHBAAglQEAAMYEACCWAQAAyQQAIKACAAC-BAAgoQIAAL4EACAP-QEAAJgDADD6AQAAwgIAEPsBAACYAwAwlQIBAIoDACGWAgEA9wIAIZcCAQD3AgAhmAJAAPoCACGZAgIAiwMAIZoCQAD6AgAhmwICAIsDACGdAkAA-gIAIZ4CQAD6AgAhnwIBAPcCACGgAkAAjAMAIaECQACMAwAhAwAAAK8CACABAADBAgAwIgAAwgIAIAMAAACvAgAgAQAAsAIAMAIAAKwCACAN-QEAAJMDADD6AQAAyAIAEPsBAACTAwAwlQIBAAAAAZYCAQCEAwAhlwIBAIQDACGYAkAAhwMAIZkCAgCVAwAhmgJAAIcDACGbAgIAlQMAIZwCQACWAwAhnQJAAIcDACGeAkAAhwMAIQEAAADFAgAgAQAAAMUCACAN-QEAAJMDADD6AQAAyAIAEPsBAACTAwAwlQIBAJQDACGWAgEAhAMAIZcCAQCEAwAhmAJAAIcDACGZAgIAlQMAIZoCQACHAwAhmwICAJUDACGcAkAAlgMAIZ0CQACHAwAhngJAAIcDACEBnAIAAL4EACADAAAAyAIAIAEAAMkCADACAADFAgAgAwAAAMgCACABAADJAgAwAgAAxQIAIAMAAADIAgAgAQAAyQIAMAIAAMUCACAKlQIBAAAAAZYCAQAAAAGXAgEAAAABmAJAAAAAAZkCAgAAAAGaAkAAAAABmwICAAAAAZwCQAAAAAGdAkAAAAABngJAAAAAAQEWAADNAgAgCpUCAQAAAAGWAgEAAAABlwIBAAAAAZgCQAAAAAGZAgIAAAABmgJAAAAAAZsCAgAAAAGcAkAAAAABnQJAAAAAAZ4CQAAAAAEBFgAAzwIAMAEWAADPAgAwCpUCAQDbAwAhlgIBANsDACGXAgEA2wMAIZgCQADdAwAhmQICAPcDACGaAkAA3QMAIZsCAgD3AwAhnAJAAMQEACGdAkAA3QMAIZ4CQADdAwAhAgAAAMUCACAWAADSAgAgCpUCAQDbAwAhlgIBANsDACGXAgEA2wMAIZgCQADdAwAhmQICAPcDACGaAkAA3QMAIZsCAgD3AwAhnAJAAMQEACGdAkAA3QMAIZ4CQADdAwAhAgAAAMgCACAWAADUAgAgAgAAAMgCACAWAADUAgAgAwAAAMUCACAdAADNAgAgHgAA0gIAIAEAAADFAgAgAQAAAMgCACAGBwAAvwQAICMAAMIEACAkAADBBAAglQEAAMAEACCWAQAAwwQAIJwCAAC-BAAgDfkBAACJAwAw-gEAANsCABD7AQAAiQMAMJUCAQCKAwAhlgIBAPcCACGXAgEA9wIAIZgCQAD6AgAhmQICAIsDACGaAkAA-gIAIZsCAgCLAwAhnAJAAIwDACGdAkAA-gIAIZ4CQAD6AgAhAwAAAMgCACABAADaAgAwIgAA2wIAIAMAAADIAgAgAQAAyQIAMAIAAMUCACAJBgAAiAMAIPkBAACDAwAw-gEAAA8AEPsBAACDAwAw_AEBAAAAAf0BAQCEAwAh_gEQAIUDACH_AQAAhgMAIIACQACHAwAhAQAAAN4CACABAAAA3gIAIAEGAAC9BAAgAwAAAA8AIAEAAOECADACAADeAgAgAwAAAA8AIAEAAOECADACAADeAgAgAwAAAA8AIAEAAOECADACAADeAgAgBgYAALwEACD8AQEAAAAB_QEBAAAAAf4BEAAAAAH_AYAAAAABgAJAAAAAAQEWAADlAgAgBfwBAQAAAAH9AQEAAAAB_gEQAAAAAf8BgAAAAAGAAkAAAAABARYAAOcCADABFgAA5wIAMAYGAADeAwAg_AEBANsDACH9AQEA2wMAIf4BEADcAwAh_wGAAAAAAYACQADdAwAhAgAAAN4CACAWAADqAgAgBfwBAQDbAwAh_QEBANsDACH-ARAA3AMAIf8BgAAAAAGAAkAA3QMAIQIAAAAPACAWAADsAgAgAgAAAA8AIBYAAOwCACADAAAA3gIAIB0AAOUCACAeAADqAgAgAQAAAN4CACABAAAADwAgBQcAANYDACAjAADZAwAgJAAA2AMAIJUBAADXAwAglgEAANoDACAI-QEAAPYCADD6AQAA8wIAEPsBAAD2AgAw_AEBAPcCACH9AQEA9wIAIf4BEAD4AgAh_wEAAPkCACCAAkAA-gIAIQMAAAAPACABAADyAgAwIgAA8wIAIAMAAAAPACABAADhAgAwAgAA3gIAIAj5AQAA9gIAMPoBAADzAgAQ-wEAAPYCADD8AQEA9wIAIf0BAQD3AgAh_gEQAPgCACH_AQAA-QIAIIACQAD6AgAhDgcAAPwCACAjAACCAwAgJAAAggMAIIECAQAAAAGCAgEAAAAEgwIBAAAABIQCAQAAAAGFAgEAAAABhgIBAAAAAYcCAQAAAAGIAgEAgQMAIY8CAQAAAAGQAgEAAAABkQIBAAAAAQ0HAAD8AgAgIwAAgAMAICQAAIADACCVAQAAgAMAIJYBAACAAwAggQIQAAAAAYICEAAAAASDAhAAAAAEhAIQAAAAAYUCEAAAAAGGAhAAAAABhwIQAAAAAYgCEAD_AgAhDwcAAPwCACAjAAD-AgAgJAAA_gIAIIECgAAAAAGEAoAAAAABhQKAAAAAAYYCgAAAAAGHAoAAAAABiAKAAAAAAYkCAQAAAAGKAgEAAAABiwIBAAAAAYwCgAAAAAGNAoAAAAABjgKAAAAAAQsHAAD8AgAgIwAA_QIAICQAAP0CACCBAkAAAAABggJAAAAABIMCQAAAAASEAkAAAAABhQJAAAAAAYYCQAAAAAGHAkAAAAABiAJAAPsCACELBwAA_AIAICMAAP0CACAkAAD9AgAggQJAAAAAAYICQAAAAASDAkAAAAAEhAJAAAAAAYUCQAAAAAGGAkAAAAABhwJAAAAAAYgCQAD7AgAhCIECAgAAAAGCAgIAAAAEgwICAAAABIQCAgAAAAGFAgIAAAABhgICAAAAAYcCAgAAAAGIAgIA_AIAIQiBAkAAAAABggJAAAAABIMCQAAAAASEAkAAAAABhQJAAAAAAYYCQAAAAAGHAkAAAAABiAJAAP0CACEMgQKAAAAAAYQCgAAAAAGFAoAAAAABhgKAAAAAAYcCgAAAAAGIAoAAAAABiQIBAAAAAYoCAQAAAAGLAgEAAAABjAKAAAAAAY0CgAAAAAGOAoAAAAABDQcAAPwCACAjAACAAwAgJAAAgAMAIJUBAACAAwAglgEAAIADACCBAhAAAAABggIQAAAABIMCEAAAAASEAhAAAAABhQIQAAAAAYYCEAAAAAGHAhAAAAABiAIQAP8CACEIgQIQAAAAAYICEAAAAASDAhAAAAAEhAIQAAAAAYUCEAAAAAGGAhAAAAABhwIQAAAAAYgCEACAAwAhDgcAAPwCACAjAACCAwAgJAAAggMAIIECAQAAAAGCAgEAAAAEgwIBAAAABIQCAQAAAAGFAgEAAAABhgIBAAAAAYcCAQAAAAGIAgEAgQMAIY8CAQAAAAGQAgEAAAABkQIBAAAAAQuBAgEAAAABggIBAAAABIMCAQAAAASEAgEAAAABhQIBAAAAAYYCAQAAAAGHAgEAAAABiAIBAIIDACGPAgEAAAABkAIBAAAAAZECAQAAAAEJBgAAiAMAIPkBAACDAwAw-gEAAA8AEPsBAACDAwAw_AEBAIQDACH9AQEAhAMAIf4BEACFAwAh_wEAAIYDACCAAkAAhwMAIQuBAgEAAAABggIBAAAABIMCAQAAAASEAgEAAAABhQIBAAAAAYYCAQAAAAGHAgEAAAABiAIBAIIDACGPAgEAAAABkAIBAAAAAZECAQAAAAEIgQIQAAAAAYICEAAAAASDAhAAAAAEhAIQAAAAAYUCEAAAAAGGAhAAAAABhwIQAAAAAYgCEACAAwAhDIECgAAAAAGEAoAAAAABhQKAAAAAAYYCgAAAAAGHAoAAAAABiAKAAAAAAYkCAQAAAAGKAgEAAAABiwIBAAAAAYwCgAAAAAGNAoAAAAABjgKAAAAAAQiBAkAAAAABggJAAAAABIMCQAAAAASEAkAAAAABhQJAAAAAAYYCQAAAAAGHAkAAAAABiAJAAP0CACEDkgIAABEAIJMCAAARACCUAgAAEQAgDfkBAACJAwAw-gEAANsCABD7AQAAiQMAMJUCAQCKAwAhlgIBAPcCACGXAgEA9wIAIZgCQAD6AgAhmQICAIsDACGaAkAA-gIAIZsCAgCLAwAhnAJAAIwDACGdAkAA-gIAIZ4CQAD6AgAhCwcAAPwCACAjAACCAwAgJAAAggMAIIECAQAAAAGCAgEAAAAEgwIBAAAABIQCAQAAAAGFAgEAAAABhgIBAAAAAYcCAQAAAAGIAgEAkgMAIQ0HAAD8AgAgIwAA_AIAICQAAPwCACCVAQAAkQMAIJYBAAD8AgAggQICAAAAAYICAgAAAASDAgIAAAAEhAICAAAAAYUCAgAAAAGGAgIAAAABhwICAAAAAYgCAgCQAwAhCwcAAI4DACAjAACPAwAgJAAAjwMAIIECQAAAAAGCAkAAAAAFgwJAAAAABYQCQAAAAAGFAkAAAAABhgJAAAAAAYcCQAAAAAGIAkAAjQMAIQsHAACOAwAgIwAAjwMAICQAAI8DACCBAkAAAAABggJAAAAABYMCQAAAAAWEAkAAAAABhQJAAAAAAYYCQAAAAAGHAkAAAAABiAJAAI0DACEIgQICAAAAAYICAgAAAAWDAgIAAAAFhAICAAAAAYUCAgAAAAGGAgIAAAABhwICAAAAAYgCAgCOAwAhCIECQAAAAAGCAkAAAAAFgwJAAAAABYQCQAAAAAGFAkAAAAABhgJAAAAAAYcCQAAAAAGIAkAAjwMAIQ0HAAD8AgAgIwAA_AIAICQAAPwCACCVAQAAkQMAIJYBAAD8AgAggQICAAAAAYICAgAAAASDAgIAAAAEhAICAAAAAYUCAgAAAAGGAgIAAAABhwICAAAAAYgCAgCQAwAhCIECCAAAAAGCAggAAAAEgwIIAAAABIQCCAAAAAGFAggAAAABhgIIAAAAAYcCCAAAAAGIAggAkQMAIQsHAAD8AgAgIwAAggMAICQAAIIDACCBAgEAAAABggIBAAAABIMCAQAAAASEAgEAAAABhQIBAAAAAYYCAQAAAAGHAgEAAAABiAIBAJIDACEN-QEAAJMDADD6AQAAyAIAEPsBAACTAwAwlQIBAJQDACGWAgEAhAMAIZcCAQCEAwAhmAJAAIcDACGZAgIAlQMAIZoCQACHAwAhmwICAJUDACGcAkAAlgMAIZ0CQACHAwAhngJAAIcDACEIgQIBAAAAAYICAQAAAASDAgEAAAAEhAIBAAAAAYUCAQAAAAGGAgEAAAABhwIBAAAAAYgCAQCXAwAhCIECAgAAAAGCAgIAAAAEgwICAAAABIQCAgAAAAGFAgIAAAABhgICAAAAAYcCAgAAAAGIAgIA_AIAIQiBAkAAAAABggJAAAAABYMCQAAAAAWEAkAAAAABhQJAAAAAAYYCQAAAAAGHAkAAAAABiAJAAI8DACEIgQIBAAAAAYICAQAAAASDAgEAAAAEhAIBAAAAAYUCAQAAAAGGAgEAAAABhwIBAAAAAYgCAQCXAwAhD_kBAACYAwAw-gEAAMICABD7AQAAmAMAMJUCAQCKAwAhlgIBAPcCACGXAgEA9wIAIZgCQAD6AgAhmQICAIsDACGaAkAA-gIAIZsCAgCLAwAhnQJAAPoCACGeAkAA-gIAIZ8CAQD3AgAhoAJAAIwDACGhAkAAjAMAIQ_5AQAAmQMAMPoBAACvAgAQ-wEAAJkDADCVAgEAlAMAIZYCAQCEAwAhlwIBAIQDACGYAkAAhwMAIZkCAgCVAwAhmgJAAIcDACGbAgIAlQMAIZ0CQACHAwAhngJAAIcDACGfAgEAhAMAIaACQACWAwAhoQJAAJYDACEO-QEAAJoDADD6AQAAqQIAEPsBAACaAwAwlQIBAIoDACGdAkAA-gIAIZ4CQAD6AgAhogIBAPcCACGjAgEAigMAIaQCQAD6AgAhpQIBAPcCACGmAgEA9wIAIacCAQD3AgAhqAIBAPcCACGqAgAAmwOqAiIHBwAA_AIAICMAAJ0DACAkAACdAwAggQIAAACqAgKCAgAAAKoCCIMCAAAAqgIIiAIAAJwDqgIiBwcAAPwCACAjAACdAwAgJAAAnQMAIIECAAAAqgICggIAAACqAgiDAgAAAKoCCIgCAACcA6oCIgSBAgAAAKoCAoICAAAAqgIIgwIAAACqAgiIAgAAnQOqAiIM-QEAAJ4DADD6AQAAkwIAEPsBAACeAwAw_gEQAPgCACGVAgEAigMAIZ0CQAD6AgAhngJAAPoCACGjAgEAigMAIaUCAQCgAwAhpgIBAKADACGsAgAAnwOsAiOtAiAAoQMAIQcHAACOAwAgIwAApwMAICQAAKcDACCBAgAAAKwCA4ICAAAArAIJgwIAAACsAgmIAgAApgOsAiMOBwAAjgMAICMAAKUDACAkAAClAwAggQIBAAAAAYICAQAAAAWDAgEAAAAFhAIBAAAAAYUCAQAAAAGGAgEAAAABhwIBAAAAAYgCAQCkAwAhjwIBAAAAAZACAQAAAAGRAgEAAAABBQcAAPwCACAjAACjAwAgJAAAowMAIIECIAAAAAGIAiAAogMAIQUHAAD8AgAgIwAAowMAICQAAKMDACCBAiAAAAABiAIgAKIDACECgQIgAAAAAYgCIACjAwAhDgcAAI4DACAjAAClAwAgJAAApQMAIIECAQAAAAGCAgEAAAAFgwIBAAAABYQCAQAAAAGFAgEAAAABhgIBAAAAAYcCAQAAAAGIAgEApAMAIY8CAQAAAAGQAgEAAAABkQIBAAAAAQuBAgEAAAABggIBAAAABYMCAQAAAAWEAgEAAAABhQIBAAAAAYYCAQAAAAGHAgEAAAABiAIBAKUDACGPAgEAAAABkAIBAAAAAZECAQAAAAEHBwAAjgMAICMAAKcDACAkAACnAwAggQIAAACsAgOCAgAAAKwCCYMCAAAArAIJiAIAAKYDrAIjBIECAAAArAIDggIAAACsAgmDAgAAAKwCCYgCAACnA6wCIwn5AQAAqAMAMPoBAAD9AQAQ-wEAAKgDADCVAgEAigMAIZ0CQAD6AgAhowIBAIoDACGlAgEA9wIAIaYCAQD3AgAhrAIAAKkDrAIiBwcAAPwCACAjAACrAwAgJAAAqwMAIIECAAAArAICggIAAACsAgiDAgAAAKwCCIgCAACqA6wCIgcHAAD8AgAgIwAAqwMAICQAAKsDACCBAgAAAKwCAoICAAAArAIIgwIAAACsAgiIAgAAqgOsAiIEgQIAAACsAgKCAgAAAKwCCIMCAAAArAIIiAIAAKsDrAIiC_kBAACsAwAw-gEAAOcBABD7AQAArAMAMP0BAQD3AgAhlQIBAIoDACGdAkAA-gIAIZ4CQAD6AgAhrgIBAIoDACGvAgEAigMAIbACAgCLAwAhsQIQAPgCACEJ-QEAAK0DADD6AQAA0QEAEPsBAACtAwAw_QEBAPcCACGVAgEAigMAIZ0CQAD6AgAhngJAAPoCACGtAiAAoQMAIbICAQD3AgAhCgsAALADACD5AQAArgMAMPoBAAC-AQAQ-wEAAK4DADD9AQEAhAMAIZUCAQCUAwAhnQJAAIcDACGeAkAAhwMAIa0CIACvAwAhsgIBAIQDACECgQIgAAAAAYgCIACjAwAhA5ICAAAXACCTAgAAFwAglAIAABcAIAf5AQAAsQMAMPoBAAC4AQAQ-wEAALEDADCdAkAA-gIAIa4CAQCKAwAhswIBAPcCACG1AgAAsgO1AiIHBwAA_AIAICMAALQDACAkAAC0AwAggQIAAAC1AgKCAgAAALUCCIMCAAAAtQIIiAIAALMDtQIiBwcAAPwCACAjAAC0AwAgJAAAtAMAIIECAAAAtQICggIAAAC1AgiDAgAAALUCCIgCAACzA7UCIgSBAgAAALUCAoICAAAAtQIIgwIAAAC1AgiIAgAAtAO1AiIO-QEAALUDADD6AQAAogEAEPsBAAC1AwAwlQIBAIoDACGdAkAA-gIAIZ4CQAD6AgAhtgIBAPcCACG3AgEAoAMAIbgCAQCgAwAhuQIBAKADACG6AgEAoAMAIbsCAQD3AgAhvAIBAPcCACG9AgEAoAMAIQn5AQAAtgMAMPoBAACKAQAQ-wEAALYDADCVAgEA9wIAIZ0CQAD6AgAhngJAAPoCACG-AgEA9wIAIb8CAQD3AgAhwAJAAPoCACEJ-QEAALcDADD6AQAAdwAQ-wEAALcDADCVAgEAhAMAIZ0CQACHAwAhngJAAIcDACG-AgEAhAMAIb8CAQCEAwAhwAJAAIcDACEQ-QEAALgDADD6AQAAcQAQ-wEAALgDADCVAgEA9wIAIZ0CQAD6AgAhngJAAPoCACGzAgEA9wIAIcECAQD3AgAhwgIBAPcCACHDAgEAoAMAIcQCAQCgAwAhxQIBAKADACHGAkAAjAMAIccCQACMAwAhyAIBAKADACHJAgEAoAMAIQv5AQAAuQMAMPoBAABbABD7AQAAuQMAMJUCAQD3AgAhnQJAAPoCACGeAkAA-gIAIbMCAQD3AgAhwAJAAPoCACHKAgEA9wIAIcsCAQCgAwAhzAIBAKADACEK-QEAALoDADD6AQAARQAQ-wEAALoDADD9AQEA9wIAIZUCAQD3AgAhlgIBAPcCACGdAkAA-gIAIZ4CQAD6AgAhzQIgAKEDACHOAgEAoAMAIQ0EAAC9AwAgBQAAvgMAIAYAAL8DACD5AQAAuwMAMPoBAAAyABD7AQAAuwMAMP0BAQCEAwAhlQIBAIQDACGWAgEAhAMAIZ0CQACHAwAhngJAAIcDACHNAiAArwMAIc4CAQC8AwAhC4ECAQAAAAGCAgEAAAAFgwIBAAAABYQCAQAAAAGFAgEAAAABhgIBAAAAAYcCAQAAAAGIAgEApQMAIY8CAQAAAAGQAgEAAAABkQIBAAAAAQOSAgAAAwAgkwIAAAMAIJQCAAADACADkgIAAAcAIJMCAAAHACCUAgAABwAgA5ICAAALACCTAgAACwAglAIAAAsAIAOjAgEAAAABpAJAAAAAAaUCAQAAAAEPDQAAwwMAIPkBAADBAwAw-gEAACUAEPsBAADBAwAwlQIBAJQDACGdAkAAhwMAIZ4CQACHAwAhogIBAIQDACGjAgEAlAMAIaQCQACHAwAhpQIBAIQDACGmAgEAhAMAIacCAQCEAwAhqAIBAIQDACGqAgAAwgOqAiIEgQIAAACqAgKCAgAAAKoCCIMCAAAAqgIIiAIAAJ0DqgIiEgoAAMkDACAMAADKAwAgDgAAywMAIA8AAMwDACAQAADNAwAg-QEAAMgDADD6AQAAFwAQ-wEAAMgDADD9AQEAhAMAIZUCAQCUAwAhnQJAAIcDACGeAkAAhwMAIa4CAQCUAwAhrwIBAJQDACGwAgIAlQMAIbECEACFAwAh0QIAABcAINICAAAXACANDQAAwwMAIPkBAADEAwAw-gEAACEAEPsBAADEAwAw_gEQAIUDACGVAgEAlAMAIZ0CQACHAwAhngJAAIcDACGjAgEAlAMAIaUCAQC8AwAhpgIBALwDACGsAgAAxQOsAiOtAiAArwMAIQSBAgAAAKwCA4ICAAAArAIJgwIAAACsAgmIAgAApwOsAiMKDQAAwwMAIPkBAADGAwAw-gEAAB0AEPsBAADGAwAwlQIBAJQDACGdAkAAhwMAIaMCAQCUAwAhpQIBAIQDACGmAgEAhAMAIawCAADHA6wCIgSBAgAAAKwCAoICAAAArAIIgwIAAACsAgiIAgAAqwOsAiIQCgAAyQMAIAwAAMoDACAOAADLAwAgDwAAzAMAIBAAAM0DACD5AQAAyAMAMPoBAAAXABD7AQAAyAMAMP0BAQCEAwAhlQIBAJQDACGdAkAAhwMAIZ4CQACHAwAhrgIBAJQDACGvAgEAlAMAIbACAgCVAwAhsQIQAIUDACETCAAAzwMAIAkAAL8DACALAACwAwAg-QEAAM4DADD6AQAAEQAQ-wEAAM4DADCVAgEAlAMAIZ0CQACHAwAhngJAAIcDACG2AgEAhAMAIbcCAQC8AwAhuAIBALwDACG5AgEAvAMAIboCAQC8AwAhuwIBAIQDACG8AgEAhAMAIb0CAQC8AwAh0QIAABEAINICAAARACAMCwAAsAMAIPkBAACuAwAw-gEAAL4BABD7AQAArgMAMP0BAQCEAwAhlQIBAJQDACGdAkAAhwMAIZ4CQACHAwAhrQIgAK8DACGyAgEAhAMAIdECAAC-AQAg0gIAAL4BACADkgIAAB0AIJMCAAAdACCUAgAAHQAgA5ICAAAhACCTAgAAIQAglAIAACEAIAOSAgAAJQAgkwIAACUAIJQCAAAlACARCAAAzwMAIAkAAL8DACALAACwAwAg-QEAAM4DADD6AQAAEQAQ-wEAAM4DADCVAgEAlAMAIZ0CQACHAwAhngJAAIcDACG2AgEAhAMAIbcCAQC8AwAhuAIBALwDACG5AgEAvAMAIboCAQC8AwAhuwIBAIQDACG8AgEAhAMAIb0CAQC8AwAhCwYAAIgDACD5AQAAgwMAMPoBAAAPABD7AQAAgwMAMPwBAQCEAwAh_QEBAIQDACH-ARAAhQMAIf8BAACGAwAggAJAAIcDACHRAgAADwAg0gIAAA8AIAKuAgEAAAABswIBAAAAAQkDAADTAwAgCgAAyQMAIPkBAADRAwAw-gEAAAsAEPsBAADRAwAwnQJAAIcDACGuAgEAlAMAIbMCAQCEAwAhtQIAANIDtQIiBIECAAAAtQICggIAAAC1AgiDAgAAALUCCIgCAAC0A7UCIg8EAAC9AwAgBQAAvgMAIAYAAL8DACD5AQAAuwMAMPoBAAAyABD7AQAAuwMAMP0BAQCEAwAhlQIBAIQDACGWAgEAhAMAIZ0CQACHAwAhngJAAIcDACHNAiAArwMAIc4CAQC8AwAh0QIAADIAINICAAAyACARAwAA0wMAIPkBAADUAwAw-gEAAAcAEPsBAADUAwAwlQIBAIQDACGdAkAAhwMAIZ4CQACHAwAhswIBAIQDACHBAgEAhAMAIcICAQCEAwAhwwIBALwDACHEAgEAvAMAIcUCAQC8AwAhxgJAAJYDACHHAkAAlgMAIcgCAQC8AwAhyQIBALwDACEMAwAA0wMAIPkBAADVAwAw-gEAAAMAEPsBAADVAwAwlQIBAIQDACGdAkAAhwMAIZ4CQACHAwAhswIBAIQDACHAAkAAhwMAIcoCAQCEAwAhywIBALwDACHMAgEAvAMAIQAAAAAAAdYCAQAAAAEF1gIQAAAAAdwCEAAAAAHdAhAAAAAB3gIQAAAAAd8CEAAAAAEB1gJAAAAAAQsdAADfAwAwHgAA5AMAMNMCAADgAwAw1AIAAOEDADDVAgAA4gMAINYCAADjAwAw1wIAAOMDADDYAgAA4wMAMNkCAADjAwAw2gIAAOUDADDbAgAA5gMAMAwJAAC6BAAgCwAAuwQAIJUCAQAAAAGdAkAAAAABngJAAAAAAbYCAQAAAAG3AgEAAAABuAIBAAAAAbkCAQAAAAG6AgEAAAABuwIBAAAAAbwCAQAAAAECAAAAEwAgHQAAuQQAIAMAAAATACAdAAC5BAAgHgAA6gMAIAEWAAD4BQAwEQgAAM8DACAJAAC_AwAgCwAAsAMAIPkBAADOAwAw-gEAABEAEPsBAADOAwAwlQIBAAAAAZ0CQACHAwAhngJAAIcDACG2AgEAhAMAIbcCAQC8AwAhuAIBALwDACG5AgEAvAMAIboCAQC8AwAhuwIBAAAAAbwCAQCEAwAhvQIBALwDACECAAAAEwAgFgAA6gMAIAIAAADnAwAgFgAA6AMAIA75AQAA5gMAMPoBAADnAwAQ-wEAAOYDADCVAgEAlAMAIZ0CQACHAwAhngJAAIcDACG2AgEAhAMAIbcCAQC8AwAhuAIBALwDACG5AgEAvAMAIboCAQC8AwAhuwIBAIQDACG8AgEAhAMAIb0CAQC8AwAhDvkBAADmAwAw-gEAAOcDABD7AQAA5gMAMJUCAQCUAwAhnQJAAIcDACGeAkAAhwMAIbYCAQCEAwAhtwIBALwDACG4AgEAvAMAIbkCAQC8AwAhugIBALwDACG7AgEAhAMAIbwCAQCEAwAhvQIBALwDACEKlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhtgIBANsDACG3AgEA6QMAIbgCAQDpAwAhuQIBAOkDACG6AgEA6QMAIbsCAQDbAwAhvAIBANsDACEB1gIBAAAAAQwJAADrAwAgCwAA7AMAIJUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbYCAQDbAwAhtwIBAOkDACG4AgEA6QMAIbkCAQDpAwAhugIBAOkDACG7AgEA2wMAIbwCAQDbAwAhCx0AAKoEADAeAACvBAAw0wIAAKsEADDUAgAArAQAMNUCAACtBAAg1gIAAK4EADDXAgAArgQAMNgCAACuBAAw2QIAAK4EADDaAgAAsAQAMNsCAACxBAAwCx0AAO0DADAeAADyAwAw0wIAAO4DADDUAgAA7wMAMNUCAADwAwAg1gIAAPEDADDXAgAA8QMAMNgCAADxAwAw2QIAAPEDADDaAgAA8wMAMNsCAAD0AwAwCwwAAKYEACAOAACnBAAgDwAAqAQAIBAAAKkEACD9AQEAAAABlQIBAAAAAZ0CQAAAAAGeAkAAAAABrwIBAAAAAbACAgAAAAGxAhAAAAABAgAAABkAIB0AAKUEACADAAAAGQAgHQAApQQAIB4AAPgDACABFgAA9wUAMBAKAADJAwAgDAAAygMAIA4AAMsDACAPAADMAwAgEAAAzQMAIPkBAADIAwAw-gEAABcAEPsBAADIAwAw_QEBAIQDACGVAgEAAAABnQJAAIcDACGeAkAAhwMAIa4CAQCUAwAhrwIBAJQDACGwAgIAlQMAIbECEACFAwAhAgAAABkAIBYAAPgDACACAAAA9QMAIBYAAPYDACAL-QEAAPQDADD6AQAA9QMAEPsBAAD0AwAw_QEBAIQDACGVAgEAlAMAIZ0CQACHAwAhngJAAIcDACGuAgEAlAMAIa8CAQCUAwAhsAICAJUDACGxAhAAhQMAIQv5AQAA9AMAMPoBAAD1AwAQ-wEAAPQDADD9AQEAhAMAIZUCAQCUAwAhnQJAAIcDACGeAkAAhwMAIa4CAQCUAwAhrwIBAJQDACGwAgIAlQMAIbECEACFAwAhB_0BAQDbAwAhlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhrwIBANsDACGwAgIA9wMAIbECEADcAwAhBdYCAgAAAAHcAgIAAAAB3QICAAAAAd4CAgAAAAHfAgIAAAABCwwAAPkDACAOAAD6AwAgDwAA-wMAIBAAAPwDACD9AQEA2wMAIZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIa8CAQDbAwAhsAICAPcDACGxAhAA3AMAIQUdAADvBQAgHgAA9QUAINMCAADwBQAg1AIAAPQFACDZAgAAuwEAIAsdAACYBAAwHgAAnQQAMNMCAACZBAAw1AIAAJoEADDVAgAAmwQAINYCAACcBAAw1wIAAJwEADDYAgAAnAQAMNkCAACcBAAw2gIAAJ4EADDbAgAAnwQAMAsdAACKBAAwHgAAjwQAMNMCAACLBAAw1AIAAIwEADDVAgAAjQQAINYCAACOBAAw1wIAAI4EADDYAgAAjgQAMNkCAACOBAAw2gIAAJAEADDbAgAAkQQAMAsdAAD9AwAwHgAAggQAMNMCAAD-AwAw1AIAAP8DADDVAgAAgAQAINYCAACBBAAw1wIAAIEEADDYAgAAgQQAMNkCAACBBAAw2gIAAIMEADDbAgAAhAQAMAqVAgEAAAABnQJAAAAAAZ4CQAAAAAGiAgEAAAABpAJAAAAAAaUCAQAAAAGmAgEAAAABpwIBAAAAAagCAQAAAAGqAgAAAKoCAgIAAAAnACAdAACJBAAgAwAAACcAIB0AAIkEACAeAACIBAAgARYAAPMFADAQDQAAwwMAIPkBAADBAwAw-gEAACUAEPsBAADBAwAwlQIBAAAAAZ0CQACHAwAhngJAAIcDACGiAgEAAAABowIBAJQDACGkAkAAhwMAIaUCAQCEAwAhpgIBAIQDACGnAgEAhAMAIagCAQCEAwAhqgIAAMIDqgIizwIAAMADACACAAAAJwAgFgAAiAQAIAIAAACFBAAgFgAAhgQAIA75AQAAhAQAMPoBAACFBAAQ-wEAAIQEADCVAgEAlAMAIZ0CQACHAwAhngJAAIcDACGiAgEAhAMAIaMCAQCUAwAhpAJAAIcDACGlAgEAhAMAIaYCAQCEAwAhpwIBAIQDACGoAgEAhAMAIaoCAADCA6oCIg75AQAAhAQAMPoBAACFBAAQ-wEAAIQEADCVAgEAlAMAIZ0CQACHAwAhngJAAIcDACGiAgEAhAMAIaMCAQCUAwAhpAJAAIcDACGlAgEAhAMAIaYCAQCEAwAhpwIBAIQDACGoAgEAhAMAIaoCAADCA6oCIgqVAgEA2wMAIZ0CQADdAwAhngJAAN0DACGiAgEA2wMAIaQCQADdAwAhpQIBANsDACGmAgEA2wMAIacCAQDbAwAhqAIBANsDACGqAgAAhwSqAiIB1gIAAACqAgIKlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhogIBANsDACGkAkAA3QMAIaUCAQDbAwAhpgIBANsDACGnAgEA2wMAIagCAQDbAwAhqgIAAIcEqgIiCpUCAQAAAAGdAkAAAAABngJAAAAAAaICAQAAAAGkAkAAAAABpQIBAAAAAaYCAQAAAAGnAgEAAAABqAIBAAAAAaoCAAAAqgICCP4BEAAAAAGVAgEAAAABnQJAAAAAAZ4CQAAAAAGlAgEAAAABpgIBAAAAAawCAAAArAIDrQIgAAAAAQIAAAAjACAdAACXBAAgAwAAACMAIB0AAJcEACAeAACWBAAgARYAAPIFADANDQAAwwMAIPkBAADEAwAw-gEAACEAEPsBAADEAwAw_gEQAIUDACGVAgEAAAABnQJAAIcDACGeAkAAhwMAIaMCAQCUAwAhpQIBALwDACGmAgEAvAMAIawCAADFA6wCI60CIACvAwAhAgAAACMAIBYAAJYEACACAAAAkgQAIBYAAJMEACAM-QEAAJEEADD6AQAAkgQAEPsBAACRBAAw_gEQAIUDACGVAgEAlAMAIZ0CQACHAwAhngJAAIcDACGjAgEAlAMAIaUCAQC8AwAhpgIBALwDACGsAgAAxQOsAiOtAiAArwMAIQz5AQAAkQQAMPoBAACSBAAQ-wEAAJEEADD-ARAAhQMAIZUCAQCUAwAhnQJAAIcDACGeAkAAhwMAIaMCAQCUAwAhpQIBALwDACGmAgEAvAMAIawCAADFA6wCI60CIACvAwAhCP4BEADcAwAhlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhpQIBAOkDACGmAgEA6QMAIawCAACUBKwCI60CIACVBAAhAdYCAAAArAIDAdYCIAAAAAEI_gEQANwDACGVAgEA2wMAIZ0CQADdAwAhngJAAN0DACGlAgEA6QMAIaYCAQDpAwAhrAIAAJQErAIjrQIgAJUEACEI_gEQAAAAAZUCAQAAAAGdAkAAAAABngJAAAAAAaUCAQAAAAGmAgEAAAABrAIAAACsAgOtAiAAAAABBZUCAQAAAAGdAkAAAAABpQIBAAAAAaYCAQAAAAGsAgAAAKwCAgIAAAAfACAdAACkBAAgAwAAAB8AIB0AAKQEACAeAACjBAAgARYAAPEFADAKDQAAwwMAIPkBAADGAwAw-gEAAB0AEPsBAADGAwAwlQIBAAAAAZ0CQACHAwAhowIBAJQDACGlAgEAhAMAIaYCAQCEAwAhrAIAAMcDrAIiAgAAAB8AIBYAAKMEACACAAAAoAQAIBYAAKEEACAJ-QEAAJ8EADD6AQAAoAQAEPsBAACfBAAwlQIBAJQDACGdAkAAhwMAIaMCAQCUAwAhpQIBAIQDACGmAgEAhAMAIawCAADHA6wCIgn5AQAAnwQAMPoBAACgBAAQ-wEAAJ8EADCVAgEAlAMAIZ0CQACHAwAhowIBAJQDACGlAgEAhAMAIaYCAQCEAwAhrAIAAMcDrAIiBZUCAQDbAwAhnQJAAN0DACGlAgEA2wMAIaYCAQDbAwAhrAIAAKIErAIiAdYCAAAArAICBZUCAQDbAwAhnQJAAN0DACGlAgEA2wMAIaYCAQDbAwAhrAIAAKIErAIiBZUCAQAAAAGdAkAAAAABpQIBAAAAAaYCAQAAAAGsAgAAAKwCAgsMAACmBAAgDgAApwQAIA8AAKgEACAQAACpBAAg_QEBAAAAAZUCAQAAAAGdAkAAAAABngJAAAAAAa8CAQAAAAGwAgIAAAABsQIQAAAAAQMdAADvBQAg0wIAAPAFACDZAgAAuwEAIAQdAACYBAAw0wIAAJkEADDVAgAAmwQAINkCAACcBAAwBB0AAIoEADDTAgAAiwQAMNUCAACNBAAg2QIAAI4EADAEHQAA_QMAMNMCAAD-AwAw1QIAAIAEACDZAgAAgQQAMAQDAAC4BAAgnQJAAAAAAbMCAQAAAAG1AgAAALUCAgIAAAANACAdAAC3BAAgAwAAAA0AIB0AALcEACAeAAC1BAAgARYAAO4FADAKAwAA0wMAIAoAAMkDACD5AQAA0QMAMPoBAAALABD7AQAA0QMAMJ0CQACHAwAhrgIBAJQDACGzAgEAhAMAIbUCAADSA7UCItACAADQAwAgAgAAAA0AIBYAALUEACACAAAAsgQAIBYAALMEACAH-QEAALEEADD6AQAAsgQAEPsBAACxBAAwnQJAAIcDACGuAgEAlAMAIbMCAQCEAwAhtQIAANIDtQIiB_kBAACxBAAw-gEAALIEABD7AQAAsQQAMJ0CQACHAwAhrgIBAJQDACGzAgEAhAMAIbUCAADSA7UCIgOdAkAA3QMAIbMCAQDbAwAhtQIAALQEtQIiAdYCAAAAtQICBAMAALYEACCdAkAA3QMAIbMCAQDbAwAhtQIAALQEtQIiBR0AAOkFACAeAADsBQAg0wIAAOoFACDUAgAA6wUAINkCAAABACAEAwAAuAQAIJ0CQAAAAAGzAgEAAAABtQIAAAC1AgIDHQAA6QUAINMCAADqBQAg2QIAAAEAIAwJAAC6BAAgCwAAuwQAIJUCAQAAAAGdAkAAAAABngJAAAAAAbYCAQAAAAG3AgEAAAABuAIBAAAAAbkCAQAAAAG6AgEAAAABuwIBAAAAAbwCAQAAAAEEHQAAqgQAMNMCAACrBAAw1QIAAK0EACDZAgAArgQAMAQdAADtAwAw0wIAAO4DADDVAgAA8AMAINkCAADxAwAwBB0AAN8DADDTAgAA4AMAMNUCAADiAwAg2QIAAOMDADAAAAAAAAAAAdYCQAAAAAEAAAAAAAAAAAUdAADkBQAgHgAA5wUAINMCAADlBQAg1AIAAOYFACDZAgAAGQAgAx0AAOQFACDTAgAA5QUAINkCAAAZACAAAAAAAAUdAADfBQAgHgAA4gUAINMCAADgBQAg1AIAAOEFACDZAgAAGQAgAx0AAN8FACDTAgAA4AUAINkCAAAZACAAAAAFHQAA2gUAIB4AAN0FACDTAgAA2wUAINQCAADcBQAg2QIAABkAIAMdAADaBQAg0wIAANsFACDZAgAAGQAgAAAAAAAFHQAA1QUAIB4AANgFACDTAgAA1gUAINQCAADXBQAg2QIAABMAIAMdAADVBQAg0wIAANYFACDZAgAAEwAgAAAACx0AAOYEADAeAADqBAAw0wIAAOcEADDUAgAA6AQAMNUCAADpBAAg1gIAAPEDADDXAgAA8QMAMNgCAADxAwAw2QIAAPEDADDaAgAA6wQAMNsCAAD0AwAwCwoAAOEEACAOAACnBAAgDwAAqAQAIBAAAKkEACD9AQEAAAABlQIBAAAAAZ0CQAAAAAGeAkAAAAABrgIBAAAAAbACAgAAAAGxAhAAAAABAgAAABkAIB0AAO4EACADAAAAGQAgHQAA7gQAIB4AAO0EACABFgAA1AUAMAIAAAAZACAWAADtBAAgAgAAAPUDACAWAADsBAAgB_0BAQDbAwAhlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhrgIBANsDACGwAgIA9wMAIbECEADcAwAhCwoAAOAEACAOAAD6AwAgDwAA-wMAIBAAAPwDACD9AQEA2wMAIZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIa4CAQDbAwAhsAICAPcDACGxAhAA3AMAIQsKAADhBAAgDgAApwQAIA8AAKgEACAQAACpBAAg_QEBAAAAAZUCAQAAAAGdAkAAAAABngJAAAAAAa4CAQAAAAGwAgIAAAABsQIQAAAAAQQdAADmBAAw0wIAAOcEADDVAgAA6QQAINkCAADxAwAwAAAAAAUdAADPBQAgHgAA0gUAINMCAADQBQAg1AIAANEFACDZAgAAEwAgAx0AAM8FACDTAgAA0AUAINkCAAATACAAAAAHHQAAygUAIB4AAM0FACDTAgAAywUAINQCAADMBQAg1wIAAA8AINgCAAAPACDZAgAA3gIAIAMdAADKBQAg0wIAAMsFACDZAgAA3gIAIAAAAAAAAAUdAADFBQAgHgAAyAUAINMCAADGBQAg1AIAAMcFACDZAgAAAQAgAx0AAMUFACDTAgAAxgUAINkCAAABACAAAAAFHQAAwAUAIB4AAMMFACDTAgAAwQUAINQCAADCBQAg2QIAAAEAIAMdAADABQAg0wIAAMEFACDZAgAAAQAgAAAACx0AAKMFADAeAACoBQAw0wIAAKQFADDUAgAApQUAMNUCAACmBQAg1gIAAKcFADDXAgAApwUAMNgCAACnBQAw2QIAAKcFADDaAgAAqQUAMNsCAACqBQAwCx0AAJcFADAeAACcBQAw0wIAAJgFADDUAgAAmQUAMNUCAACaBQAg1gIAAJsFADDXAgAAmwUAMNgCAACbBQAw2QIAAJsFADDaAgAAnQUAMNsCAACeBQAwCx0AAI4FADAeAACSBQAw0wIAAI8FADDUAgAAkAUAMNUCAACRBQAg1gIAAK4EADDXAgAArgQAMNgCAACuBAAw2QIAAK4EADDaAgAAkwUAMNsCAACxBAAwBAoAAPUEACCdAkAAAAABrgIBAAAAAbUCAAAAtQICAgAAAA0AIB0AAJYFACADAAAADQAgHQAAlgUAIB4AAJUFACABFgAAvwUAMAIAAAANACAWAACVBQAgAgAAALIEACAWAACUBQAgA50CQADdAwAhrgIBANsDACG1AgAAtAS1AiIECgAA9AQAIJ0CQADdAwAhrgIBANsDACG1AgAAtAS1AiIECgAA9QQAIJ0CQAAAAAGuAgEAAAABtQIAAAC1AgIMlQIBAAAAAZ0CQAAAAAGeAkAAAAABwQIBAAAAAcICAQAAAAHDAgEAAAABxAIBAAAAAcUCAQAAAAHGAkAAAAABxwJAAAAAAcgCAQAAAAHJAgEAAAABAgAAAAkAIB0AAKIFACADAAAACQAgHQAAogUAIB4AAKEFACABFgAAvgUAMBEDAADTAwAg-QEAANQDADD6AQAABwAQ-wEAANQDADCVAgEAAAABnQJAAIcDACGeAkAAhwMAIbMCAQCEAwAhwQIBAIQDACHCAgEAhAMAIcMCAQC8AwAhxAIBALwDACHFAgEAvAMAIcYCQACWAwAhxwJAAJYDACHIAgEAvAMAIckCAQC8AwAhAgAAAAkAIBYAAKEFACACAAAAnwUAIBYAAKAFACAQ-QEAAJ4FADD6AQAAnwUAEPsBAACeBQAwlQIBAIQDACGdAkAAhwMAIZ4CQACHAwAhswIBAIQDACHBAgEAhAMAIcICAQCEAwAhwwIBALwDACHEAgEAvAMAIcUCAQC8AwAhxgJAAJYDACHHAkAAlgMAIcgCAQC8AwAhyQIBALwDACEQ-QEAAJ4FADD6AQAAnwUAEPsBAACeBQAwlQIBAIQDACGdAkAAhwMAIZ4CQACHAwAhswIBAIQDACHBAgEAhAMAIcICAQCEAwAhwwIBALwDACHEAgEAvAMAIcUCAQC8AwAhxgJAAJYDACHHAkAAlgMAIcgCAQC8AwAhyQIBALwDACEMlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhwQIBANsDACHCAgEA2wMAIcMCAQDpAwAhxAIBAOkDACHFAgEA6QMAIcYCQADEBAAhxwJAAMQEACHIAgEA6QMAIckCAQDpAwAhDJUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIcECAQDbAwAhwgIBANsDACHDAgEA6QMAIcQCAQDpAwAhxQIBAOkDACHGAkAAxAQAIccCQADEBAAhyAIBAOkDACHJAgEA6QMAIQyVAgEAAAABnQJAAAAAAZ4CQAAAAAHBAgEAAAABwgIBAAAAAcMCAQAAAAHEAgEAAAABxQIBAAAAAcYCQAAAAAHHAkAAAAAByAIBAAAAAckCAQAAAAEHlQIBAAAAAZ0CQAAAAAGeAkAAAAABwAJAAAAAAcoCAQAAAAHLAgEAAAABzAIBAAAAAQIAAAAFACAdAACuBQAgAwAAAAUAIB0AAK4FACAeAACtBQAgARYAAL0FADAMAwAA0wMAIPkBAADVAwAw-gEAAAMAEPsBAADVAwAwlQIBAAAAAZ0CQACHAwAhngJAAIcDACGzAgEAhAMAIcACQACHAwAhygIBAAAAAcsCAQC8AwAhzAIBALwDACECAAAABQAgFgAArQUAIAIAAACrBQAgFgAArAUAIAv5AQAAqgUAMPoBAACrBQAQ-wEAAKoFADCVAgEAhAMAIZ0CQACHAwAhngJAAIcDACGzAgEAhAMAIcACQACHAwAhygIBAIQDACHLAgEAvAMAIcwCAQC8AwAhC_kBAACqBQAw-gEAAKsFABD7AQAAqgUAMJUCAQCEAwAhnQJAAIcDACGeAkAAhwMAIbMCAQCEAwAhwAJAAIcDACHKAgEAhAMAIcsCAQC8AwAhzAIBALwDACEHlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhwAJAAN0DACHKAgEA2wMAIcsCAQDpAwAhzAIBAOkDACEHlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhwAJAAN0DACHKAgEA2wMAIcsCAQDpAwAhzAIBAOkDACEHlQIBAAAAAZ0CQAAAAAGeAkAAAAABwAJAAAAAAcoCAQAAAAHLAgEAAAABzAIBAAAAAQQdAACjBQAw0wIAAKQFADDVAgAApgUAINkCAACnBQAwBB0AAJcFADDTAgAAmAUAMNUCAACaBQAg2QIAAJsFADAEHQAAjgUAMNMCAACPBQAw1QIAAJEFACDZAgAArgQAMAAAAAUKAAC2BQAgDAAAtwUAIA4AALgFACAPAAC5BQAgEAAAugUAIAgIAAC7BQAgCQAAtAUAIAsAAPAEACC3AgAAvgQAILgCAAC-BAAguQIAAL4EACC6AgAAvgQAIL0CAAC-BAAgAQsAAPAEACAAAAABBgAAvQQAIAQEAACyBQAgBQAAswUAIAYAALQFACDOAgAAvgQAIAeVAgEAAAABnQJAAAAAAZ4CQAAAAAHAAkAAAAABygIBAAAAAcsCAQAAAAHMAgEAAAABDJUCAQAAAAGdAkAAAAABngJAAAAAAcECAQAAAAHCAgEAAAABwwIBAAAAAcQCAQAAAAHFAgEAAAABxgJAAAAAAccCQAAAAAHIAgEAAAAByQIBAAAAAQOdAkAAAAABrgIBAAAAAbUCAAAAtQICCQUAALAFACAGAACxBQAg_QEBAAAAAZUCAQAAAAGWAgEAAAABnQJAAAAAAZ4CQAAAAAHNAiAAAAABzgIBAAAAAQIAAAABACAdAADABQAgAwAAADIAIB0AAMAFACAeAADEBQAgCwAAADIAIAUAAIwFACAGAACNBQAgFgAAxAUAIP0BAQDbAwAhlQIBANsDACGWAgEA2wMAIZ0CQADdAwAhngJAAN0DACHNAiAAlQQAIc4CAQDpAwAhCQUAAIwFACAGAACNBQAg_QEBANsDACGVAgEA2wMAIZYCAQDbAwAhnQJAAN0DACGeAkAA3QMAIc0CIACVBAAhzgIBAOkDACEJBAAArwUAIAYAALEFACD9AQEAAAABlQIBAAAAAZYCAQAAAAGdAkAAAAABngJAAAAAAc0CIAAAAAHOAgEAAAABAgAAAAEAIB0AAMUFACADAAAAMgAgHQAAxQUAIB4AAMkFACALAAAAMgAgBAAAiwUAIAYAAI0FACAWAADJBQAg_QEBANsDACGVAgEA2wMAIZYCAQDbAwAhnQJAAN0DACGeAkAA3QMAIc0CIACVBAAhzgIBAOkDACEJBAAAiwUAIAYAAI0FACD9AQEA2wMAIZUCAQDbAwAhlgIBANsDACGdAkAA3QMAIZ4CQADdAwAhzQIgAJUEACHOAgEA6QMAIQX8AQEAAAAB_QEBAAAAAf4BEAAAAAH_AYAAAAABgAJAAAAAAQIAAADeAgAgHQAAygUAIAMAAAAPACAdAADKBQAgHgAAzgUAIAcAAAAPACAWAADOBQAg_AEBANsDACH9AQEA2wMAIf4BEADcAwAh_wGAAAAAAYACQADdAwAhBfwBAQDbAwAh_QEBANsDACH-ARAA3AMAIf8BgAAAAAGAAkAA3QMAIQ0IAAD6BAAgCwAAuwQAIJUCAQAAAAGdAkAAAAABngJAAAAAAbYCAQAAAAG3AgEAAAABuAIBAAAAAbkCAQAAAAG6AgEAAAABuwIBAAAAAbwCAQAAAAG9AgEAAAABAgAAABMAIB0AAM8FACADAAAAEQAgHQAAzwUAIB4AANMFACAPAAAAEQAgCAAA-QQAIAsAAOwDACAWAADTBQAglQIBANsDACGdAkAA3QMAIZ4CQADdAwAhtgIBANsDACG3AgEA6QMAIbgCAQDpAwAhuQIBAOkDACG6AgEA6QMAIbsCAQDbAwAhvAIBANsDACG9AgEA6QMAIQ0IAAD5BAAgCwAA7AMAIJUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbYCAQDbAwAhtwIBAOkDACG4AgEA6QMAIbkCAQDpAwAhugIBAOkDACG7AgEA2wMAIbwCAQDbAwAhvQIBAOkDACEH_QEBAAAAAZUCAQAAAAGdAkAAAAABngJAAAAAAa4CAQAAAAGwAgIAAAABsQIQAAAAAQ0IAAD6BAAgCQAAugQAIJUCAQAAAAGdAkAAAAABngJAAAAAAbYCAQAAAAG3AgEAAAABuAIBAAAAAbkCAQAAAAG6AgEAAAABuwIBAAAAAbwCAQAAAAG9AgEAAAABAgAAABMAIB0AANUFACADAAAAEQAgHQAA1QUAIB4AANkFACAPAAAAEQAgCAAA-QQAIAkAAOsDACAWAADZBQAglQIBANsDACGdAkAA3QMAIZ4CQADdAwAhtgIBANsDACG3AgEA6QMAIbgCAQDpAwAhuQIBAOkDACG6AgEA6QMAIbsCAQDbAwAhvAIBANsDACG9AgEA6QMAIQ0IAAD5BAAgCQAA6wMAIJUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbYCAQDbAwAhtwIBAOkDACG4AgEA6QMAIbkCAQDpAwAhugIBAOkDACG7AgEA2wMAIbwCAQDbAwAhvQIBAOkDACEMCgAA4QQAIAwAAKYEACAPAACoBAAgEAAAqQQAIP0BAQAAAAGVAgEAAAABnQJAAAAAAZ4CQAAAAAGuAgEAAAABrwIBAAAAAbACAgAAAAGxAhAAAAABAgAAABkAIB0AANoFACADAAAAFwAgHQAA2gUAIB4AAN4FACAOAAAAFwAgCgAA4AQAIAwAAPkDACAPAAD7AwAgEAAA_AMAIBYAAN4FACD9AQEA2wMAIZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIa4CAQDbAwAhrwIBANsDACGwAgIA9wMAIbECEADcAwAhDAoAAOAEACAMAAD5AwAgDwAA-wMAIBAAAPwDACD9AQEA2wMAIZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIa4CAQDbAwAhrwIBANsDACGwAgIA9wMAIbECEADcAwAhDAoAAOEEACAMAACmBAAgDgAApwQAIBAAAKkEACD9AQEAAAABlQIBAAAAAZ0CQAAAAAGeAkAAAAABrgIBAAAAAa8CAQAAAAGwAgIAAAABsQIQAAAAAQIAAAAZACAdAADfBQAgAwAAABcAIB0AAN8FACAeAADjBQAgDgAAABcAIAoAAOAEACAMAAD5AwAgDgAA-gMAIBAAAPwDACAWAADjBQAg_QEBANsDACGVAgEA2wMAIZ0CQADdAwAhngJAAN0DACGuAgEA2wMAIa8CAQDbAwAhsAICAPcDACGxAhAA3AMAIQwKAADgBAAgDAAA-QMAIA4AAPoDACAQAAD8AwAg_QEBANsDACGVAgEA2wMAIZ0CQADdAwAhngJAAN0DACGuAgEA2wMAIa8CAQDbAwAhsAICAPcDACGxAhAA3AMAIQwKAADhBAAgDAAApgQAIA4AAKcEACAPAACoBAAg_QEBAAAAAZUCAQAAAAGdAkAAAAABngJAAAAAAa4CAQAAAAGvAgEAAAABsAICAAAAAbECEAAAAAECAAAAGQAgHQAA5AUAIAMAAAAXACAdAADkBQAgHgAA6AUAIA4AAAAXACAKAADgBAAgDAAA-QMAIA4AAPoDACAPAAD7AwAgFgAA6AUAIP0BAQDbAwAhlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhrgIBANsDACGvAgEA2wMAIbACAgD3AwAhsQIQANwDACEMCgAA4AQAIAwAAPkDACAOAAD6AwAgDwAA-wMAIP0BAQDbAwAhlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhrgIBANsDACGvAgEA2wMAIbACAgD3AwAhsQIQANwDACEJBAAArwUAIAUAALAFACD9AQEAAAABlQIBAAAAAZYCAQAAAAGdAkAAAAABngJAAAAAAc0CIAAAAAHOAgEAAAABAgAAAAEAIB0AAOkFACADAAAAMgAgHQAA6QUAIB4AAO0FACALAAAAMgAgBAAAiwUAIAUAAIwFACAWAADtBQAg_QEBANsDACGVAgEA2wMAIZYCAQDbAwAhnQJAAN0DACGeAkAA3QMAIc0CIACVBAAhzgIBAOkDACEJBAAAiwUAIAUAAIwFACD9AQEA2wMAIZUCAQDbAwAhlgIBANsDACGdAkAA3QMAIZ4CQADdAwAhzQIgAJUEACHOAgEA6QMAIQOdAkAAAAABswIBAAAAAbUCAAAAtQICBv0BAQAAAAGVAgEAAAABnQJAAAAAAZ4CQAAAAAGtAiAAAAABsgIBAAAAAQIAAAC7AQAgHQAA7wUAIAWVAgEAAAABnQJAAAAAAaUCAQAAAAGmAgEAAAABrAIAAACsAgII_gEQAAAAAZUCAQAAAAGdAkAAAAABngJAAAAAAaUCAQAAAAGmAgEAAAABrAIAAACsAgOtAiAAAAABCpUCAQAAAAGdAkAAAAABngJAAAAAAaICAQAAAAGkAkAAAAABpQIBAAAAAaYCAQAAAAGnAgEAAAABqAIBAAAAAaoCAAAAqgICAwAAAL4BACAdAADvBQAgHgAA9gUAIAgAAAC-AQAgFgAA9gUAIP0BAQDbAwAhlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhrQIgAJUEACGyAgEA2wMAIQb9AQEA2wMAIZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIa0CIACVBAAhsgIBANsDACEH_QEBAAAAAZUCAQAAAAGdAkAAAAABngJAAAAAAa8CAQAAAAGwAgIAAAABsQIQAAAAAQqVAgEAAAABnQJAAAAAAZ4CQAAAAAG2AgEAAAABtwIBAAAAAbgCAQAAAAG5AgEAAAABugIBAAAAAbsCAQAAAAG8AgEAAAABBAQGAgUKAwYOBAcAEAEDAAEBAwABAgMAAQoABQQHAA8IEAYJFgQLGggCBhQFBwAHAQYVAAYHAA4KAAUMAAkOIAsPJAwQKA0CBwAKCxsIAQscAAENAAgBDQAIAQ0ACAMOKQAPKgAQKwACCSwACy0AAwQuAAUvAAYwAAAAAAMHABUjABYkABcAAAADBwAVIwAWJAAXAQMAAQEDAAEDBwAcIwAdJAAeAAAAAwcAHCMAHSQAHgEDAAEBAwABAwcAIyMAJCQAJQAAAAMHACMjACQkACUAAAADBwArIwAsJAAtAAAAAwcAKyMALCQALQEIlwEGAQidAQYDBwAyIwAzJAA0AAAAAwcAMiMAMyQANAIDAAEKAAUCAwABCgAFAwcAOSMAOiQAOwAAAAMHADkjADokADsAAAMHAEAjAEEkAEIAAAADBwBAIwBBJABCAgoABQwACQIKAAUMAAkFBwBHIwBKJABLlQEASJYBAEkAAAAAAAUHAEcjAEokAEuVAQBIlgEASQENAAgBDQAIAwcAUCMAUSQAUgAAAAMHAFAjAFEkAFIBDQAIAQ0ACAUHAFcjAFokAFuVAQBYlgEAWQAAAAAABQcAVyMAWiQAW5UBAFiWAQBZAQ0ACAENAAgDBwBgIwBhJABiAAAAAwcAYCMAYSQAYgAAAAUHAGgjAGskAGyVAQBplgEAagAAAAAABQcAaCMAayQAbJUBAGmWAQBqAAAABQcAciMAdSQAdpUBAHOWAQB0AAAAAAAFBwByIwB1JAB2lQEAc5YBAHQAAAUHAHsjAH4kAH-VAQB8lgEAfQAAAAAABQcAeyMAfiQAf5UBAHyWAQB9EQIBEjEBEzQBFDUBFTYBFzgBGDoRGTsSGj0BGz8RHEATH0EBIEIBIUMRJUYUJkcYJ0gCKEkCKUoCKksCK0wCLE4CLVARLlEZL1MCMFURMVYaMlcCM1gCNFkRNVwbNl0fN14DOF8DOWADOmEDO2IDPGQDPWYRPmcgP2kDQGsRQWwhQm0DQ24DRG8RRXIiRnMmR3UnSHYnSXknSnonS3snTH0nTX8RToABKE-CASdQhAERUYUBKVKGASdThwEnVIgBEVWLASpWjAEuV40BBViOAQVZjwEFWpABBVuRAQVckwEFXZUBEV6WAS9fmQEFYJsBEWGcATBingEFY58BBWSgARFlowExZqQBNWelAQRopgEEaacBBGqoAQRrqQEEbKsBBG2tARFurgE2b7ABBHCyARFxswE3crQBBHO1AQR0tgERdbkBOHa6ATx3vAEJeL0BCXnAAQl6wQEJe8IBCXzEAQl9xgERfscBPX_JAQmAAcsBEYEBzAE-ggHNAQmDAc4BCYQBzwERhQHSAT-GAdMBQ4cB1AEIiAHVAQiJAdYBCIoB1wEIiwHYAQiMAdoBCI0B3AERjgHdAUSPAd8BCJAB4QERkQHiAUWSAeMBCJMB5AEIlAHlARGXAegBRpgB6QFMmQHqAQuaAesBC5sB7AELnAHtAQudAe4BC54B8AELnwHyARGgAfMBTaEB9QELogH3ARGjAfgBTqQB-QELpQH6AQumAfsBEacB_gFPqAH_AVOpAYACDKoBgQIMqwGCAgysAYMCDK0BhAIMrgGGAgyvAYgCEbABiQJUsQGLAgyyAY0CEbMBjgJVtAGPAgy1AZACDLYBkQIRtwGUAla4AZUCXLkBlgINugGXAg27AZgCDbwBmQINvQGaAg2-AZwCDb8BngIRwAGfAl3BAaECDcIBowIRwwGkAl7EAaUCDcUBpgINxgGnAhHHAaoCX8gBqwJjyQGtAmTKAa4CZMsBsQJkzAGyAmTNAbMCZM4BtQJkzwG3AhHQAbgCZdEBugJk0gG8AhHTAb0CZtQBvgJk1QG_AmTWAcACEdcBwwJn2AHEAm3ZAcYCbtoBxwJu2wHKAm7cAcsCbt0BzAJu3gHOAm7fAdACEeAB0QJv4QHTAm7iAdUCEeMB1gJw5AHXAm7lAdgCbuYB2QIR5wHcAnHoAd0Cd-kB3wIG6gHgAgbrAeICBuwB4wIG7QHkAgbuAeYCBu8B6AIR8AHpAnjxAesCBvIB7QIR8wHuAnn0Ae8CBvUB8AIG9gHxAhH3AfQCevgB9QKAAQ" } async function decodeBase64AsWasm(wasmBase64: string): Promise { @@ -70,8 +70,8 @@ export interface PrismaClientConstructor { * const prisma = new PrismaClient({ * adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL }) * }) - * // Fetch zero or more Complexes - * const complexes = await prisma.complex.findMany() + * // Fetch zero or more Users + * const users = await prisma.user.findMany() * ``` * * Read more in our [docs](https://pris.ly/d/client). @@ -94,8 +94,8 @@ export interface PrismaClientConstructor { * const prisma = new PrismaClient({ * adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL }) * }) - * // Fetch zero or more Complexes - * const complexes = await prisma.complex.findMany() + * // Fetch zero or more Users + * const users = await prisma.user.findMany() * ``` * * Read more in our [docs](https://pris.ly/d/client). @@ -189,6 +189,46 @@ export interface PrismaClient< }>> /** + * `prisma.user`: Exposes CRUD operations for the **User** model. + * Example usage: + * ```ts + * // Fetch zero or more Users + * const users = await prisma.user.findMany() + * ``` + */ + get user(): Prisma.UserDelegate; + + /** + * `prisma.session`: Exposes CRUD operations for the **Session** model. + * Example usage: + * ```ts + * // Fetch zero or more Sessions + * const sessions = await prisma.session.findMany() + * ``` + */ + get session(): Prisma.SessionDelegate; + + /** + * `prisma.account`: Exposes CRUD operations for the **Account** model. + * Example usage: + * ```ts + * // Fetch zero or more Accounts + * const accounts = await prisma.account.findMany() + * ``` + */ + get account(): Prisma.AccountDelegate; + + /** + * `prisma.verification`: Exposes CRUD operations for the **Verification** model. + * Example usage: + * ```ts + * // Fetch zero or more Verifications + * const verifications = await prisma.verification.findMany() + * ``` + */ + get verification(): Prisma.VerificationDelegate; + + /** * `prisma.complex`: Exposes CRUD operations for the **Complex** model. * Example usage: * ```ts @@ -287,16 +327,6 @@ export interface PrismaClient< * ``` */ get plan(): Prisma.PlanDelegate; - - /** - * `prisma.user`: Exposes CRUD operations for the **User** model. - * Example usage: - * ```ts - * // Fetch zero or more Users - * const users = await prisma.user.findMany() - * ``` - */ - get user(): Prisma.UserDelegate; } export function getPrismaClientClass(): PrismaClientConstructor { diff --git a/apps/backend/src/generated/prisma/internal/prismaNamespace.ts b/apps/backend/src/generated/prisma/internal/prismaNamespace.ts index fe08cb5..5a18941 100644 --- a/apps/backend/src/generated/prisma/internal/prismaNamespace.ts +++ b/apps/backend/src/generated/prisma/internal/prismaNamespace.ts @@ -384,6 +384,10 @@ type FieldRefInputType = Model extends never ? never : FieldRe export const ModelName = { + User: 'User', + Session: 'Session', + Account: 'Account', + Verification: 'Verification', Complex: 'Complex', ComplexUser: 'ComplexUser', Sport: 'Sport', @@ -393,8 +397,7 @@ export const ModelName = { CourtBooking: 'CourtBooking', OnboardingRequest: 'OnboardingRequest', PasswordResetRequest: 'PasswordResetRequest', - Plan: 'Plan', - User: 'User' + Plan: 'Plan' } as const export type ModelName = (typeof ModelName)[keyof typeof ModelName] @@ -410,10 +413,306 @@ export type TypeMap + fields: Prisma.UserFieldRefs + operations: { + findUnique: { + args: Prisma.UserFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.UserFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.UserFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.UserFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.UserFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.UserCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.UserCreateManyArgs + result: BatchPayload + } + createManyAndReturn: { + args: Prisma.UserCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + delete: { + args: Prisma.UserDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.UserUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.UserDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.UserUpdateManyArgs + result: BatchPayload + } + updateManyAndReturn: { + args: Prisma.UserUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + upsert: { + args: Prisma.UserUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.UserAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.UserGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.UserCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } + Session: { + payload: Prisma.$SessionPayload + fields: Prisma.SessionFieldRefs + operations: { + findUnique: { + args: Prisma.SessionFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.SessionFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.SessionFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.SessionFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.SessionFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.SessionCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.SessionCreateManyArgs + result: BatchPayload + } + createManyAndReturn: { + args: Prisma.SessionCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + delete: { + args: Prisma.SessionDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.SessionUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.SessionDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.SessionUpdateManyArgs + result: BatchPayload + } + updateManyAndReturn: { + args: Prisma.SessionUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + upsert: { + args: Prisma.SessionUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.SessionAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.SessionGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.SessionCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } + Account: { + payload: Prisma.$AccountPayload + fields: Prisma.AccountFieldRefs + operations: { + findUnique: { + args: Prisma.AccountFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.AccountFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.AccountFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.AccountFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.AccountFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.AccountCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.AccountCreateManyArgs + result: BatchPayload + } + createManyAndReturn: { + args: Prisma.AccountCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + delete: { + args: Prisma.AccountDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.AccountUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.AccountDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.AccountUpdateManyArgs + result: BatchPayload + } + updateManyAndReturn: { + args: Prisma.AccountUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + upsert: { + args: Prisma.AccountUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.AccountAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.AccountGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.AccountCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } + Verification: { + payload: Prisma.$VerificationPayload + fields: Prisma.VerificationFieldRefs + operations: { + findUnique: { + args: Prisma.VerificationFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.VerificationFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.VerificationFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.VerificationFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.VerificationFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.VerificationCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.VerificationCreateManyArgs + result: BatchPayload + } + createManyAndReturn: { + args: Prisma.VerificationCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + delete: { + args: Prisma.VerificationDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.VerificationUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.VerificationDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.VerificationUpdateManyArgs + result: BatchPayload + } + updateManyAndReturn: { + args: Prisma.VerificationUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + upsert: { + args: Prisma.VerificationUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.VerificationAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.VerificationGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.VerificationCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } Complex: { payload: Prisma.$ComplexPayload fields: Prisma.ComplexFieldRefs @@ -1154,80 +1453,6 @@ export type TypeMap - fields: Prisma.UserFieldRefs - operations: { - findUnique: { - args: Prisma.UserFindUniqueArgs - result: runtime.Types.Utils.PayloadToResult | null - } - findUniqueOrThrow: { - args: Prisma.UserFindUniqueOrThrowArgs - result: runtime.Types.Utils.PayloadToResult - } - findFirst: { - args: Prisma.UserFindFirstArgs - result: runtime.Types.Utils.PayloadToResult | null - } - findFirstOrThrow: { - args: Prisma.UserFindFirstOrThrowArgs - result: runtime.Types.Utils.PayloadToResult - } - findMany: { - args: Prisma.UserFindManyArgs - result: runtime.Types.Utils.PayloadToResult[] - } - create: { - args: Prisma.UserCreateArgs - result: runtime.Types.Utils.PayloadToResult - } - createMany: { - args: Prisma.UserCreateManyArgs - result: BatchPayload - } - createManyAndReturn: { - args: Prisma.UserCreateManyAndReturnArgs - result: runtime.Types.Utils.PayloadToResult[] - } - delete: { - args: Prisma.UserDeleteArgs - result: runtime.Types.Utils.PayloadToResult - } - update: { - args: Prisma.UserUpdateArgs - result: runtime.Types.Utils.PayloadToResult - } - deleteMany: { - args: Prisma.UserDeleteManyArgs - result: BatchPayload - } - updateMany: { - args: Prisma.UserUpdateManyArgs - result: BatchPayload - } - updateManyAndReturn: { - args: Prisma.UserUpdateManyAndReturnArgs - result: runtime.Types.Utils.PayloadToResult[] - } - upsert: { - args: Prisma.UserUpsertArgs - result: runtime.Types.Utils.PayloadToResult - } - aggregate: { - args: Prisma.UserAggregateArgs - result: runtime.Types.Utils.Optional - } - groupBy: { - args: Prisma.UserGroupByArgs - result: runtime.Types.Utils.Optional[] - } - count: { - args: Prisma.UserCountArgs - result: runtime.Types.Utils.Optional | number - } - } - } } } & { other: { @@ -1267,6 +1492,64 @@ export const TransactionIsolationLevel = runtime.makeStrictEnum({ export type TransactionIsolationLevel = (typeof TransactionIsolationLevel)[keyof typeof TransactionIsolationLevel] +export const UserScalarFieldEnum = { + id: 'id', + name: 'name', + email: 'email', + emailVerified: 'emailVerified', + image: 'image', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type UserScalarFieldEnum = (typeof UserScalarFieldEnum)[keyof typeof UserScalarFieldEnum] + + +export const SessionScalarFieldEnum = { + id: 'id', + expiresAt: 'expiresAt', + token: 'token', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + ipAddress: 'ipAddress', + userAgent: 'userAgent', + userId: 'userId' +} as const + +export type SessionScalarFieldEnum = (typeof SessionScalarFieldEnum)[keyof typeof SessionScalarFieldEnum] + + +export const AccountScalarFieldEnum = { + id: 'id', + accountId: 'accountId', + providerId: 'providerId', + userId: 'userId', + accessToken: 'accessToken', + refreshToken: 'refreshToken', + idToken: 'idToken', + accessTokenExpiresAt: 'accessTokenExpiresAt', + refreshTokenExpiresAt: 'refreshTokenExpiresAt', + scope: 'scope', + password: 'password', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type AccountScalarFieldEnum = (typeof AccountScalarFieldEnum)[keyof typeof AccountScalarFieldEnum] + + +export const VerificationScalarFieldEnum = { + id: 'id', + identifier: 'identifier', + value: 'value', + expiresAt: 'expiresAt', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type VerificationScalarFieldEnum = (typeof VerificationScalarFieldEnum)[keyof typeof VerificationScalarFieldEnum] + + export const ComplexScalarFieldEnum = { id: 'id', complexName: 'complexName', @@ -1409,18 +1692,6 @@ export const PlanScalarFieldEnum = { export type PlanScalarFieldEnum = (typeof PlanScalarFieldEnum)[keyof typeof PlanScalarFieldEnum] -export const UserScalarFieldEnum = { - id: 'id', - supabaseUserId: 'supabaseUserId', - email: 'email', - fullName: 'fullName', - createdAt: 'createdAt', - updatedAt: 'updatedAt' -} as const - -export type UserScalarFieldEnum = (typeof UserScalarFieldEnum)[keyof typeof UserScalarFieldEnum] - - export const SortOrder = { asc: 'asc', desc: 'desc' @@ -1481,6 +1752,13 @@ export type ListStringFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaMod +/** + * Reference to a field of type 'Boolean' + */ +export type BooleanFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Boolean'> + + + /** * Reference to a field of type 'DateTime' */ @@ -1509,13 +1787,6 @@ export type ListEnumComplexUserRoleFieldRefInput<$PrismaModel> = FieldRefInputTy -/** - * Reference to a field of type 'Boolean' - */ -export type BooleanFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Boolean'> - - - /** * Reference to a field of type 'Int' */ @@ -1694,6 +1965,10 @@ export type PrismaClientOptions = ({ comments?: runtime.SqlCommenterPlugin[] } export type GlobalOmitConfig = { + user?: Prisma.UserOmit + session?: Prisma.SessionOmit + account?: Prisma.AccountOmit + verification?: Prisma.VerificationOmit complex?: Prisma.ComplexOmit complexUser?: Prisma.ComplexUserOmit sport?: Prisma.SportOmit @@ -1704,7 +1979,6 @@ export type GlobalOmitConfig = { onboardingRequest?: Prisma.OnboardingRequestOmit passwordResetRequest?: Prisma.PasswordResetRequestOmit plan?: Prisma.PlanOmit - user?: Prisma.UserOmit } /* Types for Logging */ diff --git a/apps/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts b/apps/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts index 8e49200..b0e105f 100644 --- a/apps/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts +++ b/apps/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts @@ -51,6 +51,10 @@ export const AnyNull = runtime.AnyNull export const ModelName = { + User: 'User', + Session: 'Session', + Account: 'Account', + Verification: 'Verification', Complex: 'Complex', ComplexUser: 'ComplexUser', Sport: 'Sport', @@ -60,8 +64,7 @@ export const ModelName = { CourtBooking: 'CourtBooking', OnboardingRequest: 'OnboardingRequest', PasswordResetRequest: 'PasswordResetRequest', - Plan: 'Plan', - User: 'User' + Plan: 'Plan' } as const export type ModelName = (typeof ModelName)[keyof typeof ModelName] @@ -80,6 +83,64 @@ export const TransactionIsolationLevel = runtime.makeStrictEnum({ export type TransactionIsolationLevel = (typeof TransactionIsolationLevel)[keyof typeof TransactionIsolationLevel] +export const UserScalarFieldEnum = { + id: 'id', + name: 'name', + email: 'email', + emailVerified: 'emailVerified', + image: 'image', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type UserScalarFieldEnum = (typeof UserScalarFieldEnum)[keyof typeof UserScalarFieldEnum] + + +export const SessionScalarFieldEnum = { + id: 'id', + expiresAt: 'expiresAt', + token: 'token', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + ipAddress: 'ipAddress', + userAgent: 'userAgent', + userId: 'userId' +} as const + +export type SessionScalarFieldEnum = (typeof SessionScalarFieldEnum)[keyof typeof SessionScalarFieldEnum] + + +export const AccountScalarFieldEnum = { + id: 'id', + accountId: 'accountId', + providerId: 'providerId', + userId: 'userId', + accessToken: 'accessToken', + refreshToken: 'refreshToken', + idToken: 'idToken', + accessTokenExpiresAt: 'accessTokenExpiresAt', + refreshTokenExpiresAt: 'refreshTokenExpiresAt', + scope: 'scope', + password: 'password', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type AccountScalarFieldEnum = (typeof AccountScalarFieldEnum)[keyof typeof AccountScalarFieldEnum] + + +export const VerificationScalarFieldEnum = { + id: 'id', + identifier: 'identifier', + value: 'value', + expiresAt: 'expiresAt', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type VerificationScalarFieldEnum = (typeof VerificationScalarFieldEnum)[keyof typeof VerificationScalarFieldEnum] + + export const ComplexScalarFieldEnum = { id: 'id', complexName: 'complexName', @@ -222,18 +283,6 @@ export const PlanScalarFieldEnum = { export type PlanScalarFieldEnum = (typeof PlanScalarFieldEnum)[keyof typeof PlanScalarFieldEnum] -export const UserScalarFieldEnum = { - id: 'id', - supabaseUserId: 'supabaseUserId', - email: 'email', - fullName: 'fullName', - createdAt: 'createdAt', - updatedAt: 'updatedAt' -} as const - -export type UserScalarFieldEnum = (typeof UserScalarFieldEnum)[keyof typeof UserScalarFieldEnum] - - export const SortOrder = { asc: 'asc', desc: 'desc' diff --git a/apps/backend/src/generated/prisma/models.ts b/apps/backend/src/generated/prisma/models.ts index 2dd328d..cef5ba6 100644 --- a/apps/backend/src/generated/prisma/models.ts +++ b/apps/backend/src/generated/prisma/models.ts @@ -8,6 +8,10 @@ * * 🟢 You can import this file directly. */ +export type * from './models/User' +export type * from './models/Session' +export type * from './models/Account' +export type * from './models/Verification' export type * from './models/Complex' export type * from './models/ComplexUser' export type * from './models/Sport' @@ -18,5 +22,4 @@ export type * from './models/CourtBooking' export type * from './models/OnboardingRequest' export type * from './models/PasswordResetRequest' export type * from './models/Plan' -export type * from './models/User' export type * from './commonInputTypes' \ No newline at end of file diff --git a/apps/backend/src/generated/prisma/models/Complex.ts b/apps/backend/src/generated/prisma/models/Complex.ts index ce25488..95f08f1 100644 --- a/apps/backend/src/generated/prisma/models/Complex.ts +++ b/apps/backend/src/generated/prisma/models/Complex.ts @@ -468,18 +468,6 @@ export type ComplexOrderByRelationAggregateInput = { _count?: Prisma.SortOrder } -export type StringFieldUpdateOperationsInput = { - set?: string -} - -export type NullableStringFieldUpdateOperationsInput = { - set?: string | null -} - -export type DateTimeFieldUpdateOperationsInput = { - set?: Date | string -} - export type ComplexCreateNestedOneWithoutUsersInput = { create?: Prisma.XOR connectOrCreate?: Prisma.ComplexCreateOrConnectWithoutUsersInput diff --git a/apps/backend/src/generated/prisma/models/ComplexUser.ts b/apps/backend/src/generated/prisma/models/ComplexUser.ts index a7cf65d..7e94c42 100644 --- a/apps/backend/src/generated/prisma/models/ComplexUser.ts +++ b/apps/backend/src/generated/prisma/models/ComplexUser.ts @@ -171,7 +171,7 @@ export type ComplexUserWhereInput = { OR?: Prisma.ComplexUserWhereInput[] NOT?: Prisma.ComplexUserWhereInput | Prisma.ComplexUserWhereInput[] complexId?: Prisma.UuidFilter<"ComplexUser"> | string - userId?: Prisma.UuidFilter<"ComplexUser"> | string + userId?: Prisma.StringFilter<"ComplexUser"> | string role?: Prisma.EnumComplexUserRoleFilter<"ComplexUser"> | $Enums.ComplexUserRole createdAt?: Prisma.DateTimeFilter<"ComplexUser"> | Date | string complex?: Prisma.XOR @@ -193,7 +193,7 @@ export type ComplexUserWhereUniqueInput = Prisma.AtLeast<{ OR?: Prisma.ComplexUserWhereInput[] NOT?: Prisma.ComplexUserWhereInput | Prisma.ComplexUserWhereInput[] complexId?: Prisma.UuidFilter<"ComplexUser"> | string - userId?: Prisma.UuidFilter<"ComplexUser"> | string + userId?: Prisma.StringFilter<"ComplexUser"> | string role?: Prisma.EnumComplexUserRoleFilter<"ComplexUser"> | $Enums.ComplexUserRole createdAt?: Prisma.DateTimeFilter<"ComplexUser"> | Date | string complex?: Prisma.XOR @@ -215,7 +215,7 @@ export type ComplexUserScalarWhereWithAggregatesInput = { OR?: Prisma.ComplexUserScalarWhereWithAggregatesInput[] NOT?: Prisma.ComplexUserScalarWhereWithAggregatesInput | Prisma.ComplexUserScalarWhereWithAggregatesInput[] complexId?: Prisma.UuidWithAggregatesFilter<"ComplexUser"> | string - userId?: Prisma.UuidWithAggregatesFilter<"ComplexUser"> | string + userId?: Prisma.StringWithAggregatesFilter<"ComplexUser"> | string role?: Prisma.EnumComplexUserRoleWithAggregatesFilter<"ComplexUser"> | $Enums.ComplexUserRole createdAt?: Prisma.DateTimeWithAggregatesFilter<"ComplexUser"> | Date | string } @@ -303,6 +303,48 @@ export type ComplexUserMinOrderByAggregateInput = { createdAt?: Prisma.SortOrder } +export type ComplexUserCreateNestedManyWithoutUserInput = { + create?: Prisma.XOR | Prisma.ComplexUserCreateWithoutUserInput[] | Prisma.ComplexUserUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.ComplexUserCreateOrConnectWithoutUserInput | Prisma.ComplexUserCreateOrConnectWithoutUserInput[] + createMany?: Prisma.ComplexUserCreateManyUserInputEnvelope + connect?: Prisma.ComplexUserWhereUniqueInput | Prisma.ComplexUserWhereUniqueInput[] +} + +export type ComplexUserUncheckedCreateNestedManyWithoutUserInput = { + create?: Prisma.XOR | Prisma.ComplexUserCreateWithoutUserInput[] | Prisma.ComplexUserUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.ComplexUserCreateOrConnectWithoutUserInput | Prisma.ComplexUserCreateOrConnectWithoutUserInput[] + createMany?: Prisma.ComplexUserCreateManyUserInputEnvelope + connect?: Prisma.ComplexUserWhereUniqueInput | Prisma.ComplexUserWhereUniqueInput[] +} + +export type ComplexUserUpdateManyWithoutUserNestedInput = { + create?: Prisma.XOR | Prisma.ComplexUserCreateWithoutUserInput[] | Prisma.ComplexUserUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.ComplexUserCreateOrConnectWithoutUserInput | Prisma.ComplexUserCreateOrConnectWithoutUserInput[] + upsert?: Prisma.ComplexUserUpsertWithWhereUniqueWithoutUserInput | Prisma.ComplexUserUpsertWithWhereUniqueWithoutUserInput[] + createMany?: Prisma.ComplexUserCreateManyUserInputEnvelope + set?: Prisma.ComplexUserWhereUniqueInput | Prisma.ComplexUserWhereUniqueInput[] + disconnect?: Prisma.ComplexUserWhereUniqueInput | Prisma.ComplexUserWhereUniqueInput[] + delete?: Prisma.ComplexUserWhereUniqueInput | Prisma.ComplexUserWhereUniqueInput[] + connect?: Prisma.ComplexUserWhereUniqueInput | Prisma.ComplexUserWhereUniqueInput[] + update?: Prisma.ComplexUserUpdateWithWhereUniqueWithoutUserInput | Prisma.ComplexUserUpdateWithWhereUniqueWithoutUserInput[] + updateMany?: Prisma.ComplexUserUpdateManyWithWhereWithoutUserInput | Prisma.ComplexUserUpdateManyWithWhereWithoutUserInput[] + deleteMany?: Prisma.ComplexUserScalarWhereInput | Prisma.ComplexUserScalarWhereInput[] +} + +export type ComplexUserUncheckedUpdateManyWithoutUserNestedInput = { + create?: Prisma.XOR | Prisma.ComplexUserCreateWithoutUserInput[] | Prisma.ComplexUserUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.ComplexUserCreateOrConnectWithoutUserInput | Prisma.ComplexUserCreateOrConnectWithoutUserInput[] + upsert?: Prisma.ComplexUserUpsertWithWhereUniqueWithoutUserInput | Prisma.ComplexUserUpsertWithWhereUniqueWithoutUserInput[] + createMany?: Prisma.ComplexUserCreateManyUserInputEnvelope + set?: Prisma.ComplexUserWhereUniqueInput | Prisma.ComplexUserWhereUniqueInput[] + disconnect?: Prisma.ComplexUserWhereUniqueInput | Prisma.ComplexUserWhereUniqueInput[] + delete?: Prisma.ComplexUserWhereUniqueInput | Prisma.ComplexUserWhereUniqueInput[] + connect?: Prisma.ComplexUserWhereUniqueInput | Prisma.ComplexUserWhereUniqueInput[] + update?: Prisma.ComplexUserUpdateWithWhereUniqueWithoutUserInput | Prisma.ComplexUserUpdateWithWhereUniqueWithoutUserInput[] + updateMany?: Prisma.ComplexUserUpdateManyWithWhereWithoutUserInput | Prisma.ComplexUserUpdateManyWithWhereWithoutUserInput[] + deleteMany?: Prisma.ComplexUserScalarWhereInput | Prisma.ComplexUserScalarWhereInput[] +} + export type ComplexUserCreateNestedManyWithoutComplexInput = { create?: Prisma.XOR | Prisma.ComplexUserCreateWithoutComplexInput[] | Prisma.ComplexUserUncheckedCreateWithoutComplexInput[] connectOrCreate?: Prisma.ComplexUserCreateOrConnectWithoutComplexInput | Prisma.ComplexUserCreateOrConnectWithoutComplexInput[] @@ -349,46 +391,52 @@ export type EnumComplexUserRoleFieldUpdateOperationsInput = { set?: $Enums.ComplexUserRole } -export type ComplexUserCreateNestedManyWithoutUserInput = { - create?: Prisma.XOR | Prisma.ComplexUserCreateWithoutUserInput[] | Prisma.ComplexUserUncheckedCreateWithoutUserInput[] - connectOrCreate?: Prisma.ComplexUserCreateOrConnectWithoutUserInput | Prisma.ComplexUserCreateOrConnectWithoutUserInput[] - createMany?: Prisma.ComplexUserCreateManyUserInputEnvelope - connect?: Prisma.ComplexUserWhereUniqueInput | Prisma.ComplexUserWhereUniqueInput[] +export type ComplexUserCreateWithoutUserInput = { + role?: $Enums.ComplexUserRole + createdAt?: Date | string + complex: Prisma.ComplexCreateNestedOneWithoutUsersInput } -export type ComplexUserUncheckedCreateNestedManyWithoutUserInput = { - create?: Prisma.XOR | Prisma.ComplexUserCreateWithoutUserInput[] | Prisma.ComplexUserUncheckedCreateWithoutUserInput[] - connectOrCreate?: Prisma.ComplexUserCreateOrConnectWithoutUserInput | Prisma.ComplexUserCreateOrConnectWithoutUserInput[] - createMany?: Prisma.ComplexUserCreateManyUserInputEnvelope - connect?: Prisma.ComplexUserWhereUniqueInput | Prisma.ComplexUserWhereUniqueInput[] +export type ComplexUserUncheckedCreateWithoutUserInput = { + complexId: string + role?: $Enums.ComplexUserRole + createdAt?: Date | string } -export type ComplexUserUpdateManyWithoutUserNestedInput = { - create?: Prisma.XOR | Prisma.ComplexUserCreateWithoutUserInput[] | Prisma.ComplexUserUncheckedCreateWithoutUserInput[] - connectOrCreate?: Prisma.ComplexUserCreateOrConnectWithoutUserInput | Prisma.ComplexUserCreateOrConnectWithoutUserInput[] - upsert?: Prisma.ComplexUserUpsertWithWhereUniqueWithoutUserInput | Prisma.ComplexUserUpsertWithWhereUniqueWithoutUserInput[] - createMany?: Prisma.ComplexUserCreateManyUserInputEnvelope - set?: Prisma.ComplexUserWhereUniqueInput | Prisma.ComplexUserWhereUniqueInput[] - disconnect?: Prisma.ComplexUserWhereUniqueInput | Prisma.ComplexUserWhereUniqueInput[] - delete?: Prisma.ComplexUserWhereUniqueInput | Prisma.ComplexUserWhereUniqueInput[] - connect?: Prisma.ComplexUserWhereUniqueInput | Prisma.ComplexUserWhereUniqueInput[] - update?: Prisma.ComplexUserUpdateWithWhereUniqueWithoutUserInput | Prisma.ComplexUserUpdateWithWhereUniqueWithoutUserInput[] - updateMany?: Prisma.ComplexUserUpdateManyWithWhereWithoutUserInput | Prisma.ComplexUserUpdateManyWithWhereWithoutUserInput[] - deleteMany?: Prisma.ComplexUserScalarWhereInput | Prisma.ComplexUserScalarWhereInput[] +export type ComplexUserCreateOrConnectWithoutUserInput = { + where: Prisma.ComplexUserWhereUniqueInput + create: Prisma.XOR } -export type ComplexUserUncheckedUpdateManyWithoutUserNestedInput = { - create?: Prisma.XOR | Prisma.ComplexUserCreateWithoutUserInput[] | Prisma.ComplexUserUncheckedCreateWithoutUserInput[] - connectOrCreate?: Prisma.ComplexUserCreateOrConnectWithoutUserInput | Prisma.ComplexUserCreateOrConnectWithoutUserInput[] - upsert?: Prisma.ComplexUserUpsertWithWhereUniqueWithoutUserInput | Prisma.ComplexUserUpsertWithWhereUniqueWithoutUserInput[] - createMany?: Prisma.ComplexUserCreateManyUserInputEnvelope - set?: Prisma.ComplexUserWhereUniqueInput | Prisma.ComplexUserWhereUniqueInput[] - disconnect?: Prisma.ComplexUserWhereUniqueInput | Prisma.ComplexUserWhereUniqueInput[] - delete?: Prisma.ComplexUserWhereUniqueInput | Prisma.ComplexUserWhereUniqueInput[] - connect?: Prisma.ComplexUserWhereUniqueInput | Prisma.ComplexUserWhereUniqueInput[] - update?: Prisma.ComplexUserUpdateWithWhereUniqueWithoutUserInput | Prisma.ComplexUserUpdateWithWhereUniqueWithoutUserInput[] - updateMany?: Prisma.ComplexUserUpdateManyWithWhereWithoutUserInput | Prisma.ComplexUserUpdateManyWithWhereWithoutUserInput[] - deleteMany?: Prisma.ComplexUserScalarWhereInput | Prisma.ComplexUserScalarWhereInput[] +export type ComplexUserCreateManyUserInputEnvelope = { + data: Prisma.ComplexUserCreateManyUserInput | Prisma.ComplexUserCreateManyUserInput[] + skipDuplicates?: boolean +} + +export type ComplexUserUpsertWithWhereUniqueWithoutUserInput = { + where: Prisma.ComplexUserWhereUniqueInput + update: Prisma.XOR + create: Prisma.XOR +} + +export type ComplexUserUpdateWithWhereUniqueWithoutUserInput = { + where: Prisma.ComplexUserWhereUniqueInput + data: Prisma.XOR +} + +export type ComplexUserUpdateManyWithWhereWithoutUserInput = { + where: Prisma.ComplexUserScalarWhereInput + data: Prisma.XOR +} + +export type ComplexUserScalarWhereInput = { + AND?: Prisma.ComplexUserScalarWhereInput | Prisma.ComplexUserScalarWhereInput[] + OR?: Prisma.ComplexUserScalarWhereInput[] + NOT?: Prisma.ComplexUserScalarWhereInput | Prisma.ComplexUserScalarWhereInput[] + complexId?: Prisma.UuidFilter<"ComplexUser"> | string + userId?: Prisma.StringFilter<"ComplexUser"> | string + role?: Prisma.EnumComplexUserRoleFilter<"ComplexUser"> | $Enums.ComplexUserRole + createdAt?: Prisma.DateTimeFilter<"ComplexUser"> | Date | string } export type ComplexUserCreateWithoutComplexInput = { @@ -429,52 +477,28 @@ export type ComplexUserUpdateManyWithWhereWithoutComplexInput = { data: Prisma.XOR } -export type ComplexUserScalarWhereInput = { - AND?: Prisma.ComplexUserScalarWhereInput | Prisma.ComplexUserScalarWhereInput[] - OR?: Prisma.ComplexUserScalarWhereInput[] - NOT?: Prisma.ComplexUserScalarWhereInput | Prisma.ComplexUserScalarWhereInput[] - complexId?: Prisma.UuidFilter<"ComplexUser"> | string - userId?: Prisma.UuidFilter<"ComplexUser"> | string - role?: Prisma.EnumComplexUserRoleFilter<"ComplexUser"> | $Enums.ComplexUserRole - createdAt?: Prisma.DateTimeFilter<"ComplexUser"> | Date | string -} - -export type ComplexUserCreateWithoutUserInput = { - role?: $Enums.ComplexUserRole - createdAt?: Date | string - complex: Prisma.ComplexCreateNestedOneWithoutUsersInput -} - -export type ComplexUserUncheckedCreateWithoutUserInput = { +export type ComplexUserCreateManyUserInput = { complexId: string role?: $Enums.ComplexUserRole createdAt?: Date | string } -export type ComplexUserCreateOrConnectWithoutUserInput = { - where: Prisma.ComplexUserWhereUniqueInput - create: Prisma.XOR +export type ComplexUserUpdateWithoutUserInput = { + role?: Prisma.EnumComplexUserRoleFieldUpdateOperationsInput | $Enums.ComplexUserRole + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + complex?: Prisma.ComplexUpdateOneRequiredWithoutUsersNestedInput } -export type ComplexUserCreateManyUserInputEnvelope = { - data: Prisma.ComplexUserCreateManyUserInput | Prisma.ComplexUserCreateManyUserInput[] - skipDuplicates?: boolean +export type ComplexUserUncheckedUpdateWithoutUserInput = { + complexId?: Prisma.StringFieldUpdateOperationsInput | string + role?: Prisma.EnumComplexUserRoleFieldUpdateOperationsInput | $Enums.ComplexUserRole + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } -export type ComplexUserUpsertWithWhereUniqueWithoutUserInput = { - where: Prisma.ComplexUserWhereUniqueInput - update: Prisma.XOR - create: Prisma.XOR -} - -export type ComplexUserUpdateWithWhereUniqueWithoutUserInput = { - where: Prisma.ComplexUserWhereUniqueInput - data: Prisma.XOR -} - -export type ComplexUserUpdateManyWithWhereWithoutUserInput = { - where: Prisma.ComplexUserScalarWhereInput - data: Prisma.XOR +export type ComplexUserUncheckedUpdateManyWithoutUserInput = { + complexId?: Prisma.StringFieldUpdateOperationsInput | string + role?: Prisma.EnumComplexUserRoleFieldUpdateOperationsInput | $Enums.ComplexUserRole + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } export type ComplexUserCreateManyComplexInput = { @@ -501,30 +525,6 @@ export type ComplexUserUncheckedUpdateManyWithoutComplexInput = { createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } -export type ComplexUserCreateManyUserInput = { - complexId: string - role?: $Enums.ComplexUserRole - createdAt?: Date | string -} - -export type ComplexUserUpdateWithoutUserInput = { - role?: Prisma.EnumComplexUserRoleFieldUpdateOperationsInput | $Enums.ComplexUserRole - createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string - complex?: Prisma.ComplexUpdateOneRequiredWithoutUsersNestedInput -} - -export type ComplexUserUncheckedUpdateWithoutUserInput = { - complexId?: Prisma.StringFieldUpdateOperationsInput | string - role?: Prisma.EnumComplexUserRoleFieldUpdateOperationsInput | $Enums.ComplexUserRole - createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string -} - -export type ComplexUserUncheckedUpdateManyWithoutUserInput = { - complexId?: Prisma.StringFieldUpdateOperationsInput | string - role?: Prisma.EnumComplexUserRoleFieldUpdateOperationsInput | $Enums.ComplexUserRole - createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string -} - export type ComplexUserSelect = runtime.Types.Extensions.GetSelect<{ diff --git a/apps/backend/src/generated/prisma/models/OnboardingRequest.ts b/apps/backend/src/generated/prisma/models/OnboardingRequest.ts index 3d51042..b7f62cc 100644 --- a/apps/backend/src/generated/prisma/models/OnboardingRequest.ts +++ b/apps/backend/src/generated/prisma/models/OnboardingRequest.ts @@ -509,10 +509,6 @@ export type OnboardingRequestSumOrderByAggregateInput = { otpResendCount?: Prisma.SortOrder } -export type NullableDateTimeFieldUpdateOperationsInput = { - set?: Date | string | null -} - export type OnboardingRequestSelect = runtime.Types.Extensions.GetSelect<{ diff --git a/apps/backend/src/generated/prisma/models/Sport.ts b/apps/backend/src/generated/prisma/models/Sport.ts index 7cf506b..26564bd 100644 --- a/apps/backend/src/generated/prisma/models/Sport.ts +++ b/apps/backend/src/generated/prisma/models/Sport.ts @@ -339,10 +339,6 @@ export type SportScalarRelationFilter = { isNot?: Prisma.SportWhereInput } -export type BoolFieldUpdateOperationsInput = { - set?: boolean -} - export type SportCreateNestedOneWithoutCourtsInput = { create?: Prisma.XOR connectOrCreate?: Prisma.SportCreateOrConnectWithoutCourtsInput diff --git a/apps/backend/src/generated/prisma/models/User.ts b/apps/backend/src/generated/prisma/models/User.ts index d1dc3b2..5383ba5 100644 --- a/apps/backend/src/generated/prisma/models/User.ts +++ b/apps/backend/src/generated/prisma/models/User.ts @@ -26,27 +26,30 @@ export type AggregateUser = { export type UserMinAggregateOutputType = { id: string | null - supabaseUserId: string | null + name: string | null email: string | null - fullName: string | null + emailVerified: boolean | null + image: string | null createdAt: Date | null updatedAt: Date | null } export type UserMaxAggregateOutputType = { id: string | null - supabaseUserId: string | null + name: string | null email: string | null - fullName: string | null + emailVerified: boolean | null + image: string | null createdAt: Date | null updatedAt: Date | null } export type UserCountAggregateOutputType = { id: number - supabaseUserId: number + name: number email: number - fullName: number + emailVerified: number + image: number createdAt: number updatedAt: number _all: number @@ -55,27 +58,30 @@ export type UserCountAggregateOutputType = { export type UserMinAggregateInputType = { id?: true - supabaseUserId?: true + name?: true email?: true - fullName?: true + emailVerified?: true + image?: true createdAt?: true updatedAt?: true } export type UserMaxAggregateInputType = { id?: true - supabaseUserId?: true + name?: true email?: true - fullName?: true + emailVerified?: true + image?: true createdAt?: true updatedAt?: true } export type UserCountAggregateInputType = { id?: true - supabaseUserId?: true + name?: true email?: true - fullName?: true + emailVerified?: true + image?: true createdAt?: true updatedAt?: true _all?: true @@ -155,9 +161,10 @@ export type UserGroupByArgs | string - supabaseUserId?: Prisma.UuidFilter<"User"> | string + id?: Prisma.StringFilter<"User"> | string + name?: Prisma.StringFilter<"User"> | string email?: Prisma.StringFilter<"User"> | string - fullName?: Prisma.StringFilter<"User"> | string + emailVerified?: Prisma.BoolFilter<"User"> | boolean + image?: Prisma.StringNullableFilter<"User"> | string | null createdAt?: Prisma.DateTimeFilter<"User"> | Date | string updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string + sessions?: Prisma.SessionListRelationFilter + accounts?: Prisma.AccountListRelationFilter complexes?: Prisma.ComplexUserListRelationFilter } export type UserOrderByWithRelationInput = { id?: Prisma.SortOrder - supabaseUserId?: Prisma.SortOrder + name?: Prisma.SortOrder email?: Prisma.SortOrder - fullName?: Prisma.SortOrder + emailVerified?: Prisma.SortOrder + image?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder + sessions?: Prisma.SessionOrderByRelationAggregateInput + accounts?: Prisma.AccountOrderByRelationAggregateInput complexes?: Prisma.ComplexUserOrderByRelationAggregateInput } export type UserWhereUniqueInput = Prisma.AtLeast<{ id?: string - supabaseUserId?: string email?: string AND?: Prisma.UserWhereInput | Prisma.UserWhereInput[] OR?: Prisma.UserWhereInput[] NOT?: Prisma.UserWhereInput | Prisma.UserWhereInput[] - fullName?: Prisma.StringFilter<"User"> | string + name?: Prisma.StringFilter<"User"> | string + emailVerified?: Prisma.BoolFilter<"User"> | boolean + image?: Prisma.StringNullableFilter<"User"> | string | null createdAt?: Prisma.DateTimeFilter<"User"> | Date | string updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string + sessions?: Prisma.SessionListRelationFilter + accounts?: Prisma.AccountListRelationFilter complexes?: Prisma.ComplexUserListRelationFilter -}, "id" | "supabaseUserId" | "email"> +}, "id" | "email"> export type UserOrderByWithAggregationInput = { id?: Prisma.SortOrder - supabaseUserId?: Prisma.SortOrder + name?: Prisma.SortOrder email?: Prisma.SortOrder - fullName?: Prisma.SortOrder + emailVerified?: Prisma.SortOrder + image?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder _count?: Prisma.UserCountOrderByAggregateInput @@ -232,111 +249,174 @@ export type UserScalarWhereWithAggregatesInput = { AND?: Prisma.UserScalarWhereWithAggregatesInput | Prisma.UserScalarWhereWithAggregatesInput[] OR?: Prisma.UserScalarWhereWithAggregatesInput[] NOT?: Prisma.UserScalarWhereWithAggregatesInput | Prisma.UserScalarWhereWithAggregatesInput[] - id?: Prisma.UuidWithAggregatesFilter<"User"> | string - supabaseUserId?: Prisma.UuidWithAggregatesFilter<"User"> | string + id?: Prisma.StringWithAggregatesFilter<"User"> | string + name?: Prisma.StringWithAggregatesFilter<"User"> | string email?: Prisma.StringWithAggregatesFilter<"User"> | string - fullName?: Prisma.StringWithAggregatesFilter<"User"> | string + emailVerified?: Prisma.BoolWithAggregatesFilter<"User"> | boolean + image?: Prisma.StringNullableWithAggregatesFilter<"User"> | string | null createdAt?: Prisma.DateTimeWithAggregatesFilter<"User"> | Date | string updatedAt?: Prisma.DateTimeWithAggregatesFilter<"User"> | Date | string } export type UserCreateInput = { id: string - supabaseUserId: string + name: string email: string - fullName: string + emailVerified?: boolean + image?: string | null createdAt?: Date | string updatedAt?: Date | string + sessions?: Prisma.SessionCreateNestedManyWithoutUserInput + accounts?: Prisma.AccountCreateNestedManyWithoutUserInput complexes?: Prisma.ComplexUserCreateNestedManyWithoutUserInput } export type UserUncheckedCreateInput = { id: string - supabaseUserId: string + name: string email: string - fullName: string + emailVerified?: boolean + image?: string | null createdAt?: Date | string updatedAt?: Date | string + sessions?: Prisma.SessionUncheckedCreateNestedManyWithoutUserInput + accounts?: Prisma.AccountUncheckedCreateNestedManyWithoutUserInput complexes?: Prisma.ComplexUserUncheckedCreateNestedManyWithoutUserInput } export type UserUpdateInput = { id?: Prisma.StringFieldUpdateOperationsInput | string - supabaseUserId?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string email?: Prisma.StringFieldUpdateOperationsInput | string - fullName?: Prisma.StringFieldUpdateOperationsInput | string + emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean + image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + sessions?: Prisma.SessionUpdateManyWithoutUserNestedInput + accounts?: Prisma.AccountUpdateManyWithoutUserNestedInput complexes?: Prisma.ComplexUserUpdateManyWithoutUserNestedInput } export type UserUncheckedUpdateInput = { id?: Prisma.StringFieldUpdateOperationsInput | string - supabaseUserId?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string email?: Prisma.StringFieldUpdateOperationsInput | string - fullName?: Prisma.StringFieldUpdateOperationsInput | string + emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean + image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + sessions?: Prisma.SessionUncheckedUpdateManyWithoutUserNestedInput + accounts?: Prisma.AccountUncheckedUpdateManyWithoutUserNestedInput complexes?: Prisma.ComplexUserUncheckedUpdateManyWithoutUserNestedInput } export type UserCreateManyInput = { id: string - supabaseUserId: string + name: string email: string - fullName: string + emailVerified?: boolean + image?: string | null createdAt?: Date | string updatedAt?: Date | string } export type UserUpdateManyMutationInput = { id?: Prisma.StringFieldUpdateOperationsInput | string - supabaseUserId?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string email?: Prisma.StringFieldUpdateOperationsInput | string - fullName?: Prisma.StringFieldUpdateOperationsInput | string + emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean + image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } export type UserUncheckedUpdateManyInput = { id?: Prisma.StringFieldUpdateOperationsInput | string - supabaseUserId?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string email?: Prisma.StringFieldUpdateOperationsInput | string - fullName?: Prisma.StringFieldUpdateOperationsInput | string + emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean + image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string } +export type UserCountOrderByAggregateInput = { + id?: Prisma.SortOrder + name?: Prisma.SortOrder + email?: Prisma.SortOrder + emailVerified?: Prisma.SortOrder + image?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type UserMaxOrderByAggregateInput = { + id?: Prisma.SortOrder + name?: Prisma.SortOrder + email?: Prisma.SortOrder + emailVerified?: Prisma.SortOrder + image?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type UserMinOrderByAggregateInput = { + id?: Prisma.SortOrder + name?: Prisma.SortOrder + email?: Prisma.SortOrder + emailVerified?: Prisma.SortOrder + image?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + export type UserScalarRelationFilter = { is?: Prisma.UserWhereInput isNot?: Prisma.UserWhereInput } -export type UserCountOrderByAggregateInput = { - id?: Prisma.SortOrder - supabaseUserId?: Prisma.SortOrder - email?: Prisma.SortOrder - fullName?: Prisma.SortOrder - createdAt?: Prisma.SortOrder - updatedAt?: Prisma.SortOrder +export type StringFieldUpdateOperationsInput = { + set?: string } -export type UserMaxOrderByAggregateInput = { - id?: Prisma.SortOrder - supabaseUserId?: Prisma.SortOrder - email?: Prisma.SortOrder - fullName?: Prisma.SortOrder - createdAt?: Prisma.SortOrder - updatedAt?: Prisma.SortOrder +export type BoolFieldUpdateOperationsInput = { + set?: boolean } -export type UserMinOrderByAggregateInput = { - id?: Prisma.SortOrder - supabaseUserId?: Prisma.SortOrder - email?: Prisma.SortOrder - fullName?: Prisma.SortOrder - createdAt?: Prisma.SortOrder - updatedAt?: Prisma.SortOrder +export type NullableStringFieldUpdateOperationsInput = { + set?: string | null +} + +export type DateTimeFieldUpdateOperationsInput = { + set?: Date | string +} + +export type UserCreateNestedOneWithoutSessionsInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.UserCreateOrConnectWithoutSessionsInput + connect?: Prisma.UserWhereUniqueInput +} + +export type UserUpdateOneRequiredWithoutSessionsNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.UserCreateOrConnectWithoutSessionsInput + upsert?: Prisma.UserUpsertWithoutSessionsInput + connect?: Prisma.UserWhereUniqueInput + update?: Prisma.XOR, Prisma.UserUncheckedUpdateWithoutSessionsInput> +} + +export type UserCreateNestedOneWithoutAccountsInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.UserCreateOrConnectWithoutAccountsInput + connect?: Prisma.UserWhereUniqueInput +} + +export type UserUpdateOneRequiredWithoutAccountsNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.UserCreateOrConnectWithoutAccountsInput + upsert?: Prisma.UserUpsertWithoutAccountsInput + connect?: Prisma.UserWhereUniqueInput + update?: Prisma.XOR, Prisma.UserUncheckedUpdateWithoutAccountsInput> } export type UserCreateNestedOneWithoutComplexesInput = { @@ -353,22 +433,156 @@ export type UserUpdateOneRequiredWithoutComplexesNestedInput = { update?: Prisma.XOR, Prisma.UserUncheckedUpdateWithoutComplexesInput> } -export type UserCreateWithoutComplexesInput = { +export type UserCreateWithoutSessionsInput = { id: string - supabaseUserId: string + name: string email: string - fullName: string + emailVerified?: boolean + image?: string | null createdAt?: Date | string updatedAt?: Date | string + accounts?: Prisma.AccountCreateNestedManyWithoutUserInput + complexes?: Prisma.ComplexUserCreateNestedManyWithoutUserInput +} + +export type UserUncheckedCreateWithoutSessionsInput = { + id: string + name: string + email: string + emailVerified?: boolean + image?: string | null + createdAt?: Date | string + updatedAt?: Date | string + accounts?: Prisma.AccountUncheckedCreateNestedManyWithoutUserInput + complexes?: Prisma.ComplexUserUncheckedCreateNestedManyWithoutUserInput +} + +export type UserCreateOrConnectWithoutSessionsInput = { + where: Prisma.UserWhereUniqueInput + create: Prisma.XOR +} + +export type UserUpsertWithoutSessionsInput = { + update: Prisma.XOR + create: Prisma.XOR + where?: Prisma.UserWhereInput +} + +export type UserUpdateToOneWithWhereWithoutSessionsInput = { + where?: Prisma.UserWhereInput + data: Prisma.XOR +} + +export type UserUpdateWithoutSessionsInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + email?: Prisma.StringFieldUpdateOperationsInput | string + emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean + image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + accounts?: Prisma.AccountUpdateManyWithoutUserNestedInput + complexes?: Prisma.ComplexUserUpdateManyWithoutUserNestedInput +} + +export type UserUncheckedUpdateWithoutSessionsInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + email?: Prisma.StringFieldUpdateOperationsInput | string + emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean + image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + accounts?: Prisma.AccountUncheckedUpdateManyWithoutUserNestedInput + complexes?: Prisma.ComplexUserUncheckedUpdateManyWithoutUserNestedInput +} + +export type UserCreateWithoutAccountsInput = { + id: string + name: string + email: string + emailVerified?: boolean + image?: string | null + createdAt?: Date | string + updatedAt?: Date | string + sessions?: Prisma.SessionCreateNestedManyWithoutUserInput + complexes?: Prisma.ComplexUserCreateNestedManyWithoutUserInput +} + +export type UserUncheckedCreateWithoutAccountsInput = { + id: string + name: string + email: string + emailVerified?: boolean + image?: string | null + createdAt?: Date | string + updatedAt?: Date | string + sessions?: Prisma.SessionUncheckedCreateNestedManyWithoutUserInput + complexes?: Prisma.ComplexUserUncheckedCreateNestedManyWithoutUserInput +} + +export type UserCreateOrConnectWithoutAccountsInput = { + where: Prisma.UserWhereUniqueInput + create: Prisma.XOR +} + +export type UserUpsertWithoutAccountsInput = { + update: Prisma.XOR + create: Prisma.XOR + where?: Prisma.UserWhereInput +} + +export type UserUpdateToOneWithWhereWithoutAccountsInput = { + where?: Prisma.UserWhereInput + data: Prisma.XOR +} + +export type UserUpdateWithoutAccountsInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + email?: Prisma.StringFieldUpdateOperationsInput | string + emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean + image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + sessions?: Prisma.SessionUpdateManyWithoutUserNestedInput + complexes?: Prisma.ComplexUserUpdateManyWithoutUserNestedInput +} + +export type UserUncheckedUpdateWithoutAccountsInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + email?: Prisma.StringFieldUpdateOperationsInput | string + emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean + image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + sessions?: Prisma.SessionUncheckedUpdateManyWithoutUserNestedInput + complexes?: Prisma.ComplexUserUncheckedUpdateManyWithoutUserNestedInput +} + +export type UserCreateWithoutComplexesInput = { + id: string + name: string + email: string + emailVerified?: boolean + image?: string | null + createdAt?: Date | string + updatedAt?: Date | string + sessions?: Prisma.SessionCreateNestedManyWithoutUserInput + accounts?: Prisma.AccountCreateNestedManyWithoutUserInput } export type UserUncheckedCreateWithoutComplexesInput = { id: string - supabaseUserId: string + name: string email: string - fullName: string + emailVerified?: boolean + image?: string | null createdAt?: Date | string updatedAt?: Date | string + sessions?: Prisma.SessionUncheckedCreateNestedManyWithoutUserInput + accounts?: Prisma.AccountUncheckedCreateNestedManyWithoutUserInput } export type UserCreateOrConnectWithoutComplexesInput = { @@ -389,20 +603,26 @@ export type UserUpdateToOneWithWhereWithoutComplexesInput = { export type UserUpdateWithoutComplexesInput = { id?: Prisma.StringFieldUpdateOperationsInput | string - supabaseUserId?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string email?: Prisma.StringFieldUpdateOperationsInput | string - fullName?: Prisma.StringFieldUpdateOperationsInput | string + emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean + image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + sessions?: Prisma.SessionUpdateManyWithoutUserNestedInput + accounts?: Prisma.AccountUpdateManyWithoutUserNestedInput } export type UserUncheckedUpdateWithoutComplexesInput = { id?: Prisma.StringFieldUpdateOperationsInput | string - supabaseUserId?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string email?: Prisma.StringFieldUpdateOperationsInput | string - fullName?: Prisma.StringFieldUpdateOperationsInput | string + emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean + image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + sessions?: Prisma.SessionUncheckedUpdateManyWithoutUserNestedInput + accounts?: Prisma.AccountUncheckedUpdateManyWithoutUserNestedInput } @@ -411,10 +631,14 @@ export type UserUncheckedUpdateWithoutComplexesInput = { */ export type UserCountOutputType = { + sessions: number + accounts: number complexes: number } export type UserCountOutputTypeSelect = { + sessions?: boolean | UserCountOutputTypeCountSessionsArgs + accounts?: boolean | UserCountOutputTypeCountAccountsArgs complexes?: boolean | UserCountOutputTypeCountComplexesArgs } @@ -428,6 +652,20 @@ export type UserCountOutputTypeDefaultArgs | null } +/** + * UserCountOutputType without action + */ +export type UserCountOutputTypeCountSessionsArgs = { + where?: Prisma.SessionWhereInput +} + +/** + * UserCountOutputType without action + */ +export type UserCountOutputTypeCountAccountsArgs = { + where?: Prisma.AccountWhereInput +} + /** * UserCountOutputType without action */ @@ -438,44 +676,52 @@ export type UserCountOutputTypeCountComplexesArgs = runtime.Types.Extensions.GetSelect<{ id?: boolean - supabaseUserId?: boolean + name?: boolean email?: boolean - fullName?: boolean + emailVerified?: boolean + image?: boolean createdAt?: boolean updatedAt?: boolean + sessions?: boolean | Prisma.User$sessionsArgs + accounts?: boolean | Prisma.User$accountsArgs complexes?: boolean | Prisma.User$complexesArgs _count?: boolean | Prisma.UserCountOutputTypeDefaultArgs }, ExtArgs["result"]["user"]> export type UserSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ id?: boolean - supabaseUserId?: boolean + name?: boolean email?: boolean - fullName?: boolean + emailVerified?: boolean + image?: boolean createdAt?: boolean updatedAt?: boolean }, ExtArgs["result"]["user"]> export type UserSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ id?: boolean - supabaseUserId?: boolean + name?: boolean email?: boolean - fullName?: boolean + emailVerified?: boolean + image?: boolean createdAt?: boolean updatedAt?: boolean }, ExtArgs["result"]["user"]> export type UserSelectScalar = { id?: boolean - supabaseUserId?: boolean + name?: boolean email?: boolean - fullName?: boolean + emailVerified?: boolean + image?: boolean createdAt?: boolean updatedAt?: boolean } -export type UserOmit = runtime.Types.Extensions.GetOmit<"id" | "supabaseUserId" | "email" | "fullName" | "createdAt" | "updatedAt", ExtArgs["result"]["user"]> +export type UserOmit = runtime.Types.Extensions.GetOmit<"id" | "name" | "email" | "emailVerified" | "image" | "createdAt" | "updatedAt", ExtArgs["result"]["user"]> export type UserInclude = { + sessions?: boolean | Prisma.User$sessionsArgs + accounts?: boolean | Prisma.User$accountsArgs complexes?: boolean | Prisma.User$complexesArgs _count?: boolean | Prisma.UserCountOutputTypeDefaultArgs } @@ -485,13 +731,16 @@ export type UserIncludeUpdateManyAndReturn = { name: "User" objects: { + sessions: Prisma.$SessionPayload[] + accounts: Prisma.$AccountPayload[] complexes: Prisma.$ComplexUserPayload[] } scalars: runtime.Types.Extensions.GetPayloadResult<{ id: string - supabaseUserId: string + name: string email: string - fullName: string + emailVerified: boolean + image: string | null createdAt: Date updatedAt: Date }, ExtArgs["result"]["user"]> @@ -888,6 +1137,8 @@ readonly fields: UserFieldRefs; */ export interface Prisma__UserClient extends Prisma.PrismaPromise { readonly [Symbol.toStringTag]: "PrismaPromise" + sessions = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> + accounts = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> complexes = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> /** * Attaches callbacks for the resolution and/or rejection of the Promise. @@ -919,9 +1170,10 @@ export interface Prisma__UserClient - readonly supabaseUserId: Prisma.FieldRef<"User", 'String'> + readonly name: Prisma.FieldRef<"User", 'String'> readonly email: Prisma.FieldRef<"User", 'String'> - readonly fullName: Prisma.FieldRef<"User", 'String'> + readonly emailVerified: Prisma.FieldRef<"User", 'Boolean'> + readonly image: Prisma.FieldRef<"User", 'String'> readonly createdAt: Prisma.FieldRef<"User", 'DateTime'> readonly updatedAt: Prisma.FieldRef<"User", 'DateTime'> } @@ -1316,6 +1568,54 @@ export type UserDeleteManyArgs = { + /** + * Select specific fields to fetch from the Session + */ + select?: Prisma.SessionSelect | null + /** + * Omit specific fields from the Session + */ + omit?: Prisma.SessionOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.SessionInclude | null + where?: Prisma.SessionWhereInput + orderBy?: Prisma.SessionOrderByWithRelationInput | Prisma.SessionOrderByWithRelationInput[] + cursor?: Prisma.SessionWhereUniqueInput + take?: number + skip?: number + distinct?: Prisma.SessionScalarFieldEnum | Prisma.SessionScalarFieldEnum[] +} + +/** + * User.accounts + */ +export type User$accountsArgs = { + /** + * Select specific fields to fetch from the Account + */ + select?: Prisma.AccountSelect | null + /** + * Omit specific fields from the Account + */ + omit?: Prisma.AccountOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.AccountInclude | null + where?: Prisma.AccountWhereInput + orderBy?: Prisma.AccountOrderByWithRelationInput | Prisma.AccountOrderByWithRelationInput[] + cursor?: Prisma.AccountWhereUniqueInput + take?: number + skip?: number + distinct?: Prisma.AccountScalarFieldEnum | Prisma.AccountScalarFieldEnum[] +} + /** * User.complexes */ diff --git a/apps/backend/src/lib/auth.ts b/apps/backend/src/lib/auth.ts new file mode 100644 index 0000000..0e7810b --- /dev/null +++ b/apps/backend/src/lib/auth.ts @@ -0,0 +1,27 @@ +import { betterAuth } from "better-auth"; +import { prismaAdapter } from "better-auth/adapters/prisma"; +// If your Prisma file is located elsewhere, you can change the path +import { openAPI } from "better-auth/plugins"; +import { db } from "./prisma"; + +export const auth = betterAuth({ + database: prismaAdapter(db, { + provider: "postgresql", + }), + secret: process.env.BETTER_AUTH_SECRET, + baseURL: process.env.BETTER_AUTH_URL, + session: { + cookieCache: { + enabled: false, + }, + }, + emailAndPassword: { + enabled: true, + }, + trustedOrigins: [process.env.APP_BASE_URL ?? "http://localhost:5173"], + plugins: [ + ], +}); + +export type Session = typeof auth.$Infer.Session.session; +export type User = typeof auth.$Infer.Session.user; \ No newline at end of file diff --git a/apps/backend/src/middlewares/require-auth.middleware.ts b/apps/backend/src/middlewares/require-auth.middleware.ts index 310d377..07710f8 100644 --- a/apps/backend/src/middlewares/require-auth.middleware.ts +++ b/apps/backend/src/middlewares/require-auth.middleware.ts @@ -1,78 +1,27 @@ -import { db } from '@/lib/prisma'; -import { supabase } from '@/lib/supabase'; -import type { AppEnv } from '@/types/hono'; -import type { MiddlewareHandler } from 'hono'; -import { createRemoteJWKSet, jwtVerify } from 'jose'; +import { createMiddleware } from "hono/factory"; +import { auth } from "@/lib/auth"; +import type { Session, User } from "@/lib/auth"; -const JWKS_CACHE_TTL_MS = 5 * 60 * 1000; +export type AuthEnv = { + Variables: { + user: User; + session: Session; + }; +}; -let jwks: ReturnType | null = null; -let jwksCacheTime = 0; - -async function getJWKS() { - const now = Date.now(); - if (!jwks || now - jwksCacheTime > JWKS_CACHE_TTL_MS) { - const supabaseUrl = process.env.SUPABASE_URL ?? process.env.VITE_SUPABASE_URL; - if (!supabaseUrl) { - throw new Error('SUPABASE_URL not configured'); - } - const jwksUrl = new URL('/auth/v1/.well-known/jwks.json', supabaseUrl).toString(); - jwks = createRemoteJWKSet(new URL(jwksUrl)); - jwksCacheTime = now; - } - return jwks; -} - -function getBearerToken(value: string | undefined): string | null { - if (!value) return null; - const [scheme, token] = value.split(' '); - if (scheme?.toLowerCase() !== 'bearer' || !token) return null; - return token; -} - -export const requireAuth: MiddlewareHandler = async (c, next) => { - const token = getBearerToken(c.req.header('authorization')); - - if (!token) { - return c.json({ message: 'Missing bearer token.' }, 403); - } - - let supabaseUserId: string; - let email: string | undefined; - - try { - const jwksSet = await getJWKS(); - const { payload } = await jwtVerify(token, jwksSet, { - algorithms: ['ES256'], - }); - - supabaseUserId = payload.sub as string; - email = payload.email as string | undefined; - } catch { - const { data, error } = await supabase.auth.getUser(token); - - if (error || !data.user) { - return c.json({ message: 'Invalid or expired token.' }, 403); - } - - supabaseUserId = data.user.id; - email = data.user.email?.toLowerCase(); - } - - if (!email) { - return c.json({ message: 'Auth user does not contain email.' }, 403); - } - - const appUser = await db.user.findUnique({ - where: { supabaseUserId }, - select: { id: true }, +export const requireAuth = createMiddleware(async (c, next) => { + const session = await auth.api.getSession({ + headers: c.req.raw.headers, }); - if (!appUser) { - return c.json({ message: 'User not provisioned in backend.' }, 403); + console.log(session) + + if (!session) { + return c.json({ message: "Unauthorized" }, 401); } - c.set('appUserId', appUser.id); + c.set("user", session.user); + c.set("session", session.session); await next(); -}; +}); diff --git a/apps/backend/src/modules/auth/auth.routes.ts b/apps/backend/src/modules/auth/auth.routes.ts new file mode 100644 index 0000000..6e22b17 --- /dev/null +++ b/apps/backend/src/modules/auth/auth.routes.ts @@ -0,0 +1,9 @@ +import { Hono } from "hono"; +import { auth } from "@/lib/auth"; +import { AppEnv } from "@/types/hono"; + +export const authRoutes = new Hono(); + +authRoutes.on(["POST", "GET"], "/api/auth/*", (c) => { + return auth.handler(c.req.raw); +}); diff --git a/apps/backend/src/modules/onboarding/services/onboarding.service.ts b/apps/backend/src/modules/onboarding/services/onboarding.service.ts index 773c3ed..a0f857b 100644 --- a/apps/backend/src/modules/onboarding/services/onboarding.service.ts +++ b/apps/backend/src/modules/onboarding/services/onboarding.service.ts @@ -10,6 +10,7 @@ import type { } from '@repo/api-contract'; import type { User as SupabaseAuthUser } from '@supabase/supabase-js'; import { v7 as uuidv7 } from 'uuid'; +import { auth } from '@/lib/auth'; const OTP_LENGTH = 6; const OTP_TTL_MINUTES = Number(Bun.env.ONBOARDING_OTP_TTL_MINUTES ?? 10); @@ -404,11 +405,11 @@ export async function completeOnboarding(input: OnboardingCompleteInput) { }); if (!onboardingRequest) { - throw new OnboardingError('Solicitud de onboarding invalida o expirada.', 400); + throw new OnboardingError('Solicitud de onboarding inválida o expirada.', 400); } if (onboardingRequest.otpExpiresAt < new Date()) { - throw new OnboardingError('La sesion de onboarding expiro. Solicita un nuevo OTP.', 400); + throw new OnboardingError('La sesión de onboarding expiró. Solicita un nuevo OTP.', 400); } if (!onboardingRequest.emailVerifiedAt) { @@ -428,28 +429,18 @@ export async function completeOnboarding(input: OnboardingCompleteInput) { throw new OnboardingError('El plan seleccionado no existe.', 400); } - const supabaseUserId = await ensureSupabaseUser({ - email: onboardingRequest.email, - fullName: onboardingRequest.fullName, - password: input.password, + const { user } = await auth.api.signUpEmail({ + asResponse: false, + body: { + email: onboardingRequest.email, + password: input.password, + name: onboardingRequest.fullName, + }, }); const complexSlug = await buildUniqueComplexSlug(input.complexName); const result = await db.$transaction(async (tx) => { - const user = await tx.user.upsert({ - where: { email: onboardingRequest.email }, - update: { - fullName: onboardingRequest.fullName, - supabaseUserId, - }, - create: { - id: uuidv7(), - fullName: onboardingRequest.fullName, - email: onboardingRequest.email, - supabaseUserId, - }, - }); const complex = await tx.complex.create({ data: { @@ -489,6 +480,5 @@ export async function completeOnboarding(input: OnboardingCompleteInput) { return { ...result, - supabaseUserId, }; } diff --git a/apps/backend/src/register-routes.ts b/apps/backend/src/register-routes.ts index 53721df..6e65a40 100644 --- a/apps/backend/src/register-routes.ts +++ b/apps/backend/src/register-routes.ts @@ -8,13 +8,16 @@ import { planRoutes } from '@/modules/plan/plan.routes'; import { publicBookingRoutes } from '@/modules/public-booking/public-booking.routes'; import { sportRoutes } from '@/modules/sport/sport.routes'; import { userRoutes } from '@/modules/user/user.routes'; +import { authRoutes } from '@/modules/auth/auth.routes'; import type { AppEnv } from '@/types/hono'; import type { Hono } from 'hono'; import { serveStatic } from 'hono/bun'; import { healthCheckRoutes } from './modules/health-check/health-check.routes'; export function registerRoutes(app: Hono) { + app + .route('', authRoutes) .route('/api/user', userRoutes) .route('/api/plans', planRoutes) .route('/api/onboarding', onboardingRoutes) diff --git a/apps/backend/tsconfig.json b/apps/backend/tsconfig.json index 598f301..08aca61 100644 --- a/apps/backend/tsconfig.json +++ b/apps/backend/tsconfig.json @@ -1,13 +1,14 @@ { "compilerOptions": { - "ignoreDeprecations": "6.0", + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "bundler", + "moduleDetection": "force", + "ignoreDeprecations": "5.0", "strict": true, "skipLibCheck": true, - "types": [ - "bun" - ], + "types": ["bun"], "baseUrl": ".", - "moduleResolution": "bundler", "paths": { "@/*": [ "src/*" diff --git a/apps/frontend/package.json b/apps/frontend/package.json index ddc5890..3afe3e4 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -24,6 +24,7 @@ "@tanstack/react-router": "^1.168.10", "@tanstack/router-devtools": "^1.166.11", "axios": "^1.14.0", + "better-auth": "^1.6.4", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "date-fns": "^4.1.0", @@ -51,4 +52,4 @@ "typescript": "~5.9.3", "vite": "^8.0.1" } -} +} \ No newline at end of file diff --git a/apps/frontend/src/lib/api-client.ts b/apps/frontend/src/lib/api-client.ts index 8764afd..a82232d 100644 --- a/apps/frontend/src/lib/api-client.ts +++ b/apps/frontend/src/lib/api-client.ts @@ -29,11 +29,16 @@ import type { UserProfileResponse, } from '@repo/api-contract'; import axios, { AxiosError } from 'axios'; +import { createAuthClient } from "better-auth/react"; const apiBaseUrl = import.meta.env.VITE_API_BASE_URL?.trim() || (import.meta.env.DEV ? 'http://localhost:3000' : window.location.origin); -let accessToken: string | null = null; + +export const authClient = createAuthClient({ + baseURL: apiBaseUrl, +}); + export class ApiClientError extends Error { status?: number; @@ -104,14 +109,6 @@ function normalizeError(error: unknown): ApiClientError { }); } -http.interceptors.request.use((config) => { - if (!accessToken) return config; - - config.headers = config.headers ?? {}; - config.headers.Authorization = `Bearer ${accessToken}`; - return config; -}); - http.interceptors.response.use( (response) => response, async (error: AxiosError) => { @@ -289,5 +286,5 @@ export function configureApiClient(nextHandlers: ErrorHandlers) { } export function setApiAccessToken(token: string | null) { - accessToken = token; + // accessToken = token; } diff --git a/bun.lock b/bun.lock index e87c360..2b6a44e 100644 --- a/bun.lock +++ b/bun.lock @@ -21,7 +21,6 @@ "@prisma/adapter-pg": "^7.6.0", "@prisma/client": "^7", "@repo/api-contract": "workspace:*", - "@supabase/supabase-js": "2.101.1", "better-auth": "^1.6.4", "dotenv": "^17.4.1", "hono": "4.12.10", @@ -54,6 +53,7 @@ "@tanstack/react-router": "^1.168.10", "@tanstack/router-devtools": "^1.166.11", "axios": "^1.14.0", + "better-auth": "^1.6.4", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "date-fns": "^4.1.0",