From bd30b32b49c6d0a313309b3c03acfc7ba2b3bc94 Mon Sep 17 00:00:00 2001 From: Jose Selesan Date: Thu, 16 Apr 2026 15:45:49 -0300 Subject: [PATCH 1/4] Added Better auth mitation --- apps/backend/package.json | 3 +- apps/backend/prisma/auth.prisma | 62 +++++++++++ apps/backend/prisma/complex.prisma | 51 ++++----- .../migration.sql | 104 ++++++++++++++++++ apps/backend/prisma/user.prisma | 20 ++-- apps/backend/tsconfig.json | 11 +- bun.lock | 47 +++++++- 7 files changed, 257 insertions(+), 41 deletions(-) create mode 100644 apps/backend/prisma/auth.prisma create mode 100644 apps/backend/prisma/migrations/20260416184137_add_better_auth/migration.sql diff --git a/apps/backend/package.json b/apps/backend/package.json index df95d36..876899c 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -19,6 +19,7 @@ "@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", "nodemailer": "^8.0.5", @@ -33,4 +34,4 @@ "@types/bun": "latest", "@types/nodemailer": "^8.0.0" } -} +} \ No newline at end of file diff --git a/apps/backend/prisma/auth.prisma b/apps/backend/prisma/auth.prisma new file mode 100644 index 0000000..fb9d53e --- /dev/null +++ b/apps/backend/prisma/auth.prisma @@ -0,0 +1,62 @@ +model User { + id String @id + name String + email String + emailVerified Boolean @default(false) + image String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + sessions Session[] + accounts Account[] + + @@unique([email]) + @@map("users") +} + +model Session { + id String @id + expiresAt DateTime + token String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + ipAddress String? + userAgent String? + userId String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + @@unique([token]) + @@index([userId]) + @@map("sessions") +} + +model Account { + id String @id + accountId String + providerId String + userId String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + accessToken String? + refreshToken String? + idToken String? + accessTokenExpiresAt DateTime? + refreshTokenExpiresAt DateTime? + scope String? + password String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([userId]) + @@map("accounts") +} + +model Verification { + id String @id + identifier String + value String + expiresAt DateTime + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([identifier]) + @@map("verification") +} diff --git a/apps/backend/prisma/complex.prisma b/apps/backend/prisma/complex.prisma index 37a285a..768fef2 100644 --- a/apps/backend/prisma/complex.prisma +++ b/apps/backend/prisma/complex.prisma @@ -1,18 +1,18 @@ 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[] - courts Court[] + 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]) @@index([complexSlug]) @@ -21,17 +21,18 @@ model Complex { enum ComplexUserRole { ADMIN + 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") @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) - @@id([complexId, userId]) - @@index([userId]) - @@map("complex_users") -} +// @@id([complexId, userId]) +// @@index([userId]) +// @@map("complex_users") +// } diff --git a/apps/backend/prisma/migrations/20260416184137_add_better_auth/migration.sql b/apps/backend/prisma/migrations/20260416184137_add_better_auth/migration.sql new file mode 100644 index 0000000..d2104db --- /dev/null +++ b/apps/backend/prisma/migrations/20260416184137_add_better_auth/migration.sql @@ -0,0 +1,104 @@ +/* + Warnings: + + - The primary key for the `users` table will be changed. If it partially fails, the table could be left without primary key constraint. + - You are about to drop the column `created_at` on the `users` table. All the data in the column will be lost. + - You are about to drop the column `full_name` on the `users` table. All the data in the column will be lost. + - You are about to drop the column `supabase_user_id` on the `users` table. All the data in the column will be lost. + - You are about to drop the column `updated_at` on the `users` table. All the data in the column will be lost. + - You are about to drop the `complex_users` table. If the table is not empty, all the data it contains will be lost. + - Added the required column `name` to the `users` table without a default value. This is not possible if the table is not empty. + - Added the required column `updatedAt` to the `users` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterEnum +ALTER TYPE "ComplexUserRole" ADD VALUE 'EMPLOYEE'; + +-- DropForeignKey +ALTER TABLE "complex_users" DROP CONSTRAINT "complex_users_complex_id_fkey"; + +-- DropForeignKey +ALTER TABLE "complex_users" DROP CONSTRAINT "complex_users_user_id_fkey"; + +-- DropIndex +DROP INDEX "users_supabase_user_id_key"; + +-- AlterTable +ALTER TABLE "users" DROP CONSTRAINT "users_pkey", +DROP COLUMN "created_at", +DROP COLUMN "full_name", +DROP COLUMN "supabase_user_id", +DROP COLUMN "updated_at", +ADD COLUMN "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, +ADD COLUMN "emailVerified" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "image" TEXT, +ADD COLUMN "name" TEXT NOT NULL, +ADD COLUMN "updatedAt" TIMESTAMP(3) NOT NULL, +ALTER COLUMN "id" SET DATA TYPE TEXT, +ADD CONSTRAINT "users_pkey" PRIMARY KEY ("id"); + +-- DropTable +DROP TABLE "complex_users"; + +-- CreateTable +CREATE TABLE "sessions" ( + "id" TEXT NOT NULL, + "expiresAt" TIMESTAMP(3) NOT NULL, + "token" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "ipAddress" TEXT, + "userAgent" TEXT, + "userId" TEXT NOT NULL, + + CONSTRAINT "sessions_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "accounts" ( + "id" TEXT NOT NULL, + "accountId" TEXT NOT NULL, + "providerId" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "accessToken" TEXT, + "refreshToken" TEXT, + "idToken" TEXT, + "accessTokenExpiresAt" TIMESTAMP(3), + "refreshTokenExpiresAt" TIMESTAMP(3), + "scope" TEXT, + "password" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "accounts_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "verification" ( + "id" TEXT NOT NULL, + "identifier" TEXT NOT NULL, + "value" TEXT NOT NULL, + "expiresAt" TIMESTAMP(3) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "verification_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE INDEX "sessions_userId_idx" ON "sessions"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "sessions_token_key" ON "sessions"("token"); + +-- CreateIndex +CREATE INDEX "accounts_userId_idx" ON "accounts"("userId"); + +-- CreateIndex +CREATE INDEX "verification_identifier_idx" ON "verification"("identifier"); + +-- AddForeignKey +ALTER TABLE "sessions" ADD CONSTRAINT "sessions_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "accounts" ADD CONSTRAINT "accounts_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/apps/backend/prisma/user.prisma b/apps/backend/prisma/user.prisma index a626604..2206dfa 100644 --- a/apps/backend/prisma/user.prisma +++ b/apps/backend/prisma/user.prisma @@ -1,11 +1,11 @@ -model User { - id String @id @db.Uuid - supabaseUserId String @unique @map("supabase_user_id") @db.Uuid - email String @unique - fullName String @map("full_name") - createdAt DateTime @default(now()) @map("created_at") - updatedAt DateTime @updatedAt @map("updated_at") - complexes ComplexUser[] +// model User { +// id String @id @db.Uuid +// supabaseUserId String @unique @map("supabase_user_id") @db.Uuid +// email String @unique +// fullName String @map("full_name") +// createdAt DateTime @default(now()) @map("created_at") +// updatedAt DateTime @updatedAt @map("updated_at") +// complexes ComplexUser[] - @@map("users") -} +// @@map("users") +// } diff --git a/apps/backend/tsconfig.json b/apps/backend/tsconfig.json index a4db910..598f301 100644 --- a/apps/backend/tsconfig.json +++ b/apps/backend/tsconfig.json @@ -3,13 +3,18 @@ "ignoreDeprecations": "6.0", "strict": true, "skipLibCheck": true, - "types": ["bun"], + "types": [ + "bun" + ], "baseUrl": ".", "moduleResolution": "bundler", "paths": { - "@/*": ["src/*"] + "@/*": [ + "src/*" + ] }, + "outDir": "./dist", "jsx": "react-jsx", "jsxImportSource": "hono/jsx" } -} +} \ No newline at end of file diff --git a/bun.lock b/bun.lock index 00c2f5f..e87c360 100644 --- a/bun.lock +++ b/bun.lock @@ -22,6 +22,7 @@ "@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", "nodemailer": "^8.0.5", @@ -146,6 +147,24 @@ "@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + "@better-auth/core": ["@better-auth/core@1.6.5", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.39.0", "@standard-schema/spec": "^1.1.0", "zod": "^4.3.6" }, "peerDependencies": { "@better-auth/utils": "0.4.0", "@better-fetch/fetch": "1.1.21", "@cloudflare/workers-types": ">=4", "@opentelemetry/api": "^1.9.0", "better-call": "1.3.5", "jose": "^6.1.0", "kysely": "^0.28.5", "nanostores": "^1.0.1" }, "optionalPeers": ["@cloudflare/workers-types"] }, "sha512-T3u4rVsJcMWShG2qfQUlU1HdkQGLYX0+lcR48QV2Cp2kpBOLOTYdt+p6zZtGm2Omx/ReEouRQyKy7pYtahRQuA=="], + + "@better-auth/drizzle-adapter": ["@better-auth/drizzle-adapter@1.6.5", "", { "peerDependencies": { "@better-auth/core": "^1.6.5", "@better-auth/utils": "0.4.0", "drizzle-orm": "^0.45.2" }, "optionalPeers": ["drizzle-orm"] }, "sha512-9YjPW35+h66D+QA+YqEJ9pFP97ClLFR+QrTPZojkeP0PTYqpW0ErBK3p1pwRTJG88yK+o3Y4yOwoacMTBxz0jQ=="], + + "@better-auth/kysely-adapter": ["@better-auth/kysely-adapter@1.6.5", "", { "peerDependencies": { "@better-auth/core": "^1.6.5", "@better-auth/utils": "0.4.0", "kysely": "^0.28.14" }, "optionalPeers": ["kysely"] }, "sha512-kbevd70qzKNR3ZHF7q6/e0XXYRCXanLB2rvmTd3T8WbNEd9kYMqKjgTGNxL1ri5N+PEDUK6zfHx/HrvaEOfoHw=="], + + "@better-auth/memory-adapter": ["@better-auth/memory-adapter@1.6.5", "", { "peerDependencies": { "@better-auth/core": "^1.6.5", "@better-auth/utils": "0.4.0" } }, "sha512-5qFUpSdQi+RwHSmNyHMSsJIrFjed8d/ASS61L2xyW7sjBLTIuR7JcgS6hif5cQbtPeq+Qz+Wct5q8oKw33qyqQ=="], + + "@better-auth/mongo-adapter": ["@better-auth/mongo-adapter@1.6.5", "", { "peerDependencies": { "@better-auth/core": "^1.6.5", "@better-auth/utils": "0.4.0", "mongodb": "^6.0.0 || ^7.0.0" }, "optionalPeers": ["mongodb"] }, "sha512-HvOUFTiSEFSGTzL/vE3FntTwQiZ79O/V+QcsCimR+65Bj3tOqdFaC1G2Yd1dQ9l2YHNXA9SNBrGekbk66RzJMw=="], + + "@better-auth/prisma-adapter": ["@better-auth/prisma-adapter@1.6.5", "", { "peerDependencies": { "@better-auth/core": "^1.6.5", "@better-auth/utils": "0.4.0", "@prisma/client": "^5.0.0 || ^6.0.0 || ^7.0.0", "prisma": "^5.0.0 || ^6.0.0 || ^7.0.0" }, "optionalPeers": ["@prisma/client", "prisma"] }, "sha512-d7PUO5XoimYYDEG/DoYVbOSbyVYJBDuZgvY9pjf8INccBTCD1BzcyEJ9NQil4huXWj4fcNaGOt2FG0OI8NtWOA=="], + + "@better-auth/telemetry": ["@better-auth/telemetry@1.6.5", "", { "peerDependencies": { "@better-auth/core": "^1.6.5", "@better-auth/utils": "0.4.0", "@better-fetch/fetch": "1.1.21" } }, "sha512-Ag3CjAP+tLretKPq+pYdU/gU4pFIcey/AoNQzw671wV5JQZXrMitS65INi8j8QuYfol2xgQrht5KVlcxGrkhHQ=="], + + "@better-auth/utils": ["@better-auth/utils@0.4.0", "", { "dependencies": { "@noble/hashes": "^2.0.1" } }, "sha512-RpMtLUIQAEWMgdPLNVbIF5ON2mm+CH0U3rCdUCU1VyeAUui4m38DyK7/aXMLZov2YDjG684pS1D0MBllrmgjQA=="], + + "@better-fetch/fetch": ["@better-fetch/fetch@1.1.21", "", {}, "sha512-/ImESw0sskqlVR94jB+5+Pxjf+xBwDZF/N5+y2/q4EqD7IARUTSpPfIo8uf39SYpCxyOCtbyYpUrZ3F/k0zT4A=="], + "@biomejs/biome": ["@biomejs/biome@1.9.4", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "1.9.4", "@biomejs/cli-darwin-x64": "1.9.4", "@biomejs/cli-linux-arm64": "1.9.4", "@biomejs/cli-linux-arm64-musl": "1.9.4", "@biomejs/cli-linux-x64": "1.9.4", "@biomejs/cli-linux-x64-musl": "1.9.4", "@biomejs/cli-win32-arm64": "1.9.4", "@biomejs/cli-win32-x64": "1.9.4" }, "bin": { "biome": "bin/biome" } }, "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog=="], "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@1.9.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw=="], @@ -280,11 +299,11 @@ "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.2", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw=="], - "@noble/ciphers": ["@noble/ciphers@1.3.0", "", {}, "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw=="], + "@noble/ciphers": ["@noble/ciphers@2.2.0", "", {}, "sha512-Z6pjIZ/8IJcCGzb2S/0Px5J81yij85xASuk1teLNeg75bfT07MV3a/O2Mtn1I2se43k3lkVEcFaR10N4cgQcZA=="], "@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], - "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + "@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], @@ -298,6 +317,10 @@ "@open-draft/until": ["@open-draft/until@2.1.0", "", {}, "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg=="], + "@opentelemetry/api": ["@opentelemetry/api@1.9.1", "", {}, "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q=="], + + "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + "@oxc-project/types": ["@oxc-project/types@0.122.0", "", {}, "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA=="], "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="], @@ -632,6 +655,10 @@ "baseline-browser-mapping": ["baseline-browser-mapping@2.10.13", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-BL2sTuHOdy0YT1lYieUxTw/QMtPBC3pmlJC6xk8BBYVv6vcw3SGdKemQ+Xsx9ik2F/lYDO9tqsFQH1r9PFuHKw=="], + "better-auth": ["better-auth@1.6.5", "", { "dependencies": { "@better-auth/core": "1.6.5", "@better-auth/drizzle-adapter": "1.6.5", "@better-auth/kysely-adapter": "1.6.5", "@better-auth/memory-adapter": "1.6.5", "@better-auth/mongo-adapter": "1.6.5", "@better-auth/prisma-adapter": "1.6.5", "@better-auth/telemetry": "1.6.5", "@better-auth/utils": "0.4.0", "@better-fetch/fetch": "1.1.21", "@noble/ciphers": "^2.1.1", "@noble/hashes": "^2.0.1", "better-call": "1.3.5", "defu": "^6.1.4", "jose": "^6.1.3", "kysely": "^0.28.14", "nanostores": "^1.1.1", "zod": "^4.3.6" }, "peerDependencies": { "@lynx-js/react": "*", "@prisma/client": "^5.0.0 || ^6.0.0 || ^7.0.0", "@sveltejs/kit": "^2.0.0", "@tanstack/react-start": "^1.0.0", "@tanstack/solid-start": "^1.0.0", "better-sqlite3": "^12.0.0", "drizzle-kit": ">=0.31.4", "drizzle-orm": "^0.45.2", "mongodb": "^6.0.0 || ^7.0.0", "mysql2": "^3.0.0", "next": "^14.0.0 || ^15.0.0 || ^16.0.0", "pg": "^8.0.0", "prisma": "^5.0.0 || ^6.0.0 || ^7.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0", "solid-js": "^1.0.0", "svelte": "^4.0.0 || ^5.0.0", "vitest": "^2.0.0 || ^3.0.0 || ^4.0.0", "vue": "^3.0.0" }, "optionalPeers": ["@lynx-js/react", "@prisma/client", "@sveltejs/kit", "@tanstack/react-start", "@tanstack/solid-start", "better-sqlite3", "drizzle-kit", "drizzle-orm", "mongodb", "mysql2", "next", "pg", "prisma", "react", "react-dom", "solid-js", "svelte", "vitest", "vue"] }, "sha512-rSt8JtJOJK0MqPShXINCmM6DV30GsDvnCTlIxQIzP9OpUx/umA40nUc4ALZHQyqAPbw1ib/a549kIWw/WyxxKA=="], + + "better-call": ["better-call@1.3.5", "", { "dependencies": { "@better-auth/utils": "^0.4.0", "@better-fetch/fetch": "^1.1.21", "rou3": "^0.7.12", "set-cookie-parser": "^3.0.1" }, "peerDependencies": { "zod": "^4.0.0" }, "optionalPeers": ["zod"] }, "sha512-kOFJkBP7utAQLEYrobZm3vkTH8mXq5GNgvjc5/XEST1ilVHaxXUXfeDeFlqoETMtyqS4+3/h4ONX2i++ebZrvA=="], + "better-result": ["better-result@2.7.0", "", { "dependencies": { "@clack/prompts": "^0.11.0" }, "bin": { "better-result": "bin/cli.mjs" } }, "sha512-7zrmXjAK8u8Z6SOe4R65XObOR5X+Y2I/VVku3t5cPOGQ8/WsBcfFmfnIPiEl5EBMDOzPHRwbiPbMtQBKYdw7RA=="], "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], @@ -1000,6 +1027,8 @@ "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], + "kysely": ["kysely@0.28.16", "", {}, "sha512-3i5pmOiZvMDj00qhrIVbH0AnioVTx22DMP7Vn5At4yJO46iy+FM8Y/g61ltenLVSo3fiO8h8Q3QOFgf/gQ72ww=="], + "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], @@ -1074,6 +1103,8 @@ "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "nanostores": ["nanostores@1.2.0", "", {}, "sha512-F0wCzbsH80G7XXo0Jd9/AVQC7ouWY6idUCTnMwW5t/Rv9W8qmO6endavDwg7TNp5GbugwSukFMVZqzPSrSMndg=="], + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], @@ -1254,6 +1285,8 @@ "rolldown": ["rolldown@1.0.0-rc.12", "", { "dependencies": { "@oxc-project/types": "=0.122.0", "@rolldown/pluginutils": "1.0.0-rc.12" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-rc.12", "@rolldown/binding-darwin-arm64": "1.0.0-rc.12", "@rolldown/binding-darwin-x64": "1.0.0-rc.12", "@rolldown/binding-freebsd-x64": "1.0.0-rc.12", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12", "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12", "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12", "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12", "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12", "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12", "@rolldown/binding-linux-x64-musl": "1.0.0-rc.12", "@rolldown/binding-openharmony-arm64": "1.0.0-rc.12", "@rolldown/binding-wasm32-wasi": "1.0.0-rc.12", "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12", "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A=="], + "rou3": ["rou3@0.7.12", "", {}, "sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg=="], + "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], @@ -1282,6 +1315,8 @@ "serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="], + "set-cookie-parser": ["set-cookie-parser@3.1.0", "", {}, "sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw=="], + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], "shadcn": ["shadcn@4.1.2", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/parser": "^7.28.0", "@babel/plugin-transform-typescript": "^7.28.0", "@babel/preset-typescript": "^7.27.1", "@dotenvx/dotenvx": "^1.48.4", "@modelcontextprotocol/sdk": "^1.26.0", "@types/validate-npm-package-name": "^4.0.2", "browserslist": "^4.26.2", "commander": "^14.0.0", "cosmiconfig": "^9.0.0", "dedent": "^1.6.0", "deepmerge": "^4.3.1", "diff": "^8.0.2", "execa": "^9.6.0", "fast-glob": "^3.3.3", "fs-extra": "^11.3.1", "fuzzysort": "^3.1.0", "https-proxy-agent": "^7.0.6", "kleur": "^4.1.5", "msw": "^2.10.4", "node-fetch": "^3.3.2", "open": "^11.0.0", "ora": "^8.2.0", "postcss": "^8.5.6", "postcss-selector-parser": "^7.1.0", "prompts": "^2.4.2", "recast": "^0.23.11", "stringify-object": "^5.0.0", "tailwind-merge": "^3.0.1", "ts-morph": "^26.0.0", "tsconfig-paths": "^4.2.0", "validate-npm-package-name": "^7.0.1", "zod": "^3.24.1", "zod-to-json-schema": "^3.24.6" }, "bin": { "shadcn": "dist/index.js" } }, "sha512-qNQcCavkbYsgBj+X09tF2bTcwRd8abR880bsFkDU2kMqceMCLAm5c+cLg7kWDhfh1H9g08knpQ5ZEf6y/co16g=="], @@ -1456,12 +1491,16 @@ "@dotenvx/dotenvx/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], + "@ecies/ciphers/@noble/ciphers": ["@noble/ciphers@1.3.0", "", {}, "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw=="], + "@inquirer/core/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], "@modelcontextprotocol/sdk/@hono/node-server": ["@hono/node-server@1.19.12", "", { "peerDependencies": { "hono": "^4" } }, "sha512-txsUW4SQ1iilgE0l9/e9VQWmELXifEFvmdA1j6WFh/aFPj99hIntrSsq/if0UWyGVkmrRPKA1wCeP+UCr1B9Uw=="], "@modelcontextprotocol/sdk/hono": ["hono@4.12.9", "", {}, "sha512-wy3T8Zm2bsEvxKZM5w21VdHDDcwVS1yUFFY6i8UobSsKfFceT7TOwhbhfKsDyx7tYQlmRM5FLpIuYvNFyjctiA=="], + "@noble/curves/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + "@prisma/engines/@prisma/get-platform": ["@prisma/get-platform@7.6.0", "", { "dependencies": { "@prisma/debug": "7.6.0" } }, "sha512-ohZDwXvtmnbzOcutR2D13lDWpZP1wQjmPyztmt0AwXLzQI7q95EE7NYCvS+M6N6SivT+BM0NOqLmTH3wms4L3A=="], "@prisma/fetch-engine/@prisma/get-platform": ["@prisma/get-platform@7.6.0", "", { "dependencies": { "@prisma/debug": "7.6.0" } }, "sha512-ohZDwXvtmnbzOcutR2D13lDWpZP1wQjmPyztmt0AwXLzQI7q95EE7NYCvS+M6N6SivT+BM0NOqLmTH3wms4L3A=="], @@ -1592,6 +1631,10 @@ "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "eciesjs/@noble/ciphers": ["@noble/ciphers@1.3.0", "", {}, "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw=="], + + "eciesjs/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + "express/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], "express/mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], From f158845279ad45641133097039d5029bf9044812 Mon Sep 17 00:00:00 2001 From: Jose Selesan Date: Thu, 16 Apr 2026 20:05:08 -0300 Subject: [PATCH 2/4] 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", From e5002ce440dc342aac18dfe2497d60b67a28365b Mon Sep 17 00:00:00 2001 From: Jose Selesan Date: Thu, 16 Apr 2026 20:30:01 -0300 Subject: [PATCH 3/4] refactor: integrate Better-Auth for authentication and remove Supabase dependencies --- apps/backend/prisma/auth.prisma | 1 + apps/backend/src/app.ts | 2 +- .../src/generated/prisma/internal/class.ts | 6 +- .../prisma/internal/prismaNamespace.ts | 3 +- .../prisma/internal/prismaNamespaceBrowser.ts | 3 +- .../src/generated/prisma/models/User.ts | 42 +++++++- apps/backend/src/lib/auth.ts | 39 ++++---- .../middlewares/require-auth.middleware.ts | 23 ++--- .../require-super-admin.middleware.ts | 6 +- .../handlers/create-admin-booking.handler.ts | 4 +- .../handlers/list-admin-bookings.handler.ts | 4 +- .../update-admin-booking-status.handler.ts | 4 +- .../services/admin-booking.service.ts | 16 +-- apps/backend/src/modules/auth/auth.routes.ts | 10 +- .../handlers/create-complex.handler.ts | 4 +- .../handlers/list-my-complexes.handler.ts | 4 +- .../complex/services/complex.service.ts | 4 +- .../court/handlers/create-court.handler.ts | 4 +- .../list-courts-by-complex.handler.ts | 4 +- .../court/handlers/update-court.handler.ts | 4 +- .../modules/court/services/court.service.ts | 24 ++--- .../onboarding/services/onboarding.service.ts | 3 +- .../user/handlers/get-user-profile.handler.ts | 4 +- .../src/modules/user/services/user.service.ts | 24 ++--- apps/backend/src/register-routes.ts | 3 +- apps/backend/src/types/hono.ts | 6 +- apps/frontend/src/lib/api-client.ts | 9 +- apps/frontend/src/lib/auth.tsx | 98 +++++-------------- apps/frontend/src/lib/supabase.ts | 18 ---- 29 files changed, 165 insertions(+), 211 deletions(-) delete mode 100644 apps/frontend/src/lib/supabase.ts diff --git a/apps/backend/prisma/auth.prisma b/apps/backend/prisma/auth.prisma index 1a6f00b..6fc5926 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[] + role String @default("member") complexes ComplexUser[] @@unique([email]) diff --git a/apps/backend/src/app.ts b/apps/backend/src/app.ts index 8b753a4..f06980c 100644 --- a/apps/backend/src/app.ts +++ b/apps/backend/src/app.ts @@ -21,7 +21,7 @@ export function createApp() { }, allowHeaders: ['Authorization', 'Content-Type'], allowMethods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'], - exposeHeaders: ["Content-Length"], + exposeHeaders: ['Content-Length'], maxAge: 600, credentials: true, }) diff --git a/apps/backend/src/generated/prisma/internal/class.ts b/apps/backend/src/generated/prisma/internal/class.ts index 56aaa76..80ae773 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 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", + "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 role String @default(\"member\")\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\":{\"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.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\":\"role\",\"kind\":\"scalar\",\"type\":\"String\"},{\"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\",\"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" + graph: "-AWAAeABDgQAAL0DACAFAAC-AwAgBgAAvwMAIPkBAAC7AwAw-gEAADIAEPsBAAC7AwAw_QEBAIQDACGVAgEAAAABlgIBAAAAAZ0CQACHAwAhngJAAIcDACG1AgEAhAMAIc0CIACvAwAhzgIBALwDACEBAAAAAQAgDAMAANMDACD5AQAA1QMAMPoBAAADABD7AQAA1QMAMJUCAQCEAwAhnQJAAIcDACGeAkAAhwMAIbMCAQCEAwAhwAJAAIcDACHKAgEAhAMAIcsCAQC8AwAhzAIBALwDACEDAwAAvAUAIMsCAAC-BAAgzAIAAL4EACAMAwAA0wMAIPkBAADVAwAw-gEAAAMAEPsBAADVAwAwlQIBAAAAAZ0CQACHAwAhngJAAIcDACGzAgEAhAMAIcACQACHAwAhygIBAAAAAcsCAQC8AwAhzAIBALwDACEDAAAAAwAgAQAABAAwAgAABQAgEQMAANMDACD5AQAA1AMAMPoBAAAHABD7AQAA1AMAMJUCAQCEAwAhnQJAAIcDACGeAkAAhwMAIbMCAQCEAwAhwQIBAIQDACHCAgEAhAMAIcMCAQC8AwAhxAIBALwDACHFAgEAvAMAIcYCQACWAwAhxwJAAJYDACHIAgEAvAMAIckCAQC8AwAhCAMAALwFACDDAgAAvgQAIMQCAAC-BAAgxQIAAL4EACDGAgAAvgQAIMcCAAC-BAAgyAIAAL4EACDJAgAAvgQAIBEDAADTAwAg-QEAANQDADD6AQAABwAQ-wEAANQDADCVAgEAAAABnQJAAIcDACGeAkAAhwMAIbMCAQCEAwAhwQIBAIQDACHCAgEAhAMAIcMCAQC8AwAhxAIBALwDACHFAgEAvAMAIcYCQACWAwAhxwJAAJYDACHIAgEAvAMAIckCAQC8AwAhAwAAAAcAIAEAAAgAMAIAAAkAIAkDAADTAwAgCgAAyQMAIPkBAADRAwAw-gEAAAsAEPsBAADRAwAwnQJAAIcDACGuAgEAlAMAIbMCAQCEAwAhtQIAANIDtQIiAgMAALwFACAKAAC2BQAgCgMAANMDACAKAADJAwAg-QEAANEDADD6AQAACwAQ-wEAANEDADCdAkAAhwMAIa4CAQCUAwAhswIBAIQDACG1AgAA0gO1AiLQAgAA0AMAIAMAAAALACABAAAMADACAAANACAJBgAAiAMAIPkBAACDAwAw-gEAAA8AEPsBAACDAwAw_AEBAIQDACH9AQEAhAMAIf4BEACFAwAh_wEAAIYDACCAAkAAhwMAIQEAAAAPACARCAAAzwMAIAkAAL8DACALAACwAwAg-QEAAM4DADD6AQAAEQAQ-wEAAM4DADCVAgEAlAMAIZ0CQACHAwAhngJAAIcDACG2AgEAhAMAIbcCAQC8AwAhuAIBALwDACG5AgEAvAMAIboCAQC8AwAhuwIBAIQDACG8AgEAhAMAIb0CAQC8AwAhCAgAALsFACAJAAC0BQAgCwAA8AQAILcCAAC-BAAguAIAAL4EACC5AgAAvgQAILoCAAC-BAAgvQIAAL4EACARCAAAzwMAIAkAAL8DACALAACwAwAg-QEAAM4DADD6AQAAEQAQ-wEAAM4DADCVAgEAAAABnQJAAIcDACGeAkAAhwMAIbYCAQCEAwAhtwIBALwDACG4AgEAvAMAIbkCAQC8AwAhugIBALwDACG7AgEAAAABvAIBAIQDACG9AgEAvAMAIQMAAAARACABAAASADACAAATACABAAAAEQAgAwAAAAsAIAEAAAwAMAIAAA0AIBAKAADJAwAgDAAAygMAIA4AAMsDACAPAADMAwAgEAAAzQMAIPkBAADIAwAw-gEAABcAEPsBAADIAwAw_QEBAIQDACGVAgEAlAMAIZ0CQACHAwAhngJAAIcDACGuAgEAlAMAIa8CAQCUAwAhsAICAJUDACGxAhAAhQMAIQUKAAC2BQAgDAAAtwUAIA4AALgFACAPAAC5BQAgEAAAugUAIBAKAADJAwAgDAAAygMAIA4AAMsDACAPAADMAwAgEAAAzQMAIPkBAADIAwAw-gEAABcAEPsBAADIAwAw_QEBAIQDACGVAgEAAAABnQJAAIcDACGeAkAAhwMAIa4CAQCUAwAhrwIBAJQDACGwAgIAlQMAIbECEACFAwAhAwAAABcAIAEAABgAMAIAABkAIAMAAAAXACABAAAYADACAAAZACABAAAAFwAgCg0AAMMDACD5AQAAxgMAMPoBAAAdABD7AQAAxgMAMJUCAQCUAwAhnQJAAIcDACGjAgEAlAMAIaUCAQCEAwAhpgIBAIQDACGsAgAAxwOsAiIBDQAAtQUAIAoNAADDAwAg-QEAAMYDADD6AQAAHQAQ-wEAAMYDADCVAgEAAAABnQJAAIcDACGjAgEAlAMAIaUCAQCEAwAhpgIBAIQDACGsAgAAxwOsAiIDAAAAHQAgAQAAHgAwAgAAHwAgDQ0AAMMDACD5AQAAxAMAMPoBAAAhABD7AQAAxAMAMP4BEACFAwAhlQIBAJQDACGdAkAAhwMAIZ4CQACHAwAhowIBAJQDACGlAgEAvAMAIaYCAQC8AwAhrAIAAMUDrAIjrQIgAK8DACEEDQAAtQUAIKUCAAC-BAAgpgIAAL4EACCsAgAAvgQAIA0NAADDAwAg-QEAAMQDADD6AQAAIQAQ-wEAAMQDADD-ARAAhQMAIZUCAQAAAAGdAkAAhwMAIZ4CQACHAwAhowIBAJQDACGlAgEAvAMAIaYCAQC8AwAhrAIAAMUDrAIjrQIgAK8DACEDAAAAIQAgAQAAIgAwAgAAIwAgDw0AAMMDACD5AQAAwQMAMPoBAAAlABD7AQAAwQMAMJUCAQCUAwAhnQJAAIcDACGeAkAAhwMAIaICAQCEAwAhowIBAJQDACGkAkAAhwMAIaUCAQCEAwAhpgIBAIQDACGnAgEAhAMAIagCAQCEAwAhqgIAAMIDqgIiAQ0AALUFACAQDQAAwwMAIPkBAADBAwAw-gEAACUAEPsBAADBAwAwlQIBAAAAAZ0CQACHAwAhngJAAIcDACGiAgEAAAABowIBAJQDACGkAkAAhwMAIaUCAQCEAwAhpgIBAIQDACGnAgEAhAMAIagCAQCEAwAhqgIAAMIDqgIizwIAAMADACADAAAAJQAgAQAAJgAwAgAAJwAgAQAAAB0AIAEAAAAhACABAAAAJQAgAQAAAAsAIAEAAAAXACABAAAAAwAgAQAAAAcAIAEAAAALACABAAAAAQAgDgQAAL0DACAFAAC-AwAgBgAAvwMAIPkBAAC7AwAw-gEAADIAEPsBAAC7AwAw_QEBAIQDACGVAgEAhAMAIZYCAQCEAwAhnQJAAIcDACGeAkAAhwMAIbUCAQCEAwAhzQIgAK8DACHOAgEAvAMAIQQEAACyBQAgBQAAswUAIAYAALQFACDOAgAAvgQAIAMAAAAyACABAAAzADACAAABACADAAAAMgAgAQAAMwAwAgAAAQAgAwAAADIAIAEAADMAMAIAAAEAIAsEAACvBQAgBQAAsAUAIAYAALEFACD9AQEAAAABlQIBAAAAAZYCAQAAAAGdAkAAAAABngJAAAAAAbUCAQAAAAHNAiAAAAABzgIBAAAAAQEWAAA3ACAI_QEBAAAAAZUCAQAAAAGWAgEAAAABnQJAAAAAAZ4CQAAAAAG1AgEAAAABzQIgAAAAAc4CAQAAAAEBFgAAOQAwARYAADkAMAsEAACLBQAgBQAAjAUAIAYAAI0FACD9AQEA2wMAIZUCAQDbAwAhlgIBANsDACGdAkAA3QMAIZ4CQADdAwAhtQIBANsDACHNAiAAlQQAIc4CAQDpAwAhAgAAAAEAIBYAADwAIAj9AQEA2wMAIZUCAQDbAwAhlgIBANsDACGdAkAA3QMAIZ4CQADdAwAhtQIBANsDACHNAiAAlQQAIc4CAQDpAwAhAgAAADIAIBYAAD4AIAIAAAAyACAWAAA-ACADAAAAAQAgHQAANwAgHgAAPAAgAQAAAAEAIAEAAAAyACAEBwAAiAUAICMAAIoFACAkAACJBQAgzgIAAL4EACAL-QEAALoDADD6AQAARQAQ-wEAALoDADD9AQEA9wIAIZUCAQD3AgAhlgIBAPcCACGdAkAA-gIAIZ4CQAD6AgAhtQIBAPcCACHNAiAAoQMAIc4CAQCgAwAhAwAAADIAIAEAAEQAMCIAAEUAIAMAAAAyACABAAAzADACAAABACABAAAABQAgAQAAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIAkDAACHBQAglQIBAAAAAZ0CQAAAAAGeAkAAAAABswIBAAAAAcACQAAAAAHKAgEAAAABywIBAAAAAcwCAQAAAAEBFgAATQAgCJUCAQAAAAGdAkAAAAABngJAAAAAAbMCAQAAAAHAAkAAAAABygIBAAAAAcsCAQAAAAHMAgEAAAABARYAAE8AMAEWAABPADAJAwAAhgUAIJUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbMCAQDbAwAhwAJAAN0DACHKAgEA2wMAIcsCAQDpAwAhzAIBAOkDACECAAAABQAgFgAAUgAgCJUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbMCAQDbAwAhwAJAAN0DACHKAgEA2wMAIcsCAQDpAwAhzAIBAOkDACECAAAAAwAgFgAAVAAgAgAAAAMAIBYAAFQAIAMAAAAFACAdAABNACAeAABSACABAAAABQAgAQAAAAMAIAUHAACDBQAgIwAAhQUAICQAAIQFACDLAgAAvgQAIMwCAAC-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-gIAIbMCAQD3AgAhwAJAAPoCACHKAgEA9wIAIcsCAQCgAwAhzAIBAKADACEL-QEAALoDADD6AQAARQAQ-wEAALoDADD9AQEA9wIAIZUCAQD3AgAhlgIBAPcCACGdAkAA-gIAIZ4CQAD6AgAhtQIBAPcCACHNAiAAoQMAIc4CAQCgAwAhDgQAAL0DACAFAAC-AwAgBgAAvwMAIPkBAAC7AwAw-gEAADIAEPsBAAC7AwAw_QEBAIQDACGVAgEAhAMAIZYCAQCEAwAhnQJAAIcDACGeAkAAhwMAIbUCAQCEAwAhzQIgAK8DACHOAgEAvAMAIQuBAgEAAAABggIBAAAABYMCAQAAAAWEAgEAAAABhQIBAAAAAYYCAQAAAAGHAgEAAAABiAIBAKUDACGPAgEAAAABkAIBAAAAAZECAQAAAAEDkgIAAAMAIJMCAAADACCUAgAAAwAgA5ICAAAHACCTAgAABwAglAIAAAcAIAOSAgAACwAgkwIAAAsAIJQCAAALACADowIBAAAAAaQCQAAAAAGlAgEAAAABDw0AAMMDACD5AQAAwQMAMPoBAAAlABD7AQAAwQMAMJUCAQCUAwAhnQJAAIcDACGeAkAAhwMAIaICAQCEAwAhowIBAJQDACGkAkAAhwMAIaUCAQCEAwAhpgIBAIQDACGnAgEAhAMAIagCAQCEAwAhqgIAAMIDqgIiBIECAAAAqgICggIAAACqAgiDAgAAAKoCCIgCAACdA6oCIhIKAADJAwAgDAAAygMAIA4AAMsDACAPAADMAwAgEAAAzQMAIPkBAADIAwAw-gEAABcAEPsBAADIAwAw_QEBAIQDACGVAgEAlAMAIZ0CQACHAwAhngJAAIcDACGuAgEAlAMAIa8CAQCUAwAhsAICAJUDACGxAhAAhQMAIdECAAAXACDSAgAAFwAgDQ0AAMMDACD5AQAAxAMAMPoBAAAhABD7AQAAxAMAMP4BEACFAwAhlQIBAJQDACGdAkAAhwMAIZ4CQACHAwAhowIBAJQDACGlAgEAvAMAIaYCAQC8AwAhrAIAAMUDrAIjrQIgAK8DACEEgQIAAACsAgOCAgAAAKwCCYMCAAAArAIJiAIAAKcDrAIjCg0AAMMDACD5AQAAxgMAMPoBAAAdABD7AQAAxgMAMJUCAQCUAwAhnQJAAIcDACGjAgEAlAMAIaUCAQCEAwAhpgIBAIQDACGsAgAAxwOsAiIEgQIAAACsAgKCAgAAAKwCCIMCAAAArAIIiAIAAKsDrAIiEAoAAMkDACAMAADKAwAgDgAAywMAIA8AAMwDACAQAADNAwAg-QEAAMgDADD6AQAAFwAQ-wEAAMgDADD9AQEAhAMAIZUCAQCUAwAhnQJAAIcDACGeAkAAhwMAIa4CAQCUAwAhrwIBAJQDACGwAgIAlQMAIbECEACFAwAhEwgAAM8DACAJAAC_AwAgCwAAsAMAIPkBAADOAwAw-gEAABEAEPsBAADOAwAwlQIBAJQDACGdAkAAhwMAIZ4CQACHAwAhtgIBAIQDACG3AgEAvAMAIbgCAQC8AwAhuQIBALwDACG6AgEAvAMAIbsCAQCEAwAhvAIBAIQDACG9AgEAvAMAIdECAAARACDSAgAAEQAgDAsAALADACD5AQAArgMAMPoBAAC-AQAQ-wEAAK4DADD9AQEAhAMAIZUCAQCUAwAhnQJAAIcDACGeAkAAhwMAIa0CIACvAwAhsgIBAIQDACHRAgAAvgEAINICAAC-AQAgA5ICAAAdACCTAgAAHQAglAIAAB0AIAOSAgAAIQAgkwIAACEAIJQCAAAhACADkgIAACUAIJMCAAAlACCUAgAAJQAgEQgAAM8DACAJAAC_AwAgCwAAsAMAIPkBAADOAwAw-gEAABEAEPsBAADOAwAwlQIBAJQDACGdAkAAhwMAIZ4CQACHAwAhtgIBAIQDACG3AgEAvAMAIbgCAQC8AwAhuQIBALwDACG6AgEAvAMAIbsCAQCEAwAhvAIBAIQDACG9AgEAvAMAIQsGAACIAwAg-QEAAIMDADD6AQAADwAQ-wEAAIMDADD8AQEAhAMAIf0BAQCEAwAh_gEQAIUDACH_AQAAhgMAIIACQACHAwAh0QIAAA8AINICAAAPACACrgIBAAAAAbMCAQAAAAEJAwAA0wMAIAoAAMkDACD5AQAA0QMAMPoBAAALABD7AQAA0QMAMJ0CQACHAwAhrgIBAJQDACGzAgEAhAMAIbUCAADSA7UCIgSBAgAAALUCAoICAAAAtQIIgwIAAAC1AgiIAgAAtAO1AiIQBAAAvQMAIAUAAL4DACAGAAC_AwAg-QEAALsDADD6AQAAMgAQ-wEAALsDADD9AQEAhAMAIZUCAQCEAwAhlgIBAIQDACGdAkAAhwMAIZ4CQACHAwAhtQIBAIQDACHNAiAArwMAIc4CAQC8AwAh0QIAADIAINICAAAyACARAwAA0wMAIPkBAADUAwAw-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-BAAgAQsAAPAEACAAAAABBgAAvQQAIAQEAACyBQAgBQAAswUAIAYAALQFACDOAgAAvgQAIAeVAgEAAAABnQJAAAAAAZ4CQAAAAAHAAkAAAAABygIBAAAAAcsCAQAAAAHMAgEAAAABDJUCAQAAAAGdAkAAAAABngJAAAAAAcECAQAAAAHCAgEAAAABwwIBAAAAAcQCAQAAAAHFAgEAAAABxgJAAAAAAccCQAAAAAHIAgEAAAAByQIBAAAAAQOdAkAAAAABrgIBAAAAAbUCAAAAtQICCgUAALAFACAGAACxBQAg_QEBAAAAAZUCAQAAAAGWAgEAAAABnQJAAAAAAZ4CQAAAAAG1AgEAAAABzQIgAAAAAc4CAQAAAAECAAAAAQAgHQAAwAUAIAMAAAAyACAdAADABQAgHgAAxAUAIAwAAAAyACAFAACMBQAgBgAAjQUAIBYAAMQFACD9AQEA2wMAIZUCAQDbAwAhlgIBANsDACGdAkAA3QMAIZ4CQADdAwAhtQIBANsDACHNAiAAlQQAIc4CAQDpAwAhCgUAAIwFACAGAACNBQAg_QEBANsDACGVAgEA2wMAIZYCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbUCAQDbAwAhzQIgAJUEACHOAgEA6QMAIQoEAACvBQAgBgAAsQUAIP0BAQAAAAGVAgEAAAABlgIBAAAAAZ0CQAAAAAGeAkAAAAABtQIBAAAAAc0CIAAAAAHOAgEAAAABAgAAAAEAIB0AAMUFACADAAAAMgAgHQAAxQUAIB4AAMkFACAMAAAAMgAgBAAAiwUAIAYAAI0FACAWAADJBQAg_QEBANsDACGVAgEA2wMAIZYCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbUCAQDbAwAhzQIgAJUEACHOAgEA6QMAIQoEAACLBQAgBgAAjQUAIP0BAQDbAwAhlQIBANsDACGWAgEA2wMAIZ0CQADdAwAhngJAAN0DACG1AgEA2wMAIc0CIACVBAAhzgIBAOkDACEF_AEBAAAAAf0BAQAAAAH-ARAAAAAB_wGAAAAAAYACQAAAAAECAAAA3gIAIB0AAMoFACADAAAADwAgHQAAygUAIB4AAM4FACAHAAAADwAgFgAAzgUAIPwBAQDbAwAh_QEBANsDACH-ARAA3AMAIf8BgAAAAAGAAkAA3QMAIQX8AQEA2wMAIf0BAQDbAwAh_gEQANwDACH_AYAAAAABgAJAAN0DACENCAAA-gQAIAsAALsEACCVAgEAAAABnQJAAAAAAZ4CQAAAAAG2AgEAAAABtwIBAAAAAbgCAQAAAAG5AgEAAAABugIBAAAAAbsCAQAAAAG8AgEAAAABvQIBAAAAAQIAAAATACAdAADPBQAgAwAAABEAIB0AAM8FACAeAADTBQAgDwAAABEAIAgAAPkEACALAADsAwAgFgAA0wUAIJUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbYCAQDbAwAhtwIBAOkDACG4AgEA6QMAIbkCAQDpAwAhugIBAOkDACG7AgEA2wMAIbwCAQDbAwAhvQIBAOkDACENCAAA-QQAIAsAAOwDACCVAgEA2wMAIZ0CQADdAwAhngJAAN0DACG2AgEA2wMAIbcCAQDpAwAhuAIBAOkDACG5AgEA6QMAIboCAQDpAwAhuwIBANsDACG8AgEA2wMAIb0CAQDpAwAhB_0BAQAAAAGVAgEAAAABnQJAAAAAAZ4CQAAAAAGuAgEAAAABsAICAAAAAbECEAAAAAENCAAA-gQAIAkAALoEACCVAgEAAAABnQJAAAAAAZ4CQAAAAAG2AgEAAAABtwIBAAAAAbgCAQAAAAG5AgEAAAABugIBAAAAAbsCAQAAAAG8AgEAAAABvQIBAAAAAQIAAAATACAdAADVBQAgAwAAABEAIB0AANUFACAeAADZBQAgDwAAABEAIAgAAPkEACAJAADrAwAgFgAA2QUAIJUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbYCAQDbAwAhtwIBAOkDACG4AgEA6QMAIbkCAQDpAwAhugIBAOkDACG7AgEA2wMAIbwCAQDbAwAhvQIBAOkDACENCAAA-QQAIAkAAOsDACCVAgEA2wMAIZ0CQADdAwAhngJAAN0DACG2AgEA2wMAIbcCAQDpAwAhuAIBAOkDACG5AgEA6QMAIboCAQDpAwAhuwIBANsDACG8AgEA2wMAIb0CAQDpAwAhDAoAAOEEACAMAACmBAAgDwAAqAQAIBAAAKkEACD9AQEAAAABlQIBAAAAAZ0CQAAAAAGeAkAAAAABrgIBAAAAAa8CAQAAAAGwAgIAAAABsQIQAAAAAQIAAAAZACAdAADaBQAgAwAAABcAIB0AANoFACAeAADeBQAgDgAAABcAIAoAAOAEACAMAAD5AwAgDwAA-wMAIBAAAPwDACAWAADeBQAg_QEBANsDACGVAgEA2wMAIZ0CQADdAwAhngJAAN0DACGuAgEA2wMAIa8CAQDbAwAhsAICAPcDACGxAhAA3AMAIQwKAADgBAAgDAAA-QMAIA8AAPsDACAQAAD8AwAg_QEBANsDACGVAgEA2wMAIZ0CQADdAwAhngJAAN0DACGuAgEA2wMAIa8CAQDbAwAhsAICAPcDACGxAhAA3AMAIQwKAADhBAAgDAAApgQAIA4AAKcEACAQAACpBAAg_QEBAAAAAZUCAQAAAAGdAkAAAAABngJAAAAAAa4CAQAAAAGvAgEAAAABsAICAAAAAbECEAAAAAECAAAAGQAgHQAA3wUAIAMAAAAXACAdAADfBQAgHgAA4wUAIA4AAAAXACAKAADgBAAgDAAA-QMAIA4AAPoDACAQAAD8AwAgFgAA4wUAIP0BAQDbAwAhlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhrgIBANsDACGvAgEA2wMAIbACAgD3AwAhsQIQANwDACEMCgAA4AQAIAwAAPkDACAOAAD6AwAgEAAA_AMAIP0BAQDbAwAhlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhrgIBANsDACGvAgEA2wMAIbACAgD3AwAhsQIQANwDACEMCgAA4QQAIAwAAKYEACAOAACnBAAgDwAAqAQAIP0BAQAAAAGVAgEAAAABnQJAAAAAAZ4CQAAAAAGuAgEAAAABrwIBAAAAAbACAgAAAAGxAhAAAAABAgAAABkAIB0AAOQFACADAAAAFwAgHQAA5AUAIB4AAOgFACAOAAAAFwAgCgAA4AQAIAwAAPkDACAOAAD6AwAgDwAA-wMAIBYAAOgFACD9AQEA2wMAIZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIa4CAQDbAwAhrwIBANsDACGwAgIA9wMAIbECEADcAwAhDAoAAOAEACAMAAD5AwAgDgAA-gMAIA8AAPsDACD9AQEA2wMAIZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIa4CAQDbAwAhrwIBANsDACGwAgIA9wMAIbECEADcAwAhCgQAAK8FACAFAACwBQAg_QEBAAAAAZUCAQAAAAGWAgEAAAABnQJAAAAAAZ4CQAAAAAG1AgEAAAABzQIgAAAAAc4CAQAAAAECAAAAAQAgHQAA6QUAIAMAAAAyACAdAADpBQAgHgAA7QUAIAwAAAAyACAEAACLBQAgBQAAjAUAIBYAAO0FACD9AQEA2wMAIZUCAQDbAwAhlgIBANsDACGdAkAA3QMAIZ4CQADdAwAhtQIBANsDACHNAiAAlQQAIc4CAQDpAwAhCgQAAIsFACAFAACMBQAg_QEBANsDACGVAgEA2wMAIZYCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbUCAQDbAwAhzQIgAJUEACHOAgEA6QMAIQOdAkAAAAABswIBAAAAAbUCAAAAtQICBv0BAQAAAAGVAgEAAAABnQJAAAAAAZ4CQAAAAAGtAiAAAAABsgIBAAAAAQIAAAC7AQAgHQAA7wUAIAWVAgEAAAABnQJAAAAAAaUCAQAAAAGmAgEAAAABrAIAAACsAgII_gEQAAAAAZUCAQAAAAGdAkAAAAABngJAAAAAAaUCAQAAAAGmAgEAAAABrAIAAACsAgOtAiAAAAABCpUCAQAAAAGdAkAAAAABngJAAAAAAaICAQAAAAGkAkAAAAABpQIBAAAAAaYCAQAAAAGnAgEAAAABqAIBAAAAAaoCAAAAqgICAwAAAL4BACAdAADvBQAgHgAA9gUAIAgAAAC-AQAgFgAA9gUAIP0BAQDbAwAhlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhrQIgAJUEACGyAgEA2wMAIQb9AQEA2wMAIZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIa0CIACVBAAhsgIBANsDACEH_QEBAAAAAZUCAQAAAAGdAkAAAAABngJAAAAAAa8CAQAAAAGwAgIAAAABsQIQAAAAAQqVAgEAAAABnQJAAAAAAZ4CQAAAAAG2AgEAAAABtwIBAAAAAbgCAQAAAAG5AgEAAAABugIBAAAAAbsCAQAAAAG8AgEAAAABBAQGAgUKAwYOBAcAEAEDAAEBAwABAgMAAQoABQQHAA8IEAYJFgQLGggCBhQFBwAHAQYVAAYHAA4KAAUMAAkOIAsPJAwQKA0CBwAKCxsIAQscAAENAAgBDQAIAQ0ACAMOKQAPKgAQKwACCSwACy0AAwQuAAUvAAYwAAAAAAMHABUjABYkABcAAAADBwAVIwAWJAAXAQMAAQEDAAEDBwAcIwAdJAAeAAAAAwcAHCMAHSQAHgEDAAEBAwABAwcAIyMAJCQAJQAAAAMHACMjACQkACUAAAADBwArIwAsJAAtAAAAAwcAKyMALCQALQEIlwEGAQidAQYDBwAyIwAzJAA0AAAAAwcAMiMAMyQANAIDAAEKAAUCAwABCgAFAwcAOSMAOiQAOwAAAAMHADkjADokADsAAAMHAEAjAEEkAEIAAAADBwBAIwBBJABCAgoABQwACQIKAAUMAAkFBwBHIwBKJABLlQEASJYBAEkAAAAAAAUHAEcjAEokAEuVAQBIlgEASQENAAgBDQAIAwcAUCMAUSQAUgAAAAMHAFAjAFEkAFIBDQAIAQ0ACAUHAFcjAFokAFuVAQBYlgEAWQAAAAAABQcAVyMAWiQAW5UBAFiWAQBZAQ0ACAENAAgDBwBgIwBhJABiAAAAAwcAYCMAYSQAYgAAAAUHAGgjAGskAGyVAQBplgEAagAAAAAABQcAaCMAayQAbJUBAGmWAQBqAAAABQcAciMAdSQAdpUBAHOWAQB0AAAAAAAFBwByIwB1JAB2lQEAc5YBAHQAAAUHAHsjAH4kAH-VAQB8lgEAfQAAAAAABQcAeyMAfiQAf5UBAHyWAQB9EQIBEjEBEzQBFDUBFTYBFzgBGDoRGTsSGj0BGz8RHEATH0EBIEIBIUMRJUYUJkcYJ0gCKEkCKUoCKksCK0wCLE4CLVARLlEZL1MCMFURMVYaMlcCM1gCNFkRNVwbNl0fN14DOF8DOWADOmEDO2IDPGQDPWYRPmcgP2kDQGsRQWwhQm0DQ24DRG8RRXIiRnMmR3UnSHYnSXknSnonS3snTH0nTX8RToABKE-CASdQhAERUYUBKVKGASdThwEnVIgBEVWLASpWjAEuV40BBViOAQVZjwEFWpABBVuRAQVckwEFXZUBEV6WAS9fmQEFYJsBEWGcATBingEFY58BBWSgARFlowExZqQBNWelAQRopgEEaacBBGqoAQRrqQEEbKsBBG2tARFurgE2b7ABBHCyARFxswE3crQBBHO1AQR0tgERdbkBOHa6ATx3vAEJeL0BCXnAAQl6wQEJe8IBCXzEAQl9xgERfscBPX_JAQmAAcsBEYEBzAE-ggHNAQmDAc4BCYQBzwERhQHSAT-GAdMBQ4cB1AEIiAHVAQiJAdYBCIoB1wEIiwHYAQiMAdoBCI0B3AERjgHdAUSPAd8BCJAB4QERkQHiAUWSAeMBCJMB5AEIlAHlARGXAegBRpgB6QFMmQHqAQuaAesBC5sB7AELnAHtAQudAe4BC54B8AELnwHyARGgAfMBTaEB9QELogH3ARGjAfgBTqQB-QELpQH6AQumAfsBEacB_gFPqAH_AVOpAYACDKoBgQIMqwGCAgysAYMCDK0BhAIMrgGGAgyvAYgCEbABiQJUsQGLAgyyAY0CEbMBjgJVtAGPAgy1AZACDLYBkQIRtwGUAla4AZUCXLkBlgINugGXAg27AZgCDbwBmQINvQGaAg2-AZwCDb8BngIRwAGfAl3BAaECDcIBowIRwwGkAl7EAaUCDcUBpgINxgGnAhHHAaoCX8gBqwJjyQGtAmTKAa4CZMsBsQJkzAGyAmTNAbMCZM4BtQJkzwG3AhHQAbgCZdEBugJk0gG8AhHTAb0CZtQBvgJk1QG_AmTWAcACEdcBwwJn2AHEAm3ZAcYCbtoBxwJu2wHKAm7cAcsCbt0BzAJu3gHOAm7fAdACEeAB0QJv4QHTAm7iAdUCEeMB1gJw5AHXAm7lAdgCbuYB2QIR5wHcAnHoAd0Cd-kB3wIG6gHgAgbrAeICBuwB4wIG7QHkAgbuAeYCBu8B6AIR8AHpAnjxAesCBvIB7QIR8wHuAnn0Ae8CBvUB8AIG9gHxAhH3AfQCevgB9QKAAQ" } async function decodeBase64AsWasm(wasmBase64: string): Promise { diff --git a/apps/backend/src/generated/prisma/internal/prismaNamespace.ts b/apps/backend/src/generated/prisma/internal/prismaNamespace.ts index 5a18941..0a8cc94 100644 --- a/apps/backend/src/generated/prisma/internal/prismaNamespace.ts +++ b/apps/backend/src/generated/prisma/internal/prismaNamespace.ts @@ -1499,7 +1499,8 @@ export const UserScalarFieldEnum = { emailVerified: 'emailVerified', image: 'image', createdAt: 'createdAt', - updatedAt: 'updatedAt' + updatedAt: 'updatedAt', + role: 'role' } as const export type UserScalarFieldEnum = (typeof UserScalarFieldEnum)[keyof typeof UserScalarFieldEnum] diff --git a/apps/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts b/apps/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts index b0e105f..b416860 100644 --- a/apps/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts +++ b/apps/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts @@ -90,7 +90,8 @@ export const UserScalarFieldEnum = { emailVerified: 'emailVerified', image: 'image', createdAt: 'createdAt', - updatedAt: 'updatedAt' + updatedAt: 'updatedAt', + role: 'role' } as const export type UserScalarFieldEnum = (typeof UserScalarFieldEnum)[keyof typeof UserScalarFieldEnum] diff --git a/apps/backend/src/generated/prisma/models/User.ts b/apps/backend/src/generated/prisma/models/User.ts index 5383ba5..93011f2 100644 --- a/apps/backend/src/generated/prisma/models/User.ts +++ b/apps/backend/src/generated/prisma/models/User.ts @@ -32,6 +32,7 @@ export type UserMinAggregateOutputType = { image: string | null createdAt: Date | null updatedAt: Date | null + role: string | null } export type UserMaxAggregateOutputType = { @@ -42,6 +43,7 @@ export type UserMaxAggregateOutputType = { image: string | null createdAt: Date | null updatedAt: Date | null + role: string | null } export type UserCountAggregateOutputType = { @@ -52,6 +54,7 @@ export type UserCountAggregateOutputType = { image: number createdAt: number updatedAt: number + role: number _all: number } @@ -64,6 +67,7 @@ export type UserMinAggregateInputType = { image?: true createdAt?: true updatedAt?: true + role?: true } export type UserMaxAggregateInputType = { @@ -74,6 +78,7 @@ export type UserMaxAggregateInputType = { image?: true createdAt?: true updatedAt?: true + role?: true } export type UserCountAggregateInputType = { @@ -84,6 +89,7 @@ export type UserCountAggregateInputType = { image?: true createdAt?: true updatedAt?: true + role?: true _all?: true } @@ -167,6 +173,7 @@ export type UserGroupByOutputType = { image: string | null createdAt: Date updatedAt: Date + role: string _count: UserCountAggregateOutputType | null _min: UserMinAggregateOutputType | null _max: UserMaxAggregateOutputType | null @@ -198,6 +205,7 @@ export type UserWhereInput = { image?: Prisma.StringNullableFilter<"User"> | string | null createdAt?: Prisma.DateTimeFilter<"User"> | Date | string updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string + role?: Prisma.StringFilter<"User"> | string sessions?: Prisma.SessionListRelationFilter accounts?: Prisma.AccountListRelationFilter complexes?: Prisma.ComplexUserListRelationFilter @@ -211,6 +219,7 @@ export type UserOrderByWithRelationInput = { image?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder + role?: Prisma.SortOrder sessions?: Prisma.SessionOrderByRelationAggregateInput accounts?: Prisma.AccountOrderByRelationAggregateInput complexes?: Prisma.ComplexUserOrderByRelationAggregateInput @@ -227,6 +236,7 @@ export type UserWhereUniqueInput = Prisma.AtLeast<{ image?: Prisma.StringNullableFilter<"User"> | string | null createdAt?: Prisma.DateTimeFilter<"User"> | Date | string updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string + role?: Prisma.StringFilter<"User"> | string sessions?: Prisma.SessionListRelationFilter accounts?: Prisma.AccountListRelationFilter complexes?: Prisma.ComplexUserListRelationFilter @@ -240,6 +250,7 @@ export type UserOrderByWithAggregationInput = { image?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder + role?: Prisma.SortOrder _count?: Prisma.UserCountOrderByAggregateInput _max?: Prisma.UserMaxOrderByAggregateInput _min?: Prisma.UserMinOrderByAggregateInput @@ -256,6 +267,7 @@ export type UserScalarWhereWithAggregatesInput = { image?: Prisma.StringNullableWithAggregatesFilter<"User"> | string | null createdAt?: Prisma.DateTimeWithAggregatesFilter<"User"> | Date | string updatedAt?: Prisma.DateTimeWithAggregatesFilter<"User"> | Date | string + role?: Prisma.StringWithAggregatesFilter<"User"> | string } export type UserCreateInput = { @@ -266,6 +278,7 @@ export type UserCreateInput = { image?: string | null createdAt?: Date | string updatedAt?: Date | string + role?: string sessions?: Prisma.SessionCreateNestedManyWithoutUserInput accounts?: Prisma.AccountCreateNestedManyWithoutUserInput complexes?: Prisma.ComplexUserCreateNestedManyWithoutUserInput @@ -279,6 +292,7 @@ export type UserUncheckedCreateInput = { image?: string | null createdAt?: Date | string updatedAt?: Date | string + role?: string sessions?: Prisma.SessionUncheckedCreateNestedManyWithoutUserInput accounts?: Prisma.AccountUncheckedCreateNestedManyWithoutUserInput complexes?: Prisma.ComplexUserUncheckedCreateNestedManyWithoutUserInput @@ -292,6 +306,7 @@ export type UserUpdateInput = { image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + role?: Prisma.StringFieldUpdateOperationsInput | string sessions?: Prisma.SessionUpdateManyWithoutUserNestedInput accounts?: Prisma.AccountUpdateManyWithoutUserNestedInput complexes?: Prisma.ComplexUserUpdateManyWithoutUserNestedInput @@ -305,6 +320,7 @@ export type UserUncheckedUpdateInput = { image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + role?: Prisma.StringFieldUpdateOperationsInput | string sessions?: Prisma.SessionUncheckedUpdateManyWithoutUserNestedInput accounts?: Prisma.AccountUncheckedUpdateManyWithoutUserNestedInput complexes?: Prisma.ComplexUserUncheckedUpdateManyWithoutUserNestedInput @@ -318,6 +334,7 @@ export type UserCreateManyInput = { image?: string | null createdAt?: Date | string updatedAt?: Date | string + role?: string } export type UserUpdateManyMutationInput = { @@ -328,6 +345,7 @@ export type UserUpdateManyMutationInput = { image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + role?: Prisma.StringFieldUpdateOperationsInput | string } export type UserUncheckedUpdateManyInput = { @@ -338,6 +356,7 @@ export type UserUncheckedUpdateManyInput = { image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + role?: Prisma.StringFieldUpdateOperationsInput | string } export type UserCountOrderByAggregateInput = { @@ -348,6 +367,7 @@ export type UserCountOrderByAggregateInput = { image?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder + role?: Prisma.SortOrder } export type UserMaxOrderByAggregateInput = { @@ -358,6 +378,7 @@ export type UserMaxOrderByAggregateInput = { image?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder + role?: Prisma.SortOrder } export type UserMinOrderByAggregateInput = { @@ -368,6 +389,7 @@ export type UserMinOrderByAggregateInput = { image?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder + role?: Prisma.SortOrder } export type UserScalarRelationFilter = { @@ -441,6 +463,7 @@ export type UserCreateWithoutSessionsInput = { image?: string | null createdAt?: Date | string updatedAt?: Date | string + role?: string accounts?: Prisma.AccountCreateNestedManyWithoutUserInput complexes?: Prisma.ComplexUserCreateNestedManyWithoutUserInput } @@ -453,6 +476,7 @@ export type UserUncheckedCreateWithoutSessionsInput = { image?: string | null createdAt?: Date | string updatedAt?: Date | string + role?: string accounts?: Prisma.AccountUncheckedCreateNestedManyWithoutUserInput complexes?: Prisma.ComplexUserUncheckedCreateNestedManyWithoutUserInput } @@ -481,6 +505,7 @@ export type UserUpdateWithoutSessionsInput = { image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + role?: Prisma.StringFieldUpdateOperationsInput | string accounts?: Prisma.AccountUpdateManyWithoutUserNestedInput complexes?: Prisma.ComplexUserUpdateManyWithoutUserNestedInput } @@ -493,6 +518,7 @@ export type UserUncheckedUpdateWithoutSessionsInput = { image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + role?: Prisma.StringFieldUpdateOperationsInput | string accounts?: Prisma.AccountUncheckedUpdateManyWithoutUserNestedInput complexes?: Prisma.ComplexUserUncheckedUpdateManyWithoutUserNestedInput } @@ -505,6 +531,7 @@ export type UserCreateWithoutAccountsInput = { image?: string | null createdAt?: Date | string updatedAt?: Date | string + role?: string sessions?: Prisma.SessionCreateNestedManyWithoutUserInput complexes?: Prisma.ComplexUserCreateNestedManyWithoutUserInput } @@ -517,6 +544,7 @@ export type UserUncheckedCreateWithoutAccountsInput = { image?: string | null createdAt?: Date | string updatedAt?: Date | string + role?: string sessions?: Prisma.SessionUncheckedCreateNestedManyWithoutUserInput complexes?: Prisma.ComplexUserUncheckedCreateNestedManyWithoutUserInput } @@ -545,6 +573,7 @@ export type UserUpdateWithoutAccountsInput = { image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + role?: Prisma.StringFieldUpdateOperationsInput | string sessions?: Prisma.SessionUpdateManyWithoutUserNestedInput complexes?: Prisma.ComplexUserUpdateManyWithoutUserNestedInput } @@ -557,6 +586,7 @@ export type UserUncheckedUpdateWithoutAccountsInput = { image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + role?: Prisma.StringFieldUpdateOperationsInput | string sessions?: Prisma.SessionUncheckedUpdateManyWithoutUserNestedInput complexes?: Prisma.ComplexUserUncheckedUpdateManyWithoutUserNestedInput } @@ -569,6 +599,7 @@ export type UserCreateWithoutComplexesInput = { image?: string | null createdAt?: Date | string updatedAt?: Date | string + role?: string sessions?: Prisma.SessionCreateNestedManyWithoutUserInput accounts?: Prisma.AccountCreateNestedManyWithoutUserInput } @@ -581,6 +612,7 @@ export type UserUncheckedCreateWithoutComplexesInput = { image?: string | null createdAt?: Date | string updatedAt?: Date | string + role?: string sessions?: Prisma.SessionUncheckedCreateNestedManyWithoutUserInput accounts?: Prisma.AccountUncheckedCreateNestedManyWithoutUserInput } @@ -609,6 +641,7 @@ export type UserUpdateWithoutComplexesInput = { image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + role?: Prisma.StringFieldUpdateOperationsInput | string sessions?: Prisma.SessionUpdateManyWithoutUserNestedInput accounts?: Prisma.AccountUpdateManyWithoutUserNestedInput } @@ -621,6 +654,7 @@ export type UserUncheckedUpdateWithoutComplexesInput = { image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + role?: Prisma.StringFieldUpdateOperationsInput | string sessions?: Prisma.SessionUncheckedUpdateManyWithoutUserNestedInput accounts?: Prisma.AccountUncheckedUpdateManyWithoutUserNestedInput } @@ -682,6 +716,7 @@ export type UserSelect accounts?: boolean | Prisma.User$accountsArgs complexes?: boolean | Prisma.User$complexesArgs @@ -696,6 +731,7 @@ export type UserSelectCreateManyAndReturn export type UserSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ @@ -706,6 +742,7 @@ export type UserSelectUpdateManyAndReturn export type UserSelectScalar = { @@ -716,9 +753,10 @@ export type UserSelectScalar = { image?: boolean createdAt?: boolean updatedAt?: boolean + role?: boolean } -export type UserOmit = runtime.Types.Extensions.GetOmit<"id" | "name" | "email" | "emailVerified" | "image" | "createdAt" | "updatedAt", ExtArgs["result"]["user"]> +export type UserOmit = runtime.Types.Extensions.GetOmit<"id" | "name" | "email" | "emailVerified" | "image" | "createdAt" | "updatedAt" | "role", ExtArgs["result"]["user"]> export type UserInclude = { sessions?: boolean | Prisma.User$sessionsArgs accounts?: boolean | Prisma.User$accountsArgs @@ -743,6 +781,7 @@ export type $UserPayload composites: {} } @@ -1176,6 +1215,7 @@ export interface UserFieldRefs { readonly image: Prisma.FieldRef<"User", 'String'> readonly createdAt: Prisma.FieldRef<"User", 'DateTime'> readonly updatedAt: Prisma.FieldRef<"User", 'DateTime'> + readonly role: Prisma.FieldRef<"User", 'String'> } diff --git a/apps/backend/src/lib/auth.ts b/apps/backend/src/lib/auth.ts index 0e7810b..912f999 100644 --- a/apps/backend/src/lib/auth.ts +++ b/apps/backend/src/lib/auth.ts @@ -1,27 +1,26 @@ -import { betterAuth } from "better-auth"; -import { prismaAdapter } from "better-auth/adapters/prisma"; +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"; +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, - }, + 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: [ - ], + }, + 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 +export type User = typeof auth.$Infer.Session.user; diff --git a/apps/backend/src/middlewares/require-auth.middleware.ts b/apps/backend/src/middlewares/require-auth.middleware.ts index 07710f8..387ff97 100644 --- a/apps/backend/src/middlewares/require-auth.middleware.ts +++ b/apps/backend/src/middlewares/require-auth.middleware.ts @@ -1,27 +1,18 @@ -import { createMiddleware } from "hono/factory"; -import { auth } from "@/lib/auth"; -import type { Session, User } from "@/lib/auth"; +import { auth } from '@/lib/auth'; +import type { AppEnv } from '@/types/hono'; +import { createMiddleware } from 'hono/factory'; -export type AuthEnv = { - Variables: { - user: User; - session: Session; - }; -}; - -export const requireAuth = createMiddleware(async (c, next) => { +export const requireAuth = createMiddleware(async (c, next) => { const session = await auth.api.getSession({ headers: c.req.raw.headers, }); - console.log(session) - if (!session) { - return c.json({ message: "Unauthorized" }, 401); + return c.json({ message: 'Unauthorized' }, 401); } - c.set("user", session.user); - c.set("session", session.session); + c.set('user', session.user); + c.set('session', session.session); await next(); }); diff --git a/apps/backend/src/middlewares/require-super-admin.middleware.ts b/apps/backend/src/middlewares/require-super-admin.middleware.ts index 9aac239..0a80482 100644 --- a/apps/backend/src/middlewares/require-super-admin.middleware.ts +++ b/apps/backend/src/middlewares/require-super-admin.middleware.ts @@ -11,9 +11,9 @@ function getSuperAdminEmails(): Set { } export const requireSuperAdmin: MiddlewareHandler = async (c, next) => { - const authUser = c.get('authUser'); - const role = typeof authUser.app_metadata?.role === 'string' ? authUser.app_metadata.role : null; - const email = authUser.email?.toLowerCase(); + const user = c.get('user'); + const role = (user as any).role || 'member'; + const email = user.email.toLowerCase(); if (role === 'super_admin') { await next(); diff --git a/apps/backend/src/modules/admin-booking/handlers/create-admin-booking.handler.ts b/apps/backend/src/modules/admin-booking/handlers/create-admin-booking.handler.ts index 9953fd4..eadfa81 100644 --- a/apps/backend/src/modules/admin-booking/handlers/create-admin-booking.handler.ts +++ b/apps/backend/src/modules/admin-booking/handlers/create-admin-booking.handler.ts @@ -10,10 +10,10 @@ type ComplexIdParams = { complexId: string }; export async function createAdminBookingHandler(c: AppContext) { const { complexId } = c.req.valid('param' as never) as ComplexIdParams; const payload = c.req.valid('json' as never) as CreateAdminBookingInput; - const appUserId = c.get('appUserId'); + const user = c.get('user'); try { - const booking = await createAdminBooking(appUserId, complexId, payload); + const booking = await createAdminBooking(user.id, complexId, payload); return c.json(booking, 201); } catch (error) { if (error instanceof AdminBookingServiceError) { diff --git a/apps/backend/src/modules/admin-booking/handlers/list-admin-bookings.handler.ts b/apps/backend/src/modules/admin-booking/handlers/list-admin-bookings.handler.ts index 85c486f..3bd4eaf 100644 --- a/apps/backend/src/modules/admin-booking/handlers/list-admin-bookings.handler.ts +++ b/apps/backend/src/modules/admin-booking/handlers/list-admin-bookings.handler.ts @@ -10,10 +10,10 @@ type ComplexIdParams = { complexId: string }; export async function listAdminBookingsHandler(c: AppContext) { const { complexId } = c.req.valid('param' as never) as ComplexIdParams; const query = c.req.valid('query' as never) as ListAdminBookingsQuery; - const appUserId = c.get('appUserId'); + const user = c.get('user'); try { - const response = await listAdminBookings(appUserId, complexId, query); + const response = await listAdminBookings(user.id, complexId, query); return c.json(response); } catch (error) { if (error instanceof AdminBookingServiceError) { diff --git a/apps/backend/src/modules/admin-booking/handlers/update-admin-booking-status.handler.ts b/apps/backend/src/modules/admin-booking/handlers/update-admin-booking-status.handler.ts index c943f9a..deca159 100644 --- a/apps/backend/src/modules/admin-booking/handlers/update-admin-booking-status.handler.ts +++ b/apps/backend/src/modules/admin-booking/handlers/update-admin-booking-status.handler.ts @@ -10,10 +10,10 @@ type BookingIdParams = { id: string }; export async function updateAdminBookingStatusHandler(c: AppContext) { const { id } = c.req.valid('param' as never) as BookingIdParams; const payload = c.req.valid('json' as never) as UpdateAdminBookingStatusInput; - const appUserId = c.get('appUserId'); + const user = c.get('user'); try { - const booking = await updateAdminBookingStatus(appUserId, id, payload); + const booking = await updateAdminBookingStatus(user.id, id, payload); return c.json(booking); } catch (error) { if (error instanceof AdminBookingServiceError) { diff --git a/apps/backend/src/modules/admin-booking/services/admin-booking.service.ts b/apps/backend/src/modules/admin-booking/services/admin-booking.service.ts index 577b1c3..5155415 100644 --- a/apps/backend/src/modules/admin-booking/services/admin-booking.service.ts +++ b/apps/backend/src/modules/admin-booking/services/admin-booking.service.ts @@ -126,12 +126,12 @@ function buildSlots( return slots; } -async function ensureComplexAccess(complexId: string, appUserId: string) { +async function ensureComplexAccess(complexId: string, userId: string) { const complexUser = await db.complexUser.findUnique({ where: { complexId_userId: { complexId, - userId: appUserId, + userId, }, }, include: { @@ -205,11 +205,11 @@ function mapBookingResponse(booking: { } export async function listAdminBookings( - appUserId: string, + userId: string, complexId: string, query: ListAdminBookingsQuery ) { - await ensureComplexAccess(complexId, appUserId); + await ensureComplexAccess(complexId, userId); const fromDate = parseIsoDate(query.fromDate); const bookings = await db.courtBooking.findMany({ @@ -253,11 +253,11 @@ export async function listAdminBookings( } export async function createAdminBooking( - appUserId: string, + userId: string, complexId: string, input: CreateAdminBookingInput ) { - const complex = await ensureComplexAccess(complexId, appUserId); + const complex = await ensureComplexAccess(complexId, userId); const bookingDate = parseIsoDate(input.date); const dayOfWeek = getDayOfWeek(bookingDate); @@ -436,7 +436,7 @@ export async function createAdminBooking( } export async function updateAdminBookingStatus( - appUserId: string, + userId: string, bookingId: string, input: UpdateAdminBookingStatusInput ) { @@ -447,7 +447,7 @@ export async function updateAdminBookingStatus( complex: { users: { some: { - userId: appUserId, + userId, }, }, }, diff --git a/apps/backend/src/modules/auth/auth.routes.ts b/apps/backend/src/modules/auth/auth.routes.ts index 6e22b17..3a3f4e2 100644 --- a/apps/backend/src/modules/auth/auth.routes.ts +++ b/apps/backend/src/modules/auth/auth.routes.ts @@ -1,9 +1,9 @@ -import { Hono } from "hono"; -import { auth } from "@/lib/auth"; -import { AppEnv } from "@/types/hono"; +import { auth } from '@/lib/auth'; +import { AppEnv } from '@/types/hono'; +import { Hono } from 'hono'; export const authRoutes = new Hono(); -authRoutes.on(["POST", "GET"], "/api/auth/*", (c) => { - return auth.handler(c.req.raw); +authRoutes.on(['POST', 'GET'], '/api/auth/*', (c) => { + return auth.handler(c.req.raw); }); diff --git a/apps/backend/src/modules/complex/handlers/create-complex.handler.ts b/apps/backend/src/modules/complex/handlers/create-complex.handler.ts index 6977264..55e9fb0 100644 --- a/apps/backend/src/modules/complex/handlers/create-complex.handler.ts +++ b/apps/backend/src/modules/complex/handlers/create-complex.handler.ts @@ -5,8 +5,8 @@ import type { CreateComplexInput } from '@repo/api-contract'; export async function createComplexHandler(c: AppContext) { const payload = c.req.valid('json' as never) as CreateComplexInput; - const authUser = c.get('authUser'); - const adminEmail = authUser.email; + const user = c.get('user'); + const adminEmail = user.email; if (!adminEmail) { return c.json({ message: 'El usuario autenticado no tiene email.' }, 400); diff --git a/apps/backend/src/modules/complex/handlers/list-my-complexes.handler.ts b/apps/backend/src/modules/complex/handlers/list-my-complexes.handler.ts index 1760b6c..fb873d1 100644 --- a/apps/backend/src/modules/complex/handlers/list-my-complexes.handler.ts +++ b/apps/backend/src/modules/complex/handlers/list-my-complexes.handler.ts @@ -2,7 +2,7 @@ import { listMyComplexes } from '@/modules/complex/services/complex.service'; import type { AppContext } from '@/types/hono'; export async function listMyComplexesHandler(c: AppContext) { - const appUserId = c.get('appUserId'); - const complexes = await listMyComplexes(appUserId); + const user = c.get('user'); + const complexes = await listMyComplexes(user.id); return c.json(complexes); } diff --git a/apps/backend/src/modules/complex/services/complex.service.ts b/apps/backend/src/modules/complex/services/complex.service.ts index 4a74015..1782c6c 100644 --- a/apps/backend/src/modules/complex/services/complex.service.ts +++ b/apps/backend/src/modules/complex/services/complex.service.ts @@ -93,9 +93,9 @@ export async function getComplexBySlug(slug: string) { }); } -export async function listMyComplexes(appUserId: string) { +export async function listMyComplexes(userId: string) { const complexUsers = await db.complexUser.findMany({ - where: { userId: appUserId }, + where: { userId }, include: { complex: true, }, diff --git a/apps/backend/src/modules/court/handlers/create-court.handler.ts b/apps/backend/src/modules/court/handlers/create-court.handler.ts index b910522..7856891 100644 --- a/apps/backend/src/modules/court/handlers/create-court.handler.ts +++ b/apps/backend/src/modules/court/handlers/create-court.handler.ts @@ -7,10 +7,10 @@ type ComplexIdParams = { complexId: string }; export async function createCourtHandler(c: AppContext) { const { complexId } = c.req.valid('param' as never) as ComplexIdParams; const payload = c.req.valid('json' as never) as CreateCourtInput; - const appUserId = c.get('appUserId'); + const user = c.get('user'); try { - const court = await createCourt(appUserId, complexId, payload); + const court = await createCourt(user.id, complexId, payload); return c.json(court, 201); } catch (error) { if (error instanceof CourtServiceError) { diff --git a/apps/backend/src/modules/court/handlers/list-courts-by-complex.handler.ts b/apps/backend/src/modules/court/handlers/list-courts-by-complex.handler.ts index c436103..aad374a 100644 --- a/apps/backend/src/modules/court/handlers/list-courts-by-complex.handler.ts +++ b/apps/backend/src/modules/court/handlers/list-courts-by-complex.handler.ts @@ -5,10 +5,10 @@ type ComplexIdParams = { complexId: string }; export async function listCourtsByComplexHandler(c: AppContext) { const { complexId } = c.req.valid('param' as never) as ComplexIdParams; - const appUserId = c.get('appUserId'); + const user = c.get('user'); try { - const courts = await listCourtsByComplex(complexId, appUserId); + const courts = await listCourtsByComplex(complexId, user.id); return c.json(courts); } catch (error) { if (error instanceof CourtServiceError) { diff --git a/apps/backend/src/modules/court/handlers/update-court.handler.ts b/apps/backend/src/modules/court/handlers/update-court.handler.ts index 6ff5784..4e6d957 100644 --- a/apps/backend/src/modules/court/handlers/update-court.handler.ts +++ b/apps/backend/src/modules/court/handlers/update-court.handler.ts @@ -7,10 +7,10 @@ type CourtIdParams = { id: string }; export async function updateCourtHandler(c: AppContext) { const { id } = c.req.valid('param' as never) as CourtIdParams; const payload = c.req.valid('json' as never) as UpdateCourtInput; - const appUserId = c.get('appUserId'); + const user = c.get('user'); try { - const court = await updateCourt(appUserId, id, payload); + const court = await updateCourt(user.id, id, payload); return c.json(court); } catch (error) { if (error instanceof CourtServiceError) { diff --git a/apps/backend/src/modules/court/services/court.service.ts b/apps/backend/src/modules/court/services/court.service.ts index f8b02af..22dbfe8 100644 --- a/apps/backend/src/modules/court/services/court.service.ts +++ b/apps/backend/src/modules/court/services/court.service.ts @@ -61,12 +61,12 @@ function assertAvailabilityRanges( } } -async function ensureComplexAccess(complexId: string, appUserId: string) { +async function ensureComplexAccess(complexId: string, userId: string) { const complexUser = await db.complexUser.findUnique({ where: { complexId_userId: { complexId, - userId: appUserId, + userId, }, }, include: { @@ -137,14 +137,14 @@ async function enforcePlanCourtLimit(complexId: string) { } } -async function getCourtByIdForUser(courtId: string, appUserId: string) { +async function getCourtByIdForUser(courtId: string, userId: string) { return db.court.findFirst({ where: { id: courtId, complex: { users: { some: { - userId: appUserId, + userId, }, }, }, @@ -195,8 +195,8 @@ function mapCourtResponse(court: CourtWithRelations) { }; } -export async function listCourtsByComplex(complexId: string, appUserId: string) { - await ensureComplexAccess(complexId, appUserId); +export async function listCourtsByComplex(complexId: string, userId: string) { + await ensureComplexAccess(complexId, userId); const courts = await db.court.findMany({ where: { complexId }, @@ -218,8 +218,8 @@ export async function listCourtsByComplex(complexId: string, appUserId: string) return courts.map((court) => mapCourtResponse(court)); } -export async function createCourt(appUserId: string, complexId: string, input: CreateCourtInput) { - await ensureComplexAccess(complexId, appUserId); +export async function createCourt(userId: string, complexId: string, input: CreateCourtInput) { + await ensureComplexAccess(complexId, userId); await ensureActiveSport(input.sportId); await enforcePlanCourtLimit(complexId); assertAvailabilityRanges(input.availability); @@ -249,7 +249,7 @@ export async function createCourt(appUserId: string, complexId: string, input: C return court; }); - const court = await getCourtByIdForUser(createdCourt.id, appUserId); + const court = await getCourtByIdForUser(createdCourt.id, userId); if (!court) { throw new CourtServiceError('No se pudo obtener la cancha creada.', 404); @@ -258,8 +258,8 @@ export async function createCourt(appUserId: string, complexId: string, input: C return mapCourtResponse(court); } -export async function updateCourt(appUserId: string, courtId: string, input: UpdateCourtInput) { - const existingCourt = await getCourtByIdForUser(courtId, appUserId); +export async function updateCourt(userId: string, courtId: string, input: UpdateCourtInput) { + const existingCourt = await getCourtByIdForUser(courtId, userId); if (!existingCourt) { throw new CourtServiceError('Cancha no encontrada.', 404); @@ -305,7 +305,7 @@ export async function updateCourt(appUserId: string, courtId: string, input: Upd } }); - const updatedCourt = await getCourtByIdForUser(courtId, appUserId); + const updatedCourt = await getCourtByIdForUser(courtId, userId); if (!updatedCourt) { throw new CourtServiceError('Cancha no encontrada.', 404); diff --git a/apps/backend/src/modules/onboarding/services/onboarding.service.ts b/apps/backend/src/modules/onboarding/services/onboarding.service.ts index a0f857b..f709132 100644 --- a/apps/backend/src/modules/onboarding/services/onboarding.service.ts +++ b/apps/backend/src/modules/onboarding/services/onboarding.service.ts @@ -1,4 +1,5 @@ import { createHash, randomInt } from 'node:crypto'; +import { auth } from '@/lib/auth'; import { sendMail } from '@/lib/mailer'; import { db } from '@/lib/prisma'; import { getSupabaseAdminClient } from '@/lib/supabase-admin'; @@ -10,7 +11,6 @@ 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); @@ -441,7 +441,6 @@ export async function completeOnboarding(input: OnboardingCompleteInput) { const complexSlug = await buildUniqueComplexSlug(input.complexName); const result = await db.$transaction(async (tx) => { - const complex = await tx.complex.create({ data: { id: uuidv7(), diff --git a/apps/backend/src/modules/user/handlers/get-user-profile.handler.ts b/apps/backend/src/modules/user/handlers/get-user-profile.handler.ts index f409544..3dcbf66 100644 --- a/apps/backend/src/modules/user/handlers/get-user-profile.handler.ts +++ b/apps/backend/src/modules/user/handlers/get-user-profile.handler.ts @@ -2,7 +2,7 @@ import { getUserProfile } from '@/modules/user/services/user.service'; import type { AppContext } from '@/types/hono'; export function getUserProfileHandler(c: AppContext) { - const authUser = c.get('authUser'); - const profile = getUserProfile(authUser); + const user = c.get('user'); + const profile = getUserProfile(user); return c.json(profile); } diff --git a/apps/backend/src/modules/user/services/user.service.ts b/apps/backend/src/modules/user/services/user.service.ts index df5923d..c015a7e 100644 --- a/apps/backend/src/modules/user/services/user.service.ts +++ b/apps/backend/src/modules/user/services/user.service.ts @@ -1,23 +1,13 @@ -import type { AuthUser } from '@/types/auth-user'; +import type { User } from '@/lib/auth'; import type { UserProfile } from '@repo/api-contract'; -export function getUserProfile(user: AuthUser): UserProfile { - const fullName = - (typeof user.user_metadata?.full_name === 'string' && user.user_metadata.full_name) || - (typeof user.user_metadata?.name === 'string' && user.user_metadata.name) || - (user.email ?? 'Usuario'); - - const role = (typeof user.app_metadata?.role === 'string' && user.app_metadata.role) || 'member'; - - const avatarUrl = - (typeof user.user_metadata?.avatar_url === 'string' && user.user_metadata.avatar_url) || null; - +export function getUserProfile(user: User): UserProfile { return { id: user.id, - fullName, - email: user.email ?? null, - role, - avatarUrl, - createdAt: user.created_at, + fullName: user.name, + email: user.email, + role: (user as any).role || 'member', + avatarUrl: user.image || null, + createdAt: user.createdAt, }; } diff --git a/apps/backend/src/register-routes.ts b/apps/backend/src/register-routes.ts index 6e65a40..3219085 100644 --- a/apps/backend/src/register-routes.ts +++ b/apps/backend/src/register-routes.ts @@ -1,5 +1,6 @@ import path from 'node:path'; import { adminBookingRoutes } from '@/modules/admin-booking/admin-booking.routes'; +import { authRoutes } from '@/modules/auth/auth.routes'; import { complexRoutes } from '@/modules/complex/complex.routes'; import { courtRoutes } from '@/modules/court/court.routes'; import { onboardingRoutes } from '@/modules/onboarding/onboarding.routes'; @@ -8,14 +9,12 @@ 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) diff --git a/apps/backend/src/types/hono.ts b/apps/backend/src/types/hono.ts index 3c548f3..17fc8c6 100644 --- a/apps/backend/src/types/hono.ts +++ b/apps/backend/src/types/hono.ts @@ -1,9 +1,9 @@ -import type { AuthUser } from '@/types/auth-user'; +import type { Session, User } from '@/lib/auth'; import type { Context } from 'hono'; export type AppVariables = { - authUser: AuthUser; - appUserId: string; + user: User; + session: Session; }; export type AppEnv = { diff --git a/apps/frontend/src/lib/api-client.ts b/apps/frontend/src/lib/api-client.ts index a82232d..93eb15a 100644 --- a/apps/frontend/src/lib/api-client.ts +++ b/apps/frontend/src/lib/api-client.ts @@ -29,7 +29,7 @@ import type { UserProfileResponse, } from '@repo/api-contract'; import axios, { AxiosError } from 'axios'; -import { createAuthClient } from "better-auth/react"; +import { createAuthClient } from 'better-auth/react'; const apiBaseUrl = import.meta.env.VITE_API_BASE_URL?.trim() || @@ -37,9 +37,11 @@ const apiBaseUrl = export const authClient = createAuthClient({ baseURL: apiBaseUrl, + fetchOptions: { + credentials: 'include', + }, }); - export class ApiClientError extends Error { status?: number; details?: unknown; @@ -66,6 +68,7 @@ const handlers: ErrorHandlers = {}; const http = axios.create({ baseURL: apiBaseUrl, + withCredentials: true, headers: { 'Content-Type': 'application/json', }, @@ -285,6 +288,6 @@ export function configureApiClient(nextHandlers: ErrorHandlers) { handlers.onError = nextHandlers.onError; } -export function setApiAccessToken(token: string | null) { +export function setApiAccessToken(_token: string | null) { // accessToken = token; } diff --git a/apps/frontend/src/lib/auth.tsx b/apps/frontend/src/lib/auth.tsx index e4a20c5..51a3b76 100644 --- a/apps/frontend/src/lib/auth.tsx +++ b/apps/frontend/src/lib/auth.tsx @@ -1,14 +1,8 @@ -import { setApiAccessToken } from '@/lib/api-client'; -import { supabase } from '@/lib/supabase'; -import type { Session, User } from '@supabase/supabase-js'; -import { - type PropsWithChildren, - createContext, - useContext, - useEffect, - useMemo, - useState, -} from 'react'; +import { authClient } from '@/lib/api-client'; +import { type PropsWithChildren, createContext, useContext, useMemo } from 'react'; + +export type User = typeof authClient.$Infer.Session.user; +export type Session = typeof authClient.$Infer.Session.session; type SignInParams = { email: string; @@ -48,14 +42,7 @@ const AuthContext = createContext(null); function getDisplayName(user: User | null): string { if (!user) return 'Usuario'; - - const fromMetadata = - user.user_metadata?.name ?? user.user_metadata?.full_name ?? user.user_metadata?.user_name; - - if (typeof fromMetadata === 'string' && fromMetadata.trim().length > 0) { - return fromMetadata.trim(); - } - + if (user.name?.trim()) return user.name.trim(); return user.email ?? 'Usuario'; } @@ -66,47 +53,14 @@ function getInitials(name: string): string { } function getAvatarUrl(user: User | null): string | null { - if (!user) return null; - - const value = user.user_metadata?.avatar_url ?? user.user_metadata?.picture; - return typeof value === 'string' && value.length > 0 ? value : null; + return user?.image || null; } export function AuthProvider({ children }: PropsWithChildren) { - const [session, setSession] = useState(null); - const [user, setUser] = useState(null); - const [loading, setLoading] = useState(true); + const { data, isPending } = authClient.useSession(); - useEffect(() => { - let mounted = true; - - const init = async () => { - const { data } = await supabase.auth.getSession(); - - if (!mounted) return; - - setSession(data.session); - setUser(data.session?.user ?? null); - setApiAccessToken(data.session?.access_token ?? null); - setLoading(false); - }; - - void init(); - - const { - data: { subscription }, - } = supabase.auth.onAuthStateChange((_event, nextSession) => { - setSession(nextSession); - setUser(nextSession?.user ?? null); - setApiAccessToken(nextSession?.access_token ?? null); - setLoading(false); - }); - - return () => { - mounted = false; - subscription.unsubscribe(); - }; - }, []); + const user = data?.user ?? null; + const session = data?.session ?? null; const value = useMemo(() => { const displayName = getDisplayName(user); @@ -116,13 +70,13 @@ export function AuthProvider({ children }: PropsWithChildren) { return { user, session, - loading, + loading: isPending, isAuthenticated: Boolean(user), displayName, initials, avatarUrl, signInWithPassword: async ({ email, password }) => { - const { error } = await supabase.auth.signInWithPassword({ + const { error } = await authClient.signIn.email({ email, password, }); @@ -132,15 +86,10 @@ export function AuthProvider({ children }: PropsWithChildren) { } }, signUp: async ({ email, password, fullName }) => { - const { data, error } = await supabase.auth.signUp({ + const { data: signUpData, error } = await authClient.signUp.email({ email, password, - options: { - data: { - full_name: fullName, - name: fullName, - }, - }, + name: fullName, }); if (error) { @@ -148,15 +97,12 @@ export function AuthProvider({ children }: PropsWithChildren) { } return { - requiresEmailConfirmation: !data.session, + requiresEmailConfirmation: !signUpData?.session, }; }, updateProfile: async ({ fullName }) => { - const { error } = await supabase.auth.updateUser({ - data: { - full_name: fullName, - name: fullName, - }, + const { error } = await authClient.user.update({ + name: fullName, }); if (error) { @@ -164,8 +110,10 @@ export function AuthProvider({ children }: PropsWithChildren) { } }, updatePassword: async ({ password }) => { - const { error } = await supabase.auth.updateUser({ - password, + // Better Auth uses changePassword for authenticated users + const { error } = await authClient.changePassword({ + newPassword: password, + revokeOtherSessions: true, }); if (error) { @@ -173,13 +121,13 @@ export function AuthProvider({ children }: PropsWithChildren) { } }, signOut: async () => { - const { error } = await supabase.auth.signOut(); + const { error } = await authClient.signOut(); if (error) { throw error; } }, }; - }, [loading, session, user]); + }, [isPending, session, user]); return {children}; } diff --git a/apps/frontend/src/lib/supabase.ts b/apps/frontend/src/lib/supabase.ts deleted file mode 100644 index 2e30267..0000000 --- a/apps/frontend/src/lib/supabase.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { createClient } from '@supabase/supabase-js'; - -const supabaseUrl = import.meta.env.VITE_SUPABASE_URL; -const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY; - -if (!supabaseUrl || !supabaseAnonKey) { - throw new Error( - 'Missing Supabase environment variables. Define VITE_SUPABASE_URL and VITE_SUPABASE_ANON_KEY.' - ); -} - -export const supabase = createClient(supabaseUrl, supabaseAnonKey, { - auth: { - autoRefreshToken: true, - persistSession: true, - detectSessionInUrl: true, - }, -}); From 34a24ce6c9d07be8821e7adb7a02b175143d353a Mon Sep 17 00:00:00 2001 From: Jose Selesan Date: Thu, 16 Apr 2026 20:51:53 -0300 Subject: [PATCH 4/4] feat: add user role field and implement Gravatar fallback for user avatars --- .../migration.sql | 2 + apps/backend/src/lib/auth.ts | 3 +- .../src/modules/user/services/user.service.ts | 8 +- apps/frontend/src/lib/auth.tsx | 77 ++++++++++++++++++- 4 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 apps/backend/prisma/migrations/20260416233831_add_role_to_user/migration.sql diff --git a/apps/backend/prisma/migrations/20260416233831_add_role_to_user/migration.sql b/apps/backend/prisma/migrations/20260416233831_add_role_to_user/migration.sql new file mode 100644 index 0000000..e30d4d8 --- /dev/null +++ b/apps/backend/prisma/migrations/20260416233831_add_role_to_user/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "users" ADD COLUMN "role" TEXT NOT NULL DEFAULT 'member'; diff --git a/apps/backend/src/lib/auth.ts b/apps/backend/src/lib/auth.ts index 912f999..14ec802 100644 --- a/apps/backend/src/lib/auth.ts +++ b/apps/backend/src/lib/auth.ts @@ -1,6 +1,5 @@ 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'; @@ -19,7 +18,7 @@ export const auth = betterAuth({ enabled: true, }, trustedOrigins: [process.env.APP_BASE_URL ?? 'http://localhost:5173'], - plugins: [], + plugins: [openAPI()], }); export type Session = typeof auth.$Infer.Session.session; diff --git a/apps/backend/src/modules/user/services/user.service.ts b/apps/backend/src/modules/user/services/user.service.ts index c015a7e..1a9d59e 100644 --- a/apps/backend/src/modules/user/services/user.service.ts +++ b/apps/backend/src/modules/user/services/user.service.ts @@ -1,13 +1,19 @@ +import { createHash } from 'node:crypto'; import type { User } from '@/lib/auth'; import type { UserProfile } from '@repo/api-contract'; +function getGravatarUrl(email: string): string { + const hash = createHash('md5').update(email.trim().toLowerCase()).digest('hex'); + return `https://www.gravatar.com/avatar/${hash}?d=identicon`; +} + export function getUserProfile(user: User): UserProfile { return { id: user.id, fullName: user.name, email: user.email, role: (user as any).role || 'member', - avatarUrl: user.image || null, + avatarUrl: user.image || getGravatarUrl(user.email), createdAt: user.createdAt, }; } diff --git a/apps/frontend/src/lib/auth.tsx b/apps/frontend/src/lib/auth.tsx index 51a3b76..4679ab3 100644 --- a/apps/frontend/src/lib/auth.tsx +++ b/apps/frontend/src/lib/auth.tsx @@ -40,6 +40,80 @@ export type AuthContextValue = { const AuthContext = createContext(null); +/** + * Standard MD5 implementation for Gravatar support + * (Self-contained to avoid dependency issues) + */ +function md5(string: string) { + const k = Array.from({ length: 64 }, (_, i) => Math.floor(Math.abs(Math.sin(i + 1)) * 2 ** 32)); + let a = 0x67452301; + let b = 0xefcdab89; + let c = 0x98badcfe; + let d = 0x10325476; + const s = [ + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, + 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, + 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, + ]; + + const str = unescape(encodeURIComponent(string)); + const msg = new Uint8Array(str.length); + for (let i = 0; i < str.length; i++) msg[i] = str.charCodeAt(i); + + const len = msg.length; + const wordLen = ((len + 8) >> 6) + 1; + const words = new Uint32Array(wordLen * 16); + for (let i = 0; i < len; i++) words[i >> 2] |= msg[i] << ((i % 4) * 8); + words[len >> 2] |= 0x80 << ((len % 4) * 8); + words[wordLen * 16 - 2] = len * 8; + + for (let i = 0; i < words.length; i += 16) { + let [aa, bb, cc, dd] = [a, b, c, d]; + for (let j = 0; j < 64; j++) { + let f: number; + let g: number; + if (j < 16) { + f = (b & c) | (~b & d); + g = j; + } else if (j < 32) { + f = (d & b) | (~d & c); + g = (5 * j + 1) % 16; + } else if (j < 48) { + f = b ^ c ^ d; + g = (3 * j + 5) % 16; + } else { + f = c ^ (b | ~d); + g = (7 * j) % 16; + } + const temp = d; + d = c; + c = b; + b = + (b + + ((a + f + k[j] + words[i + g]) << s[j] | (a + f + k[j] + words[i + g]) >>> (32 - s[j]))) | + 0; + a = temp; + } + a = (a + aa) | 0; + b = (b + bb) | 0; + c = (c + cc) | 0; + d = (d + dd) | 0; + } + + return [a, b, c, d] + .map((v) => + Array.from({ length: 4 }, (_, i) => ((v >> (i * 8)) & 0xff).toString(16).padStart(2, '0')).join( + '' + ) + ) + .join(''); +} + +function getGravatarUrl(email: string): string { + const hash = md5(email.trim().toLowerCase()); + return `https://www.gravatar.com/avatar/${hash}?d=identicon`; +} + function getDisplayName(user: User | null): string { if (!user) return 'Usuario'; if (user.name?.trim()) return user.name.trim(); @@ -53,7 +127,8 @@ function getInitials(name: string): string { } function getAvatarUrl(user: User | null): string | null { - return user?.image || null; + if (!user) return null; + return user.image || getGravatarUrl(user.email); } export function AuthProvider({ children }: PropsWithChildren) {