From 347ff9369952d80b3fe800efae8f5129e4df807c Mon Sep 17 00:00:00 2001 From: jmgasper Date: Fri, 16 Oct 2026 06:18:31 +1100 Subject: [PATCH] PM-6594: Watch challenge forums for registrants and copilots What was broken Registrants and copilots missed new challenge-topic emails and could not manage a challenge-wide watch preference. Root cause Notifications resolved only explicit topic/ancestor watches. Top-level challenge-topic creation also skipped the post-commit notification path. What was changed Resolve default challenge-wide watches from Submitter and Copilot resource assignments. Persist explicit watch/unwatch choices in ChallengeForumWatch, expose authenticated member preference endpoints, and include forum watchers in new-topic/post notifications using the existing visibility and ban policy. Publish top-level challenge starter notifications after commit. Add the migration, regenerate the exported Prisma client, and document deployment. Any added/updated tests Add resource/default-watch and preference authorization tests, new-topic recipient and post-commit tests, and HTTP opt-out/re-watch coverage. Lint and build pass. The normal suite plus moderation database checks passes 181 tests. Running every PostgreSQL suite passes 188 tests and reproduces one pre-existing public-import provenance failure on unchanged origin/develop. All five migrations and empty-forum preference persistence pass locally. --- README.md | 24 +- packages/forums-prisma-client/edge.js | 17 +- .../forums-prisma-client/index-browser.js | 9 + packages/forums-prisma-client/index.d.ts | 1610 +++++++++++++++-- packages/forums-prisma-client/index.js | 17 +- packages/forums-prisma-client/package.json | 2 +- packages/forums-prisma-client/schema.prisma | 13 + .../migration.sql | 10 + prisma/schema.prisma | 13 + .../challenge-forum-watch.controller.ts | 85 + .../challenge-forum-watch.service.spec.ts | 138 ++ src/forums/challenge-forum-watch.service.ts | 121 ++ src/forums/forums-command.service.spec.ts | 45 +- src/forums/forums-command.service.ts | 4 +- ...rums-notification-read.integration.spec.ts | 109 +- .../forums-watch-notification.service.spec.ts | 110 +- .../forums-watch-notification.service.ts | 23 +- src/forums/forums.module.ts | 4 + src/forums/resource-access.service.spec.ts | 44 + src/forums/resource-access.service.ts | 33 + src/forums/topics.controller.ts | 2 +- 21 files changed, 2215 insertions(+), 218 deletions(-) create mode 100644 prisma/migrations/20261016000000_challenge_forum_watch/migration.sql create mode 100644 src/forums/challenge-forum-watch.controller.ts create mode 100644 src/forums/challenge-forum-watch.service.spec.ts create mode 100644 src/forums/challenge-forum-watch.service.ts create mode 100644 src/forums/resource-access.service.spec.ts diff --git a/README.md b/README.md index df1c3af..70e0618 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,9 @@ and post-commit watch notifications. - `PATCH /v6/forums/topics/:topicId` - `DELETE /v6/forums/topics/:topicId` - `POST /v6/forums/topics/:topicId/posts` +- `GET /v6/forums/challenges/:challengeId/watch` +- `PUT /v6/forums/challenges/:challengeId/watch` +- `DELETE /v6/forums/challenges/:challengeId/watch` - `PUT /v6/forums/topics/:topicId/watch` - `DELETE /v6/forums/topics/:topicId/watch` - `PUT /v6/forums/topics/:topicId/read-state` @@ -32,7 +35,7 @@ and post-commit watch notifications. - `PUT /v6/forums/moderation/ip-bans/:ipAddress` - `DELETE /v6/forums/moderation/ip-bans/:ipAddress` -This service includes the forums schema, Prisma client export, topic read workflows, transactional command-side workflows, per-member post reactions, centralized forums authorization and runtime moderation for topics, posts, watches, and explicit read-state updates, plus best-effort watch notification publishing for new posts and successful allowed child-topic starter posts. The policy resolves inherited topic restrictions, challenge access, resource-role/copilot elevation, role matching, ownership, scoped M2M write access, and M2M on-behalf target-member visibility before writes, reads, or notification delivery. Runtime moderation enforces active member bans, trusted exact-IP bans for human request traffic, and locked-topic mutation rules. +This service includes the forums schema, Prisma client export, topic read workflows, transactional command-side workflows, per-member post reactions, centralized forums authorization and runtime moderation for topics, posts, watches, and explicit read-state updates, plus best-effort watch notification publishing for new posts and successful allowed child-topic and top-level challenge starter posts. The policy resolves inherited topic restrictions, challenge access, resource-role/copilot elevation, role matching, ownership, scoped M2M write access, and M2M on-behalf target-member visibility before writes, reads, or notification delivery. Runtime moderation enforces active member bans, trusted exact-IP bans for human request traffic, and locked-topic mutation rules. Topic reads are exposed under `read:forums-topics`. `GET /v6/forums/topics` returns visible non-challenge root topics; `GET /v6/forums/topics/challenges/:challengeId` checks base challenge visibility before returning visible challenge roots; `GET /v6/forums/topics/:topicId/children` requires parent visibility before filtering direct children; and `GET /v6/forums/topics/:topicId` returns topic detail with an embedded post tree. Active member bans and trusted exact-IP bans return 403 before read policy or query work. Topic summaries include `locked`, `lockedBy`, and `lockedAt`; `lockedBy` and `lockedAt` may be null for imported legacy locked topics. Locked topics remain readable for callers that otherwise pass moderation and visibility checks. Detail embeds posts under `read:forums-topics`, orders every top-level and nested sibling list chronologically from oldest to newest, keeps deleted post placeholders with null content, counts only non-deleted posts, derives unread state from `TopicReadState.lastReadAt`, and includes each post's current challenge-resource `authorIsCopilot` projection, shared `thumbsUpCount`/`thumbsDownCount`, and the authenticated member's nullable `viewerReaction`. `read:forums-posts` remains reserved for future post-specific read APIs in v1. @@ -46,9 +49,22 @@ Moderation management is exposed under `/v6/forums/moderation`. Human callers mu Successful `POST /v6/forums/topics/:topicId/posts` commands publish a best-effort watch notification after the post transaction commits. Successful -allowed child-topic `POST /v6/forums/topics` commands publish the same -notification for the created starter post. Top-level topic creation, updates, -deletes, watch mutations, and mark-read commands do not publish notifications. +allowed child-topic and top-level challenge `POST /v6/forums/topics` commands +publish the same notification for the created starter post. General top-level +topic creation, updates, deletes, watch mutations, and mark-read commands do not +publish notifications. + +Challenge forums are watched by default for members with a Submitter or Copilot +resource assignment. Defaults are resolved from current Resources data, so new +registrations and copilot assignments take effect without visiting the forum, +including before its first topic exists. The challenge watch routes return +`{ challengeId, memberId, watching }` for the authenticated human member; PUT and +DELETE persist explicit preferences. DELETE stores an opt-out so later reads or +resource changes cannot silently resubscribe the member. Explicit topic watches +remain independent. Challenge-wide watchers receive new topic and post emails, +subject to the same topic visibility, ban, author exclusion, and deduplication +rules as topic watchers. Deploy the `20261016000000_challenge_forum_watch` database +migration before the API and the Opportunities watch control. Recipient resolution expands watches from the created content topic through all ancestor topics using `TopicClosure`, dedupes by member id, excludes the diff --git a/packages/forums-prisma-client/edge.js b/packages/forums-prisma-client/edge.js index ddd73b2..d89bc07 100644 --- a/packages/forums-prisma-client/edge.js +++ b/packages/forums-prisma-client/edge.js @@ -162,6 +162,14 @@ exports.Prisma.TopicWatchScalarFieldEnum = { createdAt: 'createdAt' }; +exports.Prisma.ChallengeForumWatchScalarFieldEnum = { + challengeId: 'challengeId', + memberId: 'memberId', + watching: 'watching', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +}; + exports.Prisma.TopicReadStateScalarFieldEnum = { topicId: 'topicId', memberId: 'memberId', @@ -233,6 +241,7 @@ exports.Prisma.ModelName = { PostReaction: 'PostReaction', TopicClosure: 'TopicClosure', TopicWatch: 'TopicWatch', + ChallengeForumWatch: 'ChallengeForumWatch', TopicReadState: 'TopicReadState', PublicForumCategory: 'PublicForumCategory', PublicForumRoleMember: 'PublicForumRoleMember', @@ -246,14 +255,14 @@ const config = { "clientVersion": "7.9.0", "engineVersion": "e922089b7d7502aff4249d5da3420f6fa55fc6ad", "activeProvider": "postgresql", - "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n output = \"./generated/client\"\n}\n\ngenerator externalClient {\n provider = \"prisma-client-js\"\n output = \"../packages/forums-prisma-client\"\n binaryTargets = [\"native\", \"debian-openssl-3.0.x\"]\n}\n\ndatasource db {\n provider = \"postgresql\"\n schemas = [\"forums\"]\n}\n\nenum PostReactionType {\n THUMBS_UP\n THUMBS_DOWN\n\n @@schema(\"forums\")\n}\n\nmodel Topic {\n id String @id @default(dbgenerated(\"nanoid()\")) @db.VarChar(14)\n parentTopicId String? @db.VarChar(14)\n challengeId String? @db.VarChar(64)\n roleName String? @db.VarChar(128)\n title String @db.VarChar(255)\n isAnnouncement Boolean @default(false)\n locked Boolean @default(false)\n lockedAt DateTime?\n lockedByMemberId String? @db.VarChar(64)\n authorMemberId String @db.VarChar(64)\n authorHandle String @db.VarChar(128)\n createdAt DateTime @default(now())\n updatedAt DateTime @default(now()) @updatedAt\n deletedAt DateTime?\n deletedByMemberId String? @db.VarChar(64)\n\n parentTopic Topic? @relation(\"TopicChildren\", fields: [parentTopicId], references: [id])\n childTopics Topic[] @relation(\"TopicChildren\")\n posts Post[]\n ancestorClosures TopicClosure[] @relation(\"TopicClosureAncestor\")\n descendantClosures TopicClosure[] @relation(\"TopicClosureDescendant\")\n watches TopicWatch[]\n readStates TopicReadState[]\n\n @@index([parentTopicId])\n @@index([challengeId])\n @@index([roleName])\n @@index([deletedAt])\n @@index([isAnnouncement, createdAt])\n @@schema(\"forums\")\n}\n\nmodel MemberBan {\n id String @id @default(dbgenerated(\"nanoid()\")) @db.VarChar(14)\n memberId String @db.VarChar(64)\n createdAt DateTime @default(now())\n createdByMemberId String? @db.VarChar(64)\n removedAt DateTime?\n removedByMemberId String? @db.VarChar(64)\n\n @@index([memberId])\n @@index([removedAt])\n @@schema(\"forums\")\n}\n\nmodel IpBan {\n id String @id @default(dbgenerated(\"nanoid()\")) @db.VarChar(14)\n ipAddress String @db.VarChar(45)\n createdAt DateTime @default(now())\n createdByMemberId String? @db.VarChar(64)\n removedAt DateTime?\n removedByMemberId String? @db.VarChar(64)\n\n @@index([ipAddress])\n @@index([removedAt])\n @@schema(\"forums\")\n}\n\nmodel Post {\n id String @id @default(dbgenerated(\"nanoid()\")) @db.VarChar(14)\n topicId String @db.VarChar(14)\n parentType String @db.VarChar(16)\n parentId String @db.VarChar(14)\n authorMemberId String @db.VarChar(64)\n authorHandle String @db.VarChar(128)\n content String? @db.Text\n createdAt DateTime @default(now())\n updatedAt DateTime @default(now()) @updatedAt\n deletedAt DateTime?\n deletedByMemberId String? @db.VarChar(64)\n\n topic Topic @relation(fields: [topicId], references: [id], onDelete: Cascade)\n reactions PostReaction[]\n\n @@index([topicId, createdAt])\n @@index([topicId, parentType, parentId])\n @@index([deletedAt])\n @@schema(\"forums\")\n}\n\nmodel PostReaction {\n postId String @db.VarChar(14)\n memberId String @db.VarChar(64)\n reaction PostReactionType\n createdAt DateTime @default(now())\n updatedAt DateTime @default(now()) @updatedAt\n\n post Post @relation(fields: [postId], references: [id], onDelete: Cascade)\n\n @@id([postId, memberId])\n @@index([memberId])\n @@index([postId, reaction])\n @@schema(\"forums\")\n}\n\nmodel TopicClosure {\n ancestorTopicId String @db.VarChar(14)\n descendantTopicId String @db.VarChar(14)\n depth Int\n\n ancestorTopic Topic @relation(\"TopicClosureAncestor\", fields: [ancestorTopicId], references: [id], onDelete: Cascade)\n descendantTopic Topic @relation(\"TopicClosureDescendant\", fields: [descendantTopicId], references: [id], onDelete: Cascade)\n\n @@id([ancestorTopicId, descendantTopicId])\n @@index([ancestorTopicId, depth])\n @@index([descendantTopicId, depth])\n @@schema(\"forums\")\n}\n\nmodel TopicWatch {\n topicId String @db.VarChar(14)\n memberId String @db.VarChar(64)\n createdAt DateTime @default(now())\n\n topic Topic @relation(fields: [topicId], references: [id], onDelete: Cascade)\n\n @@id([topicId, memberId])\n @@index([memberId])\n @@schema(\"forums\")\n}\n\nmodel TopicReadState {\n topicId String @db.VarChar(14)\n memberId String @db.VarChar(64)\n lastReadAt DateTime @default(now())\n updatedAt DateTime @default(now()) @updatedAt\n\n topic Topic @relation(fields: [topicId], references: [id], onDelete: Cascade)\n\n @@id([topicId, memberId])\n @@index([memberId])\n @@index([lastReadAt])\n @@schema(\"forums\")\n}\n\n// Presentation and access rules for imported public category topics only.\nmodel PublicForumCategory {\n topicId String @id @db.VarChar(14)\n description String @default(\"\") @db.Text\n displayAs String @db.VarChar(16)\n sortOrder Int\n readRoles String[]\n createRoles String[]\n replyRoles String[]\n legacyId Int @unique\n legacySlug String @db.Text\n source Json\n\n @@schema(\"forums\")\n}\n\n// Vanilla-only role assignments never grant identity-wide roles.\nmodel PublicForumRoleMember {\n roleName String @db.VarChar(128)\n memberId String @db.VarChar(64)\n\n @@id([roleName, memberId])\n @@index([memberId])\n @@schema(\"forums\")\n}\n\n// Immutable provenance makes imports insert-only and safely repeatable.\nmodel PublicForumImportRecord {\n entityType String @db.VarChar(32)\n sourceId String @db.VarChar(64)\n targetId String @db.VarChar(64)\n sourceHash String @db.VarChar(64)\n targetHash String @db.VarChar(64)\n createdAt DateTime @default(now())\n\n @@id([entityType, sourceId])\n @@unique([entityType, targetId])\n @@schema(\"forums\")\n}\n" + "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n output = \"./generated/client\"\n}\n\ngenerator externalClient {\n provider = \"prisma-client-js\"\n output = \"../packages/forums-prisma-client\"\n binaryTargets = [\"native\", \"debian-openssl-3.0.x\"]\n}\n\ndatasource db {\n provider = \"postgresql\"\n schemas = [\"forums\"]\n}\n\nenum PostReactionType {\n THUMBS_UP\n THUMBS_DOWN\n\n @@schema(\"forums\")\n}\n\nmodel Topic {\n id String @id @default(dbgenerated(\"nanoid()\")) @db.VarChar(14)\n parentTopicId String? @db.VarChar(14)\n challengeId String? @db.VarChar(64)\n roleName String? @db.VarChar(128)\n title String @db.VarChar(255)\n isAnnouncement Boolean @default(false)\n locked Boolean @default(false)\n lockedAt DateTime?\n lockedByMemberId String? @db.VarChar(64)\n authorMemberId String @db.VarChar(64)\n authorHandle String @db.VarChar(128)\n createdAt DateTime @default(now())\n updatedAt DateTime @default(now()) @updatedAt\n deletedAt DateTime?\n deletedByMemberId String? @db.VarChar(64)\n\n parentTopic Topic? @relation(\"TopicChildren\", fields: [parentTopicId], references: [id])\n childTopics Topic[] @relation(\"TopicChildren\")\n posts Post[]\n ancestorClosures TopicClosure[] @relation(\"TopicClosureAncestor\")\n descendantClosures TopicClosure[] @relation(\"TopicClosureDescendant\")\n watches TopicWatch[]\n readStates TopicReadState[]\n\n @@index([parentTopicId])\n @@index([challengeId])\n @@index([roleName])\n @@index([deletedAt])\n @@index([isAnnouncement, createdAt])\n @@schema(\"forums\")\n}\n\nmodel MemberBan {\n id String @id @default(dbgenerated(\"nanoid()\")) @db.VarChar(14)\n memberId String @db.VarChar(64)\n createdAt DateTime @default(now())\n createdByMemberId String? @db.VarChar(64)\n removedAt DateTime?\n removedByMemberId String? @db.VarChar(64)\n\n @@index([memberId])\n @@index([removedAt])\n @@schema(\"forums\")\n}\n\nmodel IpBan {\n id String @id @default(dbgenerated(\"nanoid()\")) @db.VarChar(14)\n ipAddress String @db.VarChar(45)\n createdAt DateTime @default(now())\n createdByMemberId String? @db.VarChar(64)\n removedAt DateTime?\n removedByMemberId String? @db.VarChar(64)\n\n @@index([ipAddress])\n @@index([removedAt])\n @@schema(\"forums\")\n}\n\nmodel Post {\n id String @id @default(dbgenerated(\"nanoid()\")) @db.VarChar(14)\n topicId String @db.VarChar(14)\n parentType String @db.VarChar(16)\n parentId String @db.VarChar(14)\n authorMemberId String @db.VarChar(64)\n authorHandle String @db.VarChar(128)\n content String? @db.Text\n createdAt DateTime @default(now())\n updatedAt DateTime @default(now()) @updatedAt\n deletedAt DateTime?\n deletedByMemberId String? @db.VarChar(64)\n\n topic Topic @relation(fields: [topicId], references: [id], onDelete: Cascade)\n reactions PostReaction[]\n\n @@index([topicId, createdAt])\n @@index([topicId, parentType, parentId])\n @@index([deletedAt])\n @@schema(\"forums\")\n}\n\nmodel PostReaction {\n postId String @db.VarChar(14)\n memberId String @db.VarChar(64)\n reaction PostReactionType\n createdAt DateTime @default(now())\n updatedAt DateTime @default(now()) @updatedAt\n\n post Post @relation(fields: [postId], references: [id], onDelete: Cascade)\n\n @@id([postId, memberId])\n @@index([memberId])\n @@index([postId, reaction])\n @@schema(\"forums\")\n}\n\nmodel TopicClosure {\n ancestorTopicId String @db.VarChar(14)\n descendantTopicId String @db.VarChar(14)\n depth Int\n\n ancestorTopic Topic @relation(\"TopicClosureAncestor\", fields: [ancestorTopicId], references: [id], onDelete: Cascade)\n descendantTopic Topic @relation(\"TopicClosureDescendant\", fields: [descendantTopicId], references: [id], onDelete: Cascade)\n\n @@id([ancestorTopicId, descendantTopicId])\n @@index([ancestorTopicId, depth])\n @@index([descendantTopicId, depth])\n @@schema(\"forums\")\n}\n\nmodel TopicWatch {\n topicId String @db.VarChar(14)\n memberId String @db.VarChar(64)\n createdAt DateTime @default(now())\n\n topic Topic @relation(fields: [topicId], references: [id], onDelete: Cascade)\n\n @@id([topicId, memberId])\n @@index([memberId])\n @@schema(\"forums\")\n}\n\n// Explicit challenge-wide preferences override resource-based default watches.\nmodel ChallengeForumWatch {\n challengeId String @db.VarChar(64)\n memberId String @db.VarChar(64)\n watching Boolean\n createdAt DateTime @default(now())\n updatedAt DateTime @default(now()) @updatedAt\n\n @@id([challengeId, memberId])\n @@index([memberId])\n @@schema(\"forums\")\n}\n\nmodel TopicReadState {\n topicId String @db.VarChar(14)\n memberId String @db.VarChar(64)\n lastReadAt DateTime @default(now())\n updatedAt DateTime @default(now()) @updatedAt\n\n topic Topic @relation(fields: [topicId], references: [id], onDelete: Cascade)\n\n @@id([topicId, memberId])\n @@index([memberId])\n @@index([lastReadAt])\n @@schema(\"forums\")\n}\n\n// Presentation and access rules for imported public category topics only.\nmodel PublicForumCategory {\n topicId String @id @db.VarChar(14)\n description String @default(\"\") @db.Text\n displayAs String @db.VarChar(16)\n sortOrder Int\n readRoles String[]\n createRoles String[]\n replyRoles String[]\n legacyId Int @unique\n legacySlug String @db.Text\n source Json\n\n @@schema(\"forums\")\n}\n\n// Vanilla-only role assignments never grant identity-wide roles.\nmodel PublicForumRoleMember {\n roleName String @db.VarChar(128)\n memberId String @db.VarChar(64)\n\n @@id([roleName, memberId])\n @@index([memberId])\n @@schema(\"forums\")\n}\n\n// Immutable provenance makes imports insert-only and safely repeatable.\nmodel PublicForumImportRecord {\n entityType String @db.VarChar(32)\n sourceId String @db.VarChar(64)\n targetId String @db.VarChar(64)\n sourceHash String @db.VarChar(64)\n targetHash String @db.VarChar(64)\n createdAt DateTime @default(now())\n\n @@id([entityType, sourceId])\n @@unique([entityType, targetId])\n @@schema(\"forums\")\n}\n" } -config.runtimeDataModel = JSON.parse("{\"models\":{\"Topic\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentTopicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"roleName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isAnnouncement\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"locked\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"lockedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"lockedByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"authorMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"authorHandle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentTopic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicChildren\"},{\"name\":\"childTopics\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicChildren\"},{\"name\":\"posts\",\"kind\":\"object\",\"type\":\"Post\",\"relationName\":\"PostToTopic\"},{\"name\":\"ancestorClosures\",\"kind\":\"object\",\"type\":\"TopicClosure\",\"relationName\":\"TopicClosureAncestor\"},{\"name\":\"descendantClosures\",\"kind\":\"object\",\"type\":\"TopicClosure\",\"relationName\":\"TopicClosureDescendant\"},{\"name\":\"watches\",\"kind\":\"object\",\"type\":\"TopicWatch\",\"relationName\":\"TopicToTopicWatch\"},{\"name\":\"readStates\",\"kind\":\"object\",\"type\":\"TopicReadState\",\"relationName\":\"TopicToTopicReadState\"}],\"dbName\":null},\"MemberBan\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"removedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"removedByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"IpBan\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"removedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"removedByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"Post\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"topicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"authorMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"authorHandle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"topic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"PostToTopic\"},{\"name\":\"reactions\",\"kind\":\"object\",\"type\":\"PostReaction\",\"relationName\":\"PostToPostReaction\"}],\"dbName\":null},\"PostReaction\":{\"fields\":[{\"name\":\"postId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"reaction\",\"kind\":\"enum\",\"type\":\"PostReactionType\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"post\",\"kind\":\"object\",\"type\":\"Post\",\"relationName\":\"PostToPostReaction\"}],\"dbName\":null},\"TopicClosure\":{\"fields\":[{\"name\":\"ancestorTopicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"descendantTopicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"depth\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"ancestorTopic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicClosureAncestor\"},{\"name\":\"descendantTopic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicClosureDescendant\"}],\"dbName\":null},\"TopicWatch\":{\"fields\":[{\"name\":\"topicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"topic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicToTopicWatch\"}],\"dbName\":null},\"TopicReadState\":{\"fields\":[{\"name\":\"topicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastReadAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"topic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicToTopicReadState\"}],\"dbName\":null},\"PublicForumCategory\":{\"fields\":[{\"name\":\"topicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"displayAs\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"readRoles\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createRoles\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"replyRoles\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"legacySlug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"Json\"}],\"dbName\":null},\"PublicForumRoleMember\":{\"fields\":[{\"name\":\"roleName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"PublicForumImportRecord\":{\"fields\":[{\"name\":\"entityType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sourceId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"targetId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sourceHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"targetHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"Topic\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentTopicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"roleName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isAnnouncement\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"locked\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"lockedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"lockedByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"authorMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"authorHandle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentTopic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicChildren\"},{\"name\":\"childTopics\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicChildren\"},{\"name\":\"posts\",\"kind\":\"object\",\"type\":\"Post\",\"relationName\":\"PostToTopic\"},{\"name\":\"ancestorClosures\",\"kind\":\"object\",\"type\":\"TopicClosure\",\"relationName\":\"TopicClosureAncestor\"},{\"name\":\"descendantClosures\",\"kind\":\"object\",\"type\":\"TopicClosure\",\"relationName\":\"TopicClosureDescendant\"},{\"name\":\"watches\",\"kind\":\"object\",\"type\":\"TopicWatch\",\"relationName\":\"TopicToTopicWatch\"},{\"name\":\"readStates\",\"kind\":\"object\",\"type\":\"TopicReadState\",\"relationName\":\"TopicToTopicReadState\"}],\"dbName\":null},\"MemberBan\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"removedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"removedByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"IpBan\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"removedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"removedByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"Post\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"topicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"authorMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"authorHandle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"topic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"PostToTopic\"},{\"name\":\"reactions\",\"kind\":\"object\",\"type\":\"PostReaction\",\"relationName\":\"PostToPostReaction\"}],\"dbName\":null},\"PostReaction\":{\"fields\":[{\"name\":\"postId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"reaction\",\"kind\":\"enum\",\"type\":\"PostReactionType\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"post\",\"kind\":\"object\",\"type\":\"Post\",\"relationName\":\"PostToPostReaction\"}],\"dbName\":null},\"TopicClosure\":{\"fields\":[{\"name\":\"ancestorTopicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"descendantTopicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"depth\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"ancestorTopic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicClosureAncestor\"},{\"name\":\"descendantTopic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicClosureDescendant\"}],\"dbName\":null},\"TopicWatch\":{\"fields\":[{\"name\":\"topicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"topic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicToTopicWatch\"}],\"dbName\":null},\"ChallengeForumWatch\":{\"fields\":[{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"watching\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"TopicReadState\":{\"fields\":[{\"name\":\"topicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastReadAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"topic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicToTopicReadState\"}],\"dbName\":null},\"PublicForumCategory\":{\"fields\":[{\"name\":\"topicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"displayAs\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"readRoles\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createRoles\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"replyRoles\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"legacySlug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"Json\"}],\"dbName\":null},\"PublicForumRoleMember\":{\"fields\":[{\"name\":\"roleName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"PublicForumImportRecord\":{\"fields\":[{\"name\":\"entityType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sourceId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"targetId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sourceHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"targetHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.parameterizationSchema = { - strings: JSON.parse("[\"where\",\"parentTopic\",\"orderBy\",\"cursor\",\"childTopics\",\"topic\",\"post\",\"reactions\",\"_count\",\"posts\",\"ancestorTopic\",\"descendantTopic\",\"ancestorClosures\",\"descendantClosures\",\"watches\",\"readStates\",\"Topic.findUnique\",\"Topic.findUniqueOrThrow\",\"Topic.findFirst\",\"Topic.findFirstOrThrow\",\"Topic.findMany\",\"data\",\"Topic.createOne\",\"Topic.createMany\",\"Topic.createManyAndReturn\",\"Topic.updateOne\",\"Topic.updateMany\",\"Topic.updateManyAndReturn\",\"create\",\"update\",\"Topic.upsertOne\",\"Topic.deleteOne\",\"Topic.deleteMany\",\"having\",\"_min\",\"_max\",\"Topic.groupBy\",\"Topic.aggregate\",\"MemberBan.findUnique\",\"MemberBan.findUniqueOrThrow\",\"MemberBan.findFirst\",\"MemberBan.findFirstOrThrow\",\"MemberBan.findMany\",\"MemberBan.createOne\",\"MemberBan.createMany\",\"MemberBan.createManyAndReturn\",\"MemberBan.updateOne\",\"MemberBan.updateMany\",\"MemberBan.updateManyAndReturn\",\"MemberBan.upsertOne\",\"MemberBan.deleteOne\",\"MemberBan.deleteMany\",\"MemberBan.groupBy\",\"MemberBan.aggregate\",\"IpBan.findUnique\",\"IpBan.findUniqueOrThrow\",\"IpBan.findFirst\",\"IpBan.findFirstOrThrow\",\"IpBan.findMany\",\"IpBan.createOne\",\"IpBan.createMany\",\"IpBan.createManyAndReturn\",\"IpBan.updateOne\",\"IpBan.updateMany\",\"IpBan.updateManyAndReturn\",\"IpBan.upsertOne\",\"IpBan.deleteOne\",\"IpBan.deleteMany\",\"IpBan.groupBy\",\"IpBan.aggregate\",\"Post.findUnique\",\"Post.findUniqueOrThrow\",\"Post.findFirst\",\"Post.findFirstOrThrow\",\"Post.findMany\",\"Post.createOne\",\"Post.createMany\",\"Post.createManyAndReturn\",\"Post.updateOne\",\"Post.updateMany\",\"Post.updateManyAndReturn\",\"Post.upsertOne\",\"Post.deleteOne\",\"Post.deleteMany\",\"Post.groupBy\",\"Post.aggregate\",\"PostReaction.findUnique\",\"PostReaction.findUniqueOrThrow\",\"PostReaction.findFirst\",\"PostReaction.findFirstOrThrow\",\"PostReaction.findMany\",\"PostReaction.createOne\",\"PostReaction.createMany\",\"PostReaction.createManyAndReturn\",\"PostReaction.updateOne\",\"PostReaction.updateMany\",\"PostReaction.updateManyAndReturn\",\"PostReaction.upsertOne\",\"PostReaction.deleteOne\",\"PostReaction.deleteMany\",\"PostReaction.groupBy\",\"PostReaction.aggregate\",\"TopicClosure.findUnique\",\"TopicClosure.findUniqueOrThrow\",\"TopicClosure.findFirst\",\"TopicClosure.findFirstOrThrow\",\"TopicClosure.findMany\",\"TopicClosure.createOne\",\"TopicClosure.createMany\",\"TopicClosure.createManyAndReturn\",\"TopicClosure.updateOne\",\"TopicClosure.updateMany\",\"TopicClosure.updateManyAndReturn\",\"TopicClosure.upsertOne\",\"TopicClosure.deleteOne\",\"TopicClosure.deleteMany\",\"_avg\",\"_sum\",\"TopicClosure.groupBy\",\"TopicClosure.aggregate\",\"TopicWatch.findUnique\",\"TopicWatch.findUniqueOrThrow\",\"TopicWatch.findFirst\",\"TopicWatch.findFirstOrThrow\",\"TopicWatch.findMany\",\"TopicWatch.createOne\",\"TopicWatch.createMany\",\"TopicWatch.createManyAndReturn\",\"TopicWatch.updateOne\",\"TopicWatch.updateMany\",\"TopicWatch.updateManyAndReturn\",\"TopicWatch.upsertOne\",\"TopicWatch.deleteOne\",\"TopicWatch.deleteMany\",\"TopicWatch.groupBy\",\"TopicWatch.aggregate\",\"TopicReadState.findUnique\",\"TopicReadState.findUniqueOrThrow\",\"TopicReadState.findFirst\",\"TopicReadState.findFirstOrThrow\",\"TopicReadState.findMany\",\"TopicReadState.createOne\",\"TopicReadState.createMany\",\"TopicReadState.createManyAndReturn\",\"TopicReadState.updateOne\",\"TopicReadState.updateMany\",\"TopicReadState.updateManyAndReturn\",\"TopicReadState.upsertOne\",\"TopicReadState.deleteOne\",\"TopicReadState.deleteMany\",\"TopicReadState.groupBy\",\"TopicReadState.aggregate\",\"PublicForumCategory.findUnique\",\"PublicForumCategory.findUniqueOrThrow\",\"PublicForumCategory.findFirst\",\"PublicForumCategory.findFirstOrThrow\",\"PublicForumCategory.findMany\",\"PublicForumCategory.createOne\",\"PublicForumCategory.createMany\",\"PublicForumCategory.createManyAndReturn\",\"PublicForumCategory.updateOne\",\"PublicForumCategory.updateMany\",\"PublicForumCategory.updateManyAndReturn\",\"PublicForumCategory.upsertOne\",\"PublicForumCategory.deleteOne\",\"PublicForumCategory.deleteMany\",\"PublicForumCategory.groupBy\",\"PublicForumCategory.aggregate\",\"PublicForumRoleMember.findUnique\",\"PublicForumRoleMember.findUniqueOrThrow\",\"PublicForumRoleMember.findFirst\",\"PublicForumRoleMember.findFirstOrThrow\",\"PublicForumRoleMember.findMany\",\"PublicForumRoleMember.createOne\",\"PublicForumRoleMember.createMany\",\"PublicForumRoleMember.createManyAndReturn\",\"PublicForumRoleMember.updateOne\",\"PublicForumRoleMember.updateMany\",\"PublicForumRoleMember.updateManyAndReturn\",\"PublicForumRoleMember.upsertOne\",\"PublicForumRoleMember.deleteOne\",\"PublicForumRoleMember.deleteMany\",\"PublicForumRoleMember.groupBy\",\"PublicForumRoleMember.aggregate\",\"PublicForumImportRecord.findUnique\",\"PublicForumImportRecord.findUniqueOrThrow\",\"PublicForumImportRecord.findFirst\",\"PublicForumImportRecord.findFirstOrThrow\",\"PublicForumImportRecord.findMany\",\"PublicForumImportRecord.createOne\",\"PublicForumImportRecord.createMany\",\"PublicForumImportRecord.createManyAndReturn\",\"PublicForumImportRecord.updateOne\",\"PublicForumImportRecord.updateMany\",\"PublicForumImportRecord.updateManyAndReturn\",\"PublicForumImportRecord.upsertOne\",\"PublicForumImportRecord.deleteOne\",\"PublicForumImportRecord.deleteMany\",\"PublicForumImportRecord.groupBy\",\"PublicForumImportRecord.aggregate\",\"AND\",\"OR\",\"NOT\",\"entityType\",\"sourceId\",\"targetId\",\"sourceHash\",\"targetHash\",\"createdAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"contains\",\"startsWith\",\"endsWith\",\"entityType_targetId\",\"entityType_sourceId\",\"roleName\",\"memberId\",\"roleName_memberId\",\"topicId\",\"description\",\"displayAs\",\"sortOrder\",\"readRoles\",\"createRoles\",\"replyRoles\",\"legacyId\",\"legacySlug\",\"source\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"has\",\"hasEvery\",\"hasSome\",\"lastReadAt\",\"updatedAt\",\"ancestorTopicId\",\"descendantTopicId\",\"depth\",\"postId\",\"PostReactionType\",\"reaction\",\"id\",\"parentType\",\"parentId\",\"authorMemberId\",\"authorHandle\",\"content\",\"deletedAt\",\"deletedByMemberId\",\"ipAddress\",\"createdByMemberId\",\"removedAt\",\"removedByMemberId\",\"parentTopicId\",\"challengeId\",\"title\",\"isAnnouncement\",\"locked\",\"lockedAt\",\"lockedByMemberId\",\"topicId_memberId\",\"ancestorTopicId_descendantTopicId\",\"postId_memberId\",\"every\",\"some\",\"none\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"push\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), - graph: "vgRfsAEZAQAA5wIAIAQAAOgCACAJAADpAgAgDAAA6gIAIA0AAOoCACAOAADrAgAgDwAA7AIAIMgBAADlAgAwyQEAAAMAEMoBAADlAgAw0AFAAK8CACHeAQEA0AIAIfUBQACvAgAh_AEBAAAAAf8BAQCuAgAhgAIBAK4CACGCAkAA0QIAIYMCAQDQAgAhiAIBANACACGJAgEA0AIAIYoCAQCuAgAhiwIgAOYCACGMAiAA5gIAIY0CQADRAgAhjgIBANACACEBAAAAAQAgGQEAAOcCACAEAADoAgAgCQAA6QIAIAwAAOoCACANAADqAgAgDgAA6wIAIA8AAOwCACDIAQAA5QIAMMkBAAADABDKAQAA5QIAMNABQACvAgAh3gEBANACACH1AUAArwIAIfwBAQCuAgAh_wEBAK4CACGAAgEArgIAIYICQADRAgAhgwIBANACACGIAgEA0AIAIYkCAQDQAgAhigIBAK4CACGLAiAA5gIAIYwCIADmAgAhjQJAANECACGOAgEA0AIAIQEAAAADACAOAQAAjQQAIAQAAJAEACAJAACRBAAgDAAAkgQAIA0AAJIEACAOAACTBAAgDwAAlAQAIN4BAACaAwAgggIAAJoDACCDAgAAmgMAIIgCAACaAwAgiQIAAJoDACCNAgAAmgMAII4CAACaAwAgAwAAAAMAIAIAAAUAMAMAAAEAIBAFAADaAgAgBwAA5AIAIMgBAADjAgAwyQEAAAcAEMoBAADjAgAw0AFAAK8CACHhAQEArgIAIfUBQACvAgAh_AEBAK4CACH9AQEArgIAIf4BAQCuAgAh_wEBAK4CACGAAgEArgIAIYECAQDQAgAhggJAANECACGDAgEA0AIAIQUFAACNBAAgBwAAjwQAIIECAACaAwAgggIAAJoDACCDAgAAmgMAIBAFAADaAgAgBwAA5AIAIMgBAADjAgAwyQEAAAcAEMoBAADjAgAw0AFAAK8CACHhAQEArgIAIfUBQACvAgAh_AEBAAAAAf0BAQCuAgAh_gEBAK4CACH_AQEArgIAIYACAQCuAgAhgQIBANACACGCAkAA0QIAIYMCAQDQAgAhAwAAAAcAIAIAAAgAMAMAAAkAIAkGAADiAgAgyAEAAOACADDJAQAACwAQygEAAOACADDQAUAArwIAId8BAQCuAgAh9QFAAK8CACH5AQEArgIAIfsBAADhAvsBIgEGAACOBAAgCgYAAOICACDIAQAA4AIAMMkBAAALABDKAQAA4AIAMNABQACvAgAh3wEBAK4CACH1AUAArwIAIfkBAQCuAgAh-wEAAOEC-wEikQIAAN8CACADAAAACwAgAgAADAAwAwAADQAgAQAAAAsAIAgKAADaAgAgCwAA2gIAIMgBAADeAgAwyQEAABAAEMoBAADeAgAw9gEBAK4CACH3AQEArgIAIfgBAgC9AgAhAgoAAI0EACALAACNBAAgCQoAANoCACALAADaAgAgyAEAAN4CADDJAQAAEAAQygEAAN4CADD2AQEArgIAIfcBAQCuAgAh-AECAL0CACGQAgAA3QIAIAMAAAAQACACAAARADADAAASACADAAAAEAAgAgAAEQAwAwAAEgAgBwUAANoCACDIAQAA3AIAMMkBAAAVABDKAQAA3AIAMNABQACvAgAh3wEBAK4CACHhAQEArgIAIQEFAACNBAAgCAUAANoCACDIAQAA3AIAMMkBAAAVABDKAQAA3AIAMNABQACvAgAh3wEBAK4CACHhAQEArgIAIY8CAADbAgAgAwAAABUAIAIAABYAMAMAABcAIAgFAADaAgAgyAEAANkCADDJAQAAGQAQygEAANkCADDfAQEArgIAIeEBAQCuAgAh9AFAAK8CACH1AUAArwIAIQEFAACNBAAgCQUAANoCACDIAQAA2QIAMMkBAAAZABDKAQAA2QIAMN8BAQCuAgAh4QEBAK4CACH0AUAArwIAIfUBQACvAgAhjwIAANgCACADAAAAGQAgAgAAGgAwAwAAGwAgAQAAAAMAIAEAAAAHACABAAAAEAAgAQAAABAAIAEAAAAVACABAAAAGQAgAQAAAAEAIAMAAAADACACAAAFADADAAABACADAAAAAwAgAgAABQAwAwAAAQAgAwAAAAMAIAIAAAUAMAMAAAEAIBYBAACMBAAgBAAAhgQAIAkAAIcEACAMAACIBAAgDQAAiQQAIA4AAIoEACAPAACLBAAg0AFAAAAAAd4BAQAAAAH1AUAAAAAB_AEBAAAAAf8BAQAAAAGAAgEAAAABggJAAAAAAYMCAQAAAAGIAgEAAAABiQIBAAAAAYoCAQAAAAGLAiAAAAABjAIgAAAAAY0CQAAAAAGOAgEAAAABARUAACcAIA_QAUAAAAAB3gEBAAAAAfUBQAAAAAH8AQEAAAAB_wEBAAAAAYACAQAAAAGCAkAAAAABgwIBAAAAAYgCAQAAAAGJAgEAAAABigIBAAAAAYsCIAAAAAGMAiAAAAABjQJAAAAAAY4CAQAAAAEBFQAAKQAwARUAACkAMAEAAAADACAWAQAAugMAIAQAALsDACAJAAC8AwAgDAAAvQMAIA0AAL4DACAOAAC_AwAgDwAAwAMAINABQADxAgAh3gEBAJ4DACH1AUAA8QIAIfwBAQDwAgAh_wEBAPACACGAAgEA8AIAIYICQACfAwAhgwIBAJ4DACGIAgEAngMAIYkCAQCeAwAhigIBAPACACGLAiAAuQMAIYwCIAC5AwAhjQJAAJ8DACGOAgEAngMAIQIAAAABACAVAAAtACAP0AFAAPECACHeAQEAngMAIfUBQADxAgAh_AEBAPACACH_AQEA8AIAIYACAQDwAgAhggJAAJ8DACGDAgEAngMAIYgCAQCeAwAhiQIBAJ4DACGKAgEA8AIAIYsCIAC5AwAhjAIgALkDACGNAkAAnwMAIY4CAQCeAwAhAgAAAAMAIBUAAC8AIAIAAAADACAVAAAvACABAAAAAwAgAwAAAAEAIBwAACcAIB0AAC0AIAEAAAABACABAAAAAwAgCggAALYDACAiAAC4AwAgIwAAtwMAIN4BAACaAwAgggIAAJoDACCDAgAAmgMAIIgCAACaAwAgiQIAAJoDACCNAgAAmgMAII4CAACaAwAgEsgBAADUAgAwyQEAADcAEMoBAADUAgAw0AFAAKcCACHeAQEAxwIAIfUBQACnAgAh_AEBAKYCACH_AQEApgIAIYACAQCmAgAhggJAAMgCACGDAgEAxwIAIYgCAQDHAgAhiQIBAMcCACGKAgEApgIAIYsCIADVAgAhjAIgANUCACGNAkAAyAIAIY4CAQDHAgAhAwAAAAMAIAIAADYAMCEAADcAIAMAAAADACACAAAFADADAAABACAJyAEAANMCADDJAQAAPQAQygEAANMCADDQAUAArwIAId8BAQCuAgAh_AEBAAAAAYUCAQDQAgAhhgJAANECACGHAgEA0AIAIQEAAAA6ACABAAAAOgAgCcgBAADTAgAwyQEAAD0AEMoBAADTAgAw0AFAAK8CACHfAQEArgIAIfwBAQCuAgAhhQIBANACACGGAkAA0QIAIYcCAQDQAgAhA4UCAACaAwAghgIAAJoDACCHAgAAmgMAIAMAAAA9ACACAAA-ADADAAA6ACADAAAAPQAgAgAAPgAwAwAAOgAgAwAAAD0AIAIAAD4AMAMAADoAIAbQAUAAAAAB3wEBAAAAAfwBAQAAAAGFAgEAAAABhgJAAAAAAYcCAQAAAAEBFQAAQgAgBtABQAAAAAHfAQEAAAAB_AEBAAAAAYUCAQAAAAGGAkAAAAABhwIBAAAAAQEVAABEADABFQAARAAwBtABQADxAgAh3wEBAPACACH8AQEA8AIAIYUCAQCeAwAhhgJAAJ8DACGHAgEAngMAIQIAAAA6ACAVAABHACAG0AFAAPECACHfAQEA8AIAIfwBAQDwAgAhhQIBAJ4DACGGAkAAnwMAIYcCAQCeAwAhAgAAAD0AIBUAAEkAIAIAAAA9ACAVAABJACADAAAAOgAgHAAAQgAgHQAARwAgAQAAADoAIAEAAAA9ACAGCAAAswMAICIAALUDACAjAAC0AwAghQIAAJoDACCGAgAAmgMAIIcCAACaAwAgCcgBAADSAgAwyQEAAFAAEMoBAADSAgAw0AFAAKcCACHfAQEApgIAIfwBAQCmAgAhhQIBAMcCACGGAkAAyAIAIYcCAQDHAgAhAwAAAD0AIAIAAE8AMCEAAFAAIAMAAAA9ACACAAA-ADADAAA6ACAJyAEAAM8CADDJAQAAVgAQygEAAM8CADDQAUAArwIAIfwBAQAAAAGEAgEArgIAIYUCAQDQAgAhhgJAANECACGHAgEA0AIAIQEAAABTACABAAAAUwAgCcgBAADPAgAwyQEAAFYAEMoBAADPAgAw0AFAAK8CACH8AQEArgIAIYQCAQCuAgAhhQIBANACACGGAkAA0QIAIYcCAQDQAgAhA4UCAACaAwAghgIAAJoDACCHAgAAmgMAIAMAAABWACACAABXADADAABTACADAAAAVgAgAgAAVwAwAwAAUwAgAwAAAFYAIAIAAFcAMAMAAFMAIAbQAUAAAAAB_AEBAAAAAYQCAQAAAAGFAgEAAAABhgJAAAAAAYcCAQAAAAEBFQAAWwAgBtABQAAAAAH8AQEAAAABhAIBAAAAAYUCAQAAAAGGAkAAAAABhwIBAAAAAQEVAABdADABFQAAXQAwBtABQADxAgAh_AEBAPACACGEAgEA8AIAIYUCAQCeAwAhhgJAAJ8DACGHAgEAngMAIQIAAABTACAVAABgACAG0AFAAPECACH8AQEA8AIAIYQCAQDwAgAhhQIBAJ4DACGGAkAAnwMAIYcCAQCeAwAhAgAAAFYAIBUAAGIAIAIAAABWACAVAABiACADAAAAUwAgHAAAWwAgHQAAYAAgAQAAAFMAIAEAAABWACAGCAAAsAMAICIAALIDACAjAACxAwAghQIAAJoDACCGAgAAmgMAIIcCAACaAwAgCcgBAADOAgAwyQEAAGkAEMoBAADOAgAw0AFAAKcCACH8AQEApgIAIYQCAQCmAgAhhQIBAMcCACGGAkAAyAIAIYcCAQDHAgAhAwAAAFYAIAIAAGgAMCEAAGkAIAMAAABWACACAABXADADAABTACABAAAACQAgAQAAAAkAIAMAAAAHACACAAAIADADAAAJACADAAAABwAgAgAACAAwAwAACQAgAwAAAAcAIAIAAAgAMAMAAAkAIA0FAACuAwAgBwAArwMAINABQAAAAAHhAQEAAAAB9QFAAAAAAfwBAQAAAAH9AQEAAAAB_gEBAAAAAf8BAQAAAAGAAgEAAAABgQIBAAAAAYICQAAAAAGDAgEAAAABARUAAHEAIAvQAUAAAAAB4QEBAAAAAfUBQAAAAAH8AQEAAAAB_QEBAAAAAf4BAQAAAAH_AQEAAAABgAIBAAAAAYECAQAAAAGCAkAAAAABgwIBAAAAAQEVAABzADABFQAAcwAwDQUAAKADACAHAAChAwAg0AFAAPECACHhAQEA8AIAIfUBQADxAgAh_AEBAPACACH9AQEA8AIAIf4BAQDwAgAh_wEBAPACACGAAgEA8AIAIYECAQCeAwAhggJAAJ8DACGDAgEAngMAIQIAAAAJACAVAAB2ACAL0AFAAPECACHhAQEA8AIAIfUBQADxAgAh_AEBAPACACH9AQEA8AIAIf4BAQDwAgAh_wEBAPACACGAAgEA8AIAIYECAQCeAwAhggJAAJ8DACGDAgEAngMAIQIAAAAHACAVAAB4ACACAAAABwAgFQAAeAAgAwAAAAkAIBwAAHEAIB0AAHYAIAEAAAAJACABAAAABwAgBggAAJsDACAiAACdAwAgIwAAnAMAIIECAACaAwAgggIAAJoDACCDAgAAmgMAIA7IAQAAxgIAMMkBAAB_ABDKAQAAxgIAMNABQACnAgAh4QEBAKYCACH1AUAApwIAIfwBAQCmAgAh_QEBAKYCACH-AQEApgIAIf8BAQCmAgAhgAIBAKYCACGBAgEAxwIAIYICQADIAgAhgwIBAMcCACEDAAAABwAgAgAAfgAwIQAAfwAgAwAAAAcAIAIAAAgAMAMAAAkAIAEAAAANACABAAAADQAgAwAAAAsAIAIAAAwAMAMAAA0AIAMAAAALACACAAAMADADAAANACADAAAACwAgAgAADAAwAwAADQAgBgYAAJkDACDQAUAAAAAB3wEBAAAAAfUBQAAAAAH5AQEAAAAB-wEAAAD7AQIBFQAAhwEAIAXQAUAAAAAB3wEBAAAAAfUBQAAAAAH5AQEAAAAB-wEAAAD7AQIBFQAAiQEAMAEVAACJAQAwBgYAAJgDACDQAUAA8QIAId8BAQDwAgAh9QFAAPECACH5AQEA8AIAIfsBAACXA_sBIgIAAAANACAVAACMAQAgBdABQADxAgAh3wEBAPACACH1AUAA8QIAIfkBAQDwAgAh-wEAAJcD-wEiAgAAAAsAIBUAAI4BACACAAAACwAgFQAAjgEAIAMAAAANACAcAACHAQAgHQAAjAEAIAEAAAANACABAAAACwAgAwgAAJQDACAiAACWAwAgIwAAlQMAIAjIAQAAwgIAMMkBAACVAQAQygEAAMICADDQAUAApwIAId8BAQCmAgAh9QFAAKcCACH5AQEApgIAIfsBAADDAvsBIgMAAAALACACAACUAQAwIQAAlQEAIAMAAAALACACAAAMADADAAANACABAAAAEgAgAQAAABIAIAMAAAAQACACAAARADADAAASACADAAAAEAAgAgAAEQAwAwAAEgAgAwAAABAAIAIAABEAMAMAABIAIAUKAACSAwAgCwAAkwMAIPYBAQAAAAH3AQEAAAAB-AECAAAAAQEVAACdAQAgA_YBAQAAAAH3AQEAAAAB-AECAAAAAQEVAACfAQAwARUAAJ8BADAFCgAAkAMAIAsAAJEDACD2AQEA8AIAIfcBAQDwAgAh-AECAPoCACECAAAAEgAgFQAAogEAIAP2AQEA8AIAIfcBAQDwAgAh-AECAPoCACECAAAAEAAgFQAApAEAIAIAAAAQACAVAACkAQAgAwAAABIAIBwAAJ0BACAdAACiAQAgAQAAABIAIAEAAAAQACAFCAAAiwMAICIAAI4DACAjAACNAwAgdAAAjAMAIHUAAI8DACAGyAEAAMECADDJAQAAqwEAEMoBAADBAgAw9gEBAKYCACH3AQEApgIAIfgBAgC2AgAhAwAAABAAIAIAAKoBADAhAACrAQAgAwAAABAAIAIAABEAMAMAABIAIAEAAAAXACABAAAAFwAgAwAAABUAIAIAABYAMAMAABcAIAMAAAAVACACAAAWADADAAAXACADAAAAFQAgAgAAFgAwAwAAFwAgBAUAAIoDACDQAUAAAAAB3wEBAAAAAeEBAQAAAAEBFQAAswEAIAPQAUAAAAAB3wEBAAAAAeEBAQAAAAEBFQAAtQEAMAEVAAC1AQAwBAUAAIkDACDQAUAA8QIAId8BAQDwAgAh4QEBAPACACECAAAAFwAgFQAAuAEAIAPQAUAA8QIAId8BAQDwAgAh4QEBAPACACECAAAAFQAgFQAAugEAIAIAAAAVACAVAAC6AQAgAwAAABcAIBwAALMBACAdAAC4AQAgAQAAABcAIAEAAAAVACADCAAAhgMAICIAAIgDACAjAACHAwAgBsgBAADAAgAwyQEAAMEBABDKAQAAwAIAMNABQACnAgAh3wEBAKYCACHhAQEApgIAIQMAAAAVACACAADAAQAwIQAAwQEAIAMAAAAVACACAAAWADADAAAXACABAAAAGwAgAQAAABsAIAMAAAAZACACAAAaADADAAAbACADAAAAGQAgAgAAGgAwAwAAGwAgAwAAABkAIAIAABoAMAMAABsAIAUFAACFAwAg3wEBAAAAAeEBAQAAAAH0AUAAAAAB9QFAAAAAAQEVAADJAQAgBN8BAQAAAAHhAQEAAAAB9AFAAAAAAfUBQAAAAAEBFQAAywEAMAEVAADLAQAwBQUAAIQDACDfAQEA8AIAIeEBAQDwAgAh9AFAAPECACH1AUAA8QIAIQIAAAAbACAVAADOAQAgBN8BAQDwAgAh4QEBAPACACH0AUAA8QIAIfUBQADxAgAhAgAAABkAIBUAANABACACAAAAGQAgFQAA0AEAIAMAAAAbACAcAADJAQAgHQAAzgEAIAEAAAAbACABAAAAGQAgAwgAAIEDACAiAACDAwAgIwAAggMAIAfIAQAAvwIAMMkBAADXAQAQygEAAL8CADDfAQEApgIAIeEBAQCmAgAh9AFAAKcCACH1AUAApwIAIQMAAAAZACACAADWAQAwIQAA1wEAIAMAAAAZACACAAAaADADAAAbACANyAEAALwCADDJAQAA3QEAEMoBAAC8AgAw4QEBAAAAAeIBAQCuAgAh4wEBAK4CACHkAQIAvQIAIeUBAAC3AgAg5gEAALcCACDnAQAAtwIAIOgBAgAAAAHpAQEArgIAIeoBAAC-AgAgAQAAANoBACABAAAA2gEAIA3IAQAAvAIAMMkBAADdAQAQygEAALwCADDhAQEArgIAIeIBAQCuAgAh4wEBAK4CACHkAQIAvQIAIeUBAAC3AgAg5gEAALcCACDnAQAAtwIAIOgBAgC9AgAh6QEBAK4CACHqAQAAvgIAIAADAAAA3QEAIAIAAN4BADADAADaAQAgAwAAAN0BACACAADeAQAwAwAA2gEAIAMAAADdAQAgAgAA3gEAMAMAANoBACAK4QEBAAAAAeIBAQAAAAHjAQEAAAAB5AECAAAAAeUBAAD-AgAg5gEAAP8CACDnAQAAgAMAIOgBAgAAAAHpAQEAAAAB6gGAAAAAAQEVAADiAQAgCuEBAQAAAAHiAQEAAAAB4wEBAAAAAeQBAgAAAAHlAQAA_gIAIOYBAAD_AgAg5wEAAIADACDoAQIAAAAB6QEBAAAAAeoBgAAAAAEBFQAA5AEAMAEVAADkAQAwCuEBAQDwAgAh4gEBAPACACHjAQEA8AIAIeQBAgD6AgAh5QEAAPsCACDmAQAA_AIAIOcBAAD9AgAg6AECAPoCACHpAQEA8AIAIeoBgAAAAAECAAAA2gEAIBUAAOcBACAK4QEBAPACACHiAQEA8AIAIeMBAQDwAgAh5AECAPoCACHlAQAA-wIAIOYBAAD8AgAg5wEAAP0CACDoAQIA-gIAIekBAQDwAgAh6gGAAAAAAQIAAADdAQAgFQAA6QEAIAIAAADdAQAgFQAA6QEAIAMAAADaAQAgHAAA4gEAIB0AAOcBACABAAAA2gEAIAEAAADdAQAgBQgAAPUCACAiAAD4AgAgIwAA9wIAIHQAAPYCACB1AAD5AgAgDcgBAAC1AgAwyQEAAPABABDKAQAAtQIAMOEBAQCmAgAh4gEBAKYCACHjAQEApgIAIeQBAgC2AgAh5QEAALcCACDmAQAAtwIAIOcBAAC3AgAg6AECALYCACHpAQEApgIAIeoBAAC4AgAgAwAAAN0BACACAADvAQAwIQAA8AEAIAMAAADdAQAgAgAA3gEAMAMAANoBACAGyAEAALMCADDJAQAA9gEAEMoBAACzAgAw3gEBAK4CACHfAQEArgIAIeABAAC0AgAgAQAAAPMBACABAAAA8wEAIAXIAQAAswIAMMkBAAD2AQAQygEAALMCADDeAQEArgIAId8BAQCuAgAhAAMAAAD2AQAgAgAA9wEAMAMAAPMBACADAAAA9gEAIAIAAPcBADADAADzAQAgAwAAAPYBACACAAD3AQAwAwAA8wEAIALeAQEAAAAB3wEBAAAAAQEVAAD7AQAgAt4BAQAAAAHfAQEAAAABARUAAP0BADABFQAA_QEAMALeAQEA8AIAId8BAQDwAgAhAgAAAPMBACAVAACAAgAgAt4BAQDwAgAh3wEBAPACACECAAAA9gEAIBUAAIICACACAAAA9gEAIBUAAIICACADAAAA8wEAIBwAAPsBACAdAACAAgAgAQAAAPMBACABAAAA9gEAIAMIAADyAgAgIgAA9AIAICMAAPMCACAFyAEAALICADDJAQAAiQIAEMoBAACyAgAw3gEBAKYCACHfAQEApgIAIQMAAAD2AQAgAgAAiAIAMCEAAIkCACADAAAA9gEAIAIAAPcBADADAADzAQAgC8gBAACtAgAwyQEAAI8CABDKAQAArQIAMMsBAQCuAgAhzAEBAK4CACHNAQEArgIAIc4BAQCuAgAhzwEBAK4CACHQAUAArwIAIdwBAACwAgAg3QEAALECACABAAAAjAIAIAEAAACMAgAgCcgBAACtAgAwyQEAAI8CABDKAQAArQIAMMsBAQCuAgAhzAEBAK4CACHNAQEArgIAIc4BAQCuAgAhzwEBAK4CACHQAUAArwIAIQADAAAAjwIAIAIAAJACADADAACMAgAgAwAAAI8CACACAACQAgAwAwAAjAIAIAMAAACPAgAgAgAAkAIAMAMAAIwCACAGywEBAAAAAcwBAQAAAAHNAQEAAAABzgEBAAAAAc8BAQAAAAHQAUAAAAABARUAAJQCACAGywEBAAAAAcwBAQAAAAHNAQEAAAABzgEBAAAAAc8BAQAAAAHQAUAAAAABARUAAJYCADABFQAAlgIAMAbLAQEA8AIAIcwBAQDwAgAhzQEBAPACACHOAQEA8AIAIc8BAQDwAgAh0AFAAPECACECAAAAjAIAIBUAAJkCACAGywEBAPACACHMAQEA8AIAIc0BAQDwAgAhzgEBAPACACHPAQEA8AIAIdABQADxAgAhAgAAAI8CACAVAACbAgAgAgAAAI8CACAVAACbAgAgAwAAAIwCACAcAACUAgAgHQAAmQIAIAEAAACMAgAgAQAAAI8CACADCAAA7QIAICIAAO8CACAjAADuAgAgCcgBAAClAgAwyQEAAKICABDKAQAApQIAMMsBAQCmAgAhzAEBAKYCACHNAQEApgIAIc4BAQCmAgAhzwEBAKYCACHQAUAApwIAIQMAAACPAgAgAgAAoQIAMCEAAKICACADAAAAjwIAIAIAAJACADADAACMAgAgCcgBAAClAgAwyQEAAKICABDKAQAApQIAMMsBAQCmAgAhzAEBAKYCACHNAQEApgIAIc4BAQCmAgAhzwEBAKYCACHQAUAApwIAIQ4IAACpAgAgIgAArAIAICMAAKwCACDRAQEAAAAB0gEBAAAABNMBAQAAAATUAQEAAAAB1QEBAAAAAdYBAQAAAAHXAQEAAAAB2AEBAKsCACHZAQEAAAAB2gEBAAAAAdsBAQAAAAELCAAAqQIAICIAAKoCACAjAACqAgAg0QFAAAAAAdIBQAAAAATTAUAAAAAE1AFAAAAAAdUBQAAAAAHWAUAAAAAB1wFAAAAAAdgBQACoAgAhCwgAAKkCACAiAACqAgAgIwAAqgIAINEBQAAAAAHSAUAAAAAE0wFAAAAABNQBQAAAAAHVAUAAAAAB1gFAAAAAAdcBQAAAAAHYAUAAqAIAIQjRAQIAAAAB0gECAAAABNMBAgAAAATUAQIAAAAB1QECAAAAAdYBAgAAAAHXAQIAAAAB2AECAKkCACEI0QFAAAAAAdIBQAAAAATTAUAAAAAE1AFAAAAAAdUBQAAAAAHWAUAAAAAB1wFAAAAAAdgBQACqAgAhDggAAKkCACAiAACsAgAgIwAArAIAINEBAQAAAAHSAQEAAAAE0wEBAAAABNQBAQAAAAHVAQEAAAAB1gEBAAAAAdcBAQAAAAHYAQEAqwIAIdkBAQAAAAHaAQEAAAAB2wEBAAAAAQvRAQEAAAAB0gEBAAAABNMBAQAAAATUAQEAAAAB1QEBAAAAAdYBAQAAAAHXAQEAAAAB2AEBAKwCACHZAQEAAAAB2gEBAAAAAdsBAQAAAAEJyAEAAK0CADDJAQAAjwIAEMoBAACtAgAwywEBAK4CACHMAQEArgIAIc0BAQCuAgAhzgEBAK4CACHPAQEArgIAIdABQACvAgAhC9EBAQAAAAHSAQEAAAAE0wEBAAAABNQBAQAAAAHVAQEAAAAB1gEBAAAAAdcBAQAAAAHYAQEArAIAIdkBAQAAAAHaAQEAAAAB2wEBAAAAAQjRAUAAAAAB0gFAAAAABNMBQAAAAATUAUAAAAAB1QFAAAAAAdYBQAAAAAHXAUAAAAAB2AFAAKoCACECywEBAAAAAc0BAQAAAAECywEBAAAAAcwBAQAAAAEFyAEAALICADDJAQAAiQIAEMoBAACyAgAw3gEBAKYCACHfAQEApgIAIQXIAQAAswIAMMkBAAD2AQAQygEAALMCADDeAQEArgIAId8BAQCuAgAhAt4BAQAAAAHfAQEAAAABDcgBAAC1AgAwyQEAAPABABDKAQAAtQIAMOEBAQCmAgAh4gEBAKYCACHjAQEApgIAIeQBAgC2AgAh5QEAALcCACDmAQAAtwIAIOcBAAC3AgAg6AECALYCACHpAQEApgIAIeoBAAC4AgAgDQgAAKkCACAiAACpAgAgIwAAqQIAIHQAALsCACB1AACpAgAg0QECAAAAAdIBAgAAAATTAQIAAAAE1AECAAAAAdUBAgAAAAHWAQIAAAAB1wECAAAAAdgBAgC6AgAhBNEBAQAAAAXxAQEAAAAB8gEBAAAABPMBAQAAAAQPCAAAqQIAICIAALkCACAjAAC5AgAg0QGAAAAAAdQBgAAAAAHVAYAAAAAB1gGAAAAAAdcBgAAAAAHYAYAAAAAB6wEBAAAAAewBAQAAAAHtAQEAAAAB7gGAAAAAAe8BgAAAAAHwAYAAAAABDNEBgAAAAAHUAYAAAAAB1QGAAAAAAdYBgAAAAAHXAYAAAAAB2AGAAAAAAesBAQAAAAHsAQEAAAAB7QEBAAAAAe4BgAAAAAHvAYAAAAAB8AGAAAAAAQ0IAACpAgAgIgAAqQIAICMAAKkCACB0AAC7AgAgdQAAqQIAINEBAgAAAAHSAQIAAAAE0wECAAAABNQBAgAAAAHVAQIAAAAB1gECAAAAAdcBAgAAAAHYAQIAugIAIQjRAQgAAAAB0gEIAAAABNMBCAAAAATUAQgAAAAB1QEIAAAAAdYBCAAAAAHXAQgAAAAB2AEIALsCACENyAEAALwCADDJAQAA3QEAEMoBAAC8AgAw4QEBAK4CACHiAQEArgIAIeMBAQCuAgAh5AECAL0CACHlAQAAtwIAIOYBAAC3AgAg5wEAALcCACDoAQIAvQIAIekBAQCuAgAh6gEAAL4CACAI0QECAAAAAdIBAgAAAATTAQIAAAAE1AECAAAAAdUBAgAAAAHWAQIAAAAB1wECAAAAAdgBAgCpAgAhDNEBgAAAAAHUAYAAAAAB1QGAAAAAAdYBgAAAAAHXAYAAAAAB2AGAAAAAAesBAQAAAAHsAQEAAAAB7QEBAAAAAe4BgAAAAAHvAYAAAAAB8AGAAAAAAQfIAQAAvwIAMMkBAADXAQAQygEAAL8CADDfAQEApgIAIeEBAQCmAgAh9AFAAKcCACH1AUAApwIAIQbIAQAAwAIAMMkBAADBAQAQygEAAMACADDQAUAApwIAId8BAQCmAgAh4QEBAKYCACEGyAEAAMECADDJAQAAqwEAEMoBAADBAgAw9gEBAKYCACH3AQEApgIAIfgBAgC2AgAhCMgBAADCAgAwyQEAAJUBABDKAQAAwgIAMNABQACnAgAh3wEBAKYCACH1AUAApwIAIfkBAQCmAgAh-wEAAMMC-wEiBwgAAKkCACAiAADFAgAgIwAAxQIAINEBAAAA-wEC0gEAAAD7AQjTAQAAAPsBCNgBAADEAvsBIgcIAACpAgAgIgAAxQIAICMAAMUCACDRAQAAAPsBAtIBAAAA-wEI0wEAAAD7AQjYAQAAxAL7ASIE0QEAAAD7AQLSAQAAAPsBCNMBAAAA-wEI2AEAAMUC-wEiDsgBAADGAgAwyQEAAH8AEMoBAADGAgAw0AFAAKcCACHhAQEApgIAIfUBQACnAgAh_AEBAKYCACH9AQEApgIAIf4BAQCmAgAh_wEBAKYCACGAAgEApgIAIYECAQDHAgAhggJAAMgCACGDAgEAxwIAIQ4IAADKAgAgIgAAzQIAICMAAM0CACDRAQEAAAAB0gEBAAAABdMBAQAAAAXUAQEAAAAB1QEBAAAAAdYBAQAAAAHXAQEAAAAB2AEBAMwCACHZAQEAAAAB2gEBAAAAAdsBAQAAAAELCAAAygIAICIAAMsCACAjAADLAgAg0QFAAAAAAdIBQAAAAAXTAUAAAAAF1AFAAAAAAdUBQAAAAAHWAUAAAAAB1wFAAAAAAdgBQADJAgAhCwgAAMoCACAiAADLAgAgIwAAywIAINEBQAAAAAHSAUAAAAAF0wFAAAAABdQBQAAAAAHVAUAAAAAB1gFAAAAAAdcBQAAAAAHYAUAAyQIAIQjRAQIAAAAB0gECAAAABdMBAgAAAAXUAQIAAAAB1QECAAAAAdYBAgAAAAHXAQIAAAAB2AECAMoCACEI0QFAAAAAAdIBQAAAAAXTAUAAAAAF1AFAAAAAAdUBQAAAAAHWAUAAAAAB1wFAAAAAAdgBQADLAgAhDggAAMoCACAiAADNAgAgIwAAzQIAINEBAQAAAAHSAQEAAAAF0wEBAAAABdQBAQAAAAHVAQEAAAAB1gEBAAAAAdcBAQAAAAHYAQEAzAIAIdkBAQAAAAHaAQEAAAAB2wEBAAAAAQvRAQEAAAAB0gEBAAAABdMBAQAAAAXUAQEAAAAB1QEBAAAAAdYBAQAAAAHXAQEAAAAB2AEBAM0CACHZAQEAAAAB2gEBAAAAAdsBAQAAAAEJyAEAAM4CADDJAQAAaQAQygEAAM4CADDQAUAApwIAIfwBAQCmAgAhhAIBAKYCACGFAgEAxwIAIYYCQADIAgAhhwIBAMcCACEJyAEAAM8CADDJAQAAVgAQygEAAM8CADDQAUAArwIAIfwBAQCuAgAhhAIBAK4CACGFAgEA0AIAIYYCQADRAgAhhwIBANACACEL0QEBAAAAAdIBAQAAAAXTAQEAAAAF1AEBAAAAAdUBAQAAAAHWAQEAAAAB1wEBAAAAAdgBAQDNAgAh2QEBAAAAAdoBAQAAAAHbAQEAAAABCNEBQAAAAAHSAUAAAAAF0wFAAAAABdQBQAAAAAHVAUAAAAAB1gFAAAAAAdcBQAAAAAHYAUAAywIAIQnIAQAA0gIAMMkBAABQABDKAQAA0gIAMNABQACnAgAh3wEBAKYCACH8AQEApgIAIYUCAQDHAgAhhgJAAMgCACGHAgEAxwIAIQnIAQAA0wIAMMkBAAA9ABDKAQAA0wIAMNABQACvAgAh3wEBAK4CACH8AQEArgIAIYUCAQDQAgAhhgJAANECACGHAgEA0AIAIRLIAQAA1AIAMMkBAAA3ABDKAQAA1AIAMNABQACnAgAh3gEBAMcCACH1AUAApwIAIfwBAQCmAgAh_wEBAKYCACGAAgEApgIAIYICQADIAgAhgwIBAMcCACGIAgEAxwIAIYkCAQDHAgAhigIBAKYCACGLAiAA1QIAIYwCIADVAgAhjQJAAMgCACGOAgEAxwIAIQUIAACpAgAgIgAA1wIAICMAANcCACDRASAAAAAB2AEgANYCACEFCAAAqQIAICIAANcCACAjAADXAgAg0QEgAAAAAdgBIADWAgAhAtEBIAAAAAHYASAA1wIAIQLfAQEAAAAB4QEBAAAAAQgFAADaAgAgyAEAANkCADDJAQAAGQAQygEAANkCADDfAQEArgIAIeEBAQCuAgAh9AFAAK8CACH1AUAArwIAIRsBAADnAgAgBAAA6AIAIAkAAOkCACAMAADqAgAgDQAA6gIAIA4AAOsCACAPAADsAgAgyAEAAOUCADDJAQAAAwAQygEAAOUCADDQAUAArwIAId4BAQDQAgAh9QFAAK8CACH8AQEArgIAIf8BAQCuAgAhgAIBAK4CACGCAkAA0QIAIYMCAQDQAgAhiAIBANACACGJAgEA0AIAIYoCAQCuAgAhiwIgAOYCACGMAiAA5gIAIY0CQADRAgAhjgIBANACACGVAgAAAwAglgIAAAMAIALfAQEAAAAB4QEBAAAAAQcFAADaAgAgyAEAANwCADDJAQAAFQAQygEAANwCADDQAUAArwIAId8BAQCuAgAh4QEBAK4CACEC9gEBAAAAAfcBAQAAAAEICgAA2gIAIAsAANoCACDIAQAA3gIAMMkBAAAQABDKAQAA3gIAMPYBAQCuAgAh9wEBAK4CACH4AQIAvQIAIQLfAQEAAAAB-QEBAAAAAQkGAADiAgAgyAEAAOACADDJAQAACwAQygEAAOACADDQAUAArwIAId8BAQCuAgAh9QFAAK8CACH5AQEArgIAIfsBAADhAvsBIgTRAQAAAPsBAtIBAAAA-wEI0wEAAAD7AQjYAQAAxQL7ASISBQAA2gIAIAcAAOQCACDIAQAA4wIAMMkBAAAHABDKAQAA4wIAMNABQACvAgAh4QEBAK4CACH1AUAArwIAIfwBAQCuAgAh_QEBAK4CACH-AQEArgIAIf8BAQCuAgAhgAIBAK4CACGBAgEA0AIAIYICQADRAgAhgwIBANACACGVAgAABwAglgIAAAcAIBAFAADaAgAgBwAA5AIAIMgBAADjAgAwyQEAAAcAEMoBAADjAgAw0AFAAK8CACHhAQEArgIAIfUBQACvAgAh_AEBAK4CACH9AQEArgIAIf4BAQCuAgAh_wEBAK4CACGAAgEArgIAIYECAQDQAgAhggJAANECACGDAgEA0AIAIQOSAgAACwAgkwIAAAsAIJQCAAALACAZAQAA5wIAIAQAAOgCACAJAADpAgAgDAAA6gIAIA0AAOoCACAOAADrAgAgDwAA7AIAIMgBAADlAgAwyQEAAAMAEMoBAADlAgAw0AFAAK8CACHeAQEA0AIAIfUBQACvAgAh_AEBAK4CACH_AQEArgIAIYACAQCuAgAhggJAANECACGDAgEA0AIAIYgCAQDQAgAhiQIBANACACGKAgEArgIAIYsCIADmAgAhjAIgAOYCACGNAkAA0QIAIY4CAQDQAgAhAtEBIAAAAAHYASAA1wIAIRsBAADnAgAgBAAA6AIAIAkAAOkCACAMAADqAgAgDQAA6gIAIA4AAOsCACAPAADsAgAgyAEAAOUCADDJAQAAAwAQygEAAOUCADDQAUAArwIAId4BAQDQAgAh9QFAAK8CACH8AQEArgIAIf8BAQCuAgAhgAIBAK4CACGCAkAA0QIAIYMCAQDQAgAhiAIBANACACGJAgEA0AIAIYoCAQCuAgAhiwIgAOYCACGMAiAA5gIAIY0CQADRAgAhjgIBANACACGVAgAAAwAglgIAAAMAIAOSAgAAAwAgkwIAAAMAIJQCAAADACADkgIAAAcAIJMCAAAHACCUAgAABwAgA5ICAAAQACCTAgAAEAAglAIAABAAIAOSAgAAFQAgkwIAABUAIJQCAAAVACADkgIAABkAIJMCAAAZACCUAgAAGQAgAAAAAZoCAQAAAAEBmgJAAAAAAQAAAAAAAAAABZoCAgAAAAGhAgIAAAABogICAAAAAaMCAgAAAAGkAgIAAAABApoCAQAAAASgAgEAAAAFApoCAQAAAASgAgEAAAAFApoCAQAAAASgAgEAAAAFAZoCAQAAAAQBmgIBAAAABAGaAgEAAAAEAAAABRwAALoEACAdAAC9BAAglwIAALsEACCYAgAAvAQAIJ0CAAABACADHAAAugQAIJcCAAC7BAAgnQIAAAEAIAAAAAUcAAC1BAAgHQAAuAQAIJcCAAC2BAAgmAIAALcEACCdAgAAAQAgAxwAALUEACCXAgAAtgQAIJ0CAAABACAAAAAAAAUcAACtBAAgHQAAswQAIJcCAACuBAAgmAIAALIEACCdAgAAAQAgBRwAAKsEACAdAACwBAAglwIAAKwEACCYAgAArwQAIJ0CAAABACADHAAArQQAIJcCAACuBAAgnQIAAAEAIAMcAACrBAAglwIAAKwEACCdAgAAAQAgAAAAAZoCAAAA-wECBRwAAKYEACAdAACpBAAglwIAAKcEACCYAgAAqAQAIJ0CAAAJACADHAAApgQAIJcCAACnBAAgnQIAAAkAIAAAAAABmgIBAAAAAQGaAkAAAAABBRwAAKAEACAdAACkBAAglwIAAKEEACCYAgAAowQAIJ0CAAABACALHAAAogMAMB0AAKcDADCXAgAAowMAMJgCAACkAwAwmQIAAKUDACCaAgAApgMAMJsCAACmAwAwnAIAAKYDADCdAgAApgMAMJ4CAACoAwAwnwIAAKkDADAE0AFAAAAAAd8BAQAAAAH1AUAAAAAB-wEAAAD7AQICAAAADQAgHAAArQMAIAMAAAANACAcAACtAwAgHQAArAMAIAEVAACiBAAwCgYAAOICACDIAQAA4AIAMMkBAAALABDKAQAA4AIAMNABQACvAgAh3wEBAK4CACH1AUAArwIAIfkBAQCuAgAh-wEAAOEC-wEikQIAAN8CACACAAAADQAgFQAArAMAIAIAAACqAwAgFQAAqwMAIAjIAQAAqQMAMMkBAACqAwAQygEAAKkDADDQAUAArwIAId8BAQCuAgAh9QFAAK8CACH5AQEArgIAIfsBAADhAvsBIgjIAQAAqQMAMMkBAACqAwAQygEAAKkDADDQAUAArwIAId8BAQCuAgAh9QFAAK8CACH5AQEArgIAIfsBAADhAvsBIgTQAUAA8QIAId8BAQDwAgAh9QFAAPECACH7AQAAlwP7ASIE0AFAAPECACHfAQEA8AIAIfUBQADxAgAh-wEAAJcD-wEiBNABQAAAAAHfAQEAAAAB9QFAAAAAAfsBAAAA-wECAxwAAKAEACCXAgAAoQQAIJ0CAAABACAEHAAAogMAMJcCAACjAwAwmQIAAKUDACCdAgAApgMAMAAAAAAAAAAAAAGaAiAAAAABBxwAAJUEACAdAACeBAAglwIAAJYEACCYAgAAnQQAIJsCAAADACCcAgAAAwAgnQIAAAEAIAscAAD6AwAwHQAA_wMAMJcCAAD7AwAwmAIAAPwDADCZAgAA_QMAIJoCAAD-AwAwmwIAAP4DADCcAgAA_gMAMJ0CAAD-AwAwngIAAIAEADCfAgAAgQQAMAscAADuAwAwHQAA8wMAMJcCAADvAwAwmAIAAPADADCZAgAA8QMAIJoCAADyAwAwmwIAAPIDADCcAgAA8gMAMJ0CAADyAwAwngIAAPQDADCfAgAA9QMAMAscAADlAwAwHQAA6QMAMJcCAADmAwAwmAIAAOcDADCZAgAA6AMAIJoCAADdAwAwmwIAAN0DADCcAgAA3QMAMJ0CAADdAwAwngIAAOoDADCfAgAA4AMAMAscAADZAwAwHQAA3gMAMJcCAADaAwAwmAIAANsDADCZAgAA3AMAIJoCAADdAwAwmwIAAN0DADCcAgAA3QMAMJ0CAADdAwAwngIAAN8DADCfAgAA4AMAMAscAADNAwAwHQAA0gMAMJcCAADOAwAwmAIAAM8DADCZAgAA0AMAIJoCAADRAwAwmwIAANEDADCcAgAA0QMAMJ0CAADRAwAwngIAANMDADCfAgAA1AMAMAscAADBAwAwHQAAxgMAMJcCAADCAwAwmAIAAMMDADCZAgAAxAMAIJoCAADFAwAwmwIAAMUDADCcAgAAxQMAMJ0CAADFAwAwngIAAMcDADCfAgAAyAMAMAPfAQEAAAAB9AFAAAAAAfUBQAAAAAECAAAAGwAgHAAAzAMAIAMAAAAbACAcAADMAwAgHQAAywMAIAEVAACcBAAwCQUAANoCACDIAQAA2QIAMMkBAAAZABDKAQAA2QIAMN8BAQCuAgAh4QEBAK4CACH0AUAArwIAIfUBQACvAgAhjwIAANgCACACAAAAGwAgFQAAywMAIAIAAADJAwAgFQAAygMAIAfIAQAAyAMAMMkBAADJAwAQygEAAMgDADDfAQEArgIAIeEBAQCuAgAh9AFAAK8CACH1AUAArwIAIQfIAQAAyAMAMMkBAADJAwAQygEAAMgDADDfAQEArgIAIeEBAQCuAgAh9AFAAK8CACH1AUAArwIAIQPfAQEA8AIAIfQBQADxAgAh9QFAAPECACED3wEBAPACACH0AUAA8QIAIfUBQADxAgAhA98BAQAAAAH0AUAAAAAB9QFAAAAAAQLQAUAAAAAB3wEBAAAAAQIAAAAXACAcAADYAwAgAwAAABcAIBwAANgDACAdAADXAwAgARUAAJsEADAIBQAA2gIAIMgBAADcAgAwyQEAABUAEMoBAADcAgAw0AFAAK8CACHfAQEArgIAIeEBAQCuAgAhjwIAANsCACACAAAAFwAgFQAA1wMAIAIAAADVAwAgFQAA1gMAIAbIAQAA1AMAMMkBAADVAwAQygEAANQDADDQAUAArwIAId8BAQCuAgAh4QEBAK4CACEGyAEAANQDADDJAQAA1QMAEMoBAADUAwAw0AFAAK8CACHfAQEArgIAIeEBAQCuAgAhAtABQADxAgAh3wEBAPACACEC0AFAAPECACHfAQEA8AIAIQLQAUAAAAAB3wEBAAAAAQMKAACSAwAg9gEBAAAAAfgBAgAAAAECAAAAEgAgHAAA5AMAIAMAAAASACAcAADkAwAgHQAA4wMAIAEVAACaBAAwCQoAANoCACALAADaAgAgyAEAAN4CADDJAQAAEAAQygEAAN4CADD2AQEArgIAIfcBAQCuAgAh-AECAL0CACGQAgAA3QIAIAIAAAASACAVAADjAwAgAgAAAOEDACAVAADiAwAgBsgBAADgAwAwyQEAAOEDABDKAQAA4AMAMPYBAQCuAgAh9wEBAK4CACH4AQIAvQIAIQbIAQAA4AMAMMkBAADhAwAQygEAAOADADD2AQEArgIAIfcBAQCuAgAh-AECAL0CACEC9gEBAPACACH4AQIA-gIAIQMKAACQAwAg9gEBAPACACH4AQIA-gIAIQMKAACSAwAg9gEBAAAAAfgBAgAAAAEDCwAAkwMAIPcBAQAAAAH4AQIAAAABAgAAABIAIBwAAO0DACADAAAAEgAgHAAA7QMAIB0AAOwDACABFQAAmQQAMAIAAAASACAVAADsAwAgAgAAAOEDACAVAADrAwAgAvcBAQDwAgAh-AECAPoCACEDCwAAkQMAIPcBAQDwAgAh-AECAPoCACEDCwAAkwMAIPcBAQAAAAH4AQIAAAABCwcAAK8DACDQAUAAAAAB9QFAAAAAAfwBAQAAAAH9AQEAAAAB_gEBAAAAAf8BAQAAAAGAAgEAAAABgQIBAAAAAYICQAAAAAGDAgEAAAABAgAAAAkAIBwAAPkDACADAAAACQAgHAAA-QMAIB0AAPgDACABFQAAmAQAMBAFAADaAgAgBwAA5AIAIMgBAADjAgAwyQEAAAcAEMoBAADjAgAw0AFAAK8CACHhAQEArgIAIfUBQACvAgAh_AEBAAAAAf0BAQCuAgAh_gEBAK4CACH_AQEArgIAIYACAQCuAgAhgQIBANACACGCAkAA0QIAIYMCAQDQAgAhAgAAAAkAIBUAAPgDACACAAAA9gMAIBUAAPcDACAOyAEAAPUDADDJAQAA9gMAEMoBAAD1AwAw0AFAAK8CACHhAQEArgIAIfUBQACvAgAh_AEBAK4CACH9AQEArgIAIf4BAQCuAgAh_wEBAK4CACGAAgEArgIAIYECAQDQAgAhggJAANECACGDAgEA0AIAIQ7IAQAA9QMAMMkBAAD2AwAQygEAAPUDADDQAUAArwIAIeEBAQCuAgAh9QFAAK8CACH8AQEArgIAIf0BAQCuAgAh_gEBAK4CACH_AQEArgIAIYACAQCuAgAhgQIBANACACGCAkAA0QIAIYMCAQDQAgAhCtABQADxAgAh9QFAAPECACH8AQEA8AIAIf0BAQDwAgAh_gEBAPACACH_AQEA8AIAIYACAQDwAgAhgQIBAJ4DACGCAkAAnwMAIYMCAQCeAwAhCwcAAKEDACDQAUAA8QIAIfUBQADxAgAh_AEBAPACACH9AQEA8AIAIf4BAQDwAgAh_wEBAPACACGAAgEA8AIAIYECAQCeAwAhggJAAJ8DACGDAgEAngMAIQsHAACvAwAg0AFAAAAAAfUBQAAAAAH8AQEAAAAB_QEBAAAAAf4BAQAAAAH_AQEAAAABgAIBAAAAAYECAQAAAAGCAkAAAAABgwIBAAAAARQEAACGBAAgCQAAhwQAIAwAAIgEACANAACJBAAgDgAAigQAIA8AAIsEACDQAUAAAAAB3gEBAAAAAfUBQAAAAAH8AQEAAAAB_wEBAAAAAYACAQAAAAGCAkAAAAABgwIBAAAAAYkCAQAAAAGKAgEAAAABiwIgAAAAAYwCIAAAAAGNAkAAAAABjgIBAAAAAQIAAAABACAcAACFBAAgAwAAAAEAIBwAAIUEACAdAACEBAAgARUAAJcEADAZAQAA5wIAIAQAAOgCACAJAADpAgAgDAAA6gIAIA0AAOoCACAOAADrAgAgDwAA7AIAIMgBAADlAgAwyQEAAAMAEMoBAADlAgAw0AFAAK8CACHeAQEA0AIAIfUBQACvAgAh_AEBAAAAAf8BAQCuAgAhgAIBAK4CACGCAkAA0QIAIYMCAQDQAgAhiAIBANACACGJAgEA0AIAIYoCAQCuAgAhiwIgAOYCACGMAiAA5gIAIY0CQADRAgAhjgIBANACACECAAAAAQAgFQAAhAQAIAIAAACCBAAgFQAAgwQAIBLIAQAAgQQAMMkBAACCBAAQygEAAIEEADDQAUAArwIAId4BAQDQAgAh9QFAAK8CACH8AQEArgIAIf8BAQCuAgAhgAIBAK4CACGCAkAA0QIAIYMCAQDQAgAhiAIBANACACGJAgEA0AIAIYoCAQCuAgAhiwIgAOYCACGMAiAA5gIAIY0CQADRAgAhjgIBANACACESyAEAAIEEADDJAQAAggQAEMoBAACBBAAw0AFAAK8CACHeAQEA0AIAIfUBQACvAgAh_AEBAK4CACH_AQEArgIAIYACAQCuAgAhggJAANECACGDAgEA0AIAIYgCAQDQAgAhiQIBANACACGKAgEArgIAIYsCIADmAgAhjAIgAOYCACGNAkAA0QIAIY4CAQDQAgAhDtABQADxAgAh3gEBAJ4DACH1AUAA8QIAIfwBAQDwAgAh_wEBAPACACGAAgEA8AIAIYICQACfAwAhgwIBAJ4DACGJAgEAngMAIYoCAQDwAgAhiwIgALkDACGMAiAAuQMAIY0CQACfAwAhjgIBAJ4DACEUBAAAuwMAIAkAALwDACAMAAC9AwAgDQAAvgMAIA4AAL8DACAPAADAAwAg0AFAAPECACHeAQEAngMAIfUBQADxAgAh_AEBAPACACH_AQEA8AIAIYACAQDwAgAhggJAAJ8DACGDAgEAngMAIYkCAQCeAwAhigIBAPACACGLAiAAuQMAIYwCIAC5AwAhjQJAAJ8DACGOAgEAngMAIRQEAACGBAAgCQAAhwQAIAwAAIgEACANAACJBAAgDgAAigQAIA8AAIsEACDQAUAAAAAB3gEBAAAAAfUBQAAAAAH8AQEAAAAB_wEBAAAAAYACAQAAAAGCAkAAAAABgwIBAAAAAYkCAQAAAAGKAgEAAAABiwIgAAAAAYwCIAAAAAGNAkAAAAABjgIBAAAAAQQcAAD6AwAwlwIAAPsDADCZAgAA_QMAIJ0CAAD-AwAwBBwAAO4DADCXAgAA7wMAMJkCAADxAwAgnQIAAPIDADAEHAAA5QMAMJcCAADmAwAwmQIAAOgDACCdAgAA3QMAMAQcAADZAwAwlwIAANoDADCZAgAA3AMAIJ0CAADdAwAwBBwAAM0DADCXAgAAzgMAMJkCAADQAwAgnQIAANEDADAEHAAAwQMAMJcCAADCAwAwmQIAAMQDACCdAgAAxQMAMAMcAACVBAAglwIAAJYEACCdAgAAAQAgDgEAAI0EACAEAACQBAAgCQAAkQQAIAwAAJIEACANAACSBAAgDgAAkwQAIA8AAJQEACDeAQAAmgMAIIICAACaAwAggwIAAJoDACCIAgAAmgMAIIkCAACaAwAgjQIAAJoDACCOAgAAmgMAIAUFAACNBAAgBwAAjwQAIIECAACaAwAgggIAAJoDACCDAgAAmgMAIAAAAAAAABUBAACMBAAgCQAAhwQAIAwAAIgEACANAACJBAAgDgAAigQAIA8AAIsEACDQAUAAAAAB3gEBAAAAAfUBQAAAAAH8AQEAAAAB_wEBAAAAAYACAQAAAAGCAkAAAAABgwIBAAAAAYgCAQAAAAGJAgEAAAABigIBAAAAAYsCIAAAAAGMAiAAAAABjQJAAAAAAY4CAQAAAAECAAAAAQAgHAAAlQQAIA7QAUAAAAAB3gEBAAAAAfUBQAAAAAH8AQEAAAAB_wEBAAAAAYACAQAAAAGCAkAAAAABgwIBAAAAAYkCAQAAAAGKAgEAAAABiwIgAAAAAYwCIAAAAAGNAkAAAAABjgIBAAAAAQrQAUAAAAAB9QFAAAAAAfwBAQAAAAH9AQEAAAAB_gEBAAAAAf8BAQAAAAGAAgEAAAABgQIBAAAAAYICQAAAAAGDAgEAAAABAvcBAQAAAAH4AQIAAAABAvYBAQAAAAH4AQIAAAABAtABQAAAAAHfAQEAAAABA98BAQAAAAH0AUAAAAAB9QFAAAAAAQMAAAADACAcAACVBAAgHQAAnwQAIBcAAAADACABAAC6AwAgCQAAvAMAIAwAAL0DACANAAC-AwAgDgAAvwMAIA8AAMADACAVAACfBAAg0AFAAPECACHeAQEAngMAIfUBQADxAgAh_AEBAPACACH_AQEA8AIAIYACAQDwAgAhggJAAJ8DACGDAgEAngMAIYgCAQCeAwAhiQIBAJ4DACGKAgEA8AIAIYsCIAC5AwAhjAIgALkDACGNAkAAnwMAIY4CAQCeAwAhFQEAALoDACAJAAC8AwAgDAAAvQMAIA0AAL4DACAOAAC_AwAgDwAAwAMAINABQADxAgAh3gEBAJ4DACH1AUAA8QIAIfwBAQDwAgAh_wEBAPACACGAAgEA8AIAIYICQACfAwAhgwIBAJ4DACGIAgEAngMAIYkCAQCeAwAhigIBAPACACGLAiAAuQMAIYwCIAC5AwAhjQJAAJ8DACGOAgEAngMAIRUBAACMBAAgBAAAhgQAIAwAAIgEACANAACJBAAgDgAAigQAIA8AAIsEACDQAUAAAAAB3gEBAAAAAfUBQAAAAAH8AQEAAAAB_wEBAAAAAYACAQAAAAGCAkAAAAABgwIBAAAAAYgCAQAAAAGJAgEAAAABigIBAAAAAYsCIAAAAAGMAiAAAAABjQJAAAAAAY4CAQAAAAECAAAAAQAgHAAAoAQAIATQAUAAAAAB3wEBAAAAAfUBQAAAAAH7AQAAAPsBAgMAAAADACAcAACgBAAgHQAApQQAIBcAAAADACABAAC6AwAgBAAAuwMAIAwAAL0DACANAAC-AwAgDgAAvwMAIA8AAMADACAVAAClBAAg0AFAAPECACHeAQEAngMAIfUBQADxAgAh_AEBAPACACH_AQEA8AIAIYACAQDwAgAhggJAAJ8DACGDAgEAngMAIYgCAQCeAwAhiQIBAJ4DACGKAgEA8AIAIYsCIAC5AwAhjAIgALkDACGNAkAAnwMAIY4CAQCeAwAhFQEAALoDACAEAAC7AwAgDAAAvQMAIA0AAL4DACAOAAC_AwAgDwAAwAMAINABQADxAgAh3gEBAJ4DACH1AUAA8QIAIfwBAQDwAgAh_wEBAPACACGAAgEA8AIAIYICQACfAwAhgwIBAJ4DACGIAgEAngMAIYkCAQCeAwAhigIBAPACACGLAiAAuQMAIYwCIAC5AwAhjQJAAJ8DACGOAgEAngMAIQwFAACuAwAg0AFAAAAAAeEBAQAAAAH1AUAAAAAB_AEBAAAAAf0BAQAAAAH-AQEAAAAB_wEBAAAAAYACAQAAAAGBAgEAAAABggJAAAAAAYMCAQAAAAECAAAACQAgHAAApgQAIAMAAAAHACAcAACmBAAgHQAAqgQAIA4AAAAHACAFAACgAwAgFQAAqgQAINABQADxAgAh4QEBAPACACH1AUAA8QIAIfwBAQDwAgAh_QEBAPACACH-AQEA8AIAIf8BAQDwAgAhgAIBAPACACGBAgEAngMAIYICQACfAwAhgwIBAJ4DACEMBQAAoAMAINABQADxAgAh4QEBAPACACH1AUAA8QIAIfwBAQDwAgAh_QEBAPACACH-AQEA8AIAIf8BAQDwAgAhgAIBAPACACGBAgEAngMAIYICQACfAwAhgwIBAJ4DACEVAQAAjAQAIAQAAIYEACAJAACHBAAgDAAAiAQAIA4AAIoEACAPAACLBAAg0AFAAAAAAd4BAQAAAAH1AUAAAAAB_AEBAAAAAf8BAQAAAAGAAgEAAAABggJAAAAAAYMCAQAAAAGIAgEAAAABiQIBAAAAAYoCAQAAAAGLAiAAAAABjAIgAAAAAY0CQAAAAAGOAgEAAAABAgAAAAEAIBwAAKsEACAVAQAAjAQAIAQAAIYEACAJAACHBAAgDQAAiQQAIA4AAIoEACAPAACLBAAg0AFAAAAAAd4BAQAAAAH1AUAAAAAB_AEBAAAAAf8BAQAAAAGAAgEAAAABggJAAAAAAYMCAQAAAAGIAgEAAAABiQIBAAAAAYoCAQAAAAGLAiAAAAABjAIgAAAAAY0CQAAAAAGOAgEAAAABAgAAAAEAIBwAAK0EACADAAAAAwAgHAAAqwQAIB0AALEEACAXAAAAAwAgAQAAugMAIAQAALsDACAJAAC8AwAgDAAAvQMAIA4AAL8DACAPAADAAwAgFQAAsQQAINABQADxAgAh3gEBAJ4DACH1AUAA8QIAIfwBAQDwAgAh_wEBAPACACGAAgEA8AIAIYICQACfAwAhgwIBAJ4DACGIAgEAngMAIYkCAQCeAwAhigIBAPACACGLAiAAuQMAIYwCIAC5AwAhjQJAAJ8DACGOAgEAngMAIRUBAAC6AwAgBAAAuwMAIAkAALwDACAMAAC9AwAgDgAAvwMAIA8AAMADACDQAUAA8QIAId4BAQCeAwAh9QFAAPECACH8AQEA8AIAIf8BAQDwAgAhgAIBAPACACGCAkAAnwMAIYMCAQCeAwAhiAIBAJ4DACGJAgEAngMAIYoCAQDwAgAhiwIgALkDACGMAiAAuQMAIY0CQACfAwAhjgIBAJ4DACEDAAAAAwAgHAAArQQAIB0AALQEACAXAAAAAwAgAQAAugMAIAQAALsDACAJAAC8AwAgDQAAvgMAIA4AAL8DACAPAADAAwAgFQAAtAQAINABQADxAgAh3gEBAJ4DACH1AUAA8QIAIfwBAQDwAgAh_wEBAPACACGAAgEA8AIAIYICQACfAwAhgwIBAJ4DACGIAgEAngMAIYkCAQCeAwAhigIBAPACACGLAiAAuQMAIYwCIAC5AwAhjQJAAJ8DACGOAgEAngMAIRUBAAC6AwAgBAAAuwMAIAkAALwDACANAAC-AwAgDgAAvwMAIA8AAMADACDQAUAA8QIAId4BAQCeAwAh9QFAAPECACH8AQEA8AIAIf8BAQDwAgAhgAIBAPACACGCAkAAnwMAIYMCAQCeAwAhiAIBAJ4DACGJAgEAngMAIYoCAQDwAgAhiwIgALkDACGMAiAAuQMAIY0CQACfAwAhjgIBAJ4DACEVAQAAjAQAIAQAAIYEACAJAACHBAAgDAAAiAQAIA0AAIkEACAPAACLBAAg0AFAAAAAAd4BAQAAAAH1AUAAAAAB_AEBAAAAAf8BAQAAAAGAAgEAAAABggJAAAAAAYMCAQAAAAGIAgEAAAABiQIBAAAAAYoCAQAAAAGLAiAAAAABjAIgAAAAAY0CQAAAAAGOAgEAAAABAgAAAAEAIBwAALUEACADAAAAAwAgHAAAtQQAIB0AALkEACAXAAAAAwAgAQAAugMAIAQAALsDACAJAAC8AwAgDAAAvQMAIA0AAL4DACAPAADAAwAgFQAAuQQAINABQADxAgAh3gEBAJ4DACH1AUAA8QIAIfwBAQDwAgAh_wEBAPACACGAAgEA8AIAIYICQACfAwAhgwIBAJ4DACGIAgEAngMAIYkCAQCeAwAhigIBAPACACGLAiAAuQMAIYwCIAC5AwAhjQJAAJ8DACGOAgEAngMAIRUBAAC6AwAgBAAAuwMAIAkAALwDACAMAAC9AwAgDQAAvgMAIA8AAMADACDQAUAA8QIAId4BAQCeAwAh9QFAAPECACH8AQEA8AIAIf8BAQDwAgAhgAIBAPACACGCAkAAnwMAIYMCAQCeAwAhiAIBAJ4DACGJAgEAngMAIYoCAQDwAgAhiwIgALkDACGMAiAAuQMAIY0CQACfAwAhjgIBAJ4DACEVAQAAjAQAIAQAAIYEACAJAACHBAAgDAAAiAQAIA0AAIkEACAOAACKBAAg0AFAAAAAAd4BAQAAAAH1AUAAAAAB_AEBAAAAAf8BAQAAAAGAAgEAAAABggJAAAAAAYMCAQAAAAGIAgEAAAABiQIBAAAAAYoCAQAAAAGLAiAAAAABjAIgAAAAAY0CQAAAAAGOAgEAAAABAgAAAAEAIBwAALoEACADAAAAAwAgHAAAugQAIB0AAL4EACAXAAAAAwAgAQAAugMAIAQAALsDACAJAAC8AwAgDAAAvQMAIA0AAL4DACAOAAC_AwAgFQAAvgQAINABQADxAgAh3gEBAJ4DACH1AUAA8QIAIfwBAQDwAgAh_wEBAPACACGAAgEA8AIAIYICQACfAwAhgwIBAJ4DACGIAgEAngMAIYkCAQCeAwAhigIBAPACACGLAiAAuQMAIYwCIAC5AwAhjQJAAJ8DACGOAgEAngMAIRUBAAC6AwAgBAAAuwMAIAkAALwDACAMAAC9AwAgDQAAvgMAIA4AAL8DACDQAUAA8QIAId4BAQCeAwAh9QFAAPECACH8AQEA8AIAIf8BAQDwAgAhgAIBAPACACGCAkAAnwMAIYMCAQCeAwAhiAIBAJ4DACGJAgEAngMAIYoCAQDwAgAhiwIgALkDACGMAiAAuQMAIY0CQACfAwAhjgIBAJ4DACEIAQQBBAYBCAAICQoCDBMFDRQFDhgGDxwHAwUAAQcOAwgABAEGAAIBBw8AAgoAAQsAAQEFAAEBBQABBgQdAAkeAAwfAA0gAA4hAA8iAAABASwBAQEyAQMIAA0iAA4jAA8AAAADCAANIgAOIwAPAAAAAwgAFSIAFiMAFwAAAAMIABUiABYjABcAAAADCAAdIgAeIwAfAAAAAwgAHSIAHiMAHwEFAAEBBQABAwgAJCIAJSMAJgAAAAMIACQiACUjACYBBgACAQYAAgMIACsiACwjAC0AAAADCAArIgAsIwAtAgoAAQsAAQIKAAELAAEFCAAyIgA1IwA2dAAzdQA0AAAAAAAFCAAyIgA1IwA2dAAzdQA0AQUAAQEFAAEDCAA7IgA8IwA9AAAAAwgAOyIAPCMAPQEFAAEBBQABAwgAQiIAQyMARAAAAAMIAEIiAEMjAEQAAAAFCABKIgBNIwBOdABLdQBMAAAAAAAFCABKIgBNIwBOdABLdQBMAAAAAwgAVCIAVSMAVgAAAAMIAFQiAFUjAFYAAAADCABcIgBdIwBeAAAAAwgAXCIAXSMAXhACAREjARIkARMlARQmARYoARcqCRgrChkuARowCRsxCx4zAR80ASA1CSQ4DCU5ECY7ESc8ESg_ESlAESpBEStDESxFCS1GEi5IES9KCTBLEzFMETJNETNOCTRRFDVSGDZUGTdVGThYGTlZGTpaGTtcGTxeCT1fGj5hGT9jCUBkG0FlGUJmGUNnCURqHEVrIEZsAkdtAkhuAklvAkpwAktyAkx0CU11IU53Ak95CVB6IlF7AlJ8AlN9CVSAASNVgQEnVoIBA1eDAQNYhAEDWYUBA1qGAQNbiAEDXIoBCV2LAShejQEDX48BCWCQASlhkQEDYpIBA2OTAQlklgEqZZcBLmaYAQVnmQEFaJoBBWmbAQVqnAEFa54BBWygAQltoQEvbqMBBW-lAQlwpgEwcacBBXKoAQVzqQEJdqwBMXetATd4rgEGea8BBnqwAQZ7sQEGfLIBBn20AQZ-tgEJf7cBOIABuQEGgQG7AQmCAbwBOYMBvQEGhAG-AQaFAb8BCYYBwgE6hwHDAT6IAcQBB4kBxQEHigHGAQeLAccBB4wByAEHjQHKAQeOAcwBCY8BzQE_kAHPAQeRAdEBCZIB0gFAkwHTAQeUAdQBB5UB1QEJlgHYAUGXAdkBRZgB2wFGmQHcAUaaAd8BRpsB4AFGnAHhAUadAeMBRp4B5QEJnwHmAUegAegBRqEB6gEJogHrAUijAewBRqQB7QFGpQHuAQmmAfEBSacB8gFPqAH0AVCpAfUBUKoB-AFQqwH5AVCsAfoBUK0B_AFQrgH-AQmvAf8BUbABgQJQsQGDAgmyAYQCUrMBhQJQtAGGAlC1AYcCCbYBigJTtwGLAle4AY0CWLkBjgJYugGRAli7AZICWLwBkwJYvQGVAli-AZcCCb8BmAJZwAGaAljBAZwCCcIBnQJawwGeAljEAZ8CWMUBoAIJxgGjAlvHAaQCXw" + strings: JSON.parse("[\"where\",\"parentTopic\",\"orderBy\",\"cursor\",\"childTopics\",\"topic\",\"post\",\"reactions\",\"_count\",\"posts\",\"ancestorTopic\",\"descendantTopic\",\"ancestorClosures\",\"descendantClosures\",\"watches\",\"readStates\",\"Topic.findUnique\",\"Topic.findUniqueOrThrow\",\"Topic.findFirst\",\"Topic.findFirstOrThrow\",\"Topic.findMany\",\"data\",\"Topic.createOne\",\"Topic.createMany\",\"Topic.createManyAndReturn\",\"Topic.updateOne\",\"Topic.updateMany\",\"Topic.updateManyAndReturn\",\"create\",\"update\",\"Topic.upsertOne\",\"Topic.deleteOne\",\"Topic.deleteMany\",\"having\",\"_min\",\"_max\",\"Topic.groupBy\",\"Topic.aggregate\",\"MemberBan.findUnique\",\"MemberBan.findUniqueOrThrow\",\"MemberBan.findFirst\",\"MemberBan.findFirstOrThrow\",\"MemberBan.findMany\",\"MemberBan.createOne\",\"MemberBan.createMany\",\"MemberBan.createManyAndReturn\",\"MemberBan.updateOne\",\"MemberBan.updateMany\",\"MemberBan.updateManyAndReturn\",\"MemberBan.upsertOne\",\"MemberBan.deleteOne\",\"MemberBan.deleteMany\",\"MemberBan.groupBy\",\"MemberBan.aggregate\",\"IpBan.findUnique\",\"IpBan.findUniqueOrThrow\",\"IpBan.findFirst\",\"IpBan.findFirstOrThrow\",\"IpBan.findMany\",\"IpBan.createOne\",\"IpBan.createMany\",\"IpBan.createManyAndReturn\",\"IpBan.updateOne\",\"IpBan.updateMany\",\"IpBan.updateManyAndReturn\",\"IpBan.upsertOne\",\"IpBan.deleteOne\",\"IpBan.deleteMany\",\"IpBan.groupBy\",\"IpBan.aggregate\",\"Post.findUnique\",\"Post.findUniqueOrThrow\",\"Post.findFirst\",\"Post.findFirstOrThrow\",\"Post.findMany\",\"Post.createOne\",\"Post.createMany\",\"Post.createManyAndReturn\",\"Post.updateOne\",\"Post.updateMany\",\"Post.updateManyAndReturn\",\"Post.upsertOne\",\"Post.deleteOne\",\"Post.deleteMany\",\"Post.groupBy\",\"Post.aggregate\",\"PostReaction.findUnique\",\"PostReaction.findUniqueOrThrow\",\"PostReaction.findFirst\",\"PostReaction.findFirstOrThrow\",\"PostReaction.findMany\",\"PostReaction.createOne\",\"PostReaction.createMany\",\"PostReaction.createManyAndReturn\",\"PostReaction.updateOne\",\"PostReaction.updateMany\",\"PostReaction.updateManyAndReturn\",\"PostReaction.upsertOne\",\"PostReaction.deleteOne\",\"PostReaction.deleteMany\",\"PostReaction.groupBy\",\"PostReaction.aggregate\",\"TopicClosure.findUnique\",\"TopicClosure.findUniqueOrThrow\",\"TopicClosure.findFirst\",\"TopicClosure.findFirstOrThrow\",\"TopicClosure.findMany\",\"TopicClosure.createOne\",\"TopicClosure.createMany\",\"TopicClosure.createManyAndReturn\",\"TopicClosure.updateOne\",\"TopicClosure.updateMany\",\"TopicClosure.updateManyAndReturn\",\"TopicClosure.upsertOne\",\"TopicClosure.deleteOne\",\"TopicClosure.deleteMany\",\"_avg\",\"_sum\",\"TopicClosure.groupBy\",\"TopicClosure.aggregate\",\"TopicWatch.findUnique\",\"TopicWatch.findUniqueOrThrow\",\"TopicWatch.findFirst\",\"TopicWatch.findFirstOrThrow\",\"TopicWatch.findMany\",\"TopicWatch.createOne\",\"TopicWatch.createMany\",\"TopicWatch.createManyAndReturn\",\"TopicWatch.updateOne\",\"TopicWatch.updateMany\",\"TopicWatch.updateManyAndReturn\",\"TopicWatch.upsertOne\",\"TopicWatch.deleteOne\",\"TopicWatch.deleteMany\",\"TopicWatch.groupBy\",\"TopicWatch.aggregate\",\"ChallengeForumWatch.findUnique\",\"ChallengeForumWatch.findUniqueOrThrow\",\"ChallengeForumWatch.findFirst\",\"ChallengeForumWatch.findFirstOrThrow\",\"ChallengeForumWatch.findMany\",\"ChallengeForumWatch.createOne\",\"ChallengeForumWatch.createMany\",\"ChallengeForumWatch.createManyAndReturn\",\"ChallengeForumWatch.updateOne\",\"ChallengeForumWatch.updateMany\",\"ChallengeForumWatch.updateManyAndReturn\",\"ChallengeForumWatch.upsertOne\",\"ChallengeForumWatch.deleteOne\",\"ChallengeForumWatch.deleteMany\",\"ChallengeForumWatch.groupBy\",\"ChallengeForumWatch.aggregate\",\"TopicReadState.findUnique\",\"TopicReadState.findUniqueOrThrow\",\"TopicReadState.findFirst\",\"TopicReadState.findFirstOrThrow\",\"TopicReadState.findMany\",\"TopicReadState.createOne\",\"TopicReadState.createMany\",\"TopicReadState.createManyAndReturn\",\"TopicReadState.updateOne\",\"TopicReadState.updateMany\",\"TopicReadState.updateManyAndReturn\",\"TopicReadState.upsertOne\",\"TopicReadState.deleteOne\",\"TopicReadState.deleteMany\",\"TopicReadState.groupBy\",\"TopicReadState.aggregate\",\"PublicForumCategory.findUnique\",\"PublicForumCategory.findUniqueOrThrow\",\"PublicForumCategory.findFirst\",\"PublicForumCategory.findFirstOrThrow\",\"PublicForumCategory.findMany\",\"PublicForumCategory.createOne\",\"PublicForumCategory.createMany\",\"PublicForumCategory.createManyAndReturn\",\"PublicForumCategory.updateOne\",\"PublicForumCategory.updateMany\",\"PublicForumCategory.updateManyAndReturn\",\"PublicForumCategory.upsertOne\",\"PublicForumCategory.deleteOne\",\"PublicForumCategory.deleteMany\",\"PublicForumCategory.groupBy\",\"PublicForumCategory.aggregate\",\"PublicForumRoleMember.findUnique\",\"PublicForumRoleMember.findUniqueOrThrow\",\"PublicForumRoleMember.findFirst\",\"PublicForumRoleMember.findFirstOrThrow\",\"PublicForumRoleMember.findMany\",\"PublicForumRoleMember.createOne\",\"PublicForumRoleMember.createMany\",\"PublicForumRoleMember.createManyAndReturn\",\"PublicForumRoleMember.updateOne\",\"PublicForumRoleMember.updateMany\",\"PublicForumRoleMember.updateManyAndReturn\",\"PublicForumRoleMember.upsertOne\",\"PublicForumRoleMember.deleteOne\",\"PublicForumRoleMember.deleteMany\",\"PublicForumRoleMember.groupBy\",\"PublicForumRoleMember.aggregate\",\"PublicForumImportRecord.findUnique\",\"PublicForumImportRecord.findUniqueOrThrow\",\"PublicForumImportRecord.findFirst\",\"PublicForumImportRecord.findFirstOrThrow\",\"PublicForumImportRecord.findMany\",\"PublicForumImportRecord.createOne\",\"PublicForumImportRecord.createMany\",\"PublicForumImportRecord.createManyAndReturn\",\"PublicForumImportRecord.updateOne\",\"PublicForumImportRecord.updateMany\",\"PublicForumImportRecord.updateManyAndReturn\",\"PublicForumImportRecord.upsertOne\",\"PublicForumImportRecord.deleteOne\",\"PublicForumImportRecord.deleteMany\",\"PublicForumImportRecord.groupBy\",\"PublicForumImportRecord.aggregate\",\"AND\",\"OR\",\"NOT\",\"entityType\",\"sourceId\",\"targetId\",\"sourceHash\",\"targetHash\",\"createdAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"contains\",\"startsWith\",\"endsWith\",\"entityType_targetId\",\"entityType_sourceId\",\"roleName\",\"memberId\",\"roleName_memberId\",\"topicId\",\"description\",\"displayAs\",\"sortOrder\",\"readRoles\",\"createRoles\",\"replyRoles\",\"legacyId\",\"legacySlug\",\"source\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"has\",\"hasEvery\",\"hasSome\",\"lastReadAt\",\"updatedAt\",\"challengeId\",\"watching\",\"challengeId_memberId\",\"ancestorTopicId\",\"descendantTopicId\",\"depth\",\"postId\",\"PostReactionType\",\"reaction\",\"id\",\"parentType\",\"parentId\",\"authorMemberId\",\"authorHandle\",\"content\",\"deletedAt\",\"deletedByMemberId\",\"ipAddress\",\"createdByMemberId\",\"removedAt\",\"removedByMemberId\",\"parentTopicId\",\"title\",\"isAnnouncement\",\"locked\",\"lockedAt\",\"lockedByMemberId\",\"topicId_memberId\",\"ancestorTopicId_descendantTopicId\",\"postId_memberId\",\"every\",\"some\",\"none\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"push\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), + graph: "3QRnwAEZAQAAgwMAIAQAAIQDACAJAACFAwAgDAAAhgMAIA0AAIYDACAOAACHAwAgDwAAiAMAINgBAACCAwAw2QEAAAMAENoBAACCAwAw4AFAAMgCACHuAQEA8AIAIYUCQADIAgAhhgIBAPACACGPAgEAAAABkgIBAMcCACGTAgEAxwIAIZUCQADxAgAhlgIBAPACACGbAgEA8AIAIZwCAQDHAgAhnQIgAN4CACGeAiAA3gIAIZ8CQADxAgAhoAIBAPACACEBAAAAAQAgGQEAAIMDACAEAACEAwAgCQAAhQMAIAwAAIYDACANAACGAwAgDgAAhwMAIA8AAIgDACDYAQAAggMAMNkBAAADABDaAQAAggMAMOABQADIAgAh7gEBAPACACGFAkAAyAIAIYYCAQDwAgAhjwIBAMcCACGSAgEAxwIAIZMCAQDHAgAhlQJAAPECACGWAgEA8AIAIZsCAQDwAgAhnAIBAMcCACGdAiAA3gIAIZ4CIADeAgAhnwJAAPECACGgAgEA8AIAIQEAAAADACAOAQAArAQAIAQAAK8EACAJAACwBAAgDAAAsQQAIA0AALEEACAOAACyBAAgDwAAswQAIO4BAAC6AwAghgIAALoDACCVAgAAugMAIJYCAAC6AwAgmwIAALoDACCfAgAAugMAIKACAAC6AwAgAwAAAAMAIAIAAAUAMAMAAAEAIBAFAAD3AgAgBwAAgQMAINgBAACAAwAw2QEAAAcAENoBAACAAwAw4AFAAMgCACHxAQEAxwIAIYUCQADIAgAhjwIBAMcCACGQAgEAxwIAIZECAQDHAgAhkgIBAMcCACGTAgEAxwIAIZQCAQDwAgAhlQJAAPECACGWAgEA8AIAIQUFAACsBAAgBwAArgQAIJQCAAC6AwAglQIAALoDACCWAgAAugMAIBAFAAD3AgAgBwAAgQMAINgBAACAAwAw2QEAAAcAENoBAACAAwAw4AFAAMgCACHxAQEAxwIAIYUCQADIAgAhjwIBAAAAAZACAQDHAgAhkQIBAMcCACGSAgEAxwIAIZMCAQDHAgAhlAIBAPACACGVAkAA8QIAIZYCAQDwAgAhAwAAAAcAIAIAAAgAMAMAAAkAIAkGAAD_AgAg2AEAAP0CADDZAQAACwAQ2gEAAP0CADDgAUAAyAIAIe8BAQDHAgAhhQJAAMgCACGMAgEAxwIAIY4CAAD-Ao4CIgEGAACtBAAgCgYAAP8CACDYAQAA_QIAMNkBAAALABDaAQAA_QIAMOABQADIAgAh7wEBAMcCACGFAkAAyAIAIYwCAQDHAgAhjgIAAP4CjgIiowIAAPwCACADAAAACwAgAgAADAAwAwAADQAgAQAAAAsAIAgKAAD3AgAgCwAA9wIAINgBAAD7AgAw2QEAABAAENoBAAD7AgAwiQIBAMcCACGKAgEAxwIAIYsCAgDWAgAhAgoAAKwEACALAACsBAAgCQoAAPcCACALAAD3AgAg2AEAAPsCADDZAQAAEAAQ2gEAAPsCADCJAgEAxwIAIYoCAQDHAgAhiwICANYCACGiAgAA-gIAIAMAAAAQACACAAARADADAAASACADAAAAEAAgAgAAEQAwAwAAEgAgBwUAAPcCACDYAQAA-QIAMNkBAAAVABDaAQAA-QIAMOABQADIAgAh7wEBAMcCACHxAQEAxwIAIQEFAACsBAAgCAUAAPcCACDYAQAA-QIAMNkBAAAVABDaAQAA-QIAMOABQADIAgAh7wEBAMcCACHxAQEAxwIAIaECAAD4AgAgAwAAABUAIAIAABYAMAMAABcAIAgFAAD3AgAg2AEAAPYCADDZAQAAGQAQ2gEAAPYCADDvAQEAxwIAIfEBAQDHAgAhhAJAAMgCACGFAkAAyAIAIQEFAACsBAAgCQUAAPcCACDYAQAA9gIAMNkBAAAZABDaAQAA9gIAMO8BAQDHAgAh8QEBAMcCACGEAkAAyAIAIYUCQADIAgAhoQIAAPUCACADAAAAGQAgAgAAGgAwAwAAGwAgAQAAAAMAIAEAAAAHACABAAAAEAAgAQAAABAAIAEAAAAVACABAAAAGQAgAQAAAAEAIAMAAAADACACAAAFADADAAABACADAAAAAwAgAgAABQAwAwAAAQAgAwAAAAMAIAIAAAUAMAMAAAEAIBYBAACrBAAgBAAApQQAIAkAAKYEACAMAACnBAAgDQAAqAQAIA4AAKkEACAPAACqBAAg4AFAAAAAAe4BAQAAAAGFAkAAAAABhgIBAAAAAY8CAQAAAAGSAgEAAAABkwIBAAAAAZUCQAAAAAGWAgEAAAABmwIBAAAAAZwCAQAAAAGdAiAAAAABngIgAAAAAZ8CQAAAAAGgAgEAAAABARUAACcAIA_gAUAAAAAB7gEBAAAAAYUCQAAAAAGGAgEAAAABjwIBAAAAAZICAQAAAAGTAgEAAAABlQJAAAAAAZYCAQAAAAGbAgEAAAABnAIBAAAAAZ0CIAAAAAGeAiAAAAABnwJAAAAAAaACAQAAAAEBFQAAKQAwARUAACkAMAEAAAADACAWAQAA2QMAIAQAANoDACAJAADbAwAgDAAA3AMAIA0AAN0DACAOAADeAwAgDwAA3wMAIOABQACNAwAh7gEBAL4DACGFAkAAjQMAIYYCAQC-AwAhjwIBAIwDACGSAgEAjAMAIZMCAQCMAwAhlQJAAL8DACGWAgEAvgMAIZsCAQC-AwAhnAIBAIwDACGdAiAApQMAIZ4CIAClAwAhnwJAAL8DACGgAgEAvgMAIQIAAAABACAVAAAtACAP4AFAAI0DACHuAQEAvgMAIYUCQACNAwAhhgIBAL4DACGPAgEAjAMAIZICAQCMAwAhkwIBAIwDACGVAkAAvwMAIZYCAQC-AwAhmwIBAL4DACGcAgEAjAMAIZ0CIAClAwAhngIgAKUDACGfAkAAvwMAIaACAQC-AwAhAgAAAAMAIBUAAC8AIAIAAAADACAVAAAvACABAAAAAwAgAwAAAAEAIBwAACcAIB0AAC0AIAEAAAABACABAAAAAwAgCggAANYDACAiAADYAwAgIwAA1wMAIO4BAAC6AwAghgIAALoDACCVAgAAugMAIJYCAAC6AwAgmwIAALoDACCfAgAAugMAIKACAAC6AwAgEtgBAAD0AgAw2QEAADcAENoBAAD0AgAw4AFAAMACACHuAQEA5wIAIYUCQADAAgAhhgIBAOcCACGPAgEAvwIAIZICAQC_AgAhkwIBAL8CACGVAkAA6AIAIZYCAQDnAgAhmwIBAOcCACGcAgEAvwIAIZ0CIADaAgAhngIgANoCACGfAkAA6AIAIaACAQDnAgAhAwAAAAMAIAIAADYAMCEAADcAIAMAAAADACACAAAFADADAAABACAJ2AEAAPMCADDZAQAAPQAQ2gEAAPMCADDgAUAAyAIAIe8BAQDHAgAhjwIBAAAAAZgCAQDwAgAhmQJAAPECACGaAgEA8AIAIQEAAAA6ACABAAAAOgAgCdgBAADzAgAw2QEAAD0AENoBAADzAgAw4AFAAMgCACHvAQEAxwIAIY8CAQDHAgAhmAIBAPACACGZAkAA8QIAIZoCAQDwAgAhA5gCAAC6AwAgmQIAALoDACCaAgAAugMAIAMAAAA9ACACAAA-ADADAAA6ACADAAAAPQAgAgAAPgAwAwAAOgAgAwAAAD0AIAIAAD4AMAMAADoAIAbgAUAAAAAB7wEBAAAAAY8CAQAAAAGYAgEAAAABmQJAAAAAAZoCAQAAAAEBFQAAQgAgBuABQAAAAAHvAQEAAAABjwIBAAAAAZgCAQAAAAGZAkAAAAABmgIBAAAAAQEVAABEADABFQAARAAwBuABQACNAwAh7wEBAIwDACGPAgEAjAMAIZgCAQC-AwAhmQJAAL8DACGaAgEAvgMAIQIAAAA6ACAVAABHACAG4AFAAI0DACHvAQEAjAMAIY8CAQCMAwAhmAIBAL4DACGZAkAAvwMAIZoCAQC-AwAhAgAAAD0AIBUAAEkAIAIAAAA9ACAVAABJACADAAAAOgAgHAAAQgAgHQAARwAgAQAAADoAIAEAAAA9ACAGCAAA0wMAICIAANUDACAjAADUAwAgmAIAALoDACCZAgAAugMAIJoCAAC6AwAgCdgBAADyAgAw2QEAAFAAENoBAADyAgAw4AFAAMACACHvAQEAvwIAIY8CAQC_AgAhmAIBAOcCACGZAkAA6AIAIZoCAQDnAgAhAwAAAD0AIAIAAE8AMCEAAFAAIAMAAAA9ACACAAA-ADADAAA6ACAJ2AEAAO8CADDZAQAAVgAQ2gEAAO8CADDgAUAAyAIAIY8CAQAAAAGXAgEAxwIAIZgCAQDwAgAhmQJAAPECACGaAgEA8AIAIQEAAABTACABAAAAUwAgCdgBAADvAgAw2QEAAFYAENoBAADvAgAw4AFAAMgCACGPAgEAxwIAIZcCAQDHAgAhmAIBAPACACGZAkAA8QIAIZoCAQDwAgAhA5gCAAC6AwAgmQIAALoDACCaAgAAugMAIAMAAABWACACAABXADADAABTACADAAAAVgAgAgAAVwAwAwAAUwAgAwAAAFYAIAIAAFcAMAMAAFMAIAbgAUAAAAABjwIBAAAAAZcCAQAAAAGYAgEAAAABmQJAAAAAAZoCAQAAAAEBFQAAWwAgBuABQAAAAAGPAgEAAAABlwIBAAAAAZgCAQAAAAGZAkAAAAABmgIBAAAAAQEVAABdADABFQAAXQAwBuABQACNAwAhjwIBAIwDACGXAgEAjAMAIZgCAQC-AwAhmQJAAL8DACGaAgEAvgMAIQIAAABTACAVAABgACAG4AFAAI0DACGPAgEAjAMAIZcCAQCMAwAhmAIBAL4DACGZAkAAvwMAIZoCAQC-AwAhAgAAAFYAIBUAAGIAIAIAAABWACAVAABiACADAAAAUwAgHAAAWwAgHQAAYAAgAQAAAFMAIAEAAABWACAGCAAA0AMAICIAANIDACAjAADRAwAgmAIAALoDACCZAgAAugMAIJoCAAC6AwAgCdgBAADuAgAw2QEAAGkAENoBAADuAgAw4AFAAMACACGPAgEAvwIAIZcCAQC_AgAhmAIBAOcCACGZAkAA6AIAIZoCAQDnAgAhAwAAAFYAIAIAAGgAMCEAAGkAIAMAAABWACACAABXADADAABTACABAAAACQAgAQAAAAkAIAMAAAAHACACAAAIADADAAAJACADAAAABwAgAgAACAAwAwAACQAgAwAAAAcAIAIAAAgAMAMAAAkAIA0FAADOAwAgBwAAzwMAIOABQAAAAAHxAQEAAAABhQJAAAAAAY8CAQAAAAGQAgEAAAABkQIBAAAAAZICAQAAAAGTAgEAAAABlAIBAAAAAZUCQAAAAAGWAgEAAAABARUAAHEAIAvgAUAAAAAB8QEBAAAAAYUCQAAAAAGPAgEAAAABkAIBAAAAAZECAQAAAAGSAgEAAAABkwIBAAAAAZQCAQAAAAGVAkAAAAABlgIBAAAAAQEVAABzADABFQAAcwAwDQUAAMADACAHAADBAwAg4AFAAI0DACHxAQEAjAMAIYUCQACNAwAhjwIBAIwDACGQAgEAjAMAIZECAQCMAwAhkgIBAIwDACGTAgEAjAMAIZQCAQC-AwAhlQJAAL8DACGWAgEAvgMAIQIAAAAJACAVAAB2ACAL4AFAAI0DACHxAQEAjAMAIYUCQACNAwAhjwIBAIwDACGQAgEAjAMAIZECAQCMAwAhkgIBAIwDACGTAgEAjAMAIZQCAQC-AwAhlQJAAL8DACGWAgEAvgMAIQIAAAAHACAVAAB4ACACAAAABwAgFQAAeAAgAwAAAAkAIBwAAHEAIB0AAHYAIAEAAAAJACABAAAABwAgBggAALsDACAiAAC9AwAgIwAAvAMAIJQCAAC6AwAglQIAALoDACCWAgAAugMAIA7YAQAA5gIAMNkBAAB_ABDaAQAA5gIAMOABQADAAgAh8QEBAL8CACGFAkAAwAIAIY8CAQC_AgAhkAIBAL8CACGRAgEAvwIAIZICAQC_AgAhkwIBAL8CACGUAgEA5wIAIZUCQADoAgAhlgIBAOcCACEDAAAABwAgAgAAfgAwIQAAfwAgAwAAAAcAIAIAAAgAMAMAAAkAIAEAAAANACABAAAADQAgAwAAAAsAIAIAAAwAMAMAAA0AIAMAAAALACACAAAMADADAAANACADAAAACwAgAgAADAAwAwAADQAgBgYAALkDACDgAUAAAAAB7wEBAAAAAYUCQAAAAAGMAgEAAAABjgIAAACOAgIBFQAAhwEAIAXgAUAAAAAB7wEBAAAAAYUCQAAAAAGMAgEAAAABjgIAAACOAgIBFQAAiQEAMAEVAACJAQAwBgYAALgDACDgAUAAjQMAIe8BAQCMAwAhhQJAAI0DACGMAgEAjAMAIY4CAAC3A44CIgIAAAANACAVAACMAQAgBeABQACNAwAh7wEBAIwDACGFAkAAjQMAIYwCAQCMAwAhjgIAALcDjgIiAgAAAAsAIBUAAI4BACACAAAACwAgFQAAjgEAIAMAAAANACAcAACHAQAgHQAAjAEAIAEAAAANACABAAAACwAgAwgAALQDACAiAAC2AwAgIwAAtQMAIAjYAQAA4gIAMNkBAACVAQAQ2gEAAOICADDgAUAAwAIAIe8BAQC_AgAhhQJAAMACACGMAgEAvwIAIY4CAADjAo4CIgMAAAALACACAACUAQAwIQAAlQEAIAMAAAALACACAAAMADADAAANACABAAAAEgAgAQAAABIAIAMAAAAQACACAAARADADAAASACADAAAAEAAgAgAAEQAwAwAAEgAgAwAAABAAIAIAABEAMAMAABIAIAUKAACyAwAgCwAAswMAIIkCAQAAAAGKAgEAAAABiwICAAAAAQEVAACdAQAgA4kCAQAAAAGKAgEAAAABiwICAAAAAQEVAACfAQAwARUAAJ8BADAFCgAAsAMAIAsAALEDACCJAgEAjAMAIYoCAQCMAwAhiwICAJYDACECAAAAEgAgFQAAogEAIAOJAgEAjAMAIYoCAQCMAwAhiwICAJYDACECAAAAEAAgFQAApAEAIAIAAAAQACAVAACkAQAgAwAAABIAIBwAAJ0BACAdAACiAQAgAQAAABIAIAEAAAAQACAFCAAAqwMAICIAAK4DACAjAACtAwAgdAAArAMAIHUAAK8DACAG2AEAAOECADDZAQAAqwEAENoBAADhAgAwiQIBAL8CACGKAgEAvwIAIYsCAgDPAgAhAwAAABAAIAIAAKoBADAhAACrAQAgAwAAABAAIAIAABEAMAMAABIAIAEAAAAXACABAAAAFwAgAwAAABUAIAIAABYAMAMAABcAIAMAAAAVACACAAAWADADAAAXACADAAAAFQAgAgAAFgAwAwAAFwAgBAUAAKoDACDgAUAAAAAB7wEBAAAAAfEBAQAAAAEBFQAAswEAIAPgAUAAAAAB7wEBAAAAAfEBAQAAAAEBFQAAtQEAMAEVAAC1AQAwBAUAAKkDACDgAUAAjQMAIe8BAQCMAwAh8QEBAIwDACECAAAAFwAgFQAAuAEAIAPgAUAAjQMAIe8BAQCMAwAh8QEBAIwDACECAAAAFQAgFQAAugEAIAIAAAAVACAVAAC6AQAgAwAAABcAIBwAALMBACAdAAC4AQAgAQAAABcAIAEAAAAVACADCAAApgMAICIAAKgDACAjAACnAwAgBtgBAADgAgAw2QEAAMEBABDaAQAA4AIAMOABQADAAgAh7wEBAL8CACHxAQEAvwIAIQMAAAAVACACAADAAQAwIQAAwQEAIAMAAAAVACACAAAWADADAAAXACAJ2AEAAN0CADDZAQAAxwEAENoBAADdAgAw4AFAAMgCACHvAQEAxwIAIYUCQADIAgAhhgIBAMcCACGHAiAA3gIAIYgCAADfAgAgAQAAAMQBACABAAAAxAEAIAjYAQAA3QIAMNkBAADHAQAQ2gEAAN0CADDgAUAAyAIAIe8BAQDHAgAhhQJAAMgCACGGAgEAxwIAIYcCIADeAgAhAAMAAADHAQAgAgAAyAEAMAMAAMQBACADAAAAxwEAIAIAAMgBADADAADEAQAgAwAAAMcBACACAADIAQAwAwAAxAEAIAXgAUAAAAAB7wEBAAAAAYUCQAAAAAGGAgEAAAABhwIgAAAAAQEVAADMAQAgBeABQAAAAAHvAQEAAAABhQJAAAAAAYYCAQAAAAGHAiAAAAABARUAAM4BADABFQAAzgEAMAXgAUAAjQMAIe8BAQCMAwAhhQJAAI0DACGGAgEAjAMAIYcCIAClAwAhAgAAAMQBACAVAADRAQAgBeABQACNAwAh7wEBAIwDACGFAkAAjQMAIYYCAQCMAwAhhwIgAKUDACECAAAAxwEAIBUAANMBACACAAAAxwEAIBUAANMBACADAAAAxAEAIBwAAMwBACAdAADRAQAgAQAAAMQBACABAAAAxwEAIAMIAACiAwAgIgAApAMAICMAAKMDACAI2AEAANkCADDZAQAA2gEAENoBAADZAgAw4AFAAMACACHvAQEAvwIAIYUCQADAAgAhhgIBAL8CACGHAiAA2gIAIQMAAADHAQAgAgAA2QEAMCEAANoBACADAAAAxwEAIAIAAMgBADADAADEAQAgAQAAABsAIAEAAAAbACADAAAAGQAgAgAAGgAwAwAAGwAgAwAAABkAIAIAABoAMAMAABsAIAMAAAAZACACAAAaADADAAAbACAFBQAAoQMAIO8BAQAAAAHxAQEAAAABhAJAAAAAAYUCQAAAAAEBFQAA4gEAIATvAQEAAAAB8QEBAAAAAYQCQAAAAAGFAkAAAAABARUAAOQBADABFQAA5AEAMAUFAACgAwAg7wEBAIwDACHxAQEAjAMAIYQCQACNAwAhhQJAAI0DACECAAAAGwAgFQAA5wEAIATvAQEAjAMAIfEBAQCMAwAhhAJAAI0DACGFAkAAjQMAIQIAAAAZACAVAADpAQAgAgAAABkAIBUAAOkBACADAAAAGwAgHAAA4gEAIB0AAOcBACABAAAAGwAgAQAAABkAIAMIAACdAwAgIgAAnwMAICMAAJ4DACAH2AEAANgCADDZAQAA8AEAENoBAADYAgAw7wEBAL8CACHxAQEAvwIAIYQCQADAAgAhhQJAAMACACEDAAAAGQAgAgAA7wEAMCEAAPABACADAAAAGQAgAgAAGgAwAwAAGwAgDdgBAADVAgAw2QEAAPYBABDaAQAA1QIAMPEBAQAAAAHyAQEAxwIAIfMBAQDHAgAh9AECANYCACH1AQAA0AIAIPYBAADQAgAg9wEAANACACD4AQIAAAAB-QEBAMcCACH6AQAA1wIAIAEAAADzAQAgAQAAAPMBACAN2AEAANUCADDZAQAA9gEAENoBAADVAgAw8QEBAMcCACHyAQEAxwIAIfMBAQDHAgAh9AECANYCACH1AQAA0AIAIPYBAADQAgAg9wEAANACACD4AQIA1gIAIfkBAQDHAgAh-gEAANcCACAAAwAAAPYBACACAAD3AQAwAwAA8wEAIAMAAAD2AQAgAgAA9wEAMAMAAPMBACADAAAA9gEAIAIAAPcBADADAADzAQAgCvEBAQAAAAHyAQEAAAAB8wEBAAAAAfQBAgAAAAH1AQAAmgMAIPYBAACbAwAg9wEAAJwDACD4AQIAAAAB-QEBAAAAAfoBgAAAAAEBFQAA-wEAIArxAQEAAAAB8gEBAAAAAfMBAQAAAAH0AQIAAAAB9QEAAJoDACD2AQAAmwMAIPcBAACcAwAg-AECAAAAAfkBAQAAAAH6AYAAAAABARUAAP0BADABFQAA_QEAMArxAQEAjAMAIfIBAQCMAwAh8wEBAIwDACH0AQIAlgMAIfUBAACXAwAg9gEAAJgDACD3AQAAmQMAIPgBAgCWAwAh-QEBAIwDACH6AYAAAAABAgAAAPMBACAVAACAAgAgCvEBAQCMAwAh8gEBAIwDACHzAQEAjAMAIfQBAgCWAwAh9QEAAJcDACD2AQAAmAMAIPcBAACZAwAg-AECAJYDACH5AQEAjAMAIfoBgAAAAAECAAAA9gEAIBUAAIICACACAAAA9gEAIBUAAIICACADAAAA8wEAIBwAAPsBACAdAACAAgAgAQAAAPMBACABAAAA9gEAIAUIAACRAwAgIgAAlAMAICMAAJMDACB0AACSAwAgdQAAlQMAIA3YAQAAzgIAMNkBAACJAgAQ2gEAAM4CADDxAQEAvwIAIfIBAQC_AgAh8wEBAL8CACH0AQIAzwIAIfUBAADQAgAg9gEAANACACD3AQAA0AIAIPgBAgDPAgAh-QEBAL8CACH6AQAA0QIAIAMAAAD2AQAgAgAAiAIAMCEAAIkCACADAAAA9gEAIAIAAPcBADADAADzAQAgBtgBAADMAgAw2QEAAI8CABDaAQAAzAIAMO4BAQDHAgAh7wEBAMcCACHwAQAAzQIAIAEAAACMAgAgAQAAAIwCACAF2AEAAMwCADDZAQAAjwIAENoBAADMAgAw7gEBAMcCACHvAQEAxwIAIQADAAAAjwIAIAIAAJACADADAACMAgAgAwAAAI8CACACAACQAgAwAwAAjAIAIAMAAACPAgAgAgAAkAIAMAMAAIwCACAC7gEBAAAAAe8BAQAAAAEBFQAAlAIAIALuAQEAAAAB7wEBAAAAAQEVAACWAgAwARUAAJYCADAC7gEBAIwDACHvAQEAjAMAIQIAAACMAgAgFQAAmQIAIALuAQEAjAMAIe8BAQCMAwAhAgAAAI8CACAVAACbAgAgAgAAAI8CACAVAACbAgAgAwAAAIwCACAcAACUAgAgHQAAmQIAIAEAAACMAgAgAQAAAI8CACADCAAAjgMAICIAAJADACAjAACPAwAgBdgBAADLAgAw2QEAAKICABDaAQAAywIAMO4BAQC_AgAh7wEBAL8CACEDAAAAjwIAIAIAAKECADAhAACiAgAgAwAAAI8CACACAACQAgAwAwAAjAIAIAvYAQAAxgIAMNkBAACoAgAQ2gEAAMYCADDbAQEAxwIAIdwBAQDHAgAh3QEBAMcCACHeAQEAxwIAId8BAQDHAgAh4AFAAMgCACHsAQAAyQIAIO0BAADKAgAgAQAAAKUCACABAAAApQIAIAnYAQAAxgIAMNkBAACoAgAQ2gEAAMYCADDbAQEAxwIAIdwBAQDHAgAh3QEBAMcCACHeAQEAxwIAId8BAQDHAgAh4AFAAMgCACEAAwAAAKgCACACAACpAgAwAwAApQIAIAMAAACoAgAgAgAAqQIAMAMAAKUCACADAAAAqAIAIAIAAKkCADADAAClAgAgBtsBAQAAAAHcAQEAAAAB3QEBAAAAAd4BAQAAAAHfAQEAAAAB4AFAAAAAAQEVAACtAgAgBtsBAQAAAAHcAQEAAAAB3QEBAAAAAd4BAQAAAAHfAQEAAAAB4AFAAAAAAQEVAACvAgAwARUAAK8CADAG2wEBAIwDACHcAQEAjAMAId0BAQCMAwAh3gEBAIwDACHfAQEAjAMAIeABQACNAwAhAgAAAKUCACAVAACyAgAgBtsBAQCMAwAh3AEBAIwDACHdAQEAjAMAId4BAQCMAwAh3wEBAIwDACHgAUAAjQMAIQIAAACoAgAgFQAAtAIAIAIAAACoAgAgFQAAtAIAIAMAAAClAgAgHAAArQIAIB0AALICACABAAAApQIAIAEAAACoAgAgAwgAAIkDACAiAACLAwAgIwAAigMAIAnYAQAAvgIAMNkBAAC7AgAQ2gEAAL4CADDbAQEAvwIAIdwBAQC_AgAh3QEBAL8CACHeAQEAvwIAId8BAQC_AgAh4AFAAMACACEDAAAAqAIAIAIAALoCADAhAAC7AgAgAwAAAKgCACACAACpAgAwAwAApQIAIAnYAQAAvgIAMNkBAAC7AgAQ2gEAAL4CADDbAQEAvwIAIdwBAQC_AgAh3QEBAL8CACHeAQEAvwIAId8BAQC_AgAh4AFAAMACACEOCAAAwgIAICIAAMUCACAjAADFAgAg4QEBAAAAAeIBAQAAAATjAQEAAAAE5AEBAAAAAeUBAQAAAAHmAQEAAAAB5wEBAAAAAegBAQDEAgAh6QEBAAAAAeoBAQAAAAHrAQEAAAABCwgAAMICACAiAADDAgAgIwAAwwIAIOEBQAAAAAHiAUAAAAAE4wFAAAAABOQBQAAAAAHlAUAAAAAB5gFAAAAAAecBQAAAAAHoAUAAwQIAIQsIAADCAgAgIgAAwwIAICMAAMMCACDhAUAAAAAB4gFAAAAABOMBQAAAAATkAUAAAAAB5QFAAAAAAeYBQAAAAAHnAUAAAAAB6AFAAMECACEI4QECAAAAAeIBAgAAAATjAQIAAAAE5AECAAAAAeUBAgAAAAHmAQIAAAAB5wECAAAAAegBAgDCAgAhCOEBQAAAAAHiAUAAAAAE4wFAAAAABOQBQAAAAAHlAUAAAAAB5gFAAAAAAecBQAAAAAHoAUAAwwIAIQ4IAADCAgAgIgAAxQIAICMAAMUCACDhAQEAAAAB4gEBAAAABOMBAQAAAATkAQEAAAAB5QEBAAAAAeYBAQAAAAHnAQEAAAAB6AEBAMQCACHpAQEAAAAB6gEBAAAAAesBAQAAAAEL4QEBAAAAAeIBAQAAAATjAQEAAAAE5AEBAAAAAeUBAQAAAAHmAQEAAAAB5wEBAAAAAegBAQDFAgAh6QEBAAAAAeoBAQAAAAHrAQEAAAABCdgBAADGAgAw2QEAAKgCABDaAQAAxgIAMNsBAQDHAgAh3AEBAMcCACHdAQEAxwIAId4BAQDHAgAh3wEBAMcCACHgAUAAyAIAIQvhAQEAAAAB4gEBAAAABOMBAQAAAATkAQEAAAAB5QEBAAAAAeYBAQAAAAHnAQEAAAAB6AEBAMUCACHpAQEAAAAB6gEBAAAAAesBAQAAAAEI4QFAAAAAAeIBQAAAAATjAUAAAAAE5AFAAAAAAeUBQAAAAAHmAUAAAAAB5wFAAAAAAegBQADDAgAhAtsBAQAAAAHdAQEAAAABAtsBAQAAAAHcAQEAAAABBdgBAADLAgAw2QEAAKICABDaAQAAywIAMO4BAQC_AgAh7wEBAL8CACEF2AEAAMwCADDZAQAAjwIAENoBAADMAgAw7gEBAMcCACHvAQEAxwIAIQLuAQEAAAAB7wEBAAAAAQ3YAQAAzgIAMNkBAACJAgAQ2gEAAM4CADDxAQEAvwIAIfIBAQC_AgAh8wEBAL8CACH0AQIAzwIAIfUBAADQAgAg9gEAANACACD3AQAA0AIAIPgBAgDPAgAh-QEBAL8CACH6AQAA0QIAIA0IAADCAgAgIgAAwgIAICMAAMICACB0AADUAgAgdQAAwgIAIOEBAgAAAAHiAQIAAAAE4wECAAAABOQBAgAAAAHlAQIAAAAB5gECAAAAAecBAgAAAAHoAQIA0wIAIQThAQEAAAAFgQIBAAAAAYICAQAAAASDAgEAAAAEDwgAAMICACAiAADSAgAgIwAA0gIAIOEBgAAAAAHkAYAAAAAB5QGAAAAAAeYBgAAAAAHnAYAAAAAB6AGAAAAAAfsBAQAAAAH8AQEAAAAB_QEBAAAAAf4BgAAAAAH_AYAAAAABgAKAAAAAAQzhAYAAAAAB5AGAAAAAAeUBgAAAAAHmAYAAAAAB5wGAAAAAAegBgAAAAAH7AQEAAAAB_AEBAAAAAf0BAQAAAAH-AYAAAAAB_wGAAAAAAYACgAAAAAENCAAAwgIAICIAAMICACAjAADCAgAgdAAA1AIAIHUAAMICACDhAQIAAAAB4gECAAAABOMBAgAAAATkAQIAAAAB5QECAAAAAeYBAgAAAAHnAQIAAAAB6AECANMCACEI4QEIAAAAAeIBCAAAAATjAQgAAAAE5AEIAAAAAeUBCAAAAAHmAQgAAAAB5wEIAAAAAegBCADUAgAhDdgBAADVAgAw2QEAAPYBABDaAQAA1QIAMPEBAQDHAgAh8gEBAMcCACHzAQEAxwIAIfQBAgDWAgAh9QEAANACACD2AQAA0AIAIPcBAADQAgAg-AECANYCACH5AQEAxwIAIfoBAADXAgAgCOEBAgAAAAHiAQIAAAAE4wECAAAABOQBAgAAAAHlAQIAAAAB5gECAAAAAecBAgAAAAHoAQIAwgIAIQzhAYAAAAAB5AGAAAAAAeUBgAAAAAHmAYAAAAAB5wGAAAAAAegBgAAAAAH7AQEAAAAB_AEBAAAAAf0BAQAAAAH-AYAAAAAB_wGAAAAAAYACgAAAAAEH2AEAANgCADDZAQAA8AEAENoBAADYAgAw7wEBAL8CACHxAQEAvwIAIYQCQADAAgAhhQJAAMACACEI2AEAANkCADDZAQAA2gEAENoBAADZAgAw4AFAAMACACHvAQEAvwIAIYUCQADAAgAhhgIBAL8CACGHAiAA2gIAIQUIAADCAgAgIgAA3AIAICMAANwCACDhASAAAAAB6AEgANsCACEFCAAAwgIAICIAANwCACAjAADcAgAg4QEgAAAAAegBIADbAgAhAuEBIAAAAAHoASAA3AIAIQjYAQAA3QIAMNkBAADHAQAQ2gEAAN0CADDgAUAAyAIAIe8BAQDHAgAhhQJAAMgCACGGAgEAxwIAIYcCIADeAgAhAuEBIAAAAAHoASAA3AIAIQLvAQEAAAABhgIBAAAAAQbYAQAA4AIAMNkBAADBAQAQ2gEAAOACADDgAUAAwAIAIe8BAQC_AgAh8QEBAL8CACEG2AEAAOECADDZAQAAqwEAENoBAADhAgAwiQIBAL8CACGKAgEAvwIAIYsCAgDPAgAhCNgBAADiAgAw2QEAAJUBABDaAQAA4gIAMOABQADAAgAh7wEBAL8CACGFAkAAwAIAIYwCAQC_AgAhjgIAAOMCjgIiBwgAAMICACAiAADlAgAgIwAA5QIAIOEBAAAAjgIC4gEAAACOAgjjAQAAAI4CCOgBAADkAo4CIgcIAADCAgAgIgAA5QIAICMAAOUCACDhAQAAAI4CAuIBAAAAjgII4wEAAACOAgjoAQAA5AKOAiIE4QEAAACOAgLiAQAAAI4CCOMBAAAAjgII6AEAAOUCjgIiDtgBAADmAgAw2QEAAH8AENoBAADmAgAw4AFAAMACACHxAQEAvwIAIYUCQADAAgAhjwIBAL8CACGQAgEAvwIAIZECAQC_AgAhkgIBAL8CACGTAgEAvwIAIZQCAQDnAgAhlQJAAOgCACGWAgEA5wIAIQ4IAADqAgAgIgAA7QIAICMAAO0CACDhAQEAAAAB4gEBAAAABeMBAQAAAAXkAQEAAAAB5QEBAAAAAeYBAQAAAAHnAQEAAAAB6AEBAOwCACHpAQEAAAAB6gEBAAAAAesBAQAAAAELCAAA6gIAICIAAOsCACAjAADrAgAg4QFAAAAAAeIBQAAAAAXjAUAAAAAF5AFAAAAAAeUBQAAAAAHmAUAAAAAB5wFAAAAAAegBQADpAgAhCwgAAOoCACAiAADrAgAgIwAA6wIAIOEBQAAAAAHiAUAAAAAF4wFAAAAABeQBQAAAAAHlAUAAAAAB5gFAAAAAAecBQAAAAAHoAUAA6QIAIQjhAQIAAAAB4gECAAAABeMBAgAAAAXkAQIAAAAB5QECAAAAAeYBAgAAAAHnAQIAAAAB6AECAOoCACEI4QFAAAAAAeIBQAAAAAXjAUAAAAAF5AFAAAAAAeUBQAAAAAHmAUAAAAAB5wFAAAAAAegBQADrAgAhDggAAOoCACAiAADtAgAgIwAA7QIAIOEBAQAAAAHiAQEAAAAF4wEBAAAABeQBAQAAAAHlAQEAAAAB5gEBAAAAAecBAQAAAAHoAQEA7AIAIekBAQAAAAHqAQEAAAAB6wEBAAAAAQvhAQEAAAAB4gEBAAAABeMBAQAAAAXkAQEAAAAB5QEBAAAAAeYBAQAAAAHnAQEAAAAB6AEBAO0CACHpAQEAAAAB6gEBAAAAAesBAQAAAAEJ2AEAAO4CADDZAQAAaQAQ2gEAAO4CADDgAUAAwAIAIY8CAQC_AgAhlwIBAL8CACGYAgEA5wIAIZkCQADoAgAhmgIBAOcCACEJ2AEAAO8CADDZAQAAVgAQ2gEAAO8CADDgAUAAyAIAIY8CAQDHAgAhlwIBAMcCACGYAgEA8AIAIZkCQADxAgAhmgIBAPACACEL4QEBAAAAAeIBAQAAAAXjAQEAAAAF5AEBAAAAAeUBAQAAAAHmAQEAAAAB5wEBAAAAAegBAQDtAgAh6QEBAAAAAeoBAQAAAAHrAQEAAAABCOEBQAAAAAHiAUAAAAAF4wFAAAAABeQBQAAAAAHlAUAAAAAB5gFAAAAAAecBQAAAAAHoAUAA6wIAIQnYAQAA8gIAMNkBAABQABDaAQAA8gIAMOABQADAAgAh7wEBAL8CACGPAgEAvwIAIZgCAQDnAgAhmQJAAOgCACGaAgEA5wIAIQnYAQAA8wIAMNkBAAA9ABDaAQAA8wIAMOABQADIAgAh7wEBAMcCACGPAgEAxwIAIZgCAQDwAgAhmQJAAPECACGaAgEA8AIAIRLYAQAA9AIAMNkBAAA3ABDaAQAA9AIAMOABQADAAgAh7gEBAOcCACGFAkAAwAIAIYYCAQDnAgAhjwIBAL8CACGSAgEAvwIAIZMCAQC_AgAhlQJAAOgCACGWAgEA5wIAIZsCAQDnAgAhnAIBAL8CACGdAiAA2gIAIZ4CIADaAgAhnwJAAOgCACGgAgEA5wIAIQLvAQEAAAAB8QEBAAAAAQgFAAD3AgAg2AEAAPYCADDZAQAAGQAQ2gEAAPYCADDvAQEAxwIAIfEBAQDHAgAhhAJAAMgCACGFAkAAyAIAIRsBAACDAwAgBAAAhAMAIAkAAIUDACAMAACGAwAgDQAAhgMAIA4AAIcDACAPAACIAwAg2AEAAIIDADDZAQAAAwAQ2gEAAIIDADDgAUAAyAIAIe4BAQDwAgAhhQJAAMgCACGGAgEA8AIAIY8CAQDHAgAhkgIBAMcCACGTAgEAxwIAIZUCQADxAgAhlgIBAPACACGbAgEA8AIAIZwCAQDHAgAhnQIgAN4CACGeAiAA3gIAIZ8CQADxAgAhoAIBAPACACGnAgAAAwAgqAIAAAMAIALvAQEAAAAB8QEBAAAAAQcFAAD3AgAg2AEAAPkCADDZAQAAFQAQ2gEAAPkCADDgAUAAyAIAIe8BAQDHAgAh8QEBAMcCACECiQIBAAAAAYoCAQAAAAEICgAA9wIAIAsAAPcCACDYAQAA-wIAMNkBAAAQABDaAQAA-wIAMIkCAQDHAgAhigIBAMcCACGLAgIA1gIAIQLvAQEAAAABjAIBAAAAAQkGAAD_AgAg2AEAAP0CADDZAQAACwAQ2gEAAP0CADDgAUAAyAIAIe8BAQDHAgAhhQJAAMgCACGMAgEAxwIAIY4CAAD-Ao4CIgThAQAAAI4CAuIBAAAAjgII4wEAAACOAgjoAQAA5QKOAiISBQAA9wIAIAcAAIEDACDYAQAAgAMAMNkBAAAHABDaAQAAgAMAMOABQADIAgAh8QEBAMcCACGFAkAAyAIAIY8CAQDHAgAhkAIBAMcCACGRAgEAxwIAIZICAQDHAgAhkwIBAMcCACGUAgEA8AIAIZUCQADxAgAhlgIBAPACACGnAgAABwAgqAIAAAcAIBAFAAD3AgAgBwAAgQMAINgBAACAAwAw2QEAAAcAENoBAACAAwAw4AFAAMgCACHxAQEAxwIAIYUCQADIAgAhjwIBAMcCACGQAgEAxwIAIZECAQDHAgAhkgIBAMcCACGTAgEAxwIAIZQCAQDwAgAhlQJAAPECACGWAgEA8AIAIQOkAgAACwAgpQIAAAsAIKYCAAALACAZAQAAgwMAIAQAAIQDACAJAACFAwAgDAAAhgMAIA0AAIYDACAOAACHAwAgDwAAiAMAINgBAACCAwAw2QEAAAMAENoBAACCAwAw4AFAAMgCACHuAQEA8AIAIYUCQADIAgAhhgIBAPACACGPAgEAxwIAIZICAQDHAgAhkwIBAMcCACGVAkAA8QIAIZYCAQDwAgAhmwIBAPACACGcAgEAxwIAIZ0CIADeAgAhngIgAN4CACGfAkAA8QIAIaACAQDwAgAhGwEAAIMDACAEAACEAwAgCQAAhQMAIAwAAIYDACANAACGAwAgDgAAhwMAIA8AAIgDACDYAQAAggMAMNkBAAADABDaAQAAggMAMOABQADIAgAh7gEBAPACACGFAkAAyAIAIYYCAQDwAgAhjwIBAMcCACGSAgEAxwIAIZMCAQDHAgAhlQJAAPECACGWAgEA8AIAIZsCAQDwAgAhnAIBAMcCACGdAiAA3gIAIZ4CIADeAgAhnwJAAPECACGgAgEA8AIAIacCAAADACCoAgAAAwAgA6QCAAADACClAgAAAwAgpgIAAAMAIAOkAgAABwAgpQIAAAcAIKYCAAAHACADpAIAABAAIKUCAAAQACCmAgAAEAAgA6QCAAAVACClAgAAFQAgpgIAABUAIAOkAgAAGQAgpQIAABkAIKYCAAAZACAAAAABrAIBAAAAAQGsAkAAAAABAAAAAAAAAAAFrAICAAAAAbMCAgAAAAG0AgIAAAABtQICAAAAAbYCAgAAAAECrAIBAAAABLICAQAAAAUCrAIBAAAABLICAQAAAAUCrAIBAAAABLICAQAAAAUBrAIBAAAABAGsAgEAAAAEAawCAQAAAAQAAAAFHAAA2QQAIB0AANwEACCpAgAA2gQAIKoCAADbBAAgrwIAAAEAIAMcAADZBAAgqQIAANoEACCvAgAAAQAgAAAAAawCIAAAAAEAAAAFHAAA1AQAIB0AANcEACCpAgAA1QQAIKoCAADWBAAgrwIAAAEAIAMcAADUBAAgqQIAANUEACCvAgAAAQAgAAAAAAAFHAAAzAQAIB0AANIEACCpAgAAzQQAIKoCAADRBAAgrwIAAAEAIAUcAADKBAAgHQAAzwQAIKkCAADLBAAgqgIAAM4EACCvAgAAAQAgAxwAAMwEACCpAgAAzQQAIK8CAAABACADHAAAygQAIKkCAADLBAAgrwIAAAEAIAAAAAGsAgAAAI4CAgUcAADFBAAgHQAAyAQAIKkCAADGBAAgqgIAAMcEACCvAgAACQAgAxwAAMUEACCpAgAAxgQAIK8CAAAJACAAAAAAAawCAQAAAAEBrAJAAAAAAQUcAAC_BAAgHQAAwwQAIKkCAADABAAgqgIAAMIEACCvAgAAAQAgCxwAAMIDADAdAADHAwAwqQIAAMMDADCqAgAAxAMAMKsCAADFAwAgrAIAAMYDADCtAgAAxgMAMK4CAADGAwAwrwIAAMYDADCwAgAAyAMAMLECAADJAwAwBOABQAAAAAHvAQEAAAABhQJAAAAAAY4CAAAAjgICAgAAAA0AIBwAAM0DACADAAAADQAgHAAAzQMAIB0AAMwDACABFQAAwQQAMAoGAAD_AgAg2AEAAP0CADDZAQAACwAQ2gEAAP0CADDgAUAAyAIAIe8BAQDHAgAhhQJAAMgCACGMAgEAxwIAIY4CAAD-Ao4CIqMCAAD8AgAgAgAAAA0AIBUAAMwDACACAAAAygMAIBUAAMsDACAI2AEAAMkDADDZAQAAygMAENoBAADJAwAw4AFAAMgCACHvAQEAxwIAIYUCQADIAgAhjAIBAMcCACGOAgAA_gKOAiII2AEAAMkDADDZAQAAygMAENoBAADJAwAw4AFAAMgCACHvAQEAxwIAIYUCQADIAgAhjAIBAMcCACGOAgAA_gKOAiIE4AFAAI0DACHvAQEAjAMAIYUCQACNAwAhjgIAALcDjgIiBOABQACNAwAh7wEBAIwDACGFAkAAjQMAIY4CAAC3A44CIgTgAUAAAAAB7wEBAAAAAYUCQAAAAAGOAgAAAI4CAgMcAAC_BAAgqQIAAMAEACCvAgAAAQAgBBwAAMIDADCpAgAAwwMAMKsCAADFAwAgrwIAAMYDADAAAAAAAAAAAAAHHAAAtAQAIB0AAL0EACCpAgAAtQQAIKoCAAC8BAAgrQIAAAMAIK4CAAADACCvAgAAAQAgCxwAAJkEADAdAACeBAAwqQIAAJoEADCqAgAAmwQAMKsCAACcBAAgrAIAAJ0EADCtAgAAnQQAMK4CAACdBAAwrwIAAJ0EADCwAgAAnwQAMLECAACgBAAwCxwAAI0EADAdAACSBAAwqQIAAI4EADCqAgAAjwQAMKsCAACQBAAgrAIAAJEEADCtAgAAkQQAMK4CAACRBAAwrwIAAJEEADCwAgAAkwQAMLECAACUBAAwCxwAAIQEADAdAACIBAAwqQIAAIUEADCqAgAAhgQAMKsCAACHBAAgrAIAAPwDADCtAgAA_AMAMK4CAAD8AwAwrwIAAPwDADCwAgAAiQQAMLECAAD_AwAwCxwAAPgDADAdAAD9AwAwqQIAAPkDADCqAgAA-gMAMKsCAAD7AwAgrAIAAPwDADCtAgAA_AMAMK4CAAD8AwAwrwIAAPwDADCwAgAA_gMAMLECAAD_AwAwCxwAAOwDADAdAADxAwAwqQIAAO0DADCqAgAA7gMAMKsCAADvAwAgrAIAAPADADCtAgAA8AMAMK4CAADwAwAwrwIAAPADADCwAgAA8gMAMLECAADzAwAwCxwAAOADADAdAADlAwAwqQIAAOEDADCqAgAA4gMAMKsCAADjAwAgrAIAAOQDADCtAgAA5AMAMK4CAADkAwAwrwIAAOQDADCwAgAA5gMAMLECAADnAwAwA-8BAQAAAAGEAkAAAAABhQJAAAAAAQIAAAAbACAcAADrAwAgAwAAABsAIBwAAOsDACAdAADqAwAgARUAALsEADAJBQAA9wIAINgBAAD2AgAw2QEAABkAENoBAAD2AgAw7wEBAMcCACHxAQEAxwIAIYQCQADIAgAhhQJAAMgCACGhAgAA9QIAIAIAAAAbACAVAADqAwAgAgAAAOgDACAVAADpAwAgB9gBAADnAwAw2QEAAOgDABDaAQAA5wMAMO8BAQDHAgAh8QEBAMcCACGEAkAAyAIAIYUCQADIAgAhB9gBAADnAwAw2QEAAOgDABDaAQAA5wMAMO8BAQDHAgAh8QEBAMcCACGEAkAAyAIAIYUCQADIAgAhA-8BAQCMAwAhhAJAAI0DACGFAkAAjQMAIQPvAQEAjAMAIYQCQACNAwAhhQJAAI0DACED7wEBAAAAAYQCQAAAAAGFAkAAAAABAuABQAAAAAHvAQEAAAABAgAAABcAIBwAAPcDACADAAAAFwAgHAAA9wMAIB0AAPYDACABFQAAugQAMAgFAAD3AgAg2AEAAPkCADDZAQAAFQAQ2gEAAPkCADDgAUAAyAIAIe8BAQDHAgAh8QEBAMcCACGhAgAA-AIAIAIAAAAXACAVAAD2AwAgAgAAAPQDACAVAAD1AwAgBtgBAADzAwAw2QEAAPQDABDaAQAA8wMAMOABQADIAgAh7wEBAMcCACHxAQEAxwIAIQbYAQAA8wMAMNkBAAD0AwAQ2gEAAPMDADDgAUAAyAIAIe8BAQDHAgAh8QEBAMcCACEC4AFAAI0DACHvAQEAjAMAIQLgAUAAjQMAIe8BAQCMAwAhAuABQAAAAAHvAQEAAAABAwoAALIDACCJAgEAAAABiwICAAAAAQIAAAASACAcAACDBAAgAwAAABIAIBwAAIMEACAdAACCBAAgARUAALkEADAJCgAA9wIAIAsAAPcCACDYAQAA-wIAMNkBAAAQABDaAQAA-wIAMIkCAQDHAgAhigIBAMcCACGLAgIA1gIAIaICAAD6AgAgAgAAABIAIBUAAIIEACACAAAAgAQAIBUAAIEEACAG2AEAAP8DADDZAQAAgAQAENoBAAD_AwAwiQIBAMcCACGKAgEAxwIAIYsCAgDWAgAhBtgBAAD_AwAw2QEAAIAEABDaAQAA_wMAMIkCAQDHAgAhigIBAMcCACGLAgIA1gIAIQKJAgEAjAMAIYsCAgCWAwAhAwoAALADACCJAgEAjAMAIYsCAgCWAwAhAwoAALIDACCJAgEAAAABiwICAAAAAQMLAACzAwAgigIBAAAAAYsCAgAAAAECAAAAEgAgHAAAjAQAIAMAAAASACAcAACMBAAgHQAAiwQAIAEVAAC4BAAwAgAAABIAIBUAAIsEACACAAAAgAQAIBUAAIoEACACigIBAIwDACGLAgIAlgMAIQMLAACxAwAgigIBAIwDACGLAgIAlgMAIQMLAACzAwAgigIBAAAAAYsCAgAAAAELBwAAzwMAIOABQAAAAAGFAkAAAAABjwIBAAAAAZACAQAAAAGRAgEAAAABkgIBAAAAAZMCAQAAAAGUAgEAAAABlQJAAAAAAZYCAQAAAAECAAAACQAgHAAAmAQAIAMAAAAJACAcAACYBAAgHQAAlwQAIAEVAAC3BAAwEAUAAPcCACAHAACBAwAg2AEAAIADADDZAQAABwAQ2gEAAIADADDgAUAAyAIAIfEBAQDHAgAhhQJAAMgCACGPAgEAAAABkAIBAMcCACGRAgEAxwIAIZICAQDHAgAhkwIBAMcCACGUAgEA8AIAIZUCQADxAgAhlgIBAPACACECAAAACQAgFQAAlwQAIAIAAACVBAAgFQAAlgQAIA7YAQAAlAQAMNkBAACVBAAQ2gEAAJQEADDgAUAAyAIAIfEBAQDHAgAhhQJAAMgCACGPAgEAxwIAIZACAQDHAgAhkQIBAMcCACGSAgEAxwIAIZMCAQDHAgAhlAIBAPACACGVAkAA8QIAIZYCAQDwAgAhDtgBAACUBAAw2QEAAJUEABDaAQAAlAQAMOABQADIAgAh8QEBAMcCACGFAkAAyAIAIY8CAQDHAgAhkAIBAMcCACGRAgEAxwIAIZICAQDHAgAhkwIBAMcCACGUAgEA8AIAIZUCQADxAgAhlgIBAPACACEK4AFAAI0DACGFAkAAjQMAIY8CAQCMAwAhkAIBAIwDACGRAgEAjAMAIZICAQCMAwAhkwIBAIwDACGUAgEAvgMAIZUCQAC_AwAhlgIBAL4DACELBwAAwQMAIOABQACNAwAhhQJAAI0DACGPAgEAjAMAIZACAQCMAwAhkQIBAIwDACGSAgEAjAMAIZMCAQCMAwAhlAIBAL4DACGVAkAAvwMAIZYCAQC-AwAhCwcAAM8DACDgAUAAAAABhQJAAAAAAY8CAQAAAAGQAgEAAAABkQIBAAAAAZICAQAAAAGTAgEAAAABlAIBAAAAAZUCQAAAAAGWAgEAAAABFAQAAKUEACAJAACmBAAgDAAApwQAIA0AAKgEACAOAACpBAAgDwAAqgQAIOABQAAAAAHuAQEAAAABhQJAAAAAAYYCAQAAAAGPAgEAAAABkgIBAAAAAZMCAQAAAAGVAkAAAAABlgIBAAAAAZwCAQAAAAGdAiAAAAABngIgAAAAAZ8CQAAAAAGgAgEAAAABAgAAAAEAIBwAAKQEACADAAAAAQAgHAAApAQAIB0AAKMEACABFQAAtgQAMBkBAACDAwAgBAAAhAMAIAkAAIUDACAMAACGAwAgDQAAhgMAIA4AAIcDACAPAACIAwAg2AEAAIIDADDZAQAAAwAQ2gEAAIIDADDgAUAAyAIAIe4BAQDwAgAhhQJAAMgCACGGAgEA8AIAIY8CAQAAAAGSAgEAxwIAIZMCAQDHAgAhlQJAAPECACGWAgEA8AIAIZsCAQDwAgAhnAIBAMcCACGdAiAA3gIAIZ4CIADeAgAhnwJAAPECACGgAgEA8AIAIQIAAAABACAVAACjBAAgAgAAAKEEACAVAACiBAAgEtgBAACgBAAw2QEAAKEEABDaAQAAoAQAMOABQADIAgAh7gEBAPACACGFAkAAyAIAIYYCAQDwAgAhjwIBAMcCACGSAgEAxwIAIZMCAQDHAgAhlQJAAPECACGWAgEA8AIAIZsCAQDwAgAhnAIBAMcCACGdAiAA3gIAIZ4CIADeAgAhnwJAAPECACGgAgEA8AIAIRLYAQAAoAQAMNkBAAChBAAQ2gEAAKAEADDgAUAAyAIAIe4BAQDwAgAhhQJAAMgCACGGAgEA8AIAIY8CAQDHAgAhkgIBAMcCACGTAgEAxwIAIZUCQADxAgAhlgIBAPACACGbAgEA8AIAIZwCAQDHAgAhnQIgAN4CACGeAiAA3gIAIZ8CQADxAgAhoAIBAPACACEO4AFAAI0DACHuAQEAvgMAIYUCQACNAwAhhgIBAL4DACGPAgEAjAMAIZICAQCMAwAhkwIBAIwDACGVAkAAvwMAIZYCAQC-AwAhnAIBAIwDACGdAiAApQMAIZ4CIAClAwAhnwJAAL8DACGgAgEAvgMAIRQEAADaAwAgCQAA2wMAIAwAANwDACANAADdAwAgDgAA3gMAIA8AAN8DACDgAUAAjQMAIe4BAQC-AwAhhQJAAI0DACGGAgEAvgMAIY8CAQCMAwAhkgIBAIwDACGTAgEAjAMAIZUCQAC_AwAhlgIBAL4DACGcAgEAjAMAIZ0CIAClAwAhngIgAKUDACGfAkAAvwMAIaACAQC-AwAhFAQAAKUEACAJAACmBAAgDAAApwQAIA0AAKgEACAOAACpBAAgDwAAqgQAIOABQAAAAAHuAQEAAAABhQJAAAAAAYYCAQAAAAGPAgEAAAABkgIBAAAAAZMCAQAAAAGVAkAAAAABlgIBAAAAAZwCAQAAAAGdAiAAAAABngIgAAAAAZ8CQAAAAAGgAgEAAAABBBwAAJkEADCpAgAAmgQAMKsCAACcBAAgrwIAAJ0EADAEHAAAjQQAMKkCAACOBAAwqwIAAJAEACCvAgAAkQQAMAQcAACEBAAwqQIAAIUEADCrAgAAhwQAIK8CAAD8AwAwBBwAAPgDADCpAgAA-QMAMKsCAAD7AwAgrwIAAPwDADAEHAAA7AMAMKkCAADtAwAwqwIAAO8DACCvAgAA8AMAMAQcAADgAwAwqQIAAOEDADCrAgAA4wMAIK8CAADkAwAwAxwAALQEACCpAgAAtQQAIK8CAAABACAOAQAArAQAIAQAAK8EACAJAACwBAAgDAAAsQQAIA0AALEEACAOAACyBAAgDwAAswQAIO4BAAC6AwAghgIAALoDACCVAgAAugMAIJYCAAC6AwAgmwIAALoDACCfAgAAugMAIKACAAC6AwAgBQUAAKwEACAHAACuBAAglAIAALoDACCVAgAAugMAIJYCAAC6AwAgAAAAAAAAFQEAAKsEACAJAACmBAAgDAAApwQAIA0AAKgEACAOAACpBAAgDwAAqgQAIOABQAAAAAHuAQEAAAABhQJAAAAAAYYCAQAAAAGPAgEAAAABkgIBAAAAAZMCAQAAAAGVAkAAAAABlgIBAAAAAZsCAQAAAAGcAgEAAAABnQIgAAAAAZ4CIAAAAAGfAkAAAAABoAIBAAAAAQIAAAABACAcAAC0BAAgDuABQAAAAAHuAQEAAAABhQJAAAAAAYYCAQAAAAGPAgEAAAABkgIBAAAAAZMCAQAAAAGVAkAAAAABlgIBAAAAAZwCAQAAAAGdAiAAAAABngIgAAAAAZ8CQAAAAAGgAgEAAAABCuABQAAAAAGFAkAAAAABjwIBAAAAAZACAQAAAAGRAgEAAAABkgIBAAAAAZMCAQAAAAGUAgEAAAABlQJAAAAAAZYCAQAAAAECigIBAAAAAYsCAgAAAAECiQIBAAAAAYsCAgAAAAEC4AFAAAAAAe8BAQAAAAED7wEBAAAAAYQCQAAAAAGFAkAAAAABAwAAAAMAIBwAALQEACAdAAC-BAAgFwAAAAMAIAEAANkDACAJAADbAwAgDAAA3AMAIA0AAN0DACAOAADeAwAgDwAA3wMAIBUAAL4EACDgAUAAjQMAIe4BAQC-AwAhhQJAAI0DACGGAgEAvgMAIY8CAQCMAwAhkgIBAIwDACGTAgEAjAMAIZUCQAC_AwAhlgIBAL4DACGbAgEAvgMAIZwCAQCMAwAhnQIgAKUDACGeAiAApQMAIZ8CQAC_AwAhoAIBAL4DACEVAQAA2QMAIAkAANsDACAMAADcAwAgDQAA3QMAIA4AAN4DACAPAADfAwAg4AFAAI0DACHuAQEAvgMAIYUCQACNAwAhhgIBAL4DACGPAgEAjAMAIZICAQCMAwAhkwIBAIwDACGVAkAAvwMAIZYCAQC-AwAhmwIBAL4DACGcAgEAjAMAIZ0CIAClAwAhngIgAKUDACGfAkAAvwMAIaACAQC-AwAhFQEAAKsEACAEAAClBAAgDAAApwQAIA0AAKgEACAOAACpBAAgDwAAqgQAIOABQAAAAAHuAQEAAAABhQJAAAAAAYYCAQAAAAGPAgEAAAABkgIBAAAAAZMCAQAAAAGVAkAAAAABlgIBAAAAAZsCAQAAAAGcAgEAAAABnQIgAAAAAZ4CIAAAAAGfAkAAAAABoAIBAAAAAQIAAAABACAcAAC_BAAgBOABQAAAAAHvAQEAAAABhQJAAAAAAY4CAAAAjgICAwAAAAMAIBwAAL8EACAdAADEBAAgFwAAAAMAIAEAANkDACAEAADaAwAgDAAA3AMAIA0AAN0DACAOAADeAwAgDwAA3wMAIBUAAMQEACDgAUAAjQMAIe4BAQC-AwAhhQJAAI0DACGGAgEAvgMAIY8CAQCMAwAhkgIBAIwDACGTAgEAjAMAIZUCQAC_AwAhlgIBAL4DACGbAgEAvgMAIZwCAQCMAwAhnQIgAKUDACGeAiAApQMAIZ8CQAC_AwAhoAIBAL4DACEVAQAA2QMAIAQAANoDACAMAADcAwAgDQAA3QMAIA4AAN4DACAPAADfAwAg4AFAAI0DACHuAQEAvgMAIYUCQACNAwAhhgIBAL4DACGPAgEAjAMAIZICAQCMAwAhkwIBAIwDACGVAkAAvwMAIZYCAQC-AwAhmwIBAL4DACGcAgEAjAMAIZ0CIAClAwAhngIgAKUDACGfAkAAvwMAIaACAQC-AwAhDAUAAM4DACDgAUAAAAAB8QEBAAAAAYUCQAAAAAGPAgEAAAABkAIBAAAAAZECAQAAAAGSAgEAAAABkwIBAAAAAZQCAQAAAAGVAkAAAAABlgIBAAAAAQIAAAAJACAcAADFBAAgAwAAAAcAIBwAAMUEACAdAADJBAAgDgAAAAcAIAUAAMADACAVAADJBAAg4AFAAI0DACHxAQEAjAMAIYUCQACNAwAhjwIBAIwDACGQAgEAjAMAIZECAQCMAwAhkgIBAIwDACGTAgEAjAMAIZQCAQC-AwAhlQJAAL8DACGWAgEAvgMAIQwFAADAAwAg4AFAAI0DACHxAQEAjAMAIYUCQACNAwAhjwIBAIwDACGQAgEAjAMAIZECAQCMAwAhkgIBAIwDACGTAgEAjAMAIZQCAQC-AwAhlQJAAL8DACGWAgEAvgMAIRUBAACrBAAgBAAApQQAIAkAAKYEACAMAACnBAAgDgAAqQQAIA8AAKoEACDgAUAAAAAB7gEBAAAAAYUCQAAAAAGGAgEAAAABjwIBAAAAAZICAQAAAAGTAgEAAAABlQJAAAAAAZYCAQAAAAGbAgEAAAABnAIBAAAAAZ0CIAAAAAGeAiAAAAABnwJAAAAAAaACAQAAAAECAAAAAQAgHAAAygQAIBUBAACrBAAgBAAApQQAIAkAAKYEACANAACoBAAgDgAAqQQAIA8AAKoEACDgAUAAAAAB7gEBAAAAAYUCQAAAAAGGAgEAAAABjwIBAAAAAZICAQAAAAGTAgEAAAABlQJAAAAAAZYCAQAAAAGbAgEAAAABnAIBAAAAAZ0CIAAAAAGeAiAAAAABnwJAAAAAAaACAQAAAAECAAAAAQAgHAAAzAQAIAMAAAADACAcAADKBAAgHQAA0AQAIBcAAAADACABAADZAwAgBAAA2gMAIAkAANsDACAMAADcAwAgDgAA3gMAIA8AAN8DACAVAADQBAAg4AFAAI0DACHuAQEAvgMAIYUCQACNAwAhhgIBAL4DACGPAgEAjAMAIZICAQCMAwAhkwIBAIwDACGVAkAAvwMAIZYCAQC-AwAhmwIBAL4DACGcAgEAjAMAIZ0CIAClAwAhngIgAKUDACGfAkAAvwMAIaACAQC-AwAhFQEAANkDACAEAADaAwAgCQAA2wMAIAwAANwDACAOAADeAwAgDwAA3wMAIOABQACNAwAh7gEBAL4DACGFAkAAjQMAIYYCAQC-AwAhjwIBAIwDACGSAgEAjAMAIZMCAQCMAwAhlQJAAL8DACGWAgEAvgMAIZsCAQC-AwAhnAIBAIwDACGdAiAApQMAIZ4CIAClAwAhnwJAAL8DACGgAgEAvgMAIQMAAAADACAcAADMBAAgHQAA0wQAIBcAAAADACABAADZAwAgBAAA2gMAIAkAANsDACANAADdAwAgDgAA3gMAIA8AAN8DACAVAADTBAAg4AFAAI0DACHuAQEAvgMAIYUCQACNAwAhhgIBAL4DACGPAgEAjAMAIZICAQCMAwAhkwIBAIwDACGVAkAAvwMAIZYCAQC-AwAhmwIBAL4DACGcAgEAjAMAIZ0CIAClAwAhngIgAKUDACGfAkAAvwMAIaACAQC-AwAhFQEAANkDACAEAADaAwAgCQAA2wMAIA0AAN0DACAOAADeAwAgDwAA3wMAIOABQACNAwAh7gEBAL4DACGFAkAAjQMAIYYCAQC-AwAhjwIBAIwDACGSAgEAjAMAIZMCAQCMAwAhlQJAAL8DACGWAgEAvgMAIZsCAQC-AwAhnAIBAIwDACGdAiAApQMAIZ4CIAClAwAhnwJAAL8DACGgAgEAvgMAIRUBAACrBAAgBAAApQQAIAkAAKYEACAMAACnBAAgDQAAqAQAIA8AAKoEACDgAUAAAAAB7gEBAAAAAYUCQAAAAAGGAgEAAAABjwIBAAAAAZICAQAAAAGTAgEAAAABlQJAAAAAAZYCAQAAAAGbAgEAAAABnAIBAAAAAZ0CIAAAAAGeAiAAAAABnwJAAAAAAaACAQAAAAECAAAAAQAgHAAA1AQAIAMAAAADACAcAADUBAAgHQAA2AQAIBcAAAADACABAADZAwAgBAAA2gMAIAkAANsDACAMAADcAwAgDQAA3QMAIA8AAN8DACAVAADYBAAg4AFAAI0DACHuAQEAvgMAIYUCQACNAwAhhgIBAL4DACGPAgEAjAMAIZICAQCMAwAhkwIBAIwDACGVAkAAvwMAIZYCAQC-AwAhmwIBAL4DACGcAgEAjAMAIZ0CIAClAwAhngIgAKUDACGfAkAAvwMAIaACAQC-AwAhFQEAANkDACAEAADaAwAgCQAA2wMAIAwAANwDACANAADdAwAgDwAA3wMAIOABQACNAwAh7gEBAL4DACGFAkAAjQMAIYYCAQC-AwAhjwIBAIwDACGSAgEAjAMAIZMCAQCMAwAhlQJAAL8DACGWAgEAvgMAIZsCAQC-AwAhnAIBAIwDACGdAiAApQMAIZ4CIAClAwAhnwJAAL8DACGgAgEAvgMAIRUBAACrBAAgBAAApQQAIAkAAKYEACAMAACnBAAgDQAAqAQAIA4AAKkEACDgAUAAAAAB7gEBAAAAAYUCQAAAAAGGAgEAAAABjwIBAAAAAZICAQAAAAGTAgEAAAABlQJAAAAAAZYCAQAAAAGbAgEAAAABnAIBAAAAAZ0CIAAAAAGeAiAAAAABnwJAAAAAAaACAQAAAAECAAAAAQAgHAAA2QQAIAMAAAADACAcAADZBAAgHQAA3QQAIBcAAAADACABAADZAwAgBAAA2gMAIAkAANsDACAMAADcAwAgDQAA3QMAIA4AAN4DACAVAADdBAAg4AFAAI0DACHuAQEAvgMAIYUCQACNAwAhhgIBAL4DACGPAgEAjAMAIZICAQCMAwAhkwIBAIwDACGVAkAAvwMAIZYCAQC-AwAhmwIBAL4DACGcAgEAjAMAIZ0CIAClAwAhngIgAKUDACGfAkAAvwMAIaACAQC-AwAhFQEAANkDACAEAADaAwAgCQAA2wMAIAwAANwDACANAADdAwAgDgAA3gMAIOABQACNAwAh7gEBAL4DACGFAkAAjQMAIYYCAQC-AwAhjwIBAIwDACGSAgEAjAMAIZMCAQCMAwAhlQJAAL8DACGWAgEAvgMAIZsCAQC-AwAhnAIBAIwDACGdAiAApQMAIZ4CIAClAwAhnwJAAL8DACGgAgEAvgMAIQgBBAEEBgEIAAgJCgIMEwUNFAUOGAYPHAcDBQABBw4DCAAEAQYAAgEHDwACCgABCwABAQUAAQEFAAEGBB0ACR4ADB8ADSAADiEADyIAAAEBLAEBATIBAwgADSIADiMADwAAAAMIAA0iAA4jAA8AAAADCAAVIgAWIwAXAAAAAwgAFSIAFiMAFwAAAAMIAB0iAB4jAB8AAAADCAAdIgAeIwAfAQUAAQEFAAEDCAAkIgAlIwAmAAAAAwgAJCIAJSMAJgEGAAIBBgACAwgAKyIALCMALQAAAAMIACsiACwjAC0CCgABCwABAgoAAQsAAQUIADIiADUjADZ0ADN1ADQAAAAAAAUIADIiADUjADZ0ADN1ADQBBQABAQUAAQMIADsiADwjAD0AAAADCAA7IgA8IwA9AAAAAwgAQyIARCMARQAAAAMIAEMiAEQjAEUBBQABAQUAAQMIAEoiAEsjAEwAAAADCABKIgBLIwBMAAAABQgAUiIAVSMAVnQAU3UAVAAAAAAABQgAUiIAVSMAVnQAU3UAVAAAAAMIAFwiAF0jAF4AAAADCABcIgBdIwBeAAAAAwgAZCIAZSMAZgAAAAMIAGQiAGUjAGYQAgERIwESJAETJQEUJgEWKAEXKgkYKwoZLgEaMAkbMQseMwEfNAEgNQkkOAwlORAmOxEnPBEoPxEpQBEqQRErQxEsRQktRhIuSBEvSgkwSxMxTBEyTREzTgk0URQ1Uhg2VBk3VRk4WBk5WRk6Whk7XBk8Xgk9Xxo-YRk_YwlAZBtBZRlCZhlDZwlEahxFayBGbAJHbQJIbgJJbwJKcAJLcgJMdAlNdSFOdwJPeQlQeiJRewJSfAJTfQlUgAEjVYEBJ1aCAQNXgwEDWIQBA1mFAQNahgEDW4gBA1yKAQldiwEoXo0BA1-PAQlgkAEpYZEBA2KSAQNjkwEJZJYBKmWXAS5mmAEFZ5kBBWiaAQVpmwEFapwBBWueAQVsoAEJbaEBL26jAQVvpQEJcKYBMHGnAQVyqAEFc6kBCXasATF3rQE3eK4BBnmvAQZ6sAEGe7EBBnyyAQZ9tAEGfrYBCX-3ATiAAbkBBoEBuwEJggG8ATmDAb0BBoQBvgEGhQG_AQmGAcIBOocBwwE-iAHFAT-JAcYBP4oByQE_iwHKAT-MAcsBP40BzQE_jgHPAQmPAdABQJAB0gE_kQHUAQmSAdUBQZMB1gE_lAHXAT-VAdgBCZYB2wFClwHcAUaYAd0BB5kB3gEHmgHfAQebAeABB5wB4QEHnQHjAQeeAeUBCZ8B5gFHoAHoAQehAeoBCaIB6wFIowHsAQekAe0BB6UB7gEJpgHxAUmnAfIBTagB9AFOqQH1AU6qAfgBTqsB-QFOrAH6AU6tAfwBTq4B_gEJrwH_AU-wAYECTrEBgwIJsgGEAlCzAYUCTrQBhgJOtQGHAgm2AYoCUbcBiwJXuAGNAli5AY4CWLoBkQJYuwGSAli8AZMCWL0BlQJYvgGXAgm_AZgCWcABmgJYwQGcAgnCAZ0CWsMBngJYxAGfAljFAaACCcYBowJbxwGkAl_IAaYCYMkBpwJgygGqAmDLAasCYMwBrAJgzQGuAmDOAbACCc8BsQJh0AGzAmDRAbUCCdIBtgJi0wG3AmDUAbgCYNUBuQIJ1gG8AmPXAb0CZw" } config.compilerWasm = { getRuntime: async () => require('./query_compiler_fast_bg.js'), diff --git a/packages/forums-prisma-client/index-browser.js b/packages/forums-prisma-client/index-browser.js index 3338bd5..3b1e7b2 100644 --- a/packages/forums-prisma-client/index-browser.js +++ b/packages/forums-prisma-client/index-browser.js @@ -190,6 +190,14 @@ exports.Prisma.TopicWatchScalarFieldEnum = { createdAt: 'createdAt' }; +exports.Prisma.ChallengeForumWatchScalarFieldEnum = { + challengeId: 'challengeId', + memberId: 'memberId', + watching: 'watching', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +}; + exports.Prisma.TopicReadStateScalarFieldEnum = { topicId: 'topicId', memberId: 'memberId', @@ -261,6 +269,7 @@ exports.Prisma.ModelName = { PostReaction: 'PostReaction', TopicClosure: 'TopicClosure', TopicWatch: 'TopicWatch', + ChallengeForumWatch: 'ChallengeForumWatch', TopicReadState: 'TopicReadState', PublicForumCategory: 'PublicForumCategory', PublicForumRoleMember: 'PublicForumRoleMember', diff --git a/packages/forums-prisma-client/index.d.ts b/packages/forums-prisma-client/index.d.ts index 6bbdd0e..5865846 100644 --- a/packages/forums-prisma-client/index.d.ts +++ b/packages/forums-prisma-client/index.d.ts @@ -48,6 +48,11 @@ export type TopicClosure = $Result.DefaultSelection * */ export type TopicWatch = $Result.DefaultSelection +/** + * Model ChallengeForumWatch + * + */ +export type ChallengeForumWatch = $Result.DefaultSelection /** * Model TopicReadState * @@ -277,6 +282,16 @@ export class PrismaClient< */ get topicWatch(): Prisma.TopicWatchDelegate; + /** + * `prisma.challengeForumWatch`: Exposes CRUD operations for the **ChallengeForumWatch** model. + * Example usage: + * ```ts + * // Fetch zero or more ChallengeForumWatches + * const challengeForumWatches = await prisma.challengeForumWatch.findMany() + * ``` + */ + get challengeForumWatch(): Prisma.ChallengeForumWatchDelegate; + /** * `prisma.topicReadState`: Exposes CRUD operations for the **TopicReadState** model. * Example usage: @@ -770,6 +785,7 @@ export namespace Prisma { PostReaction: 'PostReaction', TopicClosure: 'TopicClosure', TopicWatch: 'TopicWatch', + ChallengeForumWatch: 'ChallengeForumWatch', TopicReadState: 'TopicReadState', PublicForumCategory: 'PublicForumCategory', PublicForumRoleMember: 'PublicForumRoleMember', @@ -789,7 +805,7 @@ export namespace Prisma { omit: GlobalOmitOptions } meta: { - modelProps: "topic" | "memberBan" | "ipBan" | "post" | "postReaction" | "topicClosure" | "topicWatch" | "topicReadState" | "publicForumCategory" | "publicForumRoleMember" | "publicForumImportRecord" + modelProps: "topic" | "memberBan" | "ipBan" | "post" | "postReaction" | "topicClosure" | "topicWatch" | "challengeForumWatch" | "topicReadState" | "publicForumCategory" | "publicForumRoleMember" | "publicForumImportRecord" txIsolationLevel: Prisma.TransactionIsolationLevel } model: { @@ -1311,6 +1327,80 @@ export namespace Prisma { } } } + ChallengeForumWatch: { + payload: Prisma.$ChallengeForumWatchPayload + fields: Prisma.ChallengeForumWatchFieldRefs + operations: { + findUnique: { + args: Prisma.ChallengeForumWatchFindUniqueArgs + result: $Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.ChallengeForumWatchFindUniqueOrThrowArgs + result: $Utils.PayloadToResult + } + findFirst: { + args: Prisma.ChallengeForumWatchFindFirstArgs + result: $Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.ChallengeForumWatchFindFirstOrThrowArgs + result: $Utils.PayloadToResult + } + findMany: { + args: Prisma.ChallengeForumWatchFindManyArgs + result: $Utils.PayloadToResult[] + } + create: { + args: Prisma.ChallengeForumWatchCreateArgs + result: $Utils.PayloadToResult + } + createMany: { + args: Prisma.ChallengeForumWatchCreateManyArgs + result: BatchPayload + } + createManyAndReturn: { + args: Prisma.ChallengeForumWatchCreateManyAndReturnArgs + result: $Utils.PayloadToResult[] + } + delete: { + args: Prisma.ChallengeForumWatchDeleteArgs + result: $Utils.PayloadToResult + } + update: { + args: Prisma.ChallengeForumWatchUpdateArgs + result: $Utils.PayloadToResult + } + deleteMany: { + args: Prisma.ChallengeForumWatchDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.ChallengeForumWatchUpdateManyArgs + result: BatchPayload + } + updateManyAndReturn: { + args: Prisma.ChallengeForumWatchUpdateManyAndReturnArgs + result: $Utils.PayloadToResult[] + } + upsert: { + args: Prisma.ChallengeForumWatchUpsertArgs + result: $Utils.PayloadToResult + } + aggregate: { + args: Prisma.ChallengeForumWatchAggregateArgs + result: $Utils.Optional + } + groupBy: { + args: Prisma.ChallengeForumWatchGroupByArgs + result: $Utils.Optional[] + } + count: { + args: Prisma.ChallengeForumWatchCountArgs + result: $Utils.Optional | number + } + } + } TopicReadState: { payload: Prisma.$TopicReadStatePayload fields: Prisma.TopicReadStateFieldRefs @@ -1737,6 +1827,7 @@ export namespace Prisma { postReaction?: PostReactionOmit topicClosure?: TopicClosureOmit topicWatch?: TopicWatchOmit + challengeForumWatch?: ChallengeForumWatchOmit topicReadState?: TopicReadStateOmit publicForumCategory?: PublicForumCategoryOmit publicForumRoleMember?: PublicForumRoleMemberOmit @@ -9686,339 +9777,337 @@ export namespace Prisma { /** - * Model TopicReadState + * Model ChallengeForumWatch */ - export type AggregateTopicReadState = { - _count: TopicReadStateCountAggregateOutputType | null - _min: TopicReadStateMinAggregateOutputType | null - _max: TopicReadStateMaxAggregateOutputType | null + export type AggregateChallengeForumWatch = { + _count: ChallengeForumWatchCountAggregateOutputType | null + _min: ChallengeForumWatchMinAggregateOutputType | null + _max: ChallengeForumWatchMaxAggregateOutputType | null } - export type TopicReadStateMinAggregateOutputType = { - topicId: string | null + export type ChallengeForumWatchMinAggregateOutputType = { + challengeId: string | null memberId: string | null - lastReadAt: Date | null + watching: boolean | null + createdAt: Date | null updatedAt: Date | null } - export type TopicReadStateMaxAggregateOutputType = { - topicId: string | null + export type ChallengeForumWatchMaxAggregateOutputType = { + challengeId: string | null memberId: string | null - lastReadAt: Date | null + watching: boolean | null + createdAt: Date | null updatedAt: Date | null } - export type TopicReadStateCountAggregateOutputType = { - topicId: number + export type ChallengeForumWatchCountAggregateOutputType = { + challengeId: number memberId: number - lastReadAt: number + watching: number + createdAt: number updatedAt: number _all: number } - export type TopicReadStateMinAggregateInputType = { - topicId?: true + export type ChallengeForumWatchMinAggregateInputType = { + challengeId?: true memberId?: true - lastReadAt?: true + watching?: true + createdAt?: true updatedAt?: true } - export type TopicReadStateMaxAggregateInputType = { - topicId?: true + export type ChallengeForumWatchMaxAggregateInputType = { + challengeId?: true memberId?: true - lastReadAt?: true + watching?: true + createdAt?: true updatedAt?: true } - export type TopicReadStateCountAggregateInputType = { - topicId?: true + export type ChallengeForumWatchCountAggregateInputType = { + challengeId?: true memberId?: true - lastReadAt?: true + watching?: true + createdAt?: true updatedAt?: true _all?: true } - export type TopicReadStateAggregateArgs = { + export type ChallengeForumWatchAggregateArgs = { /** - * Filter which TopicReadState to aggregate. + * Filter which ChallengeForumWatch to aggregate. */ - where?: TopicReadStateWhereInput + where?: ChallengeForumWatchWhereInput /** * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} * - * Determine the order of TopicReadStates to fetch. + * Determine the order of ChallengeForumWatches to fetch. */ - orderBy?: TopicReadStateOrderByWithRelationInput | TopicReadStateOrderByWithRelationInput[] + orderBy?: ChallengeForumWatchOrderByWithRelationInput | ChallengeForumWatchOrderByWithRelationInput[] /** * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} * * Sets the start position */ - cursor?: TopicReadStateWhereUniqueInput + cursor?: ChallengeForumWatchWhereUniqueInput /** * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} * - * Take `±n` TopicReadStates from the position of the cursor. + * Take `±n` ChallengeForumWatches from the position of the cursor. */ take?: number /** * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} * - * Skip the first `n` TopicReadStates. + * Skip the first `n` ChallengeForumWatches. */ skip?: number /** * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} * - * Count returned TopicReadStates + * Count returned ChallengeForumWatches **/ - _count?: true | TopicReadStateCountAggregateInputType + _count?: true | ChallengeForumWatchCountAggregateInputType /** * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} * * Select which fields to find the minimum value **/ - _min?: TopicReadStateMinAggregateInputType + _min?: ChallengeForumWatchMinAggregateInputType /** * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} * * Select which fields to find the maximum value **/ - _max?: TopicReadStateMaxAggregateInputType + _max?: ChallengeForumWatchMaxAggregateInputType } - export type GetTopicReadStateAggregateType = { - [P in keyof T & keyof AggregateTopicReadState]: P extends '_count' | 'count' + export type GetChallengeForumWatchAggregateType = { + [P in keyof T & keyof AggregateChallengeForumWatch]: P extends '_count' | 'count' ? T[P] extends true ? number - : GetScalarType - : GetScalarType + : GetScalarType + : GetScalarType } - export type TopicReadStateGroupByArgs = { - where?: TopicReadStateWhereInput - orderBy?: TopicReadStateOrderByWithAggregationInput | TopicReadStateOrderByWithAggregationInput[] - by: TopicReadStateScalarFieldEnum[] | TopicReadStateScalarFieldEnum - having?: TopicReadStateScalarWhereWithAggregatesInput + export type ChallengeForumWatchGroupByArgs = { + where?: ChallengeForumWatchWhereInput + orderBy?: ChallengeForumWatchOrderByWithAggregationInput | ChallengeForumWatchOrderByWithAggregationInput[] + by: ChallengeForumWatchScalarFieldEnum[] | ChallengeForumWatchScalarFieldEnum + having?: ChallengeForumWatchScalarWhereWithAggregatesInput take?: number skip?: number - _count?: TopicReadStateCountAggregateInputType | true - _min?: TopicReadStateMinAggregateInputType - _max?: TopicReadStateMaxAggregateInputType + _count?: ChallengeForumWatchCountAggregateInputType | true + _min?: ChallengeForumWatchMinAggregateInputType + _max?: ChallengeForumWatchMaxAggregateInputType } - export type TopicReadStateGroupByOutputType = { - topicId: string + export type ChallengeForumWatchGroupByOutputType = { + challengeId: string memberId: string - lastReadAt: Date + watching: boolean + createdAt: Date updatedAt: Date - _count: TopicReadStateCountAggregateOutputType | null - _min: TopicReadStateMinAggregateOutputType | null - _max: TopicReadStateMaxAggregateOutputType | null + _count: ChallengeForumWatchCountAggregateOutputType | null + _min: ChallengeForumWatchMinAggregateOutputType | null + _max: ChallengeForumWatchMaxAggregateOutputType | null } - type GetTopicReadStateGroupByPayload = Prisma.PrismaPromise< + type GetChallengeForumWatchGroupByPayload = Prisma.PrismaPromise< Array< - PickEnumerable & + PickEnumerable & { - [P in ((keyof T) & (keyof TopicReadStateGroupByOutputType))]: P extends '_count' + [P in ((keyof T) & (keyof ChallengeForumWatchGroupByOutputType))]: P extends '_count' ? T[P] extends boolean ? number - : GetScalarType - : GetScalarType + : GetScalarType + : GetScalarType } > > - export type TopicReadStateSelect = $Extensions.GetSelect<{ - topicId?: boolean + export type ChallengeForumWatchSelect = $Extensions.GetSelect<{ + challengeId?: boolean memberId?: boolean - lastReadAt?: boolean + watching?: boolean + createdAt?: boolean updatedAt?: boolean - topic?: boolean | TopicDefaultArgs - }, ExtArgs["result"]["topicReadState"]> + }, ExtArgs["result"]["challengeForumWatch"]> - export type TopicReadStateSelectCreateManyAndReturn = $Extensions.GetSelect<{ - topicId?: boolean + export type ChallengeForumWatchSelectCreateManyAndReturn = $Extensions.GetSelect<{ + challengeId?: boolean memberId?: boolean - lastReadAt?: boolean + watching?: boolean + createdAt?: boolean updatedAt?: boolean - topic?: boolean | TopicDefaultArgs - }, ExtArgs["result"]["topicReadState"]> + }, ExtArgs["result"]["challengeForumWatch"]> - export type TopicReadStateSelectUpdateManyAndReturn = $Extensions.GetSelect<{ - topicId?: boolean + export type ChallengeForumWatchSelectUpdateManyAndReturn = $Extensions.GetSelect<{ + challengeId?: boolean memberId?: boolean - lastReadAt?: boolean + watching?: boolean + createdAt?: boolean updatedAt?: boolean - topic?: boolean | TopicDefaultArgs - }, ExtArgs["result"]["topicReadState"]> + }, ExtArgs["result"]["challengeForumWatch"]> - export type TopicReadStateSelectScalar = { - topicId?: boolean + export type ChallengeForumWatchSelectScalar = { + challengeId?: boolean memberId?: boolean - lastReadAt?: boolean + watching?: boolean + createdAt?: boolean updatedAt?: boolean } - export type TopicReadStateOmit = $Extensions.GetOmit<"topicId" | "memberId" | "lastReadAt" | "updatedAt", ExtArgs["result"]["topicReadState"]> - export type TopicReadStateInclude = { - topic?: boolean | TopicDefaultArgs - } - export type TopicReadStateIncludeCreateManyAndReturn = { - topic?: boolean | TopicDefaultArgs - } - export type TopicReadStateIncludeUpdateManyAndReturn = { - topic?: boolean | TopicDefaultArgs - } + export type ChallengeForumWatchOmit = $Extensions.GetOmit<"challengeId" | "memberId" | "watching" | "createdAt" | "updatedAt", ExtArgs["result"]["challengeForumWatch"]> - export type $TopicReadStatePayload = { - name: "TopicReadState" - objects: { - topic: Prisma.$TopicPayload - } + export type $ChallengeForumWatchPayload = { + name: "ChallengeForumWatch" + objects: {} scalars: $Extensions.GetPayloadResult<{ - topicId: string + challengeId: string memberId: string - lastReadAt: Date + watching: boolean + createdAt: Date updatedAt: Date - }, ExtArgs["result"]["topicReadState"]> + }, ExtArgs["result"]["challengeForumWatch"]> composites: {} } - type TopicReadStateGetPayload = $Result.GetResult + type ChallengeForumWatchGetPayload = $Result.GetResult - type TopicReadStateCountArgs = - Omit & { - select?: TopicReadStateCountAggregateInputType | true + type ChallengeForumWatchCountArgs = + Omit & { + select?: ChallengeForumWatchCountAggregateInputType | true } - export interface TopicReadStateDelegate { - [K: symbol]: { types: Prisma.TypeMap['model']['TopicReadState'], meta: { name: 'TopicReadState' } } + export interface ChallengeForumWatchDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['ChallengeForumWatch'], meta: { name: 'ChallengeForumWatch' } } /** - * Find zero or one TopicReadState that matches the filter. - * @param {TopicReadStateFindUniqueArgs} args - Arguments to find a TopicReadState + * Find zero or one ChallengeForumWatch that matches the filter. + * @param {ChallengeForumWatchFindUniqueArgs} args - Arguments to find a ChallengeForumWatch * @example - * // Get one TopicReadState - * const topicReadState = await prisma.topicReadState.findUnique({ + * // Get one ChallengeForumWatch + * const challengeForumWatch = await prisma.challengeForumWatch.findUnique({ * where: { * // ... provide filter here * } * }) */ - findUnique(args: SelectSubset>): Prisma__TopicReadStateClient<$Result.GetResult, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + findUnique(args: SelectSubset>): Prisma__ChallengeForumWatchClient<$Result.GetResult, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> /** - * Find one TopicReadState that matches the filter or throw an error with `error.code='P2025'` + * Find one ChallengeForumWatch that matches the filter or throw an error with `error.code='P2025'` * if no matches were found. - * @param {TopicReadStateFindUniqueOrThrowArgs} args - Arguments to find a TopicReadState + * @param {ChallengeForumWatchFindUniqueOrThrowArgs} args - Arguments to find a ChallengeForumWatch * @example - * // Get one TopicReadState - * const topicReadState = await prisma.topicReadState.findUniqueOrThrow({ + * // Get one ChallengeForumWatch + * const challengeForumWatch = await prisma.challengeForumWatch.findUniqueOrThrow({ * where: { * // ... provide filter here * } * }) */ - findUniqueOrThrow(args: SelectSubset>): Prisma__TopicReadStateClient<$Result.GetResult, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + findUniqueOrThrow(args: SelectSubset>): Prisma__ChallengeForumWatchClient<$Result.GetResult, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> /** - * Find the first TopicReadState that matches the filter. + * Find the first ChallengeForumWatch that matches the filter. * Note, that providing `undefined` is treated as the value not being there. * Read more here: https://pris.ly/d/null-undefined - * @param {TopicReadStateFindFirstArgs} args - Arguments to find a TopicReadState + * @param {ChallengeForumWatchFindFirstArgs} args - Arguments to find a ChallengeForumWatch * @example - * // Get one TopicReadState - * const topicReadState = await prisma.topicReadState.findFirst({ + * // Get one ChallengeForumWatch + * const challengeForumWatch = await prisma.challengeForumWatch.findFirst({ * where: { * // ... provide filter here * } * }) */ - findFirst(args?: SelectSubset>): Prisma__TopicReadStateClient<$Result.GetResult, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + findFirst(args?: SelectSubset>): Prisma__ChallengeForumWatchClient<$Result.GetResult, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> /** - * Find the first TopicReadState that matches the filter or + * Find the first ChallengeForumWatch that matches the filter or * throw `PrismaKnownClientError` with `P2025` code if no matches were found. * Note, that providing `undefined` is treated as the value not being there. * Read more here: https://pris.ly/d/null-undefined - * @param {TopicReadStateFindFirstOrThrowArgs} args - Arguments to find a TopicReadState + * @param {ChallengeForumWatchFindFirstOrThrowArgs} args - Arguments to find a ChallengeForumWatch * @example - * // Get one TopicReadState - * const topicReadState = await prisma.topicReadState.findFirstOrThrow({ + * // Get one ChallengeForumWatch + * const challengeForumWatch = await prisma.challengeForumWatch.findFirstOrThrow({ * where: { * // ... provide filter here * } * }) */ - findFirstOrThrow(args?: SelectSubset>): Prisma__TopicReadStateClient<$Result.GetResult, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + findFirstOrThrow(args?: SelectSubset>): Prisma__ChallengeForumWatchClient<$Result.GetResult, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> /** - * Find zero or more TopicReadStates that matches the filter. + * Find zero or more ChallengeForumWatches that matches the filter. * Note, that providing `undefined` is treated as the value not being there. * Read more here: https://pris.ly/d/null-undefined - * @param {TopicReadStateFindManyArgs} args - Arguments to filter and select certain fields only. + * @param {ChallengeForumWatchFindManyArgs} args - Arguments to filter and select certain fields only. * @example - * // Get all TopicReadStates - * const topicReadStates = await prisma.topicReadState.findMany() + * // Get all ChallengeForumWatches + * const challengeForumWatches = await prisma.challengeForumWatch.findMany() * - * // Get first 10 TopicReadStates - * const topicReadStates = await prisma.topicReadState.findMany({ take: 10 }) + * // Get first 10 ChallengeForumWatches + * const challengeForumWatches = await prisma.challengeForumWatch.findMany({ take: 10 }) * - * // Only select the `topicId` - * const topicReadStateWithTopicIdOnly = await prisma.topicReadState.findMany({ select: { topicId: true } }) + * // Only select the `challengeId` + * const challengeForumWatchWithChallengeIdOnly = await prisma.challengeForumWatch.findMany({ select: { challengeId: true } }) * */ - findMany(args?: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany", GlobalOmitOptions>> + findMany(args?: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany", GlobalOmitOptions>> /** - * Create a TopicReadState. - * @param {TopicReadStateCreateArgs} args - Arguments to create a TopicReadState. + * Create a ChallengeForumWatch. + * @param {ChallengeForumWatchCreateArgs} args - Arguments to create a ChallengeForumWatch. * @example - * // Create one TopicReadState - * const TopicReadState = await prisma.topicReadState.create({ + * // Create one ChallengeForumWatch + * const ChallengeForumWatch = await prisma.challengeForumWatch.create({ * data: { - * // ... data to create a TopicReadState + * // ... data to create a ChallengeForumWatch * } * }) * */ - create(args: SelectSubset>): Prisma__TopicReadStateClient<$Result.GetResult, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + create(args: SelectSubset>): Prisma__ChallengeForumWatchClient<$Result.GetResult, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> /** - * Create many TopicReadStates. - * @param {TopicReadStateCreateManyArgs} args - Arguments to create many TopicReadStates. + * Create many ChallengeForumWatches. + * @param {ChallengeForumWatchCreateManyArgs} args - Arguments to create many ChallengeForumWatches. * @example - * // Create many TopicReadStates - * const topicReadState = await prisma.topicReadState.createMany({ + * // Create many ChallengeForumWatches + * const challengeForumWatch = await prisma.challengeForumWatch.createMany({ * data: [ * // ... provide data here * ] * }) * */ - createMany(args?: SelectSubset>): Prisma.PrismaPromise + createMany(args?: SelectSubset>): Prisma.PrismaPromise /** - * Create many TopicReadStates and returns the data saved in the database. - * @param {TopicReadStateCreateManyAndReturnArgs} args - Arguments to create many TopicReadStates. + * Create many ChallengeForumWatches and returns the data saved in the database. + * @param {ChallengeForumWatchCreateManyAndReturnArgs} args - Arguments to create many ChallengeForumWatches. * @example - * // Create many TopicReadStates - * const topicReadState = await prisma.topicReadState.createManyAndReturn({ + * // Create many ChallengeForumWatches + * const challengeForumWatch = await prisma.challengeForumWatch.createManyAndReturn({ * data: [ * // ... provide data here * ] * }) * - * // Create many TopicReadStates and only return the `topicId` - * const topicReadStateWithTopicIdOnly = await prisma.topicReadState.createManyAndReturn({ - * select: { topicId: true }, + * // Create many ChallengeForumWatches and only return the `challengeId` + * const challengeForumWatchWithChallengeIdOnly = await prisma.challengeForumWatch.createManyAndReturn({ + * select: { challengeId: true }, * data: [ * // ... provide data here * ] @@ -10027,28 +10116,28 @@ export namespace Prisma { * Read more here: https://pris.ly/d/null-undefined * */ - createManyAndReturn(args?: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "createManyAndReturn", GlobalOmitOptions>> + createManyAndReturn(args?: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "createManyAndReturn", GlobalOmitOptions>> /** - * Delete a TopicReadState. - * @param {TopicReadStateDeleteArgs} args - Arguments to delete one TopicReadState. + * Delete a ChallengeForumWatch. + * @param {ChallengeForumWatchDeleteArgs} args - Arguments to delete one ChallengeForumWatch. * @example - * // Delete one TopicReadState - * const TopicReadState = await prisma.topicReadState.delete({ + * // Delete one ChallengeForumWatch + * const ChallengeForumWatch = await prisma.challengeForumWatch.delete({ * where: { - * // ... filter to delete one TopicReadState + * // ... filter to delete one ChallengeForumWatch * } * }) * */ - delete(args: SelectSubset>): Prisma__TopicReadStateClient<$Result.GetResult, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + delete(args: SelectSubset>): Prisma__ChallengeForumWatchClient<$Result.GetResult, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> /** - * Update one TopicReadState. - * @param {TopicReadStateUpdateArgs} args - Arguments to update one TopicReadState. + * Update one ChallengeForumWatch. + * @param {ChallengeForumWatchUpdateArgs} args - Arguments to update one ChallengeForumWatch. * @example - * // Update one TopicReadState - * const topicReadState = await prisma.topicReadState.update({ + * // Update one ChallengeForumWatch + * const challengeForumWatch = await prisma.challengeForumWatch.update({ * where: { * // ... provide filter here * }, @@ -10058,30 +10147,30 @@ export namespace Prisma { * }) * */ - update(args: SelectSubset>): Prisma__TopicReadStateClient<$Result.GetResult, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + update(args: SelectSubset>): Prisma__ChallengeForumWatchClient<$Result.GetResult, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> /** - * Delete zero or more TopicReadStates. - * @param {TopicReadStateDeleteManyArgs} args - Arguments to filter TopicReadStates to delete. + * Delete zero or more ChallengeForumWatches. + * @param {ChallengeForumWatchDeleteManyArgs} args - Arguments to filter ChallengeForumWatches to delete. * @example - * // Delete a few TopicReadStates - * const { count } = await prisma.topicReadState.deleteMany({ + * // Delete a few ChallengeForumWatches + * const { count } = await prisma.challengeForumWatch.deleteMany({ * where: { * // ... provide filter here * } * }) * */ - deleteMany(args?: SelectSubset>): Prisma.PrismaPromise + deleteMany(args?: SelectSubset>): Prisma.PrismaPromise /** - * Update zero or more TopicReadStates. + * Update zero or more ChallengeForumWatches. * Note, that providing `undefined` is treated as the value not being there. * Read more here: https://pris.ly/d/null-undefined - * @param {TopicReadStateUpdateManyArgs} args - Arguments to update one or more rows. + * @param {ChallengeForumWatchUpdateManyArgs} args - Arguments to update one or more rows. * @example - * // Update many TopicReadStates - * const topicReadState = await prisma.topicReadState.updateMany({ + * // Update many ChallengeForumWatches + * const challengeForumWatch = await prisma.challengeForumWatch.updateMany({ * where: { * // ... provide filter here * }, @@ -10091,14 +10180,14 @@ export namespace Prisma { * }) * */ - updateMany(args: SelectSubset>): Prisma.PrismaPromise + updateMany(args: SelectSubset>): Prisma.PrismaPromise /** - * Update zero or more TopicReadStates and returns the data updated in the database. - * @param {TopicReadStateUpdateManyAndReturnArgs} args - Arguments to update many TopicReadStates. + * Update zero or more ChallengeForumWatches and returns the data updated in the database. + * @param {ChallengeForumWatchUpdateManyAndReturnArgs} args - Arguments to update many ChallengeForumWatches. * @example - * // Update many TopicReadStates - * const topicReadState = await prisma.topicReadState.updateManyAndReturn({ + * // Update many ChallengeForumWatches + * const challengeForumWatch = await prisma.challengeForumWatch.updateManyAndReturn({ * where: { * // ... provide filter here * }, @@ -10107,9 +10196,9 @@ export namespace Prisma { * ] * }) * - * // Update zero or more TopicReadStates and only return the `topicId` - * const topicReadStateWithTopicIdOnly = await prisma.topicReadState.updateManyAndReturn({ - * select: { topicId: true }, + * // Update zero or more ChallengeForumWatches and only return the `challengeId` + * const challengeForumWatchWithChallengeIdOnly = await prisma.challengeForumWatch.updateManyAndReturn({ + * select: { challengeId: true }, * where: { * // ... provide filter here * }, @@ -10121,26 +10210,1028 @@ export namespace Prisma { * Read more here: https://pris.ly/d/null-undefined * */ - updateManyAndReturn(args: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "updateManyAndReturn", GlobalOmitOptions>> + updateManyAndReturn(args: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "updateManyAndReturn", GlobalOmitOptions>> /** - * Create or update one TopicReadState. - * @param {TopicReadStateUpsertArgs} args - Arguments to update or create a TopicReadState. + * Create or update one ChallengeForumWatch. + * @param {ChallengeForumWatchUpsertArgs} args - Arguments to update or create a ChallengeForumWatch. * @example - * // Update or create a TopicReadState - * const topicReadState = await prisma.topicReadState.upsert({ + * // Update or create a ChallengeForumWatch + * const challengeForumWatch = await prisma.challengeForumWatch.upsert({ * create: { - * // ... data to create a TopicReadState + * // ... data to create a ChallengeForumWatch * }, * update: { * // ... in case it already exists, update * }, * where: { - * // ... the filter for the TopicReadState we want to update + * // ... the filter for the ChallengeForumWatch we want to update * } * }) */ - upsert(args: SelectSubset>): Prisma__TopicReadStateClient<$Result.GetResult, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + upsert(args: SelectSubset>): Prisma__ChallengeForumWatchClient<$Result.GetResult, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + + /** + * Count the number of ChallengeForumWatches. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {ChallengeForumWatchCountArgs} args - Arguments to filter ChallengeForumWatches to count. + * @example + * // Count the number of ChallengeForumWatches + * const count = await prisma.challengeForumWatch.count({ + * where: { + * // ... the filter for the ChallengeForumWatches we want to count + * } + * }) + **/ + count( + args?: Subset, + ): Prisma.PrismaPromise< + T extends $Utils.Record<'select', any> + ? T['select'] extends true + ? number + : GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a ChallengeForumWatch. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {ChallengeForumWatchAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Subset): Prisma.PrismaPromise> + + /** + * Group by ChallengeForumWatch. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {ChallengeForumWatchGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends ChallengeForumWatchGroupByArgs, + HasSelectOrTake extends Or< + Extends<'skip', Keys>, + Extends<'take', Keys> + >, + OrderByArg extends True extends HasSelectOrTake + ? { orderBy: ChallengeForumWatchGroupByArgs['orderBy'] } + : { orderBy?: ChallengeForumWatchGroupByArgs['orderBy'] }, + OrderFields extends ExcludeUnderscoreKeys>>, + ByFields extends MaybeTupleToUnion, + ByValid extends Has, + HavingFields extends GetHavingFields, + HavingValid extends Has, + ByEmpty extends T['by'] extends never[] ? True : False, + InputErrors extends ByEmpty extends True + ? `Error: "by" must not be empty.` + : HavingValid extends False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Keys + ? 'orderBy' extends Keys + ? ByValid extends True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Keys + ? 'orderBy' extends Keys + ? ByValid extends True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: SubsetIntersection & InputErrors): {} extends InputErrors ? GetChallengeForumWatchGroupByPayload : Prisma.PrismaPromise + /** + * Fields of the ChallengeForumWatch model + */ + readonly fields: ChallengeForumWatchFieldRefs; + } + + /** + * The delegate class that acts as a "Promise-like" for ChallengeForumWatch. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ + export interface Prisma__ChallengeForumWatchClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): $Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): $Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): $Utils.JsPromise + } + + + + + /** + * Fields of the ChallengeForumWatch model + */ + interface ChallengeForumWatchFieldRefs { + readonly challengeId: FieldRef<"ChallengeForumWatch", 'String'> + readonly memberId: FieldRef<"ChallengeForumWatch", 'String'> + readonly watching: FieldRef<"ChallengeForumWatch", 'Boolean'> + readonly createdAt: FieldRef<"ChallengeForumWatch", 'DateTime'> + readonly updatedAt: FieldRef<"ChallengeForumWatch", 'DateTime'> + } + + + // Custom InputTypes + /** + * ChallengeForumWatch findUnique + */ + export type ChallengeForumWatchFindUniqueArgs = { + /** + * Select specific fields to fetch from the ChallengeForumWatch + */ + select?: ChallengeForumWatchSelect | null + /** + * Omit specific fields from the ChallengeForumWatch + */ + omit?: ChallengeForumWatchOmit | null + /** + * Filter, which ChallengeForumWatch to fetch. + */ + where: ChallengeForumWatchWhereUniqueInput + } + + /** + * ChallengeForumWatch findUniqueOrThrow + */ + export type ChallengeForumWatchFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the ChallengeForumWatch + */ + select?: ChallengeForumWatchSelect | null + /** + * Omit specific fields from the ChallengeForumWatch + */ + omit?: ChallengeForumWatchOmit | null + /** + * Filter, which ChallengeForumWatch to fetch. + */ + where: ChallengeForumWatchWhereUniqueInput + } + + /** + * ChallengeForumWatch findFirst + */ + export type ChallengeForumWatchFindFirstArgs = { + /** + * Select specific fields to fetch from the ChallengeForumWatch + */ + select?: ChallengeForumWatchSelect | null + /** + * Omit specific fields from the ChallengeForumWatch + */ + omit?: ChallengeForumWatchOmit | null + /** + * Filter, which ChallengeForumWatch to fetch. + */ + where?: ChallengeForumWatchWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of ChallengeForumWatches to fetch. + */ + orderBy?: ChallengeForumWatchOrderByWithRelationInput | ChallengeForumWatchOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for ChallengeForumWatches. + */ + cursor?: ChallengeForumWatchWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` ChallengeForumWatches from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` ChallengeForumWatches. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of ChallengeForumWatches. + */ + distinct?: ChallengeForumWatchScalarFieldEnum | ChallengeForumWatchScalarFieldEnum[] + } + + /** + * ChallengeForumWatch findFirstOrThrow + */ + export type ChallengeForumWatchFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the ChallengeForumWatch + */ + select?: ChallengeForumWatchSelect | null + /** + * Omit specific fields from the ChallengeForumWatch + */ + omit?: ChallengeForumWatchOmit | null + /** + * Filter, which ChallengeForumWatch to fetch. + */ + where?: ChallengeForumWatchWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of ChallengeForumWatches to fetch. + */ + orderBy?: ChallengeForumWatchOrderByWithRelationInput | ChallengeForumWatchOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for ChallengeForumWatches. + */ + cursor?: ChallengeForumWatchWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` ChallengeForumWatches from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` ChallengeForumWatches. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of ChallengeForumWatches. + */ + distinct?: ChallengeForumWatchScalarFieldEnum | ChallengeForumWatchScalarFieldEnum[] + } + + /** + * ChallengeForumWatch findMany + */ + export type ChallengeForumWatchFindManyArgs = { + /** + * Select specific fields to fetch from the ChallengeForumWatch + */ + select?: ChallengeForumWatchSelect | null + /** + * Omit specific fields from the ChallengeForumWatch + */ + omit?: ChallengeForumWatchOmit | null + /** + * Filter, which ChallengeForumWatches to fetch. + */ + where?: ChallengeForumWatchWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of ChallengeForumWatches to fetch. + */ + orderBy?: ChallengeForumWatchOrderByWithRelationInput | ChallengeForumWatchOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing ChallengeForumWatches. + */ + cursor?: ChallengeForumWatchWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` ChallengeForumWatches from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` ChallengeForumWatches. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of ChallengeForumWatches. + */ + distinct?: ChallengeForumWatchScalarFieldEnum | ChallengeForumWatchScalarFieldEnum[] + } + + /** + * ChallengeForumWatch create + */ + export type ChallengeForumWatchCreateArgs = { + /** + * Select specific fields to fetch from the ChallengeForumWatch + */ + select?: ChallengeForumWatchSelect | null + /** + * Omit specific fields from the ChallengeForumWatch + */ + omit?: ChallengeForumWatchOmit | null + /** + * The data needed to create a ChallengeForumWatch. + */ + data: XOR + } + + /** + * ChallengeForumWatch createMany + */ + export type ChallengeForumWatchCreateManyArgs = { + /** + * The data used to create many ChallengeForumWatches. + */ + data: ChallengeForumWatchCreateManyInput | ChallengeForumWatchCreateManyInput[] + skipDuplicates?: boolean + } + + /** + * ChallengeForumWatch createManyAndReturn + */ + export type ChallengeForumWatchCreateManyAndReturnArgs = { + /** + * Select specific fields to fetch from the ChallengeForumWatch + */ + select?: ChallengeForumWatchSelectCreateManyAndReturn | null + /** + * Omit specific fields from the ChallengeForumWatch + */ + omit?: ChallengeForumWatchOmit | null + /** + * The data used to create many ChallengeForumWatches. + */ + data: ChallengeForumWatchCreateManyInput | ChallengeForumWatchCreateManyInput[] + skipDuplicates?: boolean + } + + /** + * ChallengeForumWatch update + */ + export type ChallengeForumWatchUpdateArgs = { + /** + * Select specific fields to fetch from the ChallengeForumWatch + */ + select?: ChallengeForumWatchSelect | null + /** + * Omit specific fields from the ChallengeForumWatch + */ + omit?: ChallengeForumWatchOmit | null + /** + * The data needed to update a ChallengeForumWatch. + */ + data: XOR + /** + * Choose, which ChallengeForumWatch to update. + */ + where: ChallengeForumWatchWhereUniqueInput + } + + /** + * ChallengeForumWatch updateMany + */ + export type ChallengeForumWatchUpdateManyArgs = { + /** + * The data used to update ChallengeForumWatches. + */ + data: XOR + /** + * Filter which ChallengeForumWatches to update + */ + where?: ChallengeForumWatchWhereInput + /** + * Limit how many ChallengeForumWatches to update. + */ + limit?: number + } + + /** + * ChallengeForumWatch updateManyAndReturn + */ + export type ChallengeForumWatchUpdateManyAndReturnArgs = { + /** + * Select specific fields to fetch from the ChallengeForumWatch + */ + select?: ChallengeForumWatchSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the ChallengeForumWatch + */ + omit?: ChallengeForumWatchOmit | null + /** + * The data used to update ChallengeForumWatches. + */ + data: XOR + /** + * Filter which ChallengeForumWatches to update + */ + where?: ChallengeForumWatchWhereInput + /** + * Limit how many ChallengeForumWatches to update. + */ + limit?: number + } + + /** + * ChallengeForumWatch upsert + */ + export type ChallengeForumWatchUpsertArgs = { + /** + * Select specific fields to fetch from the ChallengeForumWatch + */ + select?: ChallengeForumWatchSelect | null + /** + * Omit specific fields from the ChallengeForumWatch + */ + omit?: ChallengeForumWatchOmit | null + /** + * The filter to search for the ChallengeForumWatch to update in case it exists. + */ + where: ChallengeForumWatchWhereUniqueInput + /** + * In case the ChallengeForumWatch found by the `where` argument doesn't exist, create a new ChallengeForumWatch with this data. + */ + create: XOR + /** + * In case the ChallengeForumWatch was found with the provided `where` argument, update it with this data. + */ + update: XOR + } + + /** + * ChallengeForumWatch delete + */ + export type ChallengeForumWatchDeleteArgs = { + /** + * Select specific fields to fetch from the ChallengeForumWatch + */ + select?: ChallengeForumWatchSelect | null + /** + * Omit specific fields from the ChallengeForumWatch + */ + omit?: ChallengeForumWatchOmit | null + /** + * Filter which ChallengeForumWatch to delete. + */ + where: ChallengeForumWatchWhereUniqueInput + } + + /** + * ChallengeForumWatch deleteMany + */ + export type ChallengeForumWatchDeleteManyArgs = { + /** + * Filter which ChallengeForumWatches to delete + */ + where?: ChallengeForumWatchWhereInput + /** + * Limit how many ChallengeForumWatches to delete. + */ + limit?: number + } + + /** + * ChallengeForumWatch without action + */ + export type ChallengeForumWatchDefaultArgs = { + /** + * Select specific fields to fetch from the ChallengeForumWatch + */ + select?: ChallengeForumWatchSelect | null + /** + * Omit specific fields from the ChallengeForumWatch + */ + omit?: ChallengeForumWatchOmit | null + } + + + /** + * Model TopicReadState + */ + + export type AggregateTopicReadState = { + _count: TopicReadStateCountAggregateOutputType | null + _min: TopicReadStateMinAggregateOutputType | null + _max: TopicReadStateMaxAggregateOutputType | null + } + + export type TopicReadStateMinAggregateOutputType = { + topicId: string | null + memberId: string | null + lastReadAt: Date | null + updatedAt: Date | null + } + + export type TopicReadStateMaxAggregateOutputType = { + topicId: string | null + memberId: string | null + lastReadAt: Date | null + updatedAt: Date | null + } + + export type TopicReadStateCountAggregateOutputType = { + topicId: number + memberId: number + lastReadAt: number + updatedAt: number + _all: number + } + + + export type TopicReadStateMinAggregateInputType = { + topicId?: true + memberId?: true + lastReadAt?: true + updatedAt?: true + } + + export type TopicReadStateMaxAggregateInputType = { + topicId?: true + memberId?: true + lastReadAt?: true + updatedAt?: true + } + + export type TopicReadStateCountAggregateInputType = { + topicId?: true + memberId?: true + lastReadAt?: true + updatedAt?: true + _all?: true + } + + export type TopicReadStateAggregateArgs = { + /** + * Filter which TopicReadState to aggregate. + */ + where?: TopicReadStateWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of TopicReadStates to fetch. + */ + orderBy?: TopicReadStateOrderByWithRelationInput | TopicReadStateOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: TopicReadStateWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` TopicReadStates from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` TopicReadStates. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned TopicReadStates + **/ + _count?: true | TopicReadStateCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: TopicReadStateMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: TopicReadStateMaxAggregateInputType + } + + export type GetTopicReadStateAggregateType = { + [P in keyof T & keyof AggregateTopicReadState]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : GetScalarType + : GetScalarType + } + + + + + export type TopicReadStateGroupByArgs = { + where?: TopicReadStateWhereInput + orderBy?: TopicReadStateOrderByWithAggregationInput | TopicReadStateOrderByWithAggregationInput[] + by: TopicReadStateScalarFieldEnum[] | TopicReadStateScalarFieldEnum + having?: TopicReadStateScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: TopicReadStateCountAggregateInputType | true + _min?: TopicReadStateMinAggregateInputType + _max?: TopicReadStateMaxAggregateInputType + } + + export type TopicReadStateGroupByOutputType = { + topicId: string + memberId: string + lastReadAt: Date + updatedAt: Date + _count: TopicReadStateCountAggregateOutputType | null + _min: TopicReadStateMinAggregateOutputType | null + _max: TopicReadStateMaxAggregateOutputType | null + } + + type GetTopicReadStateGroupByPayload = Prisma.PrismaPromise< + Array< + PickEnumerable & + { + [P in ((keyof T) & (keyof TopicReadStateGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : GetScalarType + : GetScalarType + } + > + > + + + export type TopicReadStateSelect = $Extensions.GetSelect<{ + topicId?: boolean + memberId?: boolean + lastReadAt?: boolean + updatedAt?: boolean + topic?: boolean | TopicDefaultArgs + }, ExtArgs["result"]["topicReadState"]> + + export type TopicReadStateSelectCreateManyAndReturn = $Extensions.GetSelect<{ + topicId?: boolean + memberId?: boolean + lastReadAt?: boolean + updatedAt?: boolean + topic?: boolean | TopicDefaultArgs + }, ExtArgs["result"]["topicReadState"]> + + export type TopicReadStateSelectUpdateManyAndReturn = $Extensions.GetSelect<{ + topicId?: boolean + memberId?: boolean + lastReadAt?: boolean + updatedAt?: boolean + topic?: boolean | TopicDefaultArgs + }, ExtArgs["result"]["topicReadState"]> + + export type TopicReadStateSelectScalar = { + topicId?: boolean + memberId?: boolean + lastReadAt?: boolean + updatedAt?: boolean + } + + export type TopicReadStateOmit = $Extensions.GetOmit<"topicId" | "memberId" | "lastReadAt" | "updatedAt", ExtArgs["result"]["topicReadState"]> + export type TopicReadStateInclude = { + topic?: boolean | TopicDefaultArgs + } + export type TopicReadStateIncludeCreateManyAndReturn = { + topic?: boolean | TopicDefaultArgs + } + export type TopicReadStateIncludeUpdateManyAndReturn = { + topic?: boolean | TopicDefaultArgs + } + + export type $TopicReadStatePayload = { + name: "TopicReadState" + objects: { + topic: Prisma.$TopicPayload + } + scalars: $Extensions.GetPayloadResult<{ + topicId: string + memberId: string + lastReadAt: Date + updatedAt: Date + }, ExtArgs["result"]["topicReadState"]> + composites: {} + } + + type TopicReadStateGetPayload = $Result.GetResult + + type TopicReadStateCountArgs = + Omit & { + select?: TopicReadStateCountAggregateInputType | true + } + + export interface TopicReadStateDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['TopicReadState'], meta: { name: 'TopicReadState' } } + /** + * Find zero or one TopicReadState that matches the filter. + * @param {TopicReadStateFindUniqueArgs} args - Arguments to find a TopicReadState + * @example + * // Get one TopicReadState + * const topicReadState = await prisma.topicReadState.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: SelectSubset>): Prisma__TopicReadStateClient<$Result.GetResult, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find one TopicReadState that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {TopicReadStateFindUniqueOrThrowArgs} args - Arguments to find a TopicReadState + * @example + * // Get one TopicReadState + * const topicReadState = await prisma.topicReadState.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: SelectSubset>): Prisma__TopicReadStateClient<$Result.GetResult, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find the first TopicReadState that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {TopicReadStateFindFirstArgs} args - Arguments to find a TopicReadState + * @example + * // Get one TopicReadState + * const topicReadState = await prisma.topicReadState.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: SelectSubset>): Prisma__TopicReadStateClient<$Result.GetResult, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find the first TopicReadState that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {TopicReadStateFindFirstOrThrowArgs} args - Arguments to find a TopicReadState + * @example + * // Get one TopicReadState + * const topicReadState = await prisma.topicReadState.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: SelectSubset>): Prisma__TopicReadStateClient<$Result.GetResult, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find zero or more TopicReadStates that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {TopicReadStateFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all TopicReadStates + * const topicReadStates = await prisma.topicReadState.findMany() + * + * // Get first 10 TopicReadStates + * const topicReadStates = await prisma.topicReadState.findMany({ take: 10 }) + * + * // Only select the `topicId` + * const topicReadStateWithTopicIdOnly = await prisma.topicReadState.findMany({ select: { topicId: true } }) + * + */ + findMany(args?: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany", GlobalOmitOptions>> + + /** + * Create a TopicReadState. + * @param {TopicReadStateCreateArgs} args - Arguments to create a TopicReadState. + * @example + * // Create one TopicReadState + * const TopicReadState = await prisma.topicReadState.create({ + * data: { + * // ... data to create a TopicReadState + * } + * }) + * + */ + create(args: SelectSubset>): Prisma__TopicReadStateClient<$Result.GetResult, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Create many TopicReadStates. + * @param {TopicReadStateCreateManyArgs} args - Arguments to create many TopicReadStates. + * @example + * // Create many TopicReadStates + * const topicReadState = await prisma.topicReadState.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: SelectSubset>): Prisma.PrismaPromise + + /** + * Create many TopicReadStates and returns the data saved in the database. + * @param {TopicReadStateCreateManyAndReturnArgs} args - Arguments to create many TopicReadStates. + * @example + * // Create many TopicReadStates + * const topicReadState = await prisma.topicReadState.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many TopicReadStates and only return the `topicId` + * const topicReadStateWithTopicIdOnly = await prisma.topicReadState.createManyAndReturn({ + * select: { topicId: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "createManyAndReturn", GlobalOmitOptions>> + + /** + * Delete a TopicReadState. + * @param {TopicReadStateDeleteArgs} args - Arguments to delete one TopicReadState. + * @example + * // Delete one TopicReadState + * const TopicReadState = await prisma.topicReadState.delete({ + * where: { + * // ... filter to delete one TopicReadState + * } + * }) + * + */ + delete(args: SelectSubset>): Prisma__TopicReadStateClient<$Result.GetResult, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Update one TopicReadState. + * @param {TopicReadStateUpdateArgs} args - Arguments to update one TopicReadState. + * @example + * // Update one TopicReadState + * const topicReadState = await prisma.topicReadState.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: SelectSubset>): Prisma__TopicReadStateClient<$Result.GetResult, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Delete zero or more TopicReadStates. + * @param {TopicReadStateDeleteManyArgs} args - Arguments to filter TopicReadStates to delete. + * @example + * // Delete a few TopicReadStates + * const { count } = await prisma.topicReadState.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more TopicReadStates. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {TopicReadStateUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many TopicReadStates + * const topicReadState = await prisma.topicReadState.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more TopicReadStates and returns the data updated in the database. + * @param {TopicReadStateUpdateManyAndReturnArgs} args - Arguments to update many TopicReadStates. + * @example + * // Update many TopicReadStates + * const topicReadState = await prisma.topicReadState.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more TopicReadStates and only return the `topicId` + * const topicReadStateWithTopicIdOnly = await prisma.topicReadState.updateManyAndReturn({ + * select: { topicId: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "updateManyAndReturn", GlobalOmitOptions>> + + /** + * Create or update one TopicReadState. + * @param {TopicReadStateUpsertArgs} args - Arguments to update or create a TopicReadState. + * @example + * // Update or create a TopicReadState + * const topicReadState = await prisma.topicReadState.upsert({ + * create: { + * // ... data to create a TopicReadState + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the TopicReadState we want to update + * } + * }) + */ + upsert(args: SelectSubset>): Prisma__TopicReadStateClient<$Result.GetResult, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> /** @@ -13901,6 +14992,17 @@ export namespace Prisma { export type TopicWatchScalarFieldEnum = (typeof TopicWatchScalarFieldEnum)[keyof typeof TopicWatchScalarFieldEnum] + export const ChallengeForumWatchScalarFieldEnum: { + challengeId: 'challengeId', + memberId: 'memberId', + watching: 'watching', + createdAt: 'createdAt', + updatedAt: 'updatedAt' + }; + + export type ChallengeForumWatchScalarFieldEnum = (typeof ChallengeForumWatchScalarFieldEnum)[keyof typeof ChallengeForumWatchScalarFieldEnum] + + export const TopicReadStateScalarFieldEnum: { topicId: 'topicId', memberId: 'memberId', @@ -14564,6 +15666,59 @@ export namespace Prisma { createdAt?: DateTimeWithAggregatesFilter<"TopicWatch"> | Date | string } + export type ChallengeForumWatchWhereInput = { + AND?: ChallengeForumWatchWhereInput | ChallengeForumWatchWhereInput[] + OR?: ChallengeForumWatchWhereInput[] + NOT?: ChallengeForumWatchWhereInput | ChallengeForumWatchWhereInput[] + challengeId?: StringFilter<"ChallengeForumWatch"> | string + memberId?: StringFilter<"ChallengeForumWatch"> | string + watching?: BoolFilter<"ChallengeForumWatch"> | boolean + createdAt?: DateTimeFilter<"ChallengeForumWatch"> | Date | string + updatedAt?: DateTimeFilter<"ChallengeForumWatch"> | Date | string + } + + export type ChallengeForumWatchOrderByWithRelationInput = { + challengeId?: SortOrder + memberId?: SortOrder + watching?: SortOrder + createdAt?: SortOrder + updatedAt?: SortOrder + } + + export type ChallengeForumWatchWhereUniqueInput = Prisma.AtLeast<{ + challengeId_memberId?: ChallengeForumWatchChallengeIdMemberIdCompoundUniqueInput + AND?: ChallengeForumWatchWhereInput | ChallengeForumWatchWhereInput[] + OR?: ChallengeForumWatchWhereInput[] + NOT?: ChallengeForumWatchWhereInput | ChallengeForumWatchWhereInput[] + challengeId?: StringFilter<"ChallengeForumWatch"> | string + memberId?: StringFilter<"ChallengeForumWatch"> | string + watching?: BoolFilter<"ChallengeForumWatch"> | boolean + createdAt?: DateTimeFilter<"ChallengeForumWatch"> | Date | string + updatedAt?: DateTimeFilter<"ChallengeForumWatch"> | Date | string + }, "challengeId_memberId"> + + export type ChallengeForumWatchOrderByWithAggregationInput = { + challengeId?: SortOrder + memberId?: SortOrder + watching?: SortOrder + createdAt?: SortOrder + updatedAt?: SortOrder + _count?: ChallengeForumWatchCountOrderByAggregateInput + _max?: ChallengeForumWatchMaxOrderByAggregateInput + _min?: ChallengeForumWatchMinOrderByAggregateInput + } + + export type ChallengeForumWatchScalarWhereWithAggregatesInput = { + AND?: ChallengeForumWatchScalarWhereWithAggregatesInput | ChallengeForumWatchScalarWhereWithAggregatesInput[] + OR?: ChallengeForumWatchScalarWhereWithAggregatesInput[] + NOT?: ChallengeForumWatchScalarWhereWithAggregatesInput | ChallengeForumWatchScalarWhereWithAggregatesInput[] + challengeId?: StringWithAggregatesFilter<"ChallengeForumWatch"> | string + memberId?: StringWithAggregatesFilter<"ChallengeForumWatch"> | string + watching?: BoolWithAggregatesFilter<"ChallengeForumWatch"> | boolean + createdAt?: DateTimeWithAggregatesFilter<"ChallengeForumWatch"> | Date | string + updatedAt?: DateTimeWithAggregatesFilter<"ChallengeForumWatch"> | Date | string + } + export type TopicReadStateWhereInput = { AND?: TopicReadStateWhereInput | TopicReadStateWhereInput[] OR?: TopicReadStateWhereInput[] @@ -15303,6 +16458,62 @@ export namespace Prisma { createdAt?: DateTimeFieldUpdateOperationsInput | Date | string } + export type ChallengeForumWatchCreateInput = { + challengeId: string + memberId: string + watching: boolean + createdAt?: Date | string + updatedAt?: Date | string + } + + export type ChallengeForumWatchUncheckedCreateInput = { + challengeId: string + memberId: string + watching: boolean + createdAt?: Date | string + updatedAt?: Date | string + } + + export type ChallengeForumWatchUpdateInput = { + challengeId?: StringFieldUpdateOperationsInput | string + memberId?: StringFieldUpdateOperationsInput | string + watching?: BoolFieldUpdateOperationsInput | boolean + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + } + + export type ChallengeForumWatchUncheckedUpdateInput = { + challengeId?: StringFieldUpdateOperationsInput | string + memberId?: StringFieldUpdateOperationsInput | string + watching?: BoolFieldUpdateOperationsInput | boolean + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + } + + export type ChallengeForumWatchCreateManyInput = { + challengeId: string + memberId: string + watching: boolean + createdAt?: Date | string + updatedAt?: Date | string + } + + export type ChallengeForumWatchUpdateManyMutationInput = { + challengeId?: StringFieldUpdateOperationsInput | string + memberId?: StringFieldUpdateOperationsInput | string + watching?: BoolFieldUpdateOperationsInput | boolean + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + } + + export type ChallengeForumWatchUncheckedUpdateManyInput = { + challengeId?: StringFieldUpdateOperationsInput | string + memberId?: StringFieldUpdateOperationsInput | string + watching?: BoolFieldUpdateOperationsInput | boolean + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + } + export type TopicReadStateCreateInput = { memberId: string lastReadAt?: Date | string @@ -16026,6 +17237,35 @@ export namespace Prisma { createdAt?: SortOrder } + export type ChallengeForumWatchChallengeIdMemberIdCompoundUniqueInput = { + challengeId: string + memberId: string + } + + export type ChallengeForumWatchCountOrderByAggregateInput = { + challengeId?: SortOrder + memberId?: SortOrder + watching?: SortOrder + createdAt?: SortOrder + updatedAt?: SortOrder + } + + export type ChallengeForumWatchMaxOrderByAggregateInput = { + challengeId?: SortOrder + memberId?: SortOrder + watching?: SortOrder + createdAt?: SortOrder + updatedAt?: SortOrder + } + + export type ChallengeForumWatchMinOrderByAggregateInput = { + challengeId?: SortOrder + memberId?: SortOrder + watching?: SortOrder + createdAt?: SortOrder + updatedAt?: SortOrder + } + export type TopicReadStateTopicIdMemberIdCompoundUniqueInput = { topicId: string memberId: string diff --git a/packages/forums-prisma-client/index.js b/packages/forums-prisma-client/index.js index 6c4f777..dc73b7b 100644 --- a/packages/forums-prisma-client/index.js +++ b/packages/forums-prisma-client/index.js @@ -163,6 +163,14 @@ exports.Prisma.TopicWatchScalarFieldEnum = { createdAt: 'createdAt' }; +exports.Prisma.ChallengeForumWatchScalarFieldEnum = { + challengeId: 'challengeId', + memberId: 'memberId', + watching: 'watching', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +}; + exports.Prisma.TopicReadStateScalarFieldEnum = { topicId: 'topicId', memberId: 'memberId', @@ -234,6 +242,7 @@ exports.Prisma.ModelName = { PostReaction: 'PostReaction', TopicClosure: 'TopicClosure', TopicWatch: 'TopicWatch', + ChallengeForumWatch: 'ChallengeForumWatch', TopicReadState: 'TopicReadState', PublicForumCategory: 'PublicForumCategory', PublicForumRoleMember: 'PublicForumRoleMember', @@ -247,14 +256,14 @@ const config = { "clientVersion": "7.9.0", "engineVersion": "e922089b7d7502aff4249d5da3420f6fa55fc6ad", "activeProvider": "postgresql", - "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n output = \"./generated/client\"\n}\n\ngenerator externalClient {\n provider = \"prisma-client-js\"\n output = \"../packages/forums-prisma-client\"\n binaryTargets = [\"native\", \"debian-openssl-3.0.x\"]\n}\n\ndatasource db {\n provider = \"postgresql\"\n schemas = [\"forums\"]\n}\n\nenum PostReactionType {\n THUMBS_UP\n THUMBS_DOWN\n\n @@schema(\"forums\")\n}\n\nmodel Topic {\n id String @id @default(dbgenerated(\"nanoid()\")) @db.VarChar(14)\n parentTopicId String? @db.VarChar(14)\n challengeId String? @db.VarChar(64)\n roleName String? @db.VarChar(128)\n title String @db.VarChar(255)\n isAnnouncement Boolean @default(false)\n locked Boolean @default(false)\n lockedAt DateTime?\n lockedByMemberId String? @db.VarChar(64)\n authorMemberId String @db.VarChar(64)\n authorHandle String @db.VarChar(128)\n createdAt DateTime @default(now())\n updatedAt DateTime @default(now()) @updatedAt\n deletedAt DateTime?\n deletedByMemberId String? @db.VarChar(64)\n\n parentTopic Topic? @relation(\"TopicChildren\", fields: [parentTopicId], references: [id])\n childTopics Topic[] @relation(\"TopicChildren\")\n posts Post[]\n ancestorClosures TopicClosure[] @relation(\"TopicClosureAncestor\")\n descendantClosures TopicClosure[] @relation(\"TopicClosureDescendant\")\n watches TopicWatch[]\n readStates TopicReadState[]\n\n @@index([parentTopicId])\n @@index([challengeId])\n @@index([roleName])\n @@index([deletedAt])\n @@index([isAnnouncement, createdAt])\n @@schema(\"forums\")\n}\n\nmodel MemberBan {\n id String @id @default(dbgenerated(\"nanoid()\")) @db.VarChar(14)\n memberId String @db.VarChar(64)\n createdAt DateTime @default(now())\n createdByMemberId String? @db.VarChar(64)\n removedAt DateTime?\n removedByMemberId String? @db.VarChar(64)\n\n @@index([memberId])\n @@index([removedAt])\n @@schema(\"forums\")\n}\n\nmodel IpBan {\n id String @id @default(dbgenerated(\"nanoid()\")) @db.VarChar(14)\n ipAddress String @db.VarChar(45)\n createdAt DateTime @default(now())\n createdByMemberId String? @db.VarChar(64)\n removedAt DateTime?\n removedByMemberId String? @db.VarChar(64)\n\n @@index([ipAddress])\n @@index([removedAt])\n @@schema(\"forums\")\n}\n\nmodel Post {\n id String @id @default(dbgenerated(\"nanoid()\")) @db.VarChar(14)\n topicId String @db.VarChar(14)\n parentType String @db.VarChar(16)\n parentId String @db.VarChar(14)\n authorMemberId String @db.VarChar(64)\n authorHandle String @db.VarChar(128)\n content String? @db.Text\n createdAt DateTime @default(now())\n updatedAt DateTime @default(now()) @updatedAt\n deletedAt DateTime?\n deletedByMemberId String? @db.VarChar(64)\n\n topic Topic @relation(fields: [topicId], references: [id], onDelete: Cascade)\n reactions PostReaction[]\n\n @@index([topicId, createdAt])\n @@index([topicId, parentType, parentId])\n @@index([deletedAt])\n @@schema(\"forums\")\n}\n\nmodel PostReaction {\n postId String @db.VarChar(14)\n memberId String @db.VarChar(64)\n reaction PostReactionType\n createdAt DateTime @default(now())\n updatedAt DateTime @default(now()) @updatedAt\n\n post Post @relation(fields: [postId], references: [id], onDelete: Cascade)\n\n @@id([postId, memberId])\n @@index([memberId])\n @@index([postId, reaction])\n @@schema(\"forums\")\n}\n\nmodel TopicClosure {\n ancestorTopicId String @db.VarChar(14)\n descendantTopicId String @db.VarChar(14)\n depth Int\n\n ancestorTopic Topic @relation(\"TopicClosureAncestor\", fields: [ancestorTopicId], references: [id], onDelete: Cascade)\n descendantTopic Topic @relation(\"TopicClosureDescendant\", fields: [descendantTopicId], references: [id], onDelete: Cascade)\n\n @@id([ancestorTopicId, descendantTopicId])\n @@index([ancestorTopicId, depth])\n @@index([descendantTopicId, depth])\n @@schema(\"forums\")\n}\n\nmodel TopicWatch {\n topicId String @db.VarChar(14)\n memberId String @db.VarChar(64)\n createdAt DateTime @default(now())\n\n topic Topic @relation(fields: [topicId], references: [id], onDelete: Cascade)\n\n @@id([topicId, memberId])\n @@index([memberId])\n @@schema(\"forums\")\n}\n\nmodel TopicReadState {\n topicId String @db.VarChar(14)\n memberId String @db.VarChar(64)\n lastReadAt DateTime @default(now())\n updatedAt DateTime @default(now()) @updatedAt\n\n topic Topic @relation(fields: [topicId], references: [id], onDelete: Cascade)\n\n @@id([topicId, memberId])\n @@index([memberId])\n @@index([lastReadAt])\n @@schema(\"forums\")\n}\n\n// Presentation and access rules for imported public category topics only.\nmodel PublicForumCategory {\n topicId String @id @db.VarChar(14)\n description String @default(\"\") @db.Text\n displayAs String @db.VarChar(16)\n sortOrder Int\n readRoles String[]\n createRoles String[]\n replyRoles String[]\n legacyId Int @unique\n legacySlug String @db.Text\n source Json\n\n @@schema(\"forums\")\n}\n\n// Vanilla-only role assignments never grant identity-wide roles.\nmodel PublicForumRoleMember {\n roleName String @db.VarChar(128)\n memberId String @db.VarChar(64)\n\n @@id([roleName, memberId])\n @@index([memberId])\n @@schema(\"forums\")\n}\n\n// Immutable provenance makes imports insert-only and safely repeatable.\nmodel PublicForumImportRecord {\n entityType String @db.VarChar(32)\n sourceId String @db.VarChar(64)\n targetId String @db.VarChar(64)\n sourceHash String @db.VarChar(64)\n targetHash String @db.VarChar(64)\n createdAt DateTime @default(now())\n\n @@id([entityType, sourceId])\n @@unique([entityType, targetId])\n @@schema(\"forums\")\n}\n" + "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n output = \"./generated/client\"\n}\n\ngenerator externalClient {\n provider = \"prisma-client-js\"\n output = \"../packages/forums-prisma-client\"\n binaryTargets = [\"native\", \"debian-openssl-3.0.x\"]\n}\n\ndatasource db {\n provider = \"postgresql\"\n schemas = [\"forums\"]\n}\n\nenum PostReactionType {\n THUMBS_UP\n THUMBS_DOWN\n\n @@schema(\"forums\")\n}\n\nmodel Topic {\n id String @id @default(dbgenerated(\"nanoid()\")) @db.VarChar(14)\n parentTopicId String? @db.VarChar(14)\n challengeId String? @db.VarChar(64)\n roleName String? @db.VarChar(128)\n title String @db.VarChar(255)\n isAnnouncement Boolean @default(false)\n locked Boolean @default(false)\n lockedAt DateTime?\n lockedByMemberId String? @db.VarChar(64)\n authorMemberId String @db.VarChar(64)\n authorHandle String @db.VarChar(128)\n createdAt DateTime @default(now())\n updatedAt DateTime @default(now()) @updatedAt\n deletedAt DateTime?\n deletedByMemberId String? @db.VarChar(64)\n\n parentTopic Topic? @relation(\"TopicChildren\", fields: [parentTopicId], references: [id])\n childTopics Topic[] @relation(\"TopicChildren\")\n posts Post[]\n ancestorClosures TopicClosure[] @relation(\"TopicClosureAncestor\")\n descendantClosures TopicClosure[] @relation(\"TopicClosureDescendant\")\n watches TopicWatch[]\n readStates TopicReadState[]\n\n @@index([parentTopicId])\n @@index([challengeId])\n @@index([roleName])\n @@index([deletedAt])\n @@index([isAnnouncement, createdAt])\n @@schema(\"forums\")\n}\n\nmodel MemberBan {\n id String @id @default(dbgenerated(\"nanoid()\")) @db.VarChar(14)\n memberId String @db.VarChar(64)\n createdAt DateTime @default(now())\n createdByMemberId String? @db.VarChar(64)\n removedAt DateTime?\n removedByMemberId String? @db.VarChar(64)\n\n @@index([memberId])\n @@index([removedAt])\n @@schema(\"forums\")\n}\n\nmodel IpBan {\n id String @id @default(dbgenerated(\"nanoid()\")) @db.VarChar(14)\n ipAddress String @db.VarChar(45)\n createdAt DateTime @default(now())\n createdByMemberId String? @db.VarChar(64)\n removedAt DateTime?\n removedByMemberId String? @db.VarChar(64)\n\n @@index([ipAddress])\n @@index([removedAt])\n @@schema(\"forums\")\n}\n\nmodel Post {\n id String @id @default(dbgenerated(\"nanoid()\")) @db.VarChar(14)\n topicId String @db.VarChar(14)\n parentType String @db.VarChar(16)\n parentId String @db.VarChar(14)\n authorMemberId String @db.VarChar(64)\n authorHandle String @db.VarChar(128)\n content String? @db.Text\n createdAt DateTime @default(now())\n updatedAt DateTime @default(now()) @updatedAt\n deletedAt DateTime?\n deletedByMemberId String? @db.VarChar(64)\n\n topic Topic @relation(fields: [topicId], references: [id], onDelete: Cascade)\n reactions PostReaction[]\n\n @@index([topicId, createdAt])\n @@index([topicId, parentType, parentId])\n @@index([deletedAt])\n @@schema(\"forums\")\n}\n\nmodel PostReaction {\n postId String @db.VarChar(14)\n memberId String @db.VarChar(64)\n reaction PostReactionType\n createdAt DateTime @default(now())\n updatedAt DateTime @default(now()) @updatedAt\n\n post Post @relation(fields: [postId], references: [id], onDelete: Cascade)\n\n @@id([postId, memberId])\n @@index([memberId])\n @@index([postId, reaction])\n @@schema(\"forums\")\n}\n\nmodel TopicClosure {\n ancestorTopicId String @db.VarChar(14)\n descendantTopicId String @db.VarChar(14)\n depth Int\n\n ancestorTopic Topic @relation(\"TopicClosureAncestor\", fields: [ancestorTopicId], references: [id], onDelete: Cascade)\n descendantTopic Topic @relation(\"TopicClosureDescendant\", fields: [descendantTopicId], references: [id], onDelete: Cascade)\n\n @@id([ancestorTopicId, descendantTopicId])\n @@index([ancestorTopicId, depth])\n @@index([descendantTopicId, depth])\n @@schema(\"forums\")\n}\n\nmodel TopicWatch {\n topicId String @db.VarChar(14)\n memberId String @db.VarChar(64)\n createdAt DateTime @default(now())\n\n topic Topic @relation(fields: [topicId], references: [id], onDelete: Cascade)\n\n @@id([topicId, memberId])\n @@index([memberId])\n @@schema(\"forums\")\n}\n\n// Explicit challenge-wide preferences override resource-based default watches.\nmodel ChallengeForumWatch {\n challengeId String @db.VarChar(64)\n memberId String @db.VarChar(64)\n watching Boolean\n createdAt DateTime @default(now())\n updatedAt DateTime @default(now()) @updatedAt\n\n @@id([challengeId, memberId])\n @@index([memberId])\n @@schema(\"forums\")\n}\n\nmodel TopicReadState {\n topicId String @db.VarChar(14)\n memberId String @db.VarChar(64)\n lastReadAt DateTime @default(now())\n updatedAt DateTime @default(now()) @updatedAt\n\n topic Topic @relation(fields: [topicId], references: [id], onDelete: Cascade)\n\n @@id([topicId, memberId])\n @@index([memberId])\n @@index([lastReadAt])\n @@schema(\"forums\")\n}\n\n// Presentation and access rules for imported public category topics only.\nmodel PublicForumCategory {\n topicId String @id @db.VarChar(14)\n description String @default(\"\") @db.Text\n displayAs String @db.VarChar(16)\n sortOrder Int\n readRoles String[]\n createRoles String[]\n replyRoles String[]\n legacyId Int @unique\n legacySlug String @db.Text\n source Json\n\n @@schema(\"forums\")\n}\n\n// Vanilla-only role assignments never grant identity-wide roles.\nmodel PublicForumRoleMember {\n roleName String @db.VarChar(128)\n memberId String @db.VarChar(64)\n\n @@id([roleName, memberId])\n @@index([memberId])\n @@schema(\"forums\")\n}\n\n// Immutable provenance makes imports insert-only and safely repeatable.\nmodel PublicForumImportRecord {\n entityType String @db.VarChar(32)\n sourceId String @db.VarChar(64)\n targetId String @db.VarChar(64)\n sourceHash String @db.VarChar(64)\n targetHash String @db.VarChar(64)\n createdAt DateTime @default(now())\n\n @@id([entityType, sourceId])\n @@unique([entityType, targetId])\n @@schema(\"forums\")\n}\n" } -config.runtimeDataModel = JSON.parse("{\"models\":{\"Topic\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentTopicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"roleName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isAnnouncement\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"locked\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"lockedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"lockedByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"authorMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"authorHandle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentTopic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicChildren\"},{\"name\":\"childTopics\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicChildren\"},{\"name\":\"posts\",\"kind\":\"object\",\"type\":\"Post\",\"relationName\":\"PostToTopic\"},{\"name\":\"ancestorClosures\",\"kind\":\"object\",\"type\":\"TopicClosure\",\"relationName\":\"TopicClosureAncestor\"},{\"name\":\"descendantClosures\",\"kind\":\"object\",\"type\":\"TopicClosure\",\"relationName\":\"TopicClosureDescendant\"},{\"name\":\"watches\",\"kind\":\"object\",\"type\":\"TopicWatch\",\"relationName\":\"TopicToTopicWatch\"},{\"name\":\"readStates\",\"kind\":\"object\",\"type\":\"TopicReadState\",\"relationName\":\"TopicToTopicReadState\"}],\"dbName\":null},\"MemberBan\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"removedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"removedByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"IpBan\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"removedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"removedByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"Post\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"topicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"authorMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"authorHandle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"topic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"PostToTopic\"},{\"name\":\"reactions\",\"kind\":\"object\",\"type\":\"PostReaction\",\"relationName\":\"PostToPostReaction\"}],\"dbName\":null},\"PostReaction\":{\"fields\":[{\"name\":\"postId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"reaction\",\"kind\":\"enum\",\"type\":\"PostReactionType\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"post\",\"kind\":\"object\",\"type\":\"Post\",\"relationName\":\"PostToPostReaction\"}],\"dbName\":null},\"TopicClosure\":{\"fields\":[{\"name\":\"ancestorTopicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"descendantTopicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"depth\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"ancestorTopic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicClosureAncestor\"},{\"name\":\"descendantTopic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicClosureDescendant\"}],\"dbName\":null},\"TopicWatch\":{\"fields\":[{\"name\":\"topicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"topic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicToTopicWatch\"}],\"dbName\":null},\"TopicReadState\":{\"fields\":[{\"name\":\"topicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastReadAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"topic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicToTopicReadState\"}],\"dbName\":null},\"PublicForumCategory\":{\"fields\":[{\"name\":\"topicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"displayAs\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"readRoles\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createRoles\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"replyRoles\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"legacySlug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"Json\"}],\"dbName\":null},\"PublicForumRoleMember\":{\"fields\":[{\"name\":\"roleName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"PublicForumImportRecord\":{\"fields\":[{\"name\":\"entityType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sourceId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"targetId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sourceHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"targetHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"Topic\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentTopicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"roleName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isAnnouncement\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"locked\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"lockedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"lockedByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"authorMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"authorHandle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentTopic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicChildren\"},{\"name\":\"childTopics\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicChildren\"},{\"name\":\"posts\",\"kind\":\"object\",\"type\":\"Post\",\"relationName\":\"PostToTopic\"},{\"name\":\"ancestorClosures\",\"kind\":\"object\",\"type\":\"TopicClosure\",\"relationName\":\"TopicClosureAncestor\"},{\"name\":\"descendantClosures\",\"kind\":\"object\",\"type\":\"TopicClosure\",\"relationName\":\"TopicClosureDescendant\"},{\"name\":\"watches\",\"kind\":\"object\",\"type\":\"TopicWatch\",\"relationName\":\"TopicToTopicWatch\"},{\"name\":\"readStates\",\"kind\":\"object\",\"type\":\"TopicReadState\",\"relationName\":\"TopicToTopicReadState\"}],\"dbName\":null},\"MemberBan\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"removedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"removedByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"IpBan\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"removedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"removedByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"Post\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"topicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"parentId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"authorMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"authorHandle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"deletedByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"topic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"PostToTopic\"},{\"name\":\"reactions\",\"kind\":\"object\",\"type\":\"PostReaction\",\"relationName\":\"PostToPostReaction\"}],\"dbName\":null},\"PostReaction\":{\"fields\":[{\"name\":\"postId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"reaction\",\"kind\":\"enum\",\"type\":\"PostReactionType\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"post\",\"kind\":\"object\",\"type\":\"Post\",\"relationName\":\"PostToPostReaction\"}],\"dbName\":null},\"TopicClosure\":{\"fields\":[{\"name\":\"ancestorTopicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"descendantTopicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"depth\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"ancestorTopic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicClosureAncestor\"},{\"name\":\"descendantTopic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicClosureDescendant\"}],\"dbName\":null},\"TopicWatch\":{\"fields\":[{\"name\":\"topicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"topic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicToTopicWatch\"}],\"dbName\":null},\"ChallengeForumWatch\":{\"fields\":[{\"name\":\"challengeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"watching\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"TopicReadState\":{\"fields\":[{\"name\":\"topicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastReadAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"topic\",\"kind\":\"object\",\"type\":\"Topic\",\"relationName\":\"TopicToTopicReadState\"}],\"dbName\":null},\"PublicForumCategory\":{\"fields\":[{\"name\":\"topicId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"displayAs\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"readRoles\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createRoles\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"replyRoles\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"legacyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"legacySlug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"Json\"}],\"dbName\":null},\"PublicForumRoleMember\":{\"fields\":[{\"name\":\"roleName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"PublicForumImportRecord\":{\"fields\":[{\"name\":\"entityType\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sourceId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"targetId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sourceHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"targetHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.parameterizationSchema = { - strings: JSON.parse("[\"where\",\"parentTopic\",\"orderBy\",\"cursor\",\"childTopics\",\"topic\",\"post\",\"reactions\",\"_count\",\"posts\",\"ancestorTopic\",\"descendantTopic\",\"ancestorClosures\",\"descendantClosures\",\"watches\",\"readStates\",\"Topic.findUnique\",\"Topic.findUniqueOrThrow\",\"Topic.findFirst\",\"Topic.findFirstOrThrow\",\"Topic.findMany\",\"data\",\"Topic.createOne\",\"Topic.createMany\",\"Topic.createManyAndReturn\",\"Topic.updateOne\",\"Topic.updateMany\",\"Topic.updateManyAndReturn\",\"create\",\"update\",\"Topic.upsertOne\",\"Topic.deleteOne\",\"Topic.deleteMany\",\"having\",\"_min\",\"_max\",\"Topic.groupBy\",\"Topic.aggregate\",\"MemberBan.findUnique\",\"MemberBan.findUniqueOrThrow\",\"MemberBan.findFirst\",\"MemberBan.findFirstOrThrow\",\"MemberBan.findMany\",\"MemberBan.createOne\",\"MemberBan.createMany\",\"MemberBan.createManyAndReturn\",\"MemberBan.updateOne\",\"MemberBan.updateMany\",\"MemberBan.updateManyAndReturn\",\"MemberBan.upsertOne\",\"MemberBan.deleteOne\",\"MemberBan.deleteMany\",\"MemberBan.groupBy\",\"MemberBan.aggregate\",\"IpBan.findUnique\",\"IpBan.findUniqueOrThrow\",\"IpBan.findFirst\",\"IpBan.findFirstOrThrow\",\"IpBan.findMany\",\"IpBan.createOne\",\"IpBan.createMany\",\"IpBan.createManyAndReturn\",\"IpBan.updateOne\",\"IpBan.updateMany\",\"IpBan.updateManyAndReturn\",\"IpBan.upsertOne\",\"IpBan.deleteOne\",\"IpBan.deleteMany\",\"IpBan.groupBy\",\"IpBan.aggregate\",\"Post.findUnique\",\"Post.findUniqueOrThrow\",\"Post.findFirst\",\"Post.findFirstOrThrow\",\"Post.findMany\",\"Post.createOne\",\"Post.createMany\",\"Post.createManyAndReturn\",\"Post.updateOne\",\"Post.updateMany\",\"Post.updateManyAndReturn\",\"Post.upsertOne\",\"Post.deleteOne\",\"Post.deleteMany\",\"Post.groupBy\",\"Post.aggregate\",\"PostReaction.findUnique\",\"PostReaction.findUniqueOrThrow\",\"PostReaction.findFirst\",\"PostReaction.findFirstOrThrow\",\"PostReaction.findMany\",\"PostReaction.createOne\",\"PostReaction.createMany\",\"PostReaction.createManyAndReturn\",\"PostReaction.updateOne\",\"PostReaction.updateMany\",\"PostReaction.updateManyAndReturn\",\"PostReaction.upsertOne\",\"PostReaction.deleteOne\",\"PostReaction.deleteMany\",\"PostReaction.groupBy\",\"PostReaction.aggregate\",\"TopicClosure.findUnique\",\"TopicClosure.findUniqueOrThrow\",\"TopicClosure.findFirst\",\"TopicClosure.findFirstOrThrow\",\"TopicClosure.findMany\",\"TopicClosure.createOne\",\"TopicClosure.createMany\",\"TopicClosure.createManyAndReturn\",\"TopicClosure.updateOne\",\"TopicClosure.updateMany\",\"TopicClosure.updateManyAndReturn\",\"TopicClosure.upsertOne\",\"TopicClosure.deleteOne\",\"TopicClosure.deleteMany\",\"_avg\",\"_sum\",\"TopicClosure.groupBy\",\"TopicClosure.aggregate\",\"TopicWatch.findUnique\",\"TopicWatch.findUniqueOrThrow\",\"TopicWatch.findFirst\",\"TopicWatch.findFirstOrThrow\",\"TopicWatch.findMany\",\"TopicWatch.createOne\",\"TopicWatch.createMany\",\"TopicWatch.createManyAndReturn\",\"TopicWatch.updateOne\",\"TopicWatch.updateMany\",\"TopicWatch.updateManyAndReturn\",\"TopicWatch.upsertOne\",\"TopicWatch.deleteOne\",\"TopicWatch.deleteMany\",\"TopicWatch.groupBy\",\"TopicWatch.aggregate\",\"TopicReadState.findUnique\",\"TopicReadState.findUniqueOrThrow\",\"TopicReadState.findFirst\",\"TopicReadState.findFirstOrThrow\",\"TopicReadState.findMany\",\"TopicReadState.createOne\",\"TopicReadState.createMany\",\"TopicReadState.createManyAndReturn\",\"TopicReadState.updateOne\",\"TopicReadState.updateMany\",\"TopicReadState.updateManyAndReturn\",\"TopicReadState.upsertOne\",\"TopicReadState.deleteOne\",\"TopicReadState.deleteMany\",\"TopicReadState.groupBy\",\"TopicReadState.aggregate\",\"PublicForumCategory.findUnique\",\"PublicForumCategory.findUniqueOrThrow\",\"PublicForumCategory.findFirst\",\"PublicForumCategory.findFirstOrThrow\",\"PublicForumCategory.findMany\",\"PublicForumCategory.createOne\",\"PublicForumCategory.createMany\",\"PublicForumCategory.createManyAndReturn\",\"PublicForumCategory.updateOne\",\"PublicForumCategory.updateMany\",\"PublicForumCategory.updateManyAndReturn\",\"PublicForumCategory.upsertOne\",\"PublicForumCategory.deleteOne\",\"PublicForumCategory.deleteMany\",\"PublicForumCategory.groupBy\",\"PublicForumCategory.aggregate\",\"PublicForumRoleMember.findUnique\",\"PublicForumRoleMember.findUniqueOrThrow\",\"PublicForumRoleMember.findFirst\",\"PublicForumRoleMember.findFirstOrThrow\",\"PublicForumRoleMember.findMany\",\"PublicForumRoleMember.createOne\",\"PublicForumRoleMember.createMany\",\"PublicForumRoleMember.createManyAndReturn\",\"PublicForumRoleMember.updateOne\",\"PublicForumRoleMember.updateMany\",\"PublicForumRoleMember.updateManyAndReturn\",\"PublicForumRoleMember.upsertOne\",\"PublicForumRoleMember.deleteOne\",\"PublicForumRoleMember.deleteMany\",\"PublicForumRoleMember.groupBy\",\"PublicForumRoleMember.aggregate\",\"PublicForumImportRecord.findUnique\",\"PublicForumImportRecord.findUniqueOrThrow\",\"PublicForumImportRecord.findFirst\",\"PublicForumImportRecord.findFirstOrThrow\",\"PublicForumImportRecord.findMany\",\"PublicForumImportRecord.createOne\",\"PublicForumImportRecord.createMany\",\"PublicForumImportRecord.createManyAndReturn\",\"PublicForumImportRecord.updateOne\",\"PublicForumImportRecord.updateMany\",\"PublicForumImportRecord.updateManyAndReturn\",\"PublicForumImportRecord.upsertOne\",\"PublicForumImportRecord.deleteOne\",\"PublicForumImportRecord.deleteMany\",\"PublicForumImportRecord.groupBy\",\"PublicForumImportRecord.aggregate\",\"AND\",\"OR\",\"NOT\",\"entityType\",\"sourceId\",\"targetId\",\"sourceHash\",\"targetHash\",\"createdAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"contains\",\"startsWith\",\"endsWith\",\"entityType_targetId\",\"entityType_sourceId\",\"roleName\",\"memberId\",\"roleName_memberId\",\"topicId\",\"description\",\"displayAs\",\"sortOrder\",\"readRoles\",\"createRoles\",\"replyRoles\",\"legacyId\",\"legacySlug\",\"source\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"has\",\"hasEvery\",\"hasSome\",\"lastReadAt\",\"updatedAt\",\"ancestorTopicId\",\"descendantTopicId\",\"depth\",\"postId\",\"PostReactionType\",\"reaction\",\"id\",\"parentType\",\"parentId\",\"authorMemberId\",\"authorHandle\",\"content\",\"deletedAt\",\"deletedByMemberId\",\"ipAddress\",\"createdByMemberId\",\"removedAt\",\"removedByMemberId\",\"parentTopicId\",\"challengeId\",\"title\",\"isAnnouncement\",\"locked\",\"lockedAt\",\"lockedByMemberId\",\"topicId_memberId\",\"ancestorTopicId_descendantTopicId\",\"postId_memberId\",\"every\",\"some\",\"none\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"push\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), - graph: "vgRfsAEZAQAA5wIAIAQAAOgCACAJAADpAgAgDAAA6gIAIA0AAOoCACAOAADrAgAgDwAA7AIAIMgBAADlAgAwyQEAAAMAEMoBAADlAgAw0AFAAK8CACHeAQEA0AIAIfUBQACvAgAh_AEBAAAAAf8BAQCuAgAhgAIBAK4CACGCAkAA0QIAIYMCAQDQAgAhiAIBANACACGJAgEA0AIAIYoCAQCuAgAhiwIgAOYCACGMAiAA5gIAIY0CQADRAgAhjgIBANACACEBAAAAAQAgGQEAAOcCACAEAADoAgAgCQAA6QIAIAwAAOoCACANAADqAgAgDgAA6wIAIA8AAOwCACDIAQAA5QIAMMkBAAADABDKAQAA5QIAMNABQACvAgAh3gEBANACACH1AUAArwIAIfwBAQCuAgAh_wEBAK4CACGAAgEArgIAIYICQADRAgAhgwIBANACACGIAgEA0AIAIYkCAQDQAgAhigIBAK4CACGLAiAA5gIAIYwCIADmAgAhjQJAANECACGOAgEA0AIAIQEAAAADACAOAQAAjQQAIAQAAJAEACAJAACRBAAgDAAAkgQAIA0AAJIEACAOAACTBAAgDwAAlAQAIN4BAACaAwAgggIAAJoDACCDAgAAmgMAIIgCAACaAwAgiQIAAJoDACCNAgAAmgMAII4CAACaAwAgAwAAAAMAIAIAAAUAMAMAAAEAIBAFAADaAgAgBwAA5AIAIMgBAADjAgAwyQEAAAcAEMoBAADjAgAw0AFAAK8CACHhAQEArgIAIfUBQACvAgAh_AEBAK4CACH9AQEArgIAIf4BAQCuAgAh_wEBAK4CACGAAgEArgIAIYECAQDQAgAhggJAANECACGDAgEA0AIAIQUFAACNBAAgBwAAjwQAIIECAACaAwAgggIAAJoDACCDAgAAmgMAIBAFAADaAgAgBwAA5AIAIMgBAADjAgAwyQEAAAcAEMoBAADjAgAw0AFAAK8CACHhAQEArgIAIfUBQACvAgAh_AEBAAAAAf0BAQCuAgAh_gEBAK4CACH_AQEArgIAIYACAQCuAgAhgQIBANACACGCAkAA0QIAIYMCAQDQAgAhAwAAAAcAIAIAAAgAMAMAAAkAIAkGAADiAgAgyAEAAOACADDJAQAACwAQygEAAOACADDQAUAArwIAId8BAQCuAgAh9QFAAK8CACH5AQEArgIAIfsBAADhAvsBIgEGAACOBAAgCgYAAOICACDIAQAA4AIAMMkBAAALABDKAQAA4AIAMNABQACvAgAh3wEBAK4CACH1AUAArwIAIfkBAQCuAgAh-wEAAOEC-wEikQIAAN8CACADAAAACwAgAgAADAAwAwAADQAgAQAAAAsAIAgKAADaAgAgCwAA2gIAIMgBAADeAgAwyQEAABAAEMoBAADeAgAw9gEBAK4CACH3AQEArgIAIfgBAgC9AgAhAgoAAI0EACALAACNBAAgCQoAANoCACALAADaAgAgyAEAAN4CADDJAQAAEAAQygEAAN4CADD2AQEArgIAIfcBAQCuAgAh-AECAL0CACGQAgAA3QIAIAMAAAAQACACAAARADADAAASACADAAAAEAAgAgAAEQAwAwAAEgAgBwUAANoCACDIAQAA3AIAMMkBAAAVABDKAQAA3AIAMNABQACvAgAh3wEBAK4CACHhAQEArgIAIQEFAACNBAAgCAUAANoCACDIAQAA3AIAMMkBAAAVABDKAQAA3AIAMNABQACvAgAh3wEBAK4CACHhAQEArgIAIY8CAADbAgAgAwAAABUAIAIAABYAMAMAABcAIAgFAADaAgAgyAEAANkCADDJAQAAGQAQygEAANkCADDfAQEArgIAIeEBAQCuAgAh9AFAAK8CACH1AUAArwIAIQEFAACNBAAgCQUAANoCACDIAQAA2QIAMMkBAAAZABDKAQAA2QIAMN8BAQCuAgAh4QEBAK4CACH0AUAArwIAIfUBQACvAgAhjwIAANgCACADAAAAGQAgAgAAGgAwAwAAGwAgAQAAAAMAIAEAAAAHACABAAAAEAAgAQAAABAAIAEAAAAVACABAAAAGQAgAQAAAAEAIAMAAAADACACAAAFADADAAABACADAAAAAwAgAgAABQAwAwAAAQAgAwAAAAMAIAIAAAUAMAMAAAEAIBYBAACMBAAgBAAAhgQAIAkAAIcEACAMAACIBAAgDQAAiQQAIA4AAIoEACAPAACLBAAg0AFAAAAAAd4BAQAAAAH1AUAAAAAB_AEBAAAAAf8BAQAAAAGAAgEAAAABggJAAAAAAYMCAQAAAAGIAgEAAAABiQIBAAAAAYoCAQAAAAGLAiAAAAABjAIgAAAAAY0CQAAAAAGOAgEAAAABARUAACcAIA_QAUAAAAAB3gEBAAAAAfUBQAAAAAH8AQEAAAAB_wEBAAAAAYACAQAAAAGCAkAAAAABgwIBAAAAAYgCAQAAAAGJAgEAAAABigIBAAAAAYsCIAAAAAGMAiAAAAABjQJAAAAAAY4CAQAAAAEBFQAAKQAwARUAACkAMAEAAAADACAWAQAAugMAIAQAALsDACAJAAC8AwAgDAAAvQMAIA0AAL4DACAOAAC_AwAgDwAAwAMAINABQADxAgAh3gEBAJ4DACH1AUAA8QIAIfwBAQDwAgAh_wEBAPACACGAAgEA8AIAIYICQACfAwAhgwIBAJ4DACGIAgEAngMAIYkCAQCeAwAhigIBAPACACGLAiAAuQMAIYwCIAC5AwAhjQJAAJ8DACGOAgEAngMAIQIAAAABACAVAAAtACAP0AFAAPECACHeAQEAngMAIfUBQADxAgAh_AEBAPACACH_AQEA8AIAIYACAQDwAgAhggJAAJ8DACGDAgEAngMAIYgCAQCeAwAhiQIBAJ4DACGKAgEA8AIAIYsCIAC5AwAhjAIgALkDACGNAkAAnwMAIY4CAQCeAwAhAgAAAAMAIBUAAC8AIAIAAAADACAVAAAvACABAAAAAwAgAwAAAAEAIBwAACcAIB0AAC0AIAEAAAABACABAAAAAwAgCggAALYDACAiAAC4AwAgIwAAtwMAIN4BAACaAwAgggIAAJoDACCDAgAAmgMAIIgCAACaAwAgiQIAAJoDACCNAgAAmgMAII4CAACaAwAgEsgBAADUAgAwyQEAADcAEMoBAADUAgAw0AFAAKcCACHeAQEAxwIAIfUBQACnAgAh_AEBAKYCACH_AQEApgIAIYACAQCmAgAhggJAAMgCACGDAgEAxwIAIYgCAQDHAgAhiQIBAMcCACGKAgEApgIAIYsCIADVAgAhjAIgANUCACGNAkAAyAIAIY4CAQDHAgAhAwAAAAMAIAIAADYAMCEAADcAIAMAAAADACACAAAFADADAAABACAJyAEAANMCADDJAQAAPQAQygEAANMCADDQAUAArwIAId8BAQCuAgAh_AEBAAAAAYUCAQDQAgAhhgJAANECACGHAgEA0AIAIQEAAAA6ACABAAAAOgAgCcgBAADTAgAwyQEAAD0AEMoBAADTAgAw0AFAAK8CACHfAQEArgIAIfwBAQCuAgAhhQIBANACACGGAkAA0QIAIYcCAQDQAgAhA4UCAACaAwAghgIAAJoDACCHAgAAmgMAIAMAAAA9ACACAAA-ADADAAA6ACADAAAAPQAgAgAAPgAwAwAAOgAgAwAAAD0AIAIAAD4AMAMAADoAIAbQAUAAAAAB3wEBAAAAAfwBAQAAAAGFAgEAAAABhgJAAAAAAYcCAQAAAAEBFQAAQgAgBtABQAAAAAHfAQEAAAAB_AEBAAAAAYUCAQAAAAGGAkAAAAABhwIBAAAAAQEVAABEADABFQAARAAwBtABQADxAgAh3wEBAPACACH8AQEA8AIAIYUCAQCeAwAhhgJAAJ8DACGHAgEAngMAIQIAAAA6ACAVAABHACAG0AFAAPECACHfAQEA8AIAIfwBAQDwAgAhhQIBAJ4DACGGAkAAnwMAIYcCAQCeAwAhAgAAAD0AIBUAAEkAIAIAAAA9ACAVAABJACADAAAAOgAgHAAAQgAgHQAARwAgAQAAADoAIAEAAAA9ACAGCAAAswMAICIAALUDACAjAAC0AwAghQIAAJoDACCGAgAAmgMAIIcCAACaAwAgCcgBAADSAgAwyQEAAFAAEMoBAADSAgAw0AFAAKcCACHfAQEApgIAIfwBAQCmAgAhhQIBAMcCACGGAkAAyAIAIYcCAQDHAgAhAwAAAD0AIAIAAE8AMCEAAFAAIAMAAAA9ACACAAA-ADADAAA6ACAJyAEAAM8CADDJAQAAVgAQygEAAM8CADDQAUAArwIAIfwBAQAAAAGEAgEArgIAIYUCAQDQAgAhhgJAANECACGHAgEA0AIAIQEAAABTACABAAAAUwAgCcgBAADPAgAwyQEAAFYAEMoBAADPAgAw0AFAAK8CACH8AQEArgIAIYQCAQCuAgAhhQIBANACACGGAkAA0QIAIYcCAQDQAgAhA4UCAACaAwAghgIAAJoDACCHAgAAmgMAIAMAAABWACACAABXADADAABTACADAAAAVgAgAgAAVwAwAwAAUwAgAwAAAFYAIAIAAFcAMAMAAFMAIAbQAUAAAAAB_AEBAAAAAYQCAQAAAAGFAgEAAAABhgJAAAAAAYcCAQAAAAEBFQAAWwAgBtABQAAAAAH8AQEAAAABhAIBAAAAAYUCAQAAAAGGAkAAAAABhwIBAAAAAQEVAABdADABFQAAXQAwBtABQADxAgAh_AEBAPACACGEAgEA8AIAIYUCAQCeAwAhhgJAAJ8DACGHAgEAngMAIQIAAABTACAVAABgACAG0AFAAPECACH8AQEA8AIAIYQCAQDwAgAhhQIBAJ4DACGGAkAAnwMAIYcCAQCeAwAhAgAAAFYAIBUAAGIAIAIAAABWACAVAABiACADAAAAUwAgHAAAWwAgHQAAYAAgAQAAAFMAIAEAAABWACAGCAAAsAMAICIAALIDACAjAACxAwAghQIAAJoDACCGAgAAmgMAIIcCAACaAwAgCcgBAADOAgAwyQEAAGkAEMoBAADOAgAw0AFAAKcCACH8AQEApgIAIYQCAQCmAgAhhQIBAMcCACGGAkAAyAIAIYcCAQDHAgAhAwAAAFYAIAIAAGgAMCEAAGkAIAMAAABWACACAABXADADAABTACABAAAACQAgAQAAAAkAIAMAAAAHACACAAAIADADAAAJACADAAAABwAgAgAACAAwAwAACQAgAwAAAAcAIAIAAAgAMAMAAAkAIA0FAACuAwAgBwAArwMAINABQAAAAAHhAQEAAAAB9QFAAAAAAfwBAQAAAAH9AQEAAAAB_gEBAAAAAf8BAQAAAAGAAgEAAAABgQIBAAAAAYICQAAAAAGDAgEAAAABARUAAHEAIAvQAUAAAAAB4QEBAAAAAfUBQAAAAAH8AQEAAAAB_QEBAAAAAf4BAQAAAAH_AQEAAAABgAIBAAAAAYECAQAAAAGCAkAAAAABgwIBAAAAAQEVAABzADABFQAAcwAwDQUAAKADACAHAAChAwAg0AFAAPECACHhAQEA8AIAIfUBQADxAgAh_AEBAPACACH9AQEA8AIAIf4BAQDwAgAh_wEBAPACACGAAgEA8AIAIYECAQCeAwAhggJAAJ8DACGDAgEAngMAIQIAAAAJACAVAAB2ACAL0AFAAPECACHhAQEA8AIAIfUBQADxAgAh_AEBAPACACH9AQEA8AIAIf4BAQDwAgAh_wEBAPACACGAAgEA8AIAIYECAQCeAwAhggJAAJ8DACGDAgEAngMAIQIAAAAHACAVAAB4ACACAAAABwAgFQAAeAAgAwAAAAkAIBwAAHEAIB0AAHYAIAEAAAAJACABAAAABwAgBggAAJsDACAiAACdAwAgIwAAnAMAIIECAACaAwAgggIAAJoDACCDAgAAmgMAIA7IAQAAxgIAMMkBAAB_ABDKAQAAxgIAMNABQACnAgAh4QEBAKYCACH1AUAApwIAIfwBAQCmAgAh_QEBAKYCACH-AQEApgIAIf8BAQCmAgAhgAIBAKYCACGBAgEAxwIAIYICQADIAgAhgwIBAMcCACEDAAAABwAgAgAAfgAwIQAAfwAgAwAAAAcAIAIAAAgAMAMAAAkAIAEAAAANACABAAAADQAgAwAAAAsAIAIAAAwAMAMAAA0AIAMAAAALACACAAAMADADAAANACADAAAACwAgAgAADAAwAwAADQAgBgYAAJkDACDQAUAAAAAB3wEBAAAAAfUBQAAAAAH5AQEAAAAB-wEAAAD7AQIBFQAAhwEAIAXQAUAAAAAB3wEBAAAAAfUBQAAAAAH5AQEAAAAB-wEAAAD7AQIBFQAAiQEAMAEVAACJAQAwBgYAAJgDACDQAUAA8QIAId8BAQDwAgAh9QFAAPECACH5AQEA8AIAIfsBAACXA_sBIgIAAAANACAVAACMAQAgBdABQADxAgAh3wEBAPACACH1AUAA8QIAIfkBAQDwAgAh-wEAAJcD-wEiAgAAAAsAIBUAAI4BACACAAAACwAgFQAAjgEAIAMAAAANACAcAACHAQAgHQAAjAEAIAEAAAANACABAAAACwAgAwgAAJQDACAiAACWAwAgIwAAlQMAIAjIAQAAwgIAMMkBAACVAQAQygEAAMICADDQAUAApwIAId8BAQCmAgAh9QFAAKcCACH5AQEApgIAIfsBAADDAvsBIgMAAAALACACAACUAQAwIQAAlQEAIAMAAAALACACAAAMADADAAANACABAAAAEgAgAQAAABIAIAMAAAAQACACAAARADADAAASACADAAAAEAAgAgAAEQAwAwAAEgAgAwAAABAAIAIAABEAMAMAABIAIAUKAACSAwAgCwAAkwMAIPYBAQAAAAH3AQEAAAAB-AECAAAAAQEVAACdAQAgA_YBAQAAAAH3AQEAAAAB-AECAAAAAQEVAACfAQAwARUAAJ8BADAFCgAAkAMAIAsAAJEDACD2AQEA8AIAIfcBAQDwAgAh-AECAPoCACECAAAAEgAgFQAAogEAIAP2AQEA8AIAIfcBAQDwAgAh-AECAPoCACECAAAAEAAgFQAApAEAIAIAAAAQACAVAACkAQAgAwAAABIAIBwAAJ0BACAdAACiAQAgAQAAABIAIAEAAAAQACAFCAAAiwMAICIAAI4DACAjAACNAwAgdAAAjAMAIHUAAI8DACAGyAEAAMECADDJAQAAqwEAEMoBAADBAgAw9gEBAKYCACH3AQEApgIAIfgBAgC2AgAhAwAAABAAIAIAAKoBADAhAACrAQAgAwAAABAAIAIAABEAMAMAABIAIAEAAAAXACABAAAAFwAgAwAAABUAIAIAABYAMAMAABcAIAMAAAAVACACAAAWADADAAAXACADAAAAFQAgAgAAFgAwAwAAFwAgBAUAAIoDACDQAUAAAAAB3wEBAAAAAeEBAQAAAAEBFQAAswEAIAPQAUAAAAAB3wEBAAAAAeEBAQAAAAEBFQAAtQEAMAEVAAC1AQAwBAUAAIkDACDQAUAA8QIAId8BAQDwAgAh4QEBAPACACECAAAAFwAgFQAAuAEAIAPQAUAA8QIAId8BAQDwAgAh4QEBAPACACECAAAAFQAgFQAAugEAIAIAAAAVACAVAAC6AQAgAwAAABcAIBwAALMBACAdAAC4AQAgAQAAABcAIAEAAAAVACADCAAAhgMAICIAAIgDACAjAACHAwAgBsgBAADAAgAwyQEAAMEBABDKAQAAwAIAMNABQACnAgAh3wEBAKYCACHhAQEApgIAIQMAAAAVACACAADAAQAwIQAAwQEAIAMAAAAVACACAAAWADADAAAXACABAAAAGwAgAQAAABsAIAMAAAAZACACAAAaADADAAAbACADAAAAGQAgAgAAGgAwAwAAGwAgAwAAABkAIAIAABoAMAMAABsAIAUFAACFAwAg3wEBAAAAAeEBAQAAAAH0AUAAAAAB9QFAAAAAAQEVAADJAQAgBN8BAQAAAAHhAQEAAAAB9AFAAAAAAfUBQAAAAAEBFQAAywEAMAEVAADLAQAwBQUAAIQDACDfAQEA8AIAIeEBAQDwAgAh9AFAAPECACH1AUAA8QIAIQIAAAAbACAVAADOAQAgBN8BAQDwAgAh4QEBAPACACH0AUAA8QIAIfUBQADxAgAhAgAAABkAIBUAANABACACAAAAGQAgFQAA0AEAIAMAAAAbACAcAADJAQAgHQAAzgEAIAEAAAAbACABAAAAGQAgAwgAAIEDACAiAACDAwAgIwAAggMAIAfIAQAAvwIAMMkBAADXAQAQygEAAL8CADDfAQEApgIAIeEBAQCmAgAh9AFAAKcCACH1AUAApwIAIQMAAAAZACACAADWAQAwIQAA1wEAIAMAAAAZACACAAAaADADAAAbACANyAEAALwCADDJAQAA3QEAEMoBAAC8AgAw4QEBAAAAAeIBAQCuAgAh4wEBAK4CACHkAQIAvQIAIeUBAAC3AgAg5gEAALcCACDnAQAAtwIAIOgBAgAAAAHpAQEArgIAIeoBAAC-AgAgAQAAANoBACABAAAA2gEAIA3IAQAAvAIAMMkBAADdAQAQygEAALwCADDhAQEArgIAIeIBAQCuAgAh4wEBAK4CACHkAQIAvQIAIeUBAAC3AgAg5gEAALcCACDnAQAAtwIAIOgBAgC9AgAh6QEBAK4CACHqAQAAvgIAIAADAAAA3QEAIAIAAN4BADADAADaAQAgAwAAAN0BACACAADeAQAwAwAA2gEAIAMAAADdAQAgAgAA3gEAMAMAANoBACAK4QEBAAAAAeIBAQAAAAHjAQEAAAAB5AECAAAAAeUBAAD-AgAg5gEAAP8CACDnAQAAgAMAIOgBAgAAAAHpAQEAAAAB6gGAAAAAAQEVAADiAQAgCuEBAQAAAAHiAQEAAAAB4wEBAAAAAeQBAgAAAAHlAQAA_gIAIOYBAAD_AgAg5wEAAIADACDoAQIAAAAB6QEBAAAAAeoBgAAAAAEBFQAA5AEAMAEVAADkAQAwCuEBAQDwAgAh4gEBAPACACHjAQEA8AIAIeQBAgD6AgAh5QEAAPsCACDmAQAA_AIAIOcBAAD9AgAg6AECAPoCACHpAQEA8AIAIeoBgAAAAAECAAAA2gEAIBUAAOcBACAK4QEBAPACACHiAQEA8AIAIeMBAQDwAgAh5AECAPoCACHlAQAA-wIAIOYBAAD8AgAg5wEAAP0CACDoAQIA-gIAIekBAQDwAgAh6gGAAAAAAQIAAADdAQAgFQAA6QEAIAIAAADdAQAgFQAA6QEAIAMAAADaAQAgHAAA4gEAIB0AAOcBACABAAAA2gEAIAEAAADdAQAgBQgAAPUCACAiAAD4AgAgIwAA9wIAIHQAAPYCACB1AAD5AgAgDcgBAAC1AgAwyQEAAPABABDKAQAAtQIAMOEBAQCmAgAh4gEBAKYCACHjAQEApgIAIeQBAgC2AgAh5QEAALcCACDmAQAAtwIAIOcBAAC3AgAg6AECALYCACHpAQEApgIAIeoBAAC4AgAgAwAAAN0BACACAADvAQAwIQAA8AEAIAMAAADdAQAgAgAA3gEAMAMAANoBACAGyAEAALMCADDJAQAA9gEAEMoBAACzAgAw3gEBAK4CACHfAQEArgIAIeABAAC0AgAgAQAAAPMBACABAAAA8wEAIAXIAQAAswIAMMkBAAD2AQAQygEAALMCADDeAQEArgIAId8BAQCuAgAhAAMAAAD2AQAgAgAA9wEAMAMAAPMBACADAAAA9gEAIAIAAPcBADADAADzAQAgAwAAAPYBACACAAD3AQAwAwAA8wEAIALeAQEAAAAB3wEBAAAAAQEVAAD7AQAgAt4BAQAAAAHfAQEAAAABARUAAP0BADABFQAA_QEAMALeAQEA8AIAId8BAQDwAgAhAgAAAPMBACAVAACAAgAgAt4BAQDwAgAh3wEBAPACACECAAAA9gEAIBUAAIICACACAAAA9gEAIBUAAIICACADAAAA8wEAIBwAAPsBACAdAACAAgAgAQAAAPMBACABAAAA9gEAIAMIAADyAgAgIgAA9AIAICMAAPMCACAFyAEAALICADDJAQAAiQIAEMoBAACyAgAw3gEBAKYCACHfAQEApgIAIQMAAAD2AQAgAgAAiAIAMCEAAIkCACADAAAA9gEAIAIAAPcBADADAADzAQAgC8gBAACtAgAwyQEAAI8CABDKAQAArQIAMMsBAQCuAgAhzAEBAK4CACHNAQEArgIAIc4BAQCuAgAhzwEBAK4CACHQAUAArwIAIdwBAACwAgAg3QEAALECACABAAAAjAIAIAEAAACMAgAgCcgBAACtAgAwyQEAAI8CABDKAQAArQIAMMsBAQCuAgAhzAEBAK4CACHNAQEArgIAIc4BAQCuAgAhzwEBAK4CACHQAUAArwIAIQADAAAAjwIAIAIAAJACADADAACMAgAgAwAAAI8CACACAACQAgAwAwAAjAIAIAMAAACPAgAgAgAAkAIAMAMAAIwCACAGywEBAAAAAcwBAQAAAAHNAQEAAAABzgEBAAAAAc8BAQAAAAHQAUAAAAABARUAAJQCACAGywEBAAAAAcwBAQAAAAHNAQEAAAABzgEBAAAAAc8BAQAAAAHQAUAAAAABARUAAJYCADABFQAAlgIAMAbLAQEA8AIAIcwBAQDwAgAhzQEBAPACACHOAQEA8AIAIc8BAQDwAgAh0AFAAPECACECAAAAjAIAIBUAAJkCACAGywEBAPACACHMAQEA8AIAIc0BAQDwAgAhzgEBAPACACHPAQEA8AIAIdABQADxAgAhAgAAAI8CACAVAACbAgAgAgAAAI8CACAVAACbAgAgAwAAAIwCACAcAACUAgAgHQAAmQIAIAEAAACMAgAgAQAAAI8CACADCAAA7QIAICIAAO8CACAjAADuAgAgCcgBAAClAgAwyQEAAKICABDKAQAApQIAMMsBAQCmAgAhzAEBAKYCACHNAQEApgIAIc4BAQCmAgAhzwEBAKYCACHQAUAApwIAIQMAAACPAgAgAgAAoQIAMCEAAKICACADAAAAjwIAIAIAAJACADADAACMAgAgCcgBAAClAgAwyQEAAKICABDKAQAApQIAMMsBAQCmAgAhzAEBAKYCACHNAQEApgIAIc4BAQCmAgAhzwEBAKYCACHQAUAApwIAIQ4IAACpAgAgIgAArAIAICMAAKwCACDRAQEAAAAB0gEBAAAABNMBAQAAAATUAQEAAAAB1QEBAAAAAdYBAQAAAAHXAQEAAAAB2AEBAKsCACHZAQEAAAAB2gEBAAAAAdsBAQAAAAELCAAAqQIAICIAAKoCACAjAACqAgAg0QFAAAAAAdIBQAAAAATTAUAAAAAE1AFAAAAAAdUBQAAAAAHWAUAAAAAB1wFAAAAAAdgBQACoAgAhCwgAAKkCACAiAACqAgAgIwAAqgIAINEBQAAAAAHSAUAAAAAE0wFAAAAABNQBQAAAAAHVAUAAAAAB1gFAAAAAAdcBQAAAAAHYAUAAqAIAIQjRAQIAAAAB0gECAAAABNMBAgAAAATUAQIAAAAB1QECAAAAAdYBAgAAAAHXAQIAAAAB2AECAKkCACEI0QFAAAAAAdIBQAAAAATTAUAAAAAE1AFAAAAAAdUBQAAAAAHWAUAAAAAB1wFAAAAAAdgBQACqAgAhDggAAKkCACAiAACsAgAgIwAArAIAINEBAQAAAAHSAQEAAAAE0wEBAAAABNQBAQAAAAHVAQEAAAAB1gEBAAAAAdcBAQAAAAHYAQEAqwIAIdkBAQAAAAHaAQEAAAAB2wEBAAAAAQvRAQEAAAAB0gEBAAAABNMBAQAAAATUAQEAAAAB1QEBAAAAAdYBAQAAAAHXAQEAAAAB2AEBAKwCACHZAQEAAAAB2gEBAAAAAdsBAQAAAAEJyAEAAK0CADDJAQAAjwIAEMoBAACtAgAwywEBAK4CACHMAQEArgIAIc0BAQCuAgAhzgEBAK4CACHPAQEArgIAIdABQACvAgAhC9EBAQAAAAHSAQEAAAAE0wEBAAAABNQBAQAAAAHVAQEAAAAB1gEBAAAAAdcBAQAAAAHYAQEArAIAIdkBAQAAAAHaAQEAAAAB2wEBAAAAAQjRAUAAAAAB0gFAAAAABNMBQAAAAATUAUAAAAAB1QFAAAAAAdYBQAAAAAHXAUAAAAAB2AFAAKoCACECywEBAAAAAc0BAQAAAAECywEBAAAAAcwBAQAAAAEFyAEAALICADDJAQAAiQIAEMoBAACyAgAw3gEBAKYCACHfAQEApgIAIQXIAQAAswIAMMkBAAD2AQAQygEAALMCADDeAQEArgIAId8BAQCuAgAhAt4BAQAAAAHfAQEAAAABDcgBAAC1AgAwyQEAAPABABDKAQAAtQIAMOEBAQCmAgAh4gEBAKYCACHjAQEApgIAIeQBAgC2AgAh5QEAALcCACDmAQAAtwIAIOcBAAC3AgAg6AECALYCACHpAQEApgIAIeoBAAC4AgAgDQgAAKkCACAiAACpAgAgIwAAqQIAIHQAALsCACB1AACpAgAg0QECAAAAAdIBAgAAAATTAQIAAAAE1AECAAAAAdUBAgAAAAHWAQIAAAAB1wECAAAAAdgBAgC6AgAhBNEBAQAAAAXxAQEAAAAB8gEBAAAABPMBAQAAAAQPCAAAqQIAICIAALkCACAjAAC5AgAg0QGAAAAAAdQBgAAAAAHVAYAAAAAB1gGAAAAAAdcBgAAAAAHYAYAAAAAB6wEBAAAAAewBAQAAAAHtAQEAAAAB7gGAAAAAAe8BgAAAAAHwAYAAAAABDNEBgAAAAAHUAYAAAAAB1QGAAAAAAdYBgAAAAAHXAYAAAAAB2AGAAAAAAesBAQAAAAHsAQEAAAAB7QEBAAAAAe4BgAAAAAHvAYAAAAAB8AGAAAAAAQ0IAACpAgAgIgAAqQIAICMAAKkCACB0AAC7AgAgdQAAqQIAINEBAgAAAAHSAQIAAAAE0wECAAAABNQBAgAAAAHVAQIAAAAB1gECAAAAAdcBAgAAAAHYAQIAugIAIQjRAQgAAAAB0gEIAAAABNMBCAAAAATUAQgAAAAB1QEIAAAAAdYBCAAAAAHXAQgAAAAB2AEIALsCACENyAEAALwCADDJAQAA3QEAEMoBAAC8AgAw4QEBAK4CACHiAQEArgIAIeMBAQCuAgAh5AECAL0CACHlAQAAtwIAIOYBAAC3AgAg5wEAALcCACDoAQIAvQIAIekBAQCuAgAh6gEAAL4CACAI0QECAAAAAdIBAgAAAATTAQIAAAAE1AECAAAAAdUBAgAAAAHWAQIAAAAB1wECAAAAAdgBAgCpAgAhDNEBgAAAAAHUAYAAAAAB1QGAAAAAAdYBgAAAAAHXAYAAAAAB2AGAAAAAAesBAQAAAAHsAQEAAAAB7QEBAAAAAe4BgAAAAAHvAYAAAAAB8AGAAAAAAQfIAQAAvwIAMMkBAADXAQAQygEAAL8CADDfAQEApgIAIeEBAQCmAgAh9AFAAKcCACH1AUAApwIAIQbIAQAAwAIAMMkBAADBAQAQygEAAMACADDQAUAApwIAId8BAQCmAgAh4QEBAKYCACEGyAEAAMECADDJAQAAqwEAEMoBAADBAgAw9gEBAKYCACH3AQEApgIAIfgBAgC2AgAhCMgBAADCAgAwyQEAAJUBABDKAQAAwgIAMNABQACnAgAh3wEBAKYCACH1AUAApwIAIfkBAQCmAgAh-wEAAMMC-wEiBwgAAKkCACAiAADFAgAgIwAAxQIAINEBAAAA-wEC0gEAAAD7AQjTAQAAAPsBCNgBAADEAvsBIgcIAACpAgAgIgAAxQIAICMAAMUCACDRAQAAAPsBAtIBAAAA-wEI0wEAAAD7AQjYAQAAxAL7ASIE0QEAAAD7AQLSAQAAAPsBCNMBAAAA-wEI2AEAAMUC-wEiDsgBAADGAgAwyQEAAH8AEMoBAADGAgAw0AFAAKcCACHhAQEApgIAIfUBQACnAgAh_AEBAKYCACH9AQEApgIAIf4BAQCmAgAh_wEBAKYCACGAAgEApgIAIYECAQDHAgAhggJAAMgCACGDAgEAxwIAIQ4IAADKAgAgIgAAzQIAICMAAM0CACDRAQEAAAAB0gEBAAAABdMBAQAAAAXUAQEAAAAB1QEBAAAAAdYBAQAAAAHXAQEAAAAB2AEBAMwCACHZAQEAAAAB2gEBAAAAAdsBAQAAAAELCAAAygIAICIAAMsCACAjAADLAgAg0QFAAAAAAdIBQAAAAAXTAUAAAAAF1AFAAAAAAdUBQAAAAAHWAUAAAAAB1wFAAAAAAdgBQADJAgAhCwgAAMoCACAiAADLAgAgIwAAywIAINEBQAAAAAHSAUAAAAAF0wFAAAAABdQBQAAAAAHVAUAAAAAB1gFAAAAAAdcBQAAAAAHYAUAAyQIAIQjRAQIAAAAB0gECAAAABdMBAgAAAAXUAQIAAAAB1QECAAAAAdYBAgAAAAHXAQIAAAAB2AECAMoCACEI0QFAAAAAAdIBQAAAAAXTAUAAAAAF1AFAAAAAAdUBQAAAAAHWAUAAAAAB1wFAAAAAAdgBQADLAgAhDggAAMoCACAiAADNAgAgIwAAzQIAINEBAQAAAAHSAQEAAAAF0wEBAAAABdQBAQAAAAHVAQEAAAAB1gEBAAAAAdcBAQAAAAHYAQEAzAIAIdkBAQAAAAHaAQEAAAAB2wEBAAAAAQvRAQEAAAAB0gEBAAAABdMBAQAAAAXUAQEAAAAB1QEBAAAAAdYBAQAAAAHXAQEAAAAB2AEBAM0CACHZAQEAAAAB2gEBAAAAAdsBAQAAAAEJyAEAAM4CADDJAQAAaQAQygEAAM4CADDQAUAApwIAIfwBAQCmAgAhhAIBAKYCACGFAgEAxwIAIYYCQADIAgAhhwIBAMcCACEJyAEAAM8CADDJAQAAVgAQygEAAM8CADDQAUAArwIAIfwBAQCuAgAhhAIBAK4CACGFAgEA0AIAIYYCQADRAgAhhwIBANACACEL0QEBAAAAAdIBAQAAAAXTAQEAAAAF1AEBAAAAAdUBAQAAAAHWAQEAAAAB1wEBAAAAAdgBAQDNAgAh2QEBAAAAAdoBAQAAAAHbAQEAAAABCNEBQAAAAAHSAUAAAAAF0wFAAAAABdQBQAAAAAHVAUAAAAAB1gFAAAAAAdcBQAAAAAHYAUAAywIAIQnIAQAA0gIAMMkBAABQABDKAQAA0gIAMNABQACnAgAh3wEBAKYCACH8AQEApgIAIYUCAQDHAgAhhgJAAMgCACGHAgEAxwIAIQnIAQAA0wIAMMkBAAA9ABDKAQAA0wIAMNABQACvAgAh3wEBAK4CACH8AQEArgIAIYUCAQDQAgAhhgJAANECACGHAgEA0AIAIRLIAQAA1AIAMMkBAAA3ABDKAQAA1AIAMNABQACnAgAh3gEBAMcCACH1AUAApwIAIfwBAQCmAgAh_wEBAKYCACGAAgEApgIAIYICQADIAgAhgwIBAMcCACGIAgEAxwIAIYkCAQDHAgAhigIBAKYCACGLAiAA1QIAIYwCIADVAgAhjQJAAMgCACGOAgEAxwIAIQUIAACpAgAgIgAA1wIAICMAANcCACDRASAAAAAB2AEgANYCACEFCAAAqQIAICIAANcCACAjAADXAgAg0QEgAAAAAdgBIADWAgAhAtEBIAAAAAHYASAA1wIAIQLfAQEAAAAB4QEBAAAAAQgFAADaAgAgyAEAANkCADDJAQAAGQAQygEAANkCADDfAQEArgIAIeEBAQCuAgAh9AFAAK8CACH1AUAArwIAIRsBAADnAgAgBAAA6AIAIAkAAOkCACAMAADqAgAgDQAA6gIAIA4AAOsCACAPAADsAgAgyAEAAOUCADDJAQAAAwAQygEAAOUCADDQAUAArwIAId4BAQDQAgAh9QFAAK8CACH8AQEArgIAIf8BAQCuAgAhgAIBAK4CACGCAkAA0QIAIYMCAQDQAgAhiAIBANACACGJAgEA0AIAIYoCAQCuAgAhiwIgAOYCACGMAiAA5gIAIY0CQADRAgAhjgIBANACACGVAgAAAwAglgIAAAMAIALfAQEAAAAB4QEBAAAAAQcFAADaAgAgyAEAANwCADDJAQAAFQAQygEAANwCADDQAUAArwIAId8BAQCuAgAh4QEBAK4CACEC9gEBAAAAAfcBAQAAAAEICgAA2gIAIAsAANoCACDIAQAA3gIAMMkBAAAQABDKAQAA3gIAMPYBAQCuAgAh9wEBAK4CACH4AQIAvQIAIQLfAQEAAAAB-QEBAAAAAQkGAADiAgAgyAEAAOACADDJAQAACwAQygEAAOACADDQAUAArwIAId8BAQCuAgAh9QFAAK8CACH5AQEArgIAIfsBAADhAvsBIgTRAQAAAPsBAtIBAAAA-wEI0wEAAAD7AQjYAQAAxQL7ASISBQAA2gIAIAcAAOQCACDIAQAA4wIAMMkBAAAHABDKAQAA4wIAMNABQACvAgAh4QEBAK4CACH1AUAArwIAIfwBAQCuAgAh_QEBAK4CACH-AQEArgIAIf8BAQCuAgAhgAIBAK4CACGBAgEA0AIAIYICQADRAgAhgwIBANACACGVAgAABwAglgIAAAcAIBAFAADaAgAgBwAA5AIAIMgBAADjAgAwyQEAAAcAEMoBAADjAgAw0AFAAK8CACHhAQEArgIAIfUBQACvAgAh_AEBAK4CACH9AQEArgIAIf4BAQCuAgAh_wEBAK4CACGAAgEArgIAIYECAQDQAgAhggJAANECACGDAgEA0AIAIQOSAgAACwAgkwIAAAsAIJQCAAALACAZAQAA5wIAIAQAAOgCACAJAADpAgAgDAAA6gIAIA0AAOoCACAOAADrAgAgDwAA7AIAIMgBAADlAgAwyQEAAAMAEMoBAADlAgAw0AFAAK8CACHeAQEA0AIAIfUBQACvAgAh_AEBAK4CACH_AQEArgIAIYACAQCuAgAhggJAANECACGDAgEA0AIAIYgCAQDQAgAhiQIBANACACGKAgEArgIAIYsCIADmAgAhjAIgAOYCACGNAkAA0QIAIY4CAQDQAgAhAtEBIAAAAAHYASAA1wIAIRsBAADnAgAgBAAA6AIAIAkAAOkCACAMAADqAgAgDQAA6gIAIA4AAOsCACAPAADsAgAgyAEAAOUCADDJAQAAAwAQygEAAOUCADDQAUAArwIAId4BAQDQAgAh9QFAAK8CACH8AQEArgIAIf8BAQCuAgAhgAIBAK4CACGCAkAA0QIAIYMCAQDQAgAhiAIBANACACGJAgEA0AIAIYoCAQCuAgAhiwIgAOYCACGMAiAA5gIAIY0CQADRAgAhjgIBANACACGVAgAAAwAglgIAAAMAIAOSAgAAAwAgkwIAAAMAIJQCAAADACADkgIAAAcAIJMCAAAHACCUAgAABwAgA5ICAAAQACCTAgAAEAAglAIAABAAIAOSAgAAFQAgkwIAABUAIJQCAAAVACADkgIAABkAIJMCAAAZACCUAgAAGQAgAAAAAZoCAQAAAAEBmgJAAAAAAQAAAAAAAAAABZoCAgAAAAGhAgIAAAABogICAAAAAaMCAgAAAAGkAgIAAAABApoCAQAAAASgAgEAAAAFApoCAQAAAASgAgEAAAAFApoCAQAAAASgAgEAAAAFAZoCAQAAAAQBmgIBAAAABAGaAgEAAAAEAAAABRwAALoEACAdAAC9BAAglwIAALsEACCYAgAAvAQAIJ0CAAABACADHAAAugQAIJcCAAC7BAAgnQIAAAEAIAAAAAUcAAC1BAAgHQAAuAQAIJcCAAC2BAAgmAIAALcEACCdAgAAAQAgAxwAALUEACCXAgAAtgQAIJ0CAAABACAAAAAAAAUcAACtBAAgHQAAswQAIJcCAACuBAAgmAIAALIEACCdAgAAAQAgBRwAAKsEACAdAACwBAAglwIAAKwEACCYAgAArwQAIJ0CAAABACADHAAArQQAIJcCAACuBAAgnQIAAAEAIAMcAACrBAAglwIAAKwEACCdAgAAAQAgAAAAAZoCAAAA-wECBRwAAKYEACAdAACpBAAglwIAAKcEACCYAgAAqAQAIJ0CAAAJACADHAAApgQAIJcCAACnBAAgnQIAAAkAIAAAAAABmgIBAAAAAQGaAkAAAAABBRwAAKAEACAdAACkBAAglwIAAKEEACCYAgAAowQAIJ0CAAABACALHAAAogMAMB0AAKcDADCXAgAAowMAMJgCAACkAwAwmQIAAKUDACCaAgAApgMAMJsCAACmAwAwnAIAAKYDADCdAgAApgMAMJ4CAACoAwAwnwIAAKkDADAE0AFAAAAAAd8BAQAAAAH1AUAAAAAB-wEAAAD7AQICAAAADQAgHAAArQMAIAMAAAANACAcAACtAwAgHQAArAMAIAEVAACiBAAwCgYAAOICACDIAQAA4AIAMMkBAAALABDKAQAA4AIAMNABQACvAgAh3wEBAK4CACH1AUAArwIAIfkBAQCuAgAh-wEAAOEC-wEikQIAAN8CACACAAAADQAgFQAArAMAIAIAAACqAwAgFQAAqwMAIAjIAQAAqQMAMMkBAACqAwAQygEAAKkDADDQAUAArwIAId8BAQCuAgAh9QFAAK8CACH5AQEArgIAIfsBAADhAvsBIgjIAQAAqQMAMMkBAACqAwAQygEAAKkDADDQAUAArwIAId8BAQCuAgAh9QFAAK8CACH5AQEArgIAIfsBAADhAvsBIgTQAUAA8QIAId8BAQDwAgAh9QFAAPECACH7AQAAlwP7ASIE0AFAAPECACHfAQEA8AIAIfUBQADxAgAh-wEAAJcD-wEiBNABQAAAAAHfAQEAAAAB9QFAAAAAAfsBAAAA-wECAxwAAKAEACCXAgAAoQQAIJ0CAAABACAEHAAAogMAMJcCAACjAwAwmQIAAKUDACCdAgAApgMAMAAAAAAAAAAAAAGaAiAAAAABBxwAAJUEACAdAACeBAAglwIAAJYEACCYAgAAnQQAIJsCAAADACCcAgAAAwAgnQIAAAEAIAscAAD6AwAwHQAA_wMAMJcCAAD7AwAwmAIAAPwDADCZAgAA_QMAIJoCAAD-AwAwmwIAAP4DADCcAgAA_gMAMJ0CAAD-AwAwngIAAIAEADCfAgAAgQQAMAscAADuAwAwHQAA8wMAMJcCAADvAwAwmAIAAPADADCZAgAA8QMAIJoCAADyAwAwmwIAAPIDADCcAgAA8gMAMJ0CAADyAwAwngIAAPQDADCfAgAA9QMAMAscAADlAwAwHQAA6QMAMJcCAADmAwAwmAIAAOcDADCZAgAA6AMAIJoCAADdAwAwmwIAAN0DADCcAgAA3QMAMJ0CAADdAwAwngIAAOoDADCfAgAA4AMAMAscAADZAwAwHQAA3gMAMJcCAADaAwAwmAIAANsDADCZAgAA3AMAIJoCAADdAwAwmwIAAN0DADCcAgAA3QMAMJ0CAADdAwAwngIAAN8DADCfAgAA4AMAMAscAADNAwAwHQAA0gMAMJcCAADOAwAwmAIAAM8DADCZAgAA0AMAIJoCAADRAwAwmwIAANEDADCcAgAA0QMAMJ0CAADRAwAwngIAANMDADCfAgAA1AMAMAscAADBAwAwHQAAxgMAMJcCAADCAwAwmAIAAMMDADCZAgAAxAMAIJoCAADFAwAwmwIAAMUDADCcAgAAxQMAMJ0CAADFAwAwngIAAMcDADCfAgAAyAMAMAPfAQEAAAAB9AFAAAAAAfUBQAAAAAECAAAAGwAgHAAAzAMAIAMAAAAbACAcAADMAwAgHQAAywMAIAEVAACcBAAwCQUAANoCACDIAQAA2QIAMMkBAAAZABDKAQAA2QIAMN8BAQCuAgAh4QEBAK4CACH0AUAArwIAIfUBQACvAgAhjwIAANgCACACAAAAGwAgFQAAywMAIAIAAADJAwAgFQAAygMAIAfIAQAAyAMAMMkBAADJAwAQygEAAMgDADDfAQEArgIAIeEBAQCuAgAh9AFAAK8CACH1AUAArwIAIQfIAQAAyAMAMMkBAADJAwAQygEAAMgDADDfAQEArgIAIeEBAQCuAgAh9AFAAK8CACH1AUAArwIAIQPfAQEA8AIAIfQBQADxAgAh9QFAAPECACED3wEBAPACACH0AUAA8QIAIfUBQADxAgAhA98BAQAAAAH0AUAAAAAB9QFAAAAAAQLQAUAAAAAB3wEBAAAAAQIAAAAXACAcAADYAwAgAwAAABcAIBwAANgDACAdAADXAwAgARUAAJsEADAIBQAA2gIAIMgBAADcAgAwyQEAABUAEMoBAADcAgAw0AFAAK8CACHfAQEArgIAIeEBAQCuAgAhjwIAANsCACACAAAAFwAgFQAA1wMAIAIAAADVAwAgFQAA1gMAIAbIAQAA1AMAMMkBAADVAwAQygEAANQDADDQAUAArwIAId8BAQCuAgAh4QEBAK4CACEGyAEAANQDADDJAQAA1QMAEMoBAADUAwAw0AFAAK8CACHfAQEArgIAIeEBAQCuAgAhAtABQADxAgAh3wEBAPACACEC0AFAAPECACHfAQEA8AIAIQLQAUAAAAAB3wEBAAAAAQMKAACSAwAg9gEBAAAAAfgBAgAAAAECAAAAEgAgHAAA5AMAIAMAAAASACAcAADkAwAgHQAA4wMAIAEVAACaBAAwCQoAANoCACALAADaAgAgyAEAAN4CADDJAQAAEAAQygEAAN4CADD2AQEArgIAIfcBAQCuAgAh-AECAL0CACGQAgAA3QIAIAIAAAASACAVAADjAwAgAgAAAOEDACAVAADiAwAgBsgBAADgAwAwyQEAAOEDABDKAQAA4AMAMPYBAQCuAgAh9wEBAK4CACH4AQIAvQIAIQbIAQAA4AMAMMkBAADhAwAQygEAAOADADD2AQEArgIAIfcBAQCuAgAh-AECAL0CACEC9gEBAPACACH4AQIA-gIAIQMKAACQAwAg9gEBAPACACH4AQIA-gIAIQMKAACSAwAg9gEBAAAAAfgBAgAAAAEDCwAAkwMAIPcBAQAAAAH4AQIAAAABAgAAABIAIBwAAO0DACADAAAAEgAgHAAA7QMAIB0AAOwDACABFQAAmQQAMAIAAAASACAVAADsAwAgAgAAAOEDACAVAADrAwAgAvcBAQDwAgAh-AECAPoCACEDCwAAkQMAIPcBAQDwAgAh-AECAPoCACEDCwAAkwMAIPcBAQAAAAH4AQIAAAABCwcAAK8DACDQAUAAAAAB9QFAAAAAAfwBAQAAAAH9AQEAAAAB_gEBAAAAAf8BAQAAAAGAAgEAAAABgQIBAAAAAYICQAAAAAGDAgEAAAABAgAAAAkAIBwAAPkDACADAAAACQAgHAAA-QMAIB0AAPgDACABFQAAmAQAMBAFAADaAgAgBwAA5AIAIMgBAADjAgAwyQEAAAcAEMoBAADjAgAw0AFAAK8CACHhAQEArgIAIfUBQACvAgAh_AEBAAAAAf0BAQCuAgAh_gEBAK4CACH_AQEArgIAIYACAQCuAgAhgQIBANACACGCAkAA0QIAIYMCAQDQAgAhAgAAAAkAIBUAAPgDACACAAAA9gMAIBUAAPcDACAOyAEAAPUDADDJAQAA9gMAEMoBAAD1AwAw0AFAAK8CACHhAQEArgIAIfUBQACvAgAh_AEBAK4CACH9AQEArgIAIf4BAQCuAgAh_wEBAK4CACGAAgEArgIAIYECAQDQAgAhggJAANECACGDAgEA0AIAIQ7IAQAA9QMAMMkBAAD2AwAQygEAAPUDADDQAUAArwIAIeEBAQCuAgAh9QFAAK8CACH8AQEArgIAIf0BAQCuAgAh_gEBAK4CACH_AQEArgIAIYACAQCuAgAhgQIBANACACGCAkAA0QIAIYMCAQDQAgAhCtABQADxAgAh9QFAAPECACH8AQEA8AIAIf0BAQDwAgAh_gEBAPACACH_AQEA8AIAIYACAQDwAgAhgQIBAJ4DACGCAkAAnwMAIYMCAQCeAwAhCwcAAKEDACDQAUAA8QIAIfUBQADxAgAh_AEBAPACACH9AQEA8AIAIf4BAQDwAgAh_wEBAPACACGAAgEA8AIAIYECAQCeAwAhggJAAJ8DACGDAgEAngMAIQsHAACvAwAg0AFAAAAAAfUBQAAAAAH8AQEAAAAB_QEBAAAAAf4BAQAAAAH_AQEAAAABgAIBAAAAAYECAQAAAAGCAkAAAAABgwIBAAAAARQEAACGBAAgCQAAhwQAIAwAAIgEACANAACJBAAgDgAAigQAIA8AAIsEACDQAUAAAAAB3gEBAAAAAfUBQAAAAAH8AQEAAAAB_wEBAAAAAYACAQAAAAGCAkAAAAABgwIBAAAAAYkCAQAAAAGKAgEAAAABiwIgAAAAAYwCIAAAAAGNAkAAAAABjgIBAAAAAQIAAAABACAcAACFBAAgAwAAAAEAIBwAAIUEACAdAACEBAAgARUAAJcEADAZAQAA5wIAIAQAAOgCACAJAADpAgAgDAAA6gIAIA0AAOoCACAOAADrAgAgDwAA7AIAIMgBAADlAgAwyQEAAAMAEMoBAADlAgAw0AFAAK8CACHeAQEA0AIAIfUBQACvAgAh_AEBAAAAAf8BAQCuAgAhgAIBAK4CACGCAkAA0QIAIYMCAQDQAgAhiAIBANACACGJAgEA0AIAIYoCAQCuAgAhiwIgAOYCACGMAiAA5gIAIY0CQADRAgAhjgIBANACACECAAAAAQAgFQAAhAQAIAIAAACCBAAgFQAAgwQAIBLIAQAAgQQAMMkBAACCBAAQygEAAIEEADDQAUAArwIAId4BAQDQAgAh9QFAAK8CACH8AQEArgIAIf8BAQCuAgAhgAIBAK4CACGCAkAA0QIAIYMCAQDQAgAhiAIBANACACGJAgEA0AIAIYoCAQCuAgAhiwIgAOYCACGMAiAA5gIAIY0CQADRAgAhjgIBANACACESyAEAAIEEADDJAQAAggQAEMoBAACBBAAw0AFAAK8CACHeAQEA0AIAIfUBQACvAgAh_AEBAK4CACH_AQEArgIAIYACAQCuAgAhggJAANECACGDAgEA0AIAIYgCAQDQAgAhiQIBANACACGKAgEArgIAIYsCIADmAgAhjAIgAOYCACGNAkAA0QIAIY4CAQDQAgAhDtABQADxAgAh3gEBAJ4DACH1AUAA8QIAIfwBAQDwAgAh_wEBAPACACGAAgEA8AIAIYICQACfAwAhgwIBAJ4DACGJAgEAngMAIYoCAQDwAgAhiwIgALkDACGMAiAAuQMAIY0CQACfAwAhjgIBAJ4DACEUBAAAuwMAIAkAALwDACAMAAC9AwAgDQAAvgMAIA4AAL8DACAPAADAAwAg0AFAAPECACHeAQEAngMAIfUBQADxAgAh_AEBAPACACH_AQEA8AIAIYACAQDwAgAhggJAAJ8DACGDAgEAngMAIYkCAQCeAwAhigIBAPACACGLAiAAuQMAIYwCIAC5AwAhjQJAAJ8DACGOAgEAngMAIRQEAACGBAAgCQAAhwQAIAwAAIgEACANAACJBAAgDgAAigQAIA8AAIsEACDQAUAAAAAB3gEBAAAAAfUBQAAAAAH8AQEAAAAB_wEBAAAAAYACAQAAAAGCAkAAAAABgwIBAAAAAYkCAQAAAAGKAgEAAAABiwIgAAAAAYwCIAAAAAGNAkAAAAABjgIBAAAAAQQcAAD6AwAwlwIAAPsDADCZAgAA_QMAIJ0CAAD-AwAwBBwAAO4DADCXAgAA7wMAMJkCAADxAwAgnQIAAPIDADAEHAAA5QMAMJcCAADmAwAwmQIAAOgDACCdAgAA3QMAMAQcAADZAwAwlwIAANoDADCZAgAA3AMAIJ0CAADdAwAwBBwAAM0DADCXAgAAzgMAMJkCAADQAwAgnQIAANEDADAEHAAAwQMAMJcCAADCAwAwmQIAAMQDACCdAgAAxQMAMAMcAACVBAAglwIAAJYEACCdAgAAAQAgDgEAAI0EACAEAACQBAAgCQAAkQQAIAwAAJIEACANAACSBAAgDgAAkwQAIA8AAJQEACDeAQAAmgMAIIICAACaAwAggwIAAJoDACCIAgAAmgMAIIkCAACaAwAgjQIAAJoDACCOAgAAmgMAIAUFAACNBAAgBwAAjwQAIIECAACaAwAgggIAAJoDACCDAgAAmgMAIAAAAAAAABUBAACMBAAgCQAAhwQAIAwAAIgEACANAACJBAAgDgAAigQAIA8AAIsEACDQAUAAAAAB3gEBAAAAAfUBQAAAAAH8AQEAAAAB_wEBAAAAAYACAQAAAAGCAkAAAAABgwIBAAAAAYgCAQAAAAGJAgEAAAABigIBAAAAAYsCIAAAAAGMAiAAAAABjQJAAAAAAY4CAQAAAAECAAAAAQAgHAAAlQQAIA7QAUAAAAAB3gEBAAAAAfUBQAAAAAH8AQEAAAAB_wEBAAAAAYACAQAAAAGCAkAAAAABgwIBAAAAAYkCAQAAAAGKAgEAAAABiwIgAAAAAYwCIAAAAAGNAkAAAAABjgIBAAAAAQrQAUAAAAAB9QFAAAAAAfwBAQAAAAH9AQEAAAAB_gEBAAAAAf8BAQAAAAGAAgEAAAABgQIBAAAAAYICQAAAAAGDAgEAAAABAvcBAQAAAAH4AQIAAAABAvYBAQAAAAH4AQIAAAABAtABQAAAAAHfAQEAAAABA98BAQAAAAH0AUAAAAAB9QFAAAAAAQMAAAADACAcAACVBAAgHQAAnwQAIBcAAAADACABAAC6AwAgCQAAvAMAIAwAAL0DACANAAC-AwAgDgAAvwMAIA8AAMADACAVAACfBAAg0AFAAPECACHeAQEAngMAIfUBQADxAgAh_AEBAPACACH_AQEA8AIAIYACAQDwAgAhggJAAJ8DACGDAgEAngMAIYgCAQCeAwAhiQIBAJ4DACGKAgEA8AIAIYsCIAC5AwAhjAIgALkDACGNAkAAnwMAIY4CAQCeAwAhFQEAALoDACAJAAC8AwAgDAAAvQMAIA0AAL4DACAOAAC_AwAgDwAAwAMAINABQADxAgAh3gEBAJ4DACH1AUAA8QIAIfwBAQDwAgAh_wEBAPACACGAAgEA8AIAIYICQACfAwAhgwIBAJ4DACGIAgEAngMAIYkCAQCeAwAhigIBAPACACGLAiAAuQMAIYwCIAC5AwAhjQJAAJ8DACGOAgEAngMAIRUBAACMBAAgBAAAhgQAIAwAAIgEACANAACJBAAgDgAAigQAIA8AAIsEACDQAUAAAAAB3gEBAAAAAfUBQAAAAAH8AQEAAAAB_wEBAAAAAYACAQAAAAGCAkAAAAABgwIBAAAAAYgCAQAAAAGJAgEAAAABigIBAAAAAYsCIAAAAAGMAiAAAAABjQJAAAAAAY4CAQAAAAECAAAAAQAgHAAAoAQAIATQAUAAAAAB3wEBAAAAAfUBQAAAAAH7AQAAAPsBAgMAAAADACAcAACgBAAgHQAApQQAIBcAAAADACABAAC6AwAgBAAAuwMAIAwAAL0DACANAAC-AwAgDgAAvwMAIA8AAMADACAVAAClBAAg0AFAAPECACHeAQEAngMAIfUBQADxAgAh_AEBAPACACH_AQEA8AIAIYACAQDwAgAhggJAAJ8DACGDAgEAngMAIYgCAQCeAwAhiQIBAJ4DACGKAgEA8AIAIYsCIAC5AwAhjAIgALkDACGNAkAAnwMAIY4CAQCeAwAhFQEAALoDACAEAAC7AwAgDAAAvQMAIA0AAL4DACAOAAC_AwAgDwAAwAMAINABQADxAgAh3gEBAJ4DACH1AUAA8QIAIfwBAQDwAgAh_wEBAPACACGAAgEA8AIAIYICQACfAwAhgwIBAJ4DACGIAgEAngMAIYkCAQCeAwAhigIBAPACACGLAiAAuQMAIYwCIAC5AwAhjQJAAJ8DACGOAgEAngMAIQwFAACuAwAg0AFAAAAAAeEBAQAAAAH1AUAAAAAB_AEBAAAAAf0BAQAAAAH-AQEAAAAB_wEBAAAAAYACAQAAAAGBAgEAAAABggJAAAAAAYMCAQAAAAECAAAACQAgHAAApgQAIAMAAAAHACAcAACmBAAgHQAAqgQAIA4AAAAHACAFAACgAwAgFQAAqgQAINABQADxAgAh4QEBAPACACH1AUAA8QIAIfwBAQDwAgAh_QEBAPACACH-AQEA8AIAIf8BAQDwAgAhgAIBAPACACGBAgEAngMAIYICQACfAwAhgwIBAJ4DACEMBQAAoAMAINABQADxAgAh4QEBAPACACH1AUAA8QIAIfwBAQDwAgAh_QEBAPACACH-AQEA8AIAIf8BAQDwAgAhgAIBAPACACGBAgEAngMAIYICQACfAwAhgwIBAJ4DACEVAQAAjAQAIAQAAIYEACAJAACHBAAgDAAAiAQAIA4AAIoEACAPAACLBAAg0AFAAAAAAd4BAQAAAAH1AUAAAAAB_AEBAAAAAf8BAQAAAAGAAgEAAAABggJAAAAAAYMCAQAAAAGIAgEAAAABiQIBAAAAAYoCAQAAAAGLAiAAAAABjAIgAAAAAY0CQAAAAAGOAgEAAAABAgAAAAEAIBwAAKsEACAVAQAAjAQAIAQAAIYEACAJAACHBAAgDQAAiQQAIA4AAIoEACAPAACLBAAg0AFAAAAAAd4BAQAAAAH1AUAAAAAB_AEBAAAAAf8BAQAAAAGAAgEAAAABggJAAAAAAYMCAQAAAAGIAgEAAAABiQIBAAAAAYoCAQAAAAGLAiAAAAABjAIgAAAAAY0CQAAAAAGOAgEAAAABAgAAAAEAIBwAAK0EACADAAAAAwAgHAAAqwQAIB0AALEEACAXAAAAAwAgAQAAugMAIAQAALsDACAJAAC8AwAgDAAAvQMAIA4AAL8DACAPAADAAwAgFQAAsQQAINABQADxAgAh3gEBAJ4DACH1AUAA8QIAIfwBAQDwAgAh_wEBAPACACGAAgEA8AIAIYICQACfAwAhgwIBAJ4DACGIAgEAngMAIYkCAQCeAwAhigIBAPACACGLAiAAuQMAIYwCIAC5AwAhjQJAAJ8DACGOAgEAngMAIRUBAAC6AwAgBAAAuwMAIAkAALwDACAMAAC9AwAgDgAAvwMAIA8AAMADACDQAUAA8QIAId4BAQCeAwAh9QFAAPECACH8AQEA8AIAIf8BAQDwAgAhgAIBAPACACGCAkAAnwMAIYMCAQCeAwAhiAIBAJ4DACGJAgEAngMAIYoCAQDwAgAhiwIgALkDACGMAiAAuQMAIY0CQACfAwAhjgIBAJ4DACEDAAAAAwAgHAAArQQAIB0AALQEACAXAAAAAwAgAQAAugMAIAQAALsDACAJAAC8AwAgDQAAvgMAIA4AAL8DACAPAADAAwAgFQAAtAQAINABQADxAgAh3gEBAJ4DACH1AUAA8QIAIfwBAQDwAgAh_wEBAPACACGAAgEA8AIAIYICQACfAwAhgwIBAJ4DACGIAgEAngMAIYkCAQCeAwAhigIBAPACACGLAiAAuQMAIYwCIAC5AwAhjQJAAJ8DACGOAgEAngMAIRUBAAC6AwAgBAAAuwMAIAkAALwDACANAAC-AwAgDgAAvwMAIA8AAMADACDQAUAA8QIAId4BAQCeAwAh9QFAAPECACH8AQEA8AIAIf8BAQDwAgAhgAIBAPACACGCAkAAnwMAIYMCAQCeAwAhiAIBAJ4DACGJAgEAngMAIYoCAQDwAgAhiwIgALkDACGMAiAAuQMAIY0CQACfAwAhjgIBAJ4DACEVAQAAjAQAIAQAAIYEACAJAACHBAAgDAAAiAQAIA0AAIkEACAPAACLBAAg0AFAAAAAAd4BAQAAAAH1AUAAAAAB_AEBAAAAAf8BAQAAAAGAAgEAAAABggJAAAAAAYMCAQAAAAGIAgEAAAABiQIBAAAAAYoCAQAAAAGLAiAAAAABjAIgAAAAAY0CQAAAAAGOAgEAAAABAgAAAAEAIBwAALUEACADAAAAAwAgHAAAtQQAIB0AALkEACAXAAAAAwAgAQAAugMAIAQAALsDACAJAAC8AwAgDAAAvQMAIA0AAL4DACAPAADAAwAgFQAAuQQAINABQADxAgAh3gEBAJ4DACH1AUAA8QIAIfwBAQDwAgAh_wEBAPACACGAAgEA8AIAIYICQACfAwAhgwIBAJ4DACGIAgEAngMAIYkCAQCeAwAhigIBAPACACGLAiAAuQMAIYwCIAC5AwAhjQJAAJ8DACGOAgEAngMAIRUBAAC6AwAgBAAAuwMAIAkAALwDACAMAAC9AwAgDQAAvgMAIA8AAMADACDQAUAA8QIAId4BAQCeAwAh9QFAAPECACH8AQEA8AIAIf8BAQDwAgAhgAIBAPACACGCAkAAnwMAIYMCAQCeAwAhiAIBAJ4DACGJAgEAngMAIYoCAQDwAgAhiwIgALkDACGMAiAAuQMAIY0CQACfAwAhjgIBAJ4DACEVAQAAjAQAIAQAAIYEACAJAACHBAAgDAAAiAQAIA0AAIkEACAOAACKBAAg0AFAAAAAAd4BAQAAAAH1AUAAAAAB_AEBAAAAAf8BAQAAAAGAAgEAAAABggJAAAAAAYMCAQAAAAGIAgEAAAABiQIBAAAAAYoCAQAAAAGLAiAAAAABjAIgAAAAAY0CQAAAAAGOAgEAAAABAgAAAAEAIBwAALoEACADAAAAAwAgHAAAugQAIB0AAL4EACAXAAAAAwAgAQAAugMAIAQAALsDACAJAAC8AwAgDAAAvQMAIA0AAL4DACAOAAC_AwAgFQAAvgQAINABQADxAgAh3gEBAJ4DACH1AUAA8QIAIfwBAQDwAgAh_wEBAPACACGAAgEA8AIAIYICQACfAwAhgwIBAJ4DACGIAgEAngMAIYkCAQCeAwAhigIBAPACACGLAiAAuQMAIYwCIAC5AwAhjQJAAJ8DACGOAgEAngMAIRUBAAC6AwAgBAAAuwMAIAkAALwDACAMAAC9AwAgDQAAvgMAIA4AAL8DACDQAUAA8QIAId4BAQCeAwAh9QFAAPECACH8AQEA8AIAIf8BAQDwAgAhgAIBAPACACGCAkAAnwMAIYMCAQCeAwAhiAIBAJ4DACGJAgEAngMAIYoCAQDwAgAhiwIgALkDACGMAiAAuQMAIY0CQACfAwAhjgIBAJ4DACEIAQQBBAYBCAAICQoCDBMFDRQFDhgGDxwHAwUAAQcOAwgABAEGAAIBBw8AAgoAAQsAAQEFAAEBBQABBgQdAAkeAAwfAA0gAA4hAA8iAAABASwBAQEyAQMIAA0iAA4jAA8AAAADCAANIgAOIwAPAAAAAwgAFSIAFiMAFwAAAAMIABUiABYjABcAAAADCAAdIgAeIwAfAAAAAwgAHSIAHiMAHwEFAAEBBQABAwgAJCIAJSMAJgAAAAMIACQiACUjACYBBgACAQYAAgMIACsiACwjAC0AAAADCAArIgAsIwAtAgoAAQsAAQIKAAELAAEFCAAyIgA1IwA2dAAzdQA0AAAAAAAFCAAyIgA1IwA2dAAzdQA0AQUAAQEFAAEDCAA7IgA8IwA9AAAAAwgAOyIAPCMAPQEFAAEBBQABAwgAQiIAQyMARAAAAAMIAEIiAEMjAEQAAAAFCABKIgBNIwBOdABLdQBMAAAAAAAFCABKIgBNIwBOdABLdQBMAAAAAwgAVCIAVSMAVgAAAAMIAFQiAFUjAFYAAAADCABcIgBdIwBeAAAAAwgAXCIAXSMAXhACAREjARIkARMlARQmARYoARcqCRgrChkuARowCRsxCx4zAR80ASA1CSQ4DCU5ECY7ESc8ESg_ESlAESpBEStDESxFCS1GEi5IES9KCTBLEzFMETJNETNOCTRRFDVSGDZUGTdVGThYGTlZGTpaGTtcGTxeCT1fGj5hGT9jCUBkG0FlGUJmGUNnCURqHEVrIEZsAkdtAkhuAklvAkpwAktyAkx0CU11IU53Ak95CVB6IlF7AlJ8AlN9CVSAASNVgQEnVoIBA1eDAQNYhAEDWYUBA1qGAQNbiAEDXIoBCV2LAShejQEDX48BCWCQASlhkQEDYpIBA2OTAQlklgEqZZcBLmaYAQVnmQEFaJoBBWmbAQVqnAEFa54BBWygAQltoQEvbqMBBW-lAQlwpgEwcacBBXKoAQVzqQEJdqwBMXetATd4rgEGea8BBnqwAQZ7sQEGfLIBBn20AQZ-tgEJf7cBOIABuQEGgQG7AQmCAbwBOYMBvQEGhAG-AQaFAb8BCYYBwgE6hwHDAT6IAcQBB4kBxQEHigHGAQeLAccBB4wByAEHjQHKAQeOAcwBCY8BzQE_kAHPAQeRAdEBCZIB0gFAkwHTAQeUAdQBB5UB1QEJlgHYAUGXAdkBRZgB2wFGmQHcAUaaAd8BRpsB4AFGnAHhAUadAeMBRp4B5QEJnwHmAUegAegBRqEB6gEJogHrAUijAewBRqQB7QFGpQHuAQmmAfEBSacB8gFPqAH0AVCpAfUBUKoB-AFQqwH5AVCsAfoBUK0B_AFQrgH-AQmvAf8BUbABgQJQsQGDAgmyAYQCUrMBhQJQtAGGAlC1AYcCCbYBigJTtwGLAle4AY0CWLkBjgJYugGRAli7AZICWLwBkwJYvQGVAli-AZcCCb8BmAJZwAGaAljBAZwCCcIBnQJawwGeAljEAZ8CWMUBoAIJxgGjAlvHAaQCXw" + strings: JSON.parse("[\"where\",\"parentTopic\",\"orderBy\",\"cursor\",\"childTopics\",\"topic\",\"post\",\"reactions\",\"_count\",\"posts\",\"ancestorTopic\",\"descendantTopic\",\"ancestorClosures\",\"descendantClosures\",\"watches\",\"readStates\",\"Topic.findUnique\",\"Topic.findUniqueOrThrow\",\"Topic.findFirst\",\"Topic.findFirstOrThrow\",\"Topic.findMany\",\"data\",\"Topic.createOne\",\"Topic.createMany\",\"Topic.createManyAndReturn\",\"Topic.updateOne\",\"Topic.updateMany\",\"Topic.updateManyAndReturn\",\"create\",\"update\",\"Topic.upsertOne\",\"Topic.deleteOne\",\"Topic.deleteMany\",\"having\",\"_min\",\"_max\",\"Topic.groupBy\",\"Topic.aggregate\",\"MemberBan.findUnique\",\"MemberBan.findUniqueOrThrow\",\"MemberBan.findFirst\",\"MemberBan.findFirstOrThrow\",\"MemberBan.findMany\",\"MemberBan.createOne\",\"MemberBan.createMany\",\"MemberBan.createManyAndReturn\",\"MemberBan.updateOne\",\"MemberBan.updateMany\",\"MemberBan.updateManyAndReturn\",\"MemberBan.upsertOne\",\"MemberBan.deleteOne\",\"MemberBan.deleteMany\",\"MemberBan.groupBy\",\"MemberBan.aggregate\",\"IpBan.findUnique\",\"IpBan.findUniqueOrThrow\",\"IpBan.findFirst\",\"IpBan.findFirstOrThrow\",\"IpBan.findMany\",\"IpBan.createOne\",\"IpBan.createMany\",\"IpBan.createManyAndReturn\",\"IpBan.updateOne\",\"IpBan.updateMany\",\"IpBan.updateManyAndReturn\",\"IpBan.upsertOne\",\"IpBan.deleteOne\",\"IpBan.deleteMany\",\"IpBan.groupBy\",\"IpBan.aggregate\",\"Post.findUnique\",\"Post.findUniqueOrThrow\",\"Post.findFirst\",\"Post.findFirstOrThrow\",\"Post.findMany\",\"Post.createOne\",\"Post.createMany\",\"Post.createManyAndReturn\",\"Post.updateOne\",\"Post.updateMany\",\"Post.updateManyAndReturn\",\"Post.upsertOne\",\"Post.deleteOne\",\"Post.deleteMany\",\"Post.groupBy\",\"Post.aggregate\",\"PostReaction.findUnique\",\"PostReaction.findUniqueOrThrow\",\"PostReaction.findFirst\",\"PostReaction.findFirstOrThrow\",\"PostReaction.findMany\",\"PostReaction.createOne\",\"PostReaction.createMany\",\"PostReaction.createManyAndReturn\",\"PostReaction.updateOne\",\"PostReaction.updateMany\",\"PostReaction.updateManyAndReturn\",\"PostReaction.upsertOne\",\"PostReaction.deleteOne\",\"PostReaction.deleteMany\",\"PostReaction.groupBy\",\"PostReaction.aggregate\",\"TopicClosure.findUnique\",\"TopicClosure.findUniqueOrThrow\",\"TopicClosure.findFirst\",\"TopicClosure.findFirstOrThrow\",\"TopicClosure.findMany\",\"TopicClosure.createOne\",\"TopicClosure.createMany\",\"TopicClosure.createManyAndReturn\",\"TopicClosure.updateOne\",\"TopicClosure.updateMany\",\"TopicClosure.updateManyAndReturn\",\"TopicClosure.upsertOne\",\"TopicClosure.deleteOne\",\"TopicClosure.deleteMany\",\"_avg\",\"_sum\",\"TopicClosure.groupBy\",\"TopicClosure.aggregate\",\"TopicWatch.findUnique\",\"TopicWatch.findUniqueOrThrow\",\"TopicWatch.findFirst\",\"TopicWatch.findFirstOrThrow\",\"TopicWatch.findMany\",\"TopicWatch.createOne\",\"TopicWatch.createMany\",\"TopicWatch.createManyAndReturn\",\"TopicWatch.updateOne\",\"TopicWatch.updateMany\",\"TopicWatch.updateManyAndReturn\",\"TopicWatch.upsertOne\",\"TopicWatch.deleteOne\",\"TopicWatch.deleteMany\",\"TopicWatch.groupBy\",\"TopicWatch.aggregate\",\"ChallengeForumWatch.findUnique\",\"ChallengeForumWatch.findUniqueOrThrow\",\"ChallengeForumWatch.findFirst\",\"ChallengeForumWatch.findFirstOrThrow\",\"ChallengeForumWatch.findMany\",\"ChallengeForumWatch.createOne\",\"ChallengeForumWatch.createMany\",\"ChallengeForumWatch.createManyAndReturn\",\"ChallengeForumWatch.updateOne\",\"ChallengeForumWatch.updateMany\",\"ChallengeForumWatch.updateManyAndReturn\",\"ChallengeForumWatch.upsertOne\",\"ChallengeForumWatch.deleteOne\",\"ChallengeForumWatch.deleteMany\",\"ChallengeForumWatch.groupBy\",\"ChallengeForumWatch.aggregate\",\"TopicReadState.findUnique\",\"TopicReadState.findUniqueOrThrow\",\"TopicReadState.findFirst\",\"TopicReadState.findFirstOrThrow\",\"TopicReadState.findMany\",\"TopicReadState.createOne\",\"TopicReadState.createMany\",\"TopicReadState.createManyAndReturn\",\"TopicReadState.updateOne\",\"TopicReadState.updateMany\",\"TopicReadState.updateManyAndReturn\",\"TopicReadState.upsertOne\",\"TopicReadState.deleteOne\",\"TopicReadState.deleteMany\",\"TopicReadState.groupBy\",\"TopicReadState.aggregate\",\"PublicForumCategory.findUnique\",\"PublicForumCategory.findUniqueOrThrow\",\"PublicForumCategory.findFirst\",\"PublicForumCategory.findFirstOrThrow\",\"PublicForumCategory.findMany\",\"PublicForumCategory.createOne\",\"PublicForumCategory.createMany\",\"PublicForumCategory.createManyAndReturn\",\"PublicForumCategory.updateOne\",\"PublicForumCategory.updateMany\",\"PublicForumCategory.updateManyAndReturn\",\"PublicForumCategory.upsertOne\",\"PublicForumCategory.deleteOne\",\"PublicForumCategory.deleteMany\",\"PublicForumCategory.groupBy\",\"PublicForumCategory.aggregate\",\"PublicForumRoleMember.findUnique\",\"PublicForumRoleMember.findUniqueOrThrow\",\"PublicForumRoleMember.findFirst\",\"PublicForumRoleMember.findFirstOrThrow\",\"PublicForumRoleMember.findMany\",\"PublicForumRoleMember.createOne\",\"PublicForumRoleMember.createMany\",\"PublicForumRoleMember.createManyAndReturn\",\"PublicForumRoleMember.updateOne\",\"PublicForumRoleMember.updateMany\",\"PublicForumRoleMember.updateManyAndReturn\",\"PublicForumRoleMember.upsertOne\",\"PublicForumRoleMember.deleteOne\",\"PublicForumRoleMember.deleteMany\",\"PublicForumRoleMember.groupBy\",\"PublicForumRoleMember.aggregate\",\"PublicForumImportRecord.findUnique\",\"PublicForumImportRecord.findUniqueOrThrow\",\"PublicForumImportRecord.findFirst\",\"PublicForumImportRecord.findFirstOrThrow\",\"PublicForumImportRecord.findMany\",\"PublicForumImportRecord.createOne\",\"PublicForumImportRecord.createMany\",\"PublicForumImportRecord.createManyAndReturn\",\"PublicForumImportRecord.updateOne\",\"PublicForumImportRecord.updateMany\",\"PublicForumImportRecord.updateManyAndReturn\",\"PublicForumImportRecord.upsertOne\",\"PublicForumImportRecord.deleteOne\",\"PublicForumImportRecord.deleteMany\",\"PublicForumImportRecord.groupBy\",\"PublicForumImportRecord.aggregate\",\"AND\",\"OR\",\"NOT\",\"entityType\",\"sourceId\",\"targetId\",\"sourceHash\",\"targetHash\",\"createdAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"contains\",\"startsWith\",\"endsWith\",\"entityType_targetId\",\"entityType_sourceId\",\"roleName\",\"memberId\",\"roleName_memberId\",\"topicId\",\"description\",\"displayAs\",\"sortOrder\",\"readRoles\",\"createRoles\",\"replyRoles\",\"legacyId\",\"legacySlug\",\"source\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"has\",\"hasEvery\",\"hasSome\",\"lastReadAt\",\"updatedAt\",\"challengeId\",\"watching\",\"challengeId_memberId\",\"ancestorTopicId\",\"descendantTopicId\",\"depth\",\"postId\",\"PostReactionType\",\"reaction\",\"id\",\"parentType\",\"parentId\",\"authorMemberId\",\"authorHandle\",\"content\",\"deletedAt\",\"deletedByMemberId\",\"ipAddress\",\"createdByMemberId\",\"removedAt\",\"removedByMemberId\",\"parentTopicId\",\"title\",\"isAnnouncement\",\"locked\",\"lockedAt\",\"lockedByMemberId\",\"topicId_memberId\",\"ancestorTopicId_descendantTopicId\",\"postId_memberId\",\"every\",\"some\",\"none\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"push\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), + graph: "3QRnwAEZAQAAgwMAIAQAAIQDACAJAACFAwAgDAAAhgMAIA0AAIYDACAOAACHAwAgDwAAiAMAINgBAACCAwAw2QEAAAMAENoBAACCAwAw4AFAAMgCACHuAQEA8AIAIYUCQADIAgAhhgIBAPACACGPAgEAAAABkgIBAMcCACGTAgEAxwIAIZUCQADxAgAhlgIBAPACACGbAgEA8AIAIZwCAQDHAgAhnQIgAN4CACGeAiAA3gIAIZ8CQADxAgAhoAIBAPACACEBAAAAAQAgGQEAAIMDACAEAACEAwAgCQAAhQMAIAwAAIYDACANAACGAwAgDgAAhwMAIA8AAIgDACDYAQAAggMAMNkBAAADABDaAQAAggMAMOABQADIAgAh7gEBAPACACGFAkAAyAIAIYYCAQDwAgAhjwIBAMcCACGSAgEAxwIAIZMCAQDHAgAhlQJAAPECACGWAgEA8AIAIZsCAQDwAgAhnAIBAMcCACGdAiAA3gIAIZ4CIADeAgAhnwJAAPECACGgAgEA8AIAIQEAAAADACAOAQAArAQAIAQAAK8EACAJAACwBAAgDAAAsQQAIA0AALEEACAOAACyBAAgDwAAswQAIO4BAAC6AwAghgIAALoDACCVAgAAugMAIJYCAAC6AwAgmwIAALoDACCfAgAAugMAIKACAAC6AwAgAwAAAAMAIAIAAAUAMAMAAAEAIBAFAAD3AgAgBwAAgQMAINgBAACAAwAw2QEAAAcAENoBAACAAwAw4AFAAMgCACHxAQEAxwIAIYUCQADIAgAhjwIBAMcCACGQAgEAxwIAIZECAQDHAgAhkgIBAMcCACGTAgEAxwIAIZQCAQDwAgAhlQJAAPECACGWAgEA8AIAIQUFAACsBAAgBwAArgQAIJQCAAC6AwAglQIAALoDACCWAgAAugMAIBAFAAD3AgAgBwAAgQMAINgBAACAAwAw2QEAAAcAENoBAACAAwAw4AFAAMgCACHxAQEAxwIAIYUCQADIAgAhjwIBAAAAAZACAQDHAgAhkQIBAMcCACGSAgEAxwIAIZMCAQDHAgAhlAIBAPACACGVAkAA8QIAIZYCAQDwAgAhAwAAAAcAIAIAAAgAMAMAAAkAIAkGAAD_AgAg2AEAAP0CADDZAQAACwAQ2gEAAP0CADDgAUAAyAIAIe8BAQDHAgAhhQJAAMgCACGMAgEAxwIAIY4CAAD-Ao4CIgEGAACtBAAgCgYAAP8CACDYAQAA_QIAMNkBAAALABDaAQAA_QIAMOABQADIAgAh7wEBAMcCACGFAkAAyAIAIYwCAQDHAgAhjgIAAP4CjgIiowIAAPwCACADAAAACwAgAgAADAAwAwAADQAgAQAAAAsAIAgKAAD3AgAgCwAA9wIAINgBAAD7AgAw2QEAABAAENoBAAD7AgAwiQIBAMcCACGKAgEAxwIAIYsCAgDWAgAhAgoAAKwEACALAACsBAAgCQoAAPcCACALAAD3AgAg2AEAAPsCADDZAQAAEAAQ2gEAAPsCADCJAgEAxwIAIYoCAQDHAgAhiwICANYCACGiAgAA-gIAIAMAAAAQACACAAARADADAAASACADAAAAEAAgAgAAEQAwAwAAEgAgBwUAAPcCACDYAQAA-QIAMNkBAAAVABDaAQAA-QIAMOABQADIAgAh7wEBAMcCACHxAQEAxwIAIQEFAACsBAAgCAUAAPcCACDYAQAA-QIAMNkBAAAVABDaAQAA-QIAMOABQADIAgAh7wEBAMcCACHxAQEAxwIAIaECAAD4AgAgAwAAABUAIAIAABYAMAMAABcAIAgFAAD3AgAg2AEAAPYCADDZAQAAGQAQ2gEAAPYCADDvAQEAxwIAIfEBAQDHAgAhhAJAAMgCACGFAkAAyAIAIQEFAACsBAAgCQUAAPcCACDYAQAA9gIAMNkBAAAZABDaAQAA9gIAMO8BAQDHAgAh8QEBAMcCACGEAkAAyAIAIYUCQADIAgAhoQIAAPUCACADAAAAGQAgAgAAGgAwAwAAGwAgAQAAAAMAIAEAAAAHACABAAAAEAAgAQAAABAAIAEAAAAVACABAAAAGQAgAQAAAAEAIAMAAAADACACAAAFADADAAABACADAAAAAwAgAgAABQAwAwAAAQAgAwAAAAMAIAIAAAUAMAMAAAEAIBYBAACrBAAgBAAApQQAIAkAAKYEACAMAACnBAAgDQAAqAQAIA4AAKkEACAPAACqBAAg4AFAAAAAAe4BAQAAAAGFAkAAAAABhgIBAAAAAY8CAQAAAAGSAgEAAAABkwIBAAAAAZUCQAAAAAGWAgEAAAABmwIBAAAAAZwCAQAAAAGdAiAAAAABngIgAAAAAZ8CQAAAAAGgAgEAAAABARUAACcAIA_gAUAAAAAB7gEBAAAAAYUCQAAAAAGGAgEAAAABjwIBAAAAAZICAQAAAAGTAgEAAAABlQJAAAAAAZYCAQAAAAGbAgEAAAABnAIBAAAAAZ0CIAAAAAGeAiAAAAABnwJAAAAAAaACAQAAAAEBFQAAKQAwARUAACkAMAEAAAADACAWAQAA2QMAIAQAANoDACAJAADbAwAgDAAA3AMAIA0AAN0DACAOAADeAwAgDwAA3wMAIOABQACNAwAh7gEBAL4DACGFAkAAjQMAIYYCAQC-AwAhjwIBAIwDACGSAgEAjAMAIZMCAQCMAwAhlQJAAL8DACGWAgEAvgMAIZsCAQC-AwAhnAIBAIwDACGdAiAApQMAIZ4CIAClAwAhnwJAAL8DACGgAgEAvgMAIQIAAAABACAVAAAtACAP4AFAAI0DACHuAQEAvgMAIYUCQACNAwAhhgIBAL4DACGPAgEAjAMAIZICAQCMAwAhkwIBAIwDACGVAkAAvwMAIZYCAQC-AwAhmwIBAL4DACGcAgEAjAMAIZ0CIAClAwAhngIgAKUDACGfAkAAvwMAIaACAQC-AwAhAgAAAAMAIBUAAC8AIAIAAAADACAVAAAvACABAAAAAwAgAwAAAAEAIBwAACcAIB0AAC0AIAEAAAABACABAAAAAwAgCggAANYDACAiAADYAwAgIwAA1wMAIO4BAAC6AwAghgIAALoDACCVAgAAugMAIJYCAAC6AwAgmwIAALoDACCfAgAAugMAIKACAAC6AwAgEtgBAAD0AgAw2QEAADcAENoBAAD0AgAw4AFAAMACACHuAQEA5wIAIYUCQADAAgAhhgIBAOcCACGPAgEAvwIAIZICAQC_AgAhkwIBAL8CACGVAkAA6AIAIZYCAQDnAgAhmwIBAOcCACGcAgEAvwIAIZ0CIADaAgAhngIgANoCACGfAkAA6AIAIaACAQDnAgAhAwAAAAMAIAIAADYAMCEAADcAIAMAAAADACACAAAFADADAAABACAJ2AEAAPMCADDZAQAAPQAQ2gEAAPMCADDgAUAAyAIAIe8BAQDHAgAhjwIBAAAAAZgCAQDwAgAhmQJAAPECACGaAgEA8AIAIQEAAAA6ACABAAAAOgAgCdgBAADzAgAw2QEAAD0AENoBAADzAgAw4AFAAMgCACHvAQEAxwIAIY8CAQDHAgAhmAIBAPACACGZAkAA8QIAIZoCAQDwAgAhA5gCAAC6AwAgmQIAALoDACCaAgAAugMAIAMAAAA9ACACAAA-ADADAAA6ACADAAAAPQAgAgAAPgAwAwAAOgAgAwAAAD0AIAIAAD4AMAMAADoAIAbgAUAAAAAB7wEBAAAAAY8CAQAAAAGYAgEAAAABmQJAAAAAAZoCAQAAAAEBFQAAQgAgBuABQAAAAAHvAQEAAAABjwIBAAAAAZgCAQAAAAGZAkAAAAABmgIBAAAAAQEVAABEADABFQAARAAwBuABQACNAwAh7wEBAIwDACGPAgEAjAMAIZgCAQC-AwAhmQJAAL8DACGaAgEAvgMAIQIAAAA6ACAVAABHACAG4AFAAI0DACHvAQEAjAMAIY8CAQCMAwAhmAIBAL4DACGZAkAAvwMAIZoCAQC-AwAhAgAAAD0AIBUAAEkAIAIAAAA9ACAVAABJACADAAAAOgAgHAAAQgAgHQAARwAgAQAAADoAIAEAAAA9ACAGCAAA0wMAICIAANUDACAjAADUAwAgmAIAALoDACCZAgAAugMAIJoCAAC6AwAgCdgBAADyAgAw2QEAAFAAENoBAADyAgAw4AFAAMACACHvAQEAvwIAIY8CAQC_AgAhmAIBAOcCACGZAkAA6AIAIZoCAQDnAgAhAwAAAD0AIAIAAE8AMCEAAFAAIAMAAAA9ACACAAA-ADADAAA6ACAJ2AEAAO8CADDZAQAAVgAQ2gEAAO8CADDgAUAAyAIAIY8CAQAAAAGXAgEAxwIAIZgCAQDwAgAhmQJAAPECACGaAgEA8AIAIQEAAABTACABAAAAUwAgCdgBAADvAgAw2QEAAFYAENoBAADvAgAw4AFAAMgCACGPAgEAxwIAIZcCAQDHAgAhmAIBAPACACGZAkAA8QIAIZoCAQDwAgAhA5gCAAC6AwAgmQIAALoDACCaAgAAugMAIAMAAABWACACAABXADADAABTACADAAAAVgAgAgAAVwAwAwAAUwAgAwAAAFYAIAIAAFcAMAMAAFMAIAbgAUAAAAABjwIBAAAAAZcCAQAAAAGYAgEAAAABmQJAAAAAAZoCAQAAAAEBFQAAWwAgBuABQAAAAAGPAgEAAAABlwIBAAAAAZgCAQAAAAGZAkAAAAABmgIBAAAAAQEVAABdADABFQAAXQAwBuABQACNAwAhjwIBAIwDACGXAgEAjAMAIZgCAQC-AwAhmQJAAL8DACGaAgEAvgMAIQIAAABTACAVAABgACAG4AFAAI0DACGPAgEAjAMAIZcCAQCMAwAhmAIBAL4DACGZAkAAvwMAIZoCAQC-AwAhAgAAAFYAIBUAAGIAIAIAAABWACAVAABiACADAAAAUwAgHAAAWwAgHQAAYAAgAQAAAFMAIAEAAABWACAGCAAA0AMAICIAANIDACAjAADRAwAgmAIAALoDACCZAgAAugMAIJoCAAC6AwAgCdgBAADuAgAw2QEAAGkAENoBAADuAgAw4AFAAMACACGPAgEAvwIAIZcCAQC_AgAhmAIBAOcCACGZAkAA6AIAIZoCAQDnAgAhAwAAAFYAIAIAAGgAMCEAAGkAIAMAAABWACACAABXADADAABTACABAAAACQAgAQAAAAkAIAMAAAAHACACAAAIADADAAAJACADAAAABwAgAgAACAAwAwAACQAgAwAAAAcAIAIAAAgAMAMAAAkAIA0FAADOAwAgBwAAzwMAIOABQAAAAAHxAQEAAAABhQJAAAAAAY8CAQAAAAGQAgEAAAABkQIBAAAAAZICAQAAAAGTAgEAAAABlAIBAAAAAZUCQAAAAAGWAgEAAAABARUAAHEAIAvgAUAAAAAB8QEBAAAAAYUCQAAAAAGPAgEAAAABkAIBAAAAAZECAQAAAAGSAgEAAAABkwIBAAAAAZQCAQAAAAGVAkAAAAABlgIBAAAAAQEVAABzADABFQAAcwAwDQUAAMADACAHAADBAwAg4AFAAI0DACHxAQEAjAMAIYUCQACNAwAhjwIBAIwDACGQAgEAjAMAIZECAQCMAwAhkgIBAIwDACGTAgEAjAMAIZQCAQC-AwAhlQJAAL8DACGWAgEAvgMAIQIAAAAJACAVAAB2ACAL4AFAAI0DACHxAQEAjAMAIYUCQACNAwAhjwIBAIwDACGQAgEAjAMAIZECAQCMAwAhkgIBAIwDACGTAgEAjAMAIZQCAQC-AwAhlQJAAL8DACGWAgEAvgMAIQIAAAAHACAVAAB4ACACAAAABwAgFQAAeAAgAwAAAAkAIBwAAHEAIB0AAHYAIAEAAAAJACABAAAABwAgBggAALsDACAiAAC9AwAgIwAAvAMAIJQCAAC6AwAglQIAALoDACCWAgAAugMAIA7YAQAA5gIAMNkBAAB_ABDaAQAA5gIAMOABQADAAgAh8QEBAL8CACGFAkAAwAIAIY8CAQC_AgAhkAIBAL8CACGRAgEAvwIAIZICAQC_AgAhkwIBAL8CACGUAgEA5wIAIZUCQADoAgAhlgIBAOcCACEDAAAABwAgAgAAfgAwIQAAfwAgAwAAAAcAIAIAAAgAMAMAAAkAIAEAAAANACABAAAADQAgAwAAAAsAIAIAAAwAMAMAAA0AIAMAAAALACACAAAMADADAAANACADAAAACwAgAgAADAAwAwAADQAgBgYAALkDACDgAUAAAAAB7wEBAAAAAYUCQAAAAAGMAgEAAAABjgIAAACOAgIBFQAAhwEAIAXgAUAAAAAB7wEBAAAAAYUCQAAAAAGMAgEAAAABjgIAAACOAgIBFQAAiQEAMAEVAACJAQAwBgYAALgDACDgAUAAjQMAIe8BAQCMAwAhhQJAAI0DACGMAgEAjAMAIY4CAAC3A44CIgIAAAANACAVAACMAQAgBeABQACNAwAh7wEBAIwDACGFAkAAjQMAIYwCAQCMAwAhjgIAALcDjgIiAgAAAAsAIBUAAI4BACACAAAACwAgFQAAjgEAIAMAAAANACAcAACHAQAgHQAAjAEAIAEAAAANACABAAAACwAgAwgAALQDACAiAAC2AwAgIwAAtQMAIAjYAQAA4gIAMNkBAACVAQAQ2gEAAOICADDgAUAAwAIAIe8BAQC_AgAhhQJAAMACACGMAgEAvwIAIY4CAADjAo4CIgMAAAALACACAACUAQAwIQAAlQEAIAMAAAALACACAAAMADADAAANACABAAAAEgAgAQAAABIAIAMAAAAQACACAAARADADAAASACADAAAAEAAgAgAAEQAwAwAAEgAgAwAAABAAIAIAABEAMAMAABIAIAUKAACyAwAgCwAAswMAIIkCAQAAAAGKAgEAAAABiwICAAAAAQEVAACdAQAgA4kCAQAAAAGKAgEAAAABiwICAAAAAQEVAACfAQAwARUAAJ8BADAFCgAAsAMAIAsAALEDACCJAgEAjAMAIYoCAQCMAwAhiwICAJYDACECAAAAEgAgFQAAogEAIAOJAgEAjAMAIYoCAQCMAwAhiwICAJYDACECAAAAEAAgFQAApAEAIAIAAAAQACAVAACkAQAgAwAAABIAIBwAAJ0BACAdAACiAQAgAQAAABIAIAEAAAAQACAFCAAAqwMAICIAAK4DACAjAACtAwAgdAAArAMAIHUAAK8DACAG2AEAAOECADDZAQAAqwEAENoBAADhAgAwiQIBAL8CACGKAgEAvwIAIYsCAgDPAgAhAwAAABAAIAIAAKoBADAhAACrAQAgAwAAABAAIAIAABEAMAMAABIAIAEAAAAXACABAAAAFwAgAwAAABUAIAIAABYAMAMAABcAIAMAAAAVACACAAAWADADAAAXACADAAAAFQAgAgAAFgAwAwAAFwAgBAUAAKoDACDgAUAAAAAB7wEBAAAAAfEBAQAAAAEBFQAAswEAIAPgAUAAAAAB7wEBAAAAAfEBAQAAAAEBFQAAtQEAMAEVAAC1AQAwBAUAAKkDACDgAUAAjQMAIe8BAQCMAwAh8QEBAIwDACECAAAAFwAgFQAAuAEAIAPgAUAAjQMAIe8BAQCMAwAh8QEBAIwDACECAAAAFQAgFQAAugEAIAIAAAAVACAVAAC6AQAgAwAAABcAIBwAALMBACAdAAC4AQAgAQAAABcAIAEAAAAVACADCAAApgMAICIAAKgDACAjAACnAwAgBtgBAADgAgAw2QEAAMEBABDaAQAA4AIAMOABQADAAgAh7wEBAL8CACHxAQEAvwIAIQMAAAAVACACAADAAQAwIQAAwQEAIAMAAAAVACACAAAWADADAAAXACAJ2AEAAN0CADDZAQAAxwEAENoBAADdAgAw4AFAAMgCACHvAQEAxwIAIYUCQADIAgAhhgIBAMcCACGHAiAA3gIAIYgCAADfAgAgAQAAAMQBACABAAAAxAEAIAjYAQAA3QIAMNkBAADHAQAQ2gEAAN0CADDgAUAAyAIAIe8BAQDHAgAhhQJAAMgCACGGAgEAxwIAIYcCIADeAgAhAAMAAADHAQAgAgAAyAEAMAMAAMQBACADAAAAxwEAIAIAAMgBADADAADEAQAgAwAAAMcBACACAADIAQAwAwAAxAEAIAXgAUAAAAAB7wEBAAAAAYUCQAAAAAGGAgEAAAABhwIgAAAAAQEVAADMAQAgBeABQAAAAAHvAQEAAAABhQJAAAAAAYYCAQAAAAGHAiAAAAABARUAAM4BADABFQAAzgEAMAXgAUAAjQMAIe8BAQCMAwAhhQJAAI0DACGGAgEAjAMAIYcCIAClAwAhAgAAAMQBACAVAADRAQAgBeABQACNAwAh7wEBAIwDACGFAkAAjQMAIYYCAQCMAwAhhwIgAKUDACECAAAAxwEAIBUAANMBACACAAAAxwEAIBUAANMBACADAAAAxAEAIBwAAMwBACAdAADRAQAgAQAAAMQBACABAAAAxwEAIAMIAACiAwAgIgAApAMAICMAAKMDACAI2AEAANkCADDZAQAA2gEAENoBAADZAgAw4AFAAMACACHvAQEAvwIAIYUCQADAAgAhhgIBAL8CACGHAiAA2gIAIQMAAADHAQAgAgAA2QEAMCEAANoBACADAAAAxwEAIAIAAMgBADADAADEAQAgAQAAABsAIAEAAAAbACADAAAAGQAgAgAAGgAwAwAAGwAgAwAAABkAIAIAABoAMAMAABsAIAMAAAAZACACAAAaADADAAAbACAFBQAAoQMAIO8BAQAAAAHxAQEAAAABhAJAAAAAAYUCQAAAAAEBFQAA4gEAIATvAQEAAAAB8QEBAAAAAYQCQAAAAAGFAkAAAAABARUAAOQBADABFQAA5AEAMAUFAACgAwAg7wEBAIwDACHxAQEAjAMAIYQCQACNAwAhhQJAAI0DACECAAAAGwAgFQAA5wEAIATvAQEAjAMAIfEBAQCMAwAhhAJAAI0DACGFAkAAjQMAIQIAAAAZACAVAADpAQAgAgAAABkAIBUAAOkBACADAAAAGwAgHAAA4gEAIB0AAOcBACABAAAAGwAgAQAAABkAIAMIAACdAwAgIgAAnwMAICMAAJ4DACAH2AEAANgCADDZAQAA8AEAENoBAADYAgAw7wEBAL8CACHxAQEAvwIAIYQCQADAAgAhhQJAAMACACEDAAAAGQAgAgAA7wEAMCEAAPABACADAAAAGQAgAgAAGgAwAwAAGwAgDdgBAADVAgAw2QEAAPYBABDaAQAA1QIAMPEBAQAAAAHyAQEAxwIAIfMBAQDHAgAh9AECANYCACH1AQAA0AIAIPYBAADQAgAg9wEAANACACD4AQIAAAAB-QEBAMcCACH6AQAA1wIAIAEAAADzAQAgAQAAAPMBACAN2AEAANUCADDZAQAA9gEAENoBAADVAgAw8QEBAMcCACHyAQEAxwIAIfMBAQDHAgAh9AECANYCACH1AQAA0AIAIPYBAADQAgAg9wEAANACACD4AQIA1gIAIfkBAQDHAgAh-gEAANcCACAAAwAAAPYBACACAAD3AQAwAwAA8wEAIAMAAAD2AQAgAgAA9wEAMAMAAPMBACADAAAA9gEAIAIAAPcBADADAADzAQAgCvEBAQAAAAHyAQEAAAAB8wEBAAAAAfQBAgAAAAH1AQAAmgMAIPYBAACbAwAg9wEAAJwDACD4AQIAAAAB-QEBAAAAAfoBgAAAAAEBFQAA-wEAIArxAQEAAAAB8gEBAAAAAfMBAQAAAAH0AQIAAAAB9QEAAJoDACD2AQAAmwMAIPcBAACcAwAg-AECAAAAAfkBAQAAAAH6AYAAAAABARUAAP0BADABFQAA_QEAMArxAQEAjAMAIfIBAQCMAwAh8wEBAIwDACH0AQIAlgMAIfUBAACXAwAg9gEAAJgDACD3AQAAmQMAIPgBAgCWAwAh-QEBAIwDACH6AYAAAAABAgAAAPMBACAVAACAAgAgCvEBAQCMAwAh8gEBAIwDACHzAQEAjAMAIfQBAgCWAwAh9QEAAJcDACD2AQAAmAMAIPcBAACZAwAg-AECAJYDACH5AQEAjAMAIfoBgAAAAAECAAAA9gEAIBUAAIICACACAAAA9gEAIBUAAIICACADAAAA8wEAIBwAAPsBACAdAACAAgAgAQAAAPMBACABAAAA9gEAIAUIAACRAwAgIgAAlAMAICMAAJMDACB0AACSAwAgdQAAlQMAIA3YAQAAzgIAMNkBAACJAgAQ2gEAAM4CADDxAQEAvwIAIfIBAQC_AgAh8wEBAL8CACH0AQIAzwIAIfUBAADQAgAg9gEAANACACD3AQAA0AIAIPgBAgDPAgAh-QEBAL8CACH6AQAA0QIAIAMAAAD2AQAgAgAAiAIAMCEAAIkCACADAAAA9gEAIAIAAPcBADADAADzAQAgBtgBAADMAgAw2QEAAI8CABDaAQAAzAIAMO4BAQDHAgAh7wEBAMcCACHwAQAAzQIAIAEAAACMAgAgAQAAAIwCACAF2AEAAMwCADDZAQAAjwIAENoBAADMAgAw7gEBAMcCACHvAQEAxwIAIQADAAAAjwIAIAIAAJACADADAACMAgAgAwAAAI8CACACAACQAgAwAwAAjAIAIAMAAACPAgAgAgAAkAIAMAMAAIwCACAC7gEBAAAAAe8BAQAAAAEBFQAAlAIAIALuAQEAAAAB7wEBAAAAAQEVAACWAgAwARUAAJYCADAC7gEBAIwDACHvAQEAjAMAIQIAAACMAgAgFQAAmQIAIALuAQEAjAMAIe8BAQCMAwAhAgAAAI8CACAVAACbAgAgAgAAAI8CACAVAACbAgAgAwAAAIwCACAcAACUAgAgHQAAmQIAIAEAAACMAgAgAQAAAI8CACADCAAAjgMAICIAAJADACAjAACPAwAgBdgBAADLAgAw2QEAAKICABDaAQAAywIAMO4BAQC_AgAh7wEBAL8CACEDAAAAjwIAIAIAAKECADAhAACiAgAgAwAAAI8CACACAACQAgAwAwAAjAIAIAvYAQAAxgIAMNkBAACoAgAQ2gEAAMYCADDbAQEAxwIAIdwBAQDHAgAh3QEBAMcCACHeAQEAxwIAId8BAQDHAgAh4AFAAMgCACHsAQAAyQIAIO0BAADKAgAgAQAAAKUCACABAAAApQIAIAnYAQAAxgIAMNkBAACoAgAQ2gEAAMYCADDbAQEAxwIAIdwBAQDHAgAh3QEBAMcCACHeAQEAxwIAId8BAQDHAgAh4AFAAMgCACEAAwAAAKgCACACAACpAgAwAwAApQIAIAMAAACoAgAgAgAAqQIAMAMAAKUCACADAAAAqAIAIAIAAKkCADADAAClAgAgBtsBAQAAAAHcAQEAAAAB3QEBAAAAAd4BAQAAAAHfAQEAAAAB4AFAAAAAAQEVAACtAgAgBtsBAQAAAAHcAQEAAAAB3QEBAAAAAd4BAQAAAAHfAQEAAAAB4AFAAAAAAQEVAACvAgAwARUAAK8CADAG2wEBAIwDACHcAQEAjAMAId0BAQCMAwAh3gEBAIwDACHfAQEAjAMAIeABQACNAwAhAgAAAKUCACAVAACyAgAgBtsBAQCMAwAh3AEBAIwDACHdAQEAjAMAId4BAQCMAwAh3wEBAIwDACHgAUAAjQMAIQIAAACoAgAgFQAAtAIAIAIAAACoAgAgFQAAtAIAIAMAAAClAgAgHAAArQIAIB0AALICACABAAAApQIAIAEAAACoAgAgAwgAAIkDACAiAACLAwAgIwAAigMAIAnYAQAAvgIAMNkBAAC7AgAQ2gEAAL4CADDbAQEAvwIAIdwBAQC_AgAh3QEBAL8CACHeAQEAvwIAId8BAQC_AgAh4AFAAMACACEDAAAAqAIAIAIAALoCADAhAAC7AgAgAwAAAKgCACACAACpAgAwAwAApQIAIAnYAQAAvgIAMNkBAAC7AgAQ2gEAAL4CADDbAQEAvwIAIdwBAQC_AgAh3QEBAL8CACHeAQEAvwIAId8BAQC_AgAh4AFAAMACACEOCAAAwgIAICIAAMUCACAjAADFAgAg4QEBAAAAAeIBAQAAAATjAQEAAAAE5AEBAAAAAeUBAQAAAAHmAQEAAAAB5wEBAAAAAegBAQDEAgAh6QEBAAAAAeoBAQAAAAHrAQEAAAABCwgAAMICACAiAADDAgAgIwAAwwIAIOEBQAAAAAHiAUAAAAAE4wFAAAAABOQBQAAAAAHlAUAAAAAB5gFAAAAAAecBQAAAAAHoAUAAwQIAIQsIAADCAgAgIgAAwwIAICMAAMMCACDhAUAAAAAB4gFAAAAABOMBQAAAAATkAUAAAAAB5QFAAAAAAeYBQAAAAAHnAUAAAAAB6AFAAMECACEI4QECAAAAAeIBAgAAAATjAQIAAAAE5AECAAAAAeUBAgAAAAHmAQIAAAAB5wECAAAAAegBAgDCAgAhCOEBQAAAAAHiAUAAAAAE4wFAAAAABOQBQAAAAAHlAUAAAAAB5gFAAAAAAecBQAAAAAHoAUAAwwIAIQ4IAADCAgAgIgAAxQIAICMAAMUCACDhAQEAAAAB4gEBAAAABOMBAQAAAATkAQEAAAAB5QEBAAAAAeYBAQAAAAHnAQEAAAAB6AEBAMQCACHpAQEAAAAB6gEBAAAAAesBAQAAAAEL4QEBAAAAAeIBAQAAAATjAQEAAAAE5AEBAAAAAeUBAQAAAAHmAQEAAAAB5wEBAAAAAegBAQDFAgAh6QEBAAAAAeoBAQAAAAHrAQEAAAABCdgBAADGAgAw2QEAAKgCABDaAQAAxgIAMNsBAQDHAgAh3AEBAMcCACHdAQEAxwIAId4BAQDHAgAh3wEBAMcCACHgAUAAyAIAIQvhAQEAAAAB4gEBAAAABOMBAQAAAATkAQEAAAAB5QEBAAAAAeYBAQAAAAHnAQEAAAAB6AEBAMUCACHpAQEAAAAB6gEBAAAAAesBAQAAAAEI4QFAAAAAAeIBQAAAAATjAUAAAAAE5AFAAAAAAeUBQAAAAAHmAUAAAAAB5wFAAAAAAegBQADDAgAhAtsBAQAAAAHdAQEAAAABAtsBAQAAAAHcAQEAAAABBdgBAADLAgAw2QEAAKICABDaAQAAywIAMO4BAQC_AgAh7wEBAL8CACEF2AEAAMwCADDZAQAAjwIAENoBAADMAgAw7gEBAMcCACHvAQEAxwIAIQLuAQEAAAAB7wEBAAAAAQ3YAQAAzgIAMNkBAACJAgAQ2gEAAM4CADDxAQEAvwIAIfIBAQC_AgAh8wEBAL8CACH0AQIAzwIAIfUBAADQAgAg9gEAANACACD3AQAA0AIAIPgBAgDPAgAh-QEBAL8CACH6AQAA0QIAIA0IAADCAgAgIgAAwgIAICMAAMICACB0AADUAgAgdQAAwgIAIOEBAgAAAAHiAQIAAAAE4wECAAAABOQBAgAAAAHlAQIAAAAB5gECAAAAAecBAgAAAAHoAQIA0wIAIQThAQEAAAAFgQIBAAAAAYICAQAAAASDAgEAAAAEDwgAAMICACAiAADSAgAgIwAA0gIAIOEBgAAAAAHkAYAAAAAB5QGAAAAAAeYBgAAAAAHnAYAAAAAB6AGAAAAAAfsBAQAAAAH8AQEAAAAB_QEBAAAAAf4BgAAAAAH_AYAAAAABgAKAAAAAAQzhAYAAAAAB5AGAAAAAAeUBgAAAAAHmAYAAAAAB5wGAAAAAAegBgAAAAAH7AQEAAAAB_AEBAAAAAf0BAQAAAAH-AYAAAAAB_wGAAAAAAYACgAAAAAENCAAAwgIAICIAAMICACAjAADCAgAgdAAA1AIAIHUAAMICACDhAQIAAAAB4gECAAAABOMBAgAAAATkAQIAAAAB5QECAAAAAeYBAgAAAAHnAQIAAAAB6AECANMCACEI4QEIAAAAAeIBCAAAAATjAQgAAAAE5AEIAAAAAeUBCAAAAAHmAQgAAAAB5wEIAAAAAegBCADUAgAhDdgBAADVAgAw2QEAAPYBABDaAQAA1QIAMPEBAQDHAgAh8gEBAMcCACHzAQEAxwIAIfQBAgDWAgAh9QEAANACACD2AQAA0AIAIPcBAADQAgAg-AECANYCACH5AQEAxwIAIfoBAADXAgAgCOEBAgAAAAHiAQIAAAAE4wECAAAABOQBAgAAAAHlAQIAAAAB5gECAAAAAecBAgAAAAHoAQIAwgIAIQzhAYAAAAAB5AGAAAAAAeUBgAAAAAHmAYAAAAAB5wGAAAAAAegBgAAAAAH7AQEAAAAB_AEBAAAAAf0BAQAAAAH-AYAAAAAB_wGAAAAAAYACgAAAAAEH2AEAANgCADDZAQAA8AEAENoBAADYAgAw7wEBAL8CACHxAQEAvwIAIYQCQADAAgAhhQJAAMACACEI2AEAANkCADDZAQAA2gEAENoBAADZAgAw4AFAAMACACHvAQEAvwIAIYUCQADAAgAhhgIBAL8CACGHAiAA2gIAIQUIAADCAgAgIgAA3AIAICMAANwCACDhASAAAAAB6AEgANsCACEFCAAAwgIAICIAANwCACAjAADcAgAg4QEgAAAAAegBIADbAgAhAuEBIAAAAAHoASAA3AIAIQjYAQAA3QIAMNkBAADHAQAQ2gEAAN0CADDgAUAAyAIAIe8BAQDHAgAhhQJAAMgCACGGAgEAxwIAIYcCIADeAgAhAuEBIAAAAAHoASAA3AIAIQLvAQEAAAABhgIBAAAAAQbYAQAA4AIAMNkBAADBAQAQ2gEAAOACADDgAUAAwAIAIe8BAQC_AgAh8QEBAL8CACEG2AEAAOECADDZAQAAqwEAENoBAADhAgAwiQIBAL8CACGKAgEAvwIAIYsCAgDPAgAhCNgBAADiAgAw2QEAAJUBABDaAQAA4gIAMOABQADAAgAh7wEBAL8CACGFAkAAwAIAIYwCAQC_AgAhjgIAAOMCjgIiBwgAAMICACAiAADlAgAgIwAA5QIAIOEBAAAAjgIC4gEAAACOAgjjAQAAAI4CCOgBAADkAo4CIgcIAADCAgAgIgAA5QIAICMAAOUCACDhAQAAAI4CAuIBAAAAjgII4wEAAACOAgjoAQAA5AKOAiIE4QEAAACOAgLiAQAAAI4CCOMBAAAAjgII6AEAAOUCjgIiDtgBAADmAgAw2QEAAH8AENoBAADmAgAw4AFAAMACACHxAQEAvwIAIYUCQADAAgAhjwIBAL8CACGQAgEAvwIAIZECAQC_AgAhkgIBAL8CACGTAgEAvwIAIZQCAQDnAgAhlQJAAOgCACGWAgEA5wIAIQ4IAADqAgAgIgAA7QIAICMAAO0CACDhAQEAAAAB4gEBAAAABeMBAQAAAAXkAQEAAAAB5QEBAAAAAeYBAQAAAAHnAQEAAAAB6AEBAOwCACHpAQEAAAAB6gEBAAAAAesBAQAAAAELCAAA6gIAICIAAOsCACAjAADrAgAg4QFAAAAAAeIBQAAAAAXjAUAAAAAF5AFAAAAAAeUBQAAAAAHmAUAAAAAB5wFAAAAAAegBQADpAgAhCwgAAOoCACAiAADrAgAgIwAA6wIAIOEBQAAAAAHiAUAAAAAF4wFAAAAABeQBQAAAAAHlAUAAAAAB5gFAAAAAAecBQAAAAAHoAUAA6QIAIQjhAQIAAAAB4gECAAAABeMBAgAAAAXkAQIAAAAB5QECAAAAAeYBAgAAAAHnAQIAAAAB6AECAOoCACEI4QFAAAAAAeIBQAAAAAXjAUAAAAAF5AFAAAAAAeUBQAAAAAHmAUAAAAAB5wFAAAAAAegBQADrAgAhDggAAOoCACAiAADtAgAgIwAA7QIAIOEBAQAAAAHiAQEAAAAF4wEBAAAABeQBAQAAAAHlAQEAAAAB5gEBAAAAAecBAQAAAAHoAQEA7AIAIekBAQAAAAHqAQEAAAAB6wEBAAAAAQvhAQEAAAAB4gEBAAAABeMBAQAAAAXkAQEAAAAB5QEBAAAAAeYBAQAAAAHnAQEAAAAB6AEBAO0CACHpAQEAAAAB6gEBAAAAAesBAQAAAAEJ2AEAAO4CADDZAQAAaQAQ2gEAAO4CADDgAUAAwAIAIY8CAQC_AgAhlwIBAL8CACGYAgEA5wIAIZkCQADoAgAhmgIBAOcCACEJ2AEAAO8CADDZAQAAVgAQ2gEAAO8CADDgAUAAyAIAIY8CAQDHAgAhlwIBAMcCACGYAgEA8AIAIZkCQADxAgAhmgIBAPACACEL4QEBAAAAAeIBAQAAAAXjAQEAAAAF5AEBAAAAAeUBAQAAAAHmAQEAAAAB5wEBAAAAAegBAQDtAgAh6QEBAAAAAeoBAQAAAAHrAQEAAAABCOEBQAAAAAHiAUAAAAAF4wFAAAAABeQBQAAAAAHlAUAAAAAB5gFAAAAAAecBQAAAAAHoAUAA6wIAIQnYAQAA8gIAMNkBAABQABDaAQAA8gIAMOABQADAAgAh7wEBAL8CACGPAgEAvwIAIZgCAQDnAgAhmQJAAOgCACGaAgEA5wIAIQnYAQAA8wIAMNkBAAA9ABDaAQAA8wIAMOABQADIAgAh7wEBAMcCACGPAgEAxwIAIZgCAQDwAgAhmQJAAPECACGaAgEA8AIAIRLYAQAA9AIAMNkBAAA3ABDaAQAA9AIAMOABQADAAgAh7gEBAOcCACGFAkAAwAIAIYYCAQDnAgAhjwIBAL8CACGSAgEAvwIAIZMCAQC_AgAhlQJAAOgCACGWAgEA5wIAIZsCAQDnAgAhnAIBAL8CACGdAiAA2gIAIZ4CIADaAgAhnwJAAOgCACGgAgEA5wIAIQLvAQEAAAAB8QEBAAAAAQgFAAD3AgAg2AEAAPYCADDZAQAAGQAQ2gEAAPYCADDvAQEAxwIAIfEBAQDHAgAhhAJAAMgCACGFAkAAyAIAIRsBAACDAwAgBAAAhAMAIAkAAIUDACAMAACGAwAgDQAAhgMAIA4AAIcDACAPAACIAwAg2AEAAIIDADDZAQAAAwAQ2gEAAIIDADDgAUAAyAIAIe4BAQDwAgAhhQJAAMgCACGGAgEA8AIAIY8CAQDHAgAhkgIBAMcCACGTAgEAxwIAIZUCQADxAgAhlgIBAPACACGbAgEA8AIAIZwCAQDHAgAhnQIgAN4CACGeAiAA3gIAIZ8CQADxAgAhoAIBAPACACGnAgAAAwAgqAIAAAMAIALvAQEAAAAB8QEBAAAAAQcFAAD3AgAg2AEAAPkCADDZAQAAFQAQ2gEAAPkCADDgAUAAyAIAIe8BAQDHAgAh8QEBAMcCACECiQIBAAAAAYoCAQAAAAEICgAA9wIAIAsAAPcCACDYAQAA-wIAMNkBAAAQABDaAQAA-wIAMIkCAQDHAgAhigIBAMcCACGLAgIA1gIAIQLvAQEAAAABjAIBAAAAAQkGAAD_AgAg2AEAAP0CADDZAQAACwAQ2gEAAP0CADDgAUAAyAIAIe8BAQDHAgAhhQJAAMgCACGMAgEAxwIAIY4CAAD-Ao4CIgThAQAAAI4CAuIBAAAAjgII4wEAAACOAgjoAQAA5QKOAiISBQAA9wIAIAcAAIEDACDYAQAAgAMAMNkBAAAHABDaAQAAgAMAMOABQADIAgAh8QEBAMcCACGFAkAAyAIAIY8CAQDHAgAhkAIBAMcCACGRAgEAxwIAIZICAQDHAgAhkwIBAMcCACGUAgEA8AIAIZUCQADxAgAhlgIBAPACACGnAgAABwAgqAIAAAcAIBAFAAD3AgAgBwAAgQMAINgBAACAAwAw2QEAAAcAENoBAACAAwAw4AFAAMgCACHxAQEAxwIAIYUCQADIAgAhjwIBAMcCACGQAgEAxwIAIZECAQDHAgAhkgIBAMcCACGTAgEAxwIAIZQCAQDwAgAhlQJAAPECACGWAgEA8AIAIQOkAgAACwAgpQIAAAsAIKYCAAALACAZAQAAgwMAIAQAAIQDACAJAACFAwAgDAAAhgMAIA0AAIYDACAOAACHAwAgDwAAiAMAINgBAACCAwAw2QEAAAMAENoBAACCAwAw4AFAAMgCACHuAQEA8AIAIYUCQADIAgAhhgIBAPACACGPAgEAxwIAIZICAQDHAgAhkwIBAMcCACGVAkAA8QIAIZYCAQDwAgAhmwIBAPACACGcAgEAxwIAIZ0CIADeAgAhngIgAN4CACGfAkAA8QIAIaACAQDwAgAhGwEAAIMDACAEAACEAwAgCQAAhQMAIAwAAIYDACANAACGAwAgDgAAhwMAIA8AAIgDACDYAQAAggMAMNkBAAADABDaAQAAggMAMOABQADIAgAh7gEBAPACACGFAkAAyAIAIYYCAQDwAgAhjwIBAMcCACGSAgEAxwIAIZMCAQDHAgAhlQJAAPECACGWAgEA8AIAIZsCAQDwAgAhnAIBAMcCACGdAiAA3gIAIZ4CIADeAgAhnwJAAPECACGgAgEA8AIAIacCAAADACCoAgAAAwAgA6QCAAADACClAgAAAwAgpgIAAAMAIAOkAgAABwAgpQIAAAcAIKYCAAAHACADpAIAABAAIKUCAAAQACCmAgAAEAAgA6QCAAAVACClAgAAFQAgpgIAABUAIAOkAgAAGQAgpQIAABkAIKYCAAAZACAAAAABrAIBAAAAAQGsAkAAAAABAAAAAAAAAAAFrAICAAAAAbMCAgAAAAG0AgIAAAABtQICAAAAAbYCAgAAAAECrAIBAAAABLICAQAAAAUCrAIBAAAABLICAQAAAAUCrAIBAAAABLICAQAAAAUBrAIBAAAABAGsAgEAAAAEAawCAQAAAAQAAAAFHAAA2QQAIB0AANwEACCpAgAA2gQAIKoCAADbBAAgrwIAAAEAIAMcAADZBAAgqQIAANoEACCvAgAAAQAgAAAAAawCIAAAAAEAAAAFHAAA1AQAIB0AANcEACCpAgAA1QQAIKoCAADWBAAgrwIAAAEAIAMcAADUBAAgqQIAANUEACCvAgAAAQAgAAAAAAAFHAAAzAQAIB0AANIEACCpAgAAzQQAIKoCAADRBAAgrwIAAAEAIAUcAADKBAAgHQAAzwQAIKkCAADLBAAgqgIAAM4EACCvAgAAAQAgAxwAAMwEACCpAgAAzQQAIK8CAAABACADHAAAygQAIKkCAADLBAAgrwIAAAEAIAAAAAGsAgAAAI4CAgUcAADFBAAgHQAAyAQAIKkCAADGBAAgqgIAAMcEACCvAgAACQAgAxwAAMUEACCpAgAAxgQAIK8CAAAJACAAAAAAAawCAQAAAAEBrAJAAAAAAQUcAAC_BAAgHQAAwwQAIKkCAADABAAgqgIAAMIEACCvAgAAAQAgCxwAAMIDADAdAADHAwAwqQIAAMMDADCqAgAAxAMAMKsCAADFAwAgrAIAAMYDADCtAgAAxgMAMK4CAADGAwAwrwIAAMYDADCwAgAAyAMAMLECAADJAwAwBOABQAAAAAHvAQEAAAABhQJAAAAAAY4CAAAAjgICAgAAAA0AIBwAAM0DACADAAAADQAgHAAAzQMAIB0AAMwDACABFQAAwQQAMAoGAAD_AgAg2AEAAP0CADDZAQAACwAQ2gEAAP0CADDgAUAAyAIAIe8BAQDHAgAhhQJAAMgCACGMAgEAxwIAIY4CAAD-Ao4CIqMCAAD8AgAgAgAAAA0AIBUAAMwDACACAAAAygMAIBUAAMsDACAI2AEAAMkDADDZAQAAygMAENoBAADJAwAw4AFAAMgCACHvAQEAxwIAIYUCQADIAgAhjAIBAMcCACGOAgAA_gKOAiII2AEAAMkDADDZAQAAygMAENoBAADJAwAw4AFAAMgCACHvAQEAxwIAIYUCQADIAgAhjAIBAMcCACGOAgAA_gKOAiIE4AFAAI0DACHvAQEAjAMAIYUCQACNAwAhjgIAALcDjgIiBOABQACNAwAh7wEBAIwDACGFAkAAjQMAIY4CAAC3A44CIgTgAUAAAAAB7wEBAAAAAYUCQAAAAAGOAgAAAI4CAgMcAAC_BAAgqQIAAMAEACCvAgAAAQAgBBwAAMIDADCpAgAAwwMAMKsCAADFAwAgrwIAAMYDADAAAAAAAAAAAAAHHAAAtAQAIB0AAL0EACCpAgAAtQQAIKoCAAC8BAAgrQIAAAMAIK4CAAADACCvAgAAAQAgCxwAAJkEADAdAACeBAAwqQIAAJoEADCqAgAAmwQAMKsCAACcBAAgrAIAAJ0EADCtAgAAnQQAMK4CAACdBAAwrwIAAJ0EADCwAgAAnwQAMLECAACgBAAwCxwAAI0EADAdAACSBAAwqQIAAI4EADCqAgAAjwQAMKsCAACQBAAgrAIAAJEEADCtAgAAkQQAMK4CAACRBAAwrwIAAJEEADCwAgAAkwQAMLECAACUBAAwCxwAAIQEADAdAACIBAAwqQIAAIUEADCqAgAAhgQAMKsCAACHBAAgrAIAAPwDADCtAgAA_AMAMK4CAAD8AwAwrwIAAPwDADCwAgAAiQQAMLECAAD_AwAwCxwAAPgDADAdAAD9AwAwqQIAAPkDADCqAgAA-gMAMKsCAAD7AwAgrAIAAPwDADCtAgAA_AMAMK4CAAD8AwAwrwIAAPwDADCwAgAA_gMAMLECAAD_AwAwCxwAAOwDADAdAADxAwAwqQIAAO0DADCqAgAA7gMAMKsCAADvAwAgrAIAAPADADCtAgAA8AMAMK4CAADwAwAwrwIAAPADADCwAgAA8gMAMLECAADzAwAwCxwAAOADADAdAADlAwAwqQIAAOEDADCqAgAA4gMAMKsCAADjAwAgrAIAAOQDADCtAgAA5AMAMK4CAADkAwAwrwIAAOQDADCwAgAA5gMAMLECAADnAwAwA-8BAQAAAAGEAkAAAAABhQJAAAAAAQIAAAAbACAcAADrAwAgAwAAABsAIBwAAOsDACAdAADqAwAgARUAALsEADAJBQAA9wIAINgBAAD2AgAw2QEAABkAENoBAAD2AgAw7wEBAMcCACHxAQEAxwIAIYQCQADIAgAhhQJAAMgCACGhAgAA9QIAIAIAAAAbACAVAADqAwAgAgAAAOgDACAVAADpAwAgB9gBAADnAwAw2QEAAOgDABDaAQAA5wMAMO8BAQDHAgAh8QEBAMcCACGEAkAAyAIAIYUCQADIAgAhB9gBAADnAwAw2QEAAOgDABDaAQAA5wMAMO8BAQDHAgAh8QEBAMcCACGEAkAAyAIAIYUCQADIAgAhA-8BAQCMAwAhhAJAAI0DACGFAkAAjQMAIQPvAQEAjAMAIYQCQACNAwAhhQJAAI0DACED7wEBAAAAAYQCQAAAAAGFAkAAAAABAuABQAAAAAHvAQEAAAABAgAAABcAIBwAAPcDACADAAAAFwAgHAAA9wMAIB0AAPYDACABFQAAugQAMAgFAAD3AgAg2AEAAPkCADDZAQAAFQAQ2gEAAPkCADDgAUAAyAIAIe8BAQDHAgAh8QEBAMcCACGhAgAA-AIAIAIAAAAXACAVAAD2AwAgAgAAAPQDACAVAAD1AwAgBtgBAADzAwAw2QEAAPQDABDaAQAA8wMAMOABQADIAgAh7wEBAMcCACHxAQEAxwIAIQbYAQAA8wMAMNkBAAD0AwAQ2gEAAPMDADDgAUAAyAIAIe8BAQDHAgAh8QEBAMcCACEC4AFAAI0DACHvAQEAjAMAIQLgAUAAjQMAIe8BAQCMAwAhAuABQAAAAAHvAQEAAAABAwoAALIDACCJAgEAAAABiwICAAAAAQIAAAASACAcAACDBAAgAwAAABIAIBwAAIMEACAdAACCBAAgARUAALkEADAJCgAA9wIAIAsAAPcCACDYAQAA-wIAMNkBAAAQABDaAQAA-wIAMIkCAQDHAgAhigIBAMcCACGLAgIA1gIAIaICAAD6AgAgAgAAABIAIBUAAIIEACACAAAAgAQAIBUAAIEEACAG2AEAAP8DADDZAQAAgAQAENoBAAD_AwAwiQIBAMcCACGKAgEAxwIAIYsCAgDWAgAhBtgBAAD_AwAw2QEAAIAEABDaAQAA_wMAMIkCAQDHAgAhigIBAMcCACGLAgIA1gIAIQKJAgEAjAMAIYsCAgCWAwAhAwoAALADACCJAgEAjAMAIYsCAgCWAwAhAwoAALIDACCJAgEAAAABiwICAAAAAQMLAACzAwAgigIBAAAAAYsCAgAAAAECAAAAEgAgHAAAjAQAIAMAAAASACAcAACMBAAgHQAAiwQAIAEVAAC4BAAwAgAAABIAIBUAAIsEACACAAAAgAQAIBUAAIoEACACigIBAIwDACGLAgIAlgMAIQMLAACxAwAgigIBAIwDACGLAgIAlgMAIQMLAACzAwAgigIBAAAAAYsCAgAAAAELBwAAzwMAIOABQAAAAAGFAkAAAAABjwIBAAAAAZACAQAAAAGRAgEAAAABkgIBAAAAAZMCAQAAAAGUAgEAAAABlQJAAAAAAZYCAQAAAAECAAAACQAgHAAAmAQAIAMAAAAJACAcAACYBAAgHQAAlwQAIAEVAAC3BAAwEAUAAPcCACAHAACBAwAg2AEAAIADADDZAQAABwAQ2gEAAIADADDgAUAAyAIAIfEBAQDHAgAhhQJAAMgCACGPAgEAAAABkAIBAMcCACGRAgEAxwIAIZICAQDHAgAhkwIBAMcCACGUAgEA8AIAIZUCQADxAgAhlgIBAPACACECAAAACQAgFQAAlwQAIAIAAACVBAAgFQAAlgQAIA7YAQAAlAQAMNkBAACVBAAQ2gEAAJQEADDgAUAAyAIAIfEBAQDHAgAhhQJAAMgCACGPAgEAxwIAIZACAQDHAgAhkQIBAMcCACGSAgEAxwIAIZMCAQDHAgAhlAIBAPACACGVAkAA8QIAIZYCAQDwAgAhDtgBAACUBAAw2QEAAJUEABDaAQAAlAQAMOABQADIAgAh8QEBAMcCACGFAkAAyAIAIY8CAQDHAgAhkAIBAMcCACGRAgEAxwIAIZICAQDHAgAhkwIBAMcCACGUAgEA8AIAIZUCQADxAgAhlgIBAPACACEK4AFAAI0DACGFAkAAjQMAIY8CAQCMAwAhkAIBAIwDACGRAgEAjAMAIZICAQCMAwAhkwIBAIwDACGUAgEAvgMAIZUCQAC_AwAhlgIBAL4DACELBwAAwQMAIOABQACNAwAhhQJAAI0DACGPAgEAjAMAIZACAQCMAwAhkQIBAIwDACGSAgEAjAMAIZMCAQCMAwAhlAIBAL4DACGVAkAAvwMAIZYCAQC-AwAhCwcAAM8DACDgAUAAAAABhQJAAAAAAY8CAQAAAAGQAgEAAAABkQIBAAAAAZICAQAAAAGTAgEAAAABlAIBAAAAAZUCQAAAAAGWAgEAAAABFAQAAKUEACAJAACmBAAgDAAApwQAIA0AAKgEACAOAACpBAAgDwAAqgQAIOABQAAAAAHuAQEAAAABhQJAAAAAAYYCAQAAAAGPAgEAAAABkgIBAAAAAZMCAQAAAAGVAkAAAAABlgIBAAAAAZwCAQAAAAGdAiAAAAABngIgAAAAAZ8CQAAAAAGgAgEAAAABAgAAAAEAIBwAAKQEACADAAAAAQAgHAAApAQAIB0AAKMEACABFQAAtgQAMBkBAACDAwAgBAAAhAMAIAkAAIUDACAMAACGAwAgDQAAhgMAIA4AAIcDACAPAACIAwAg2AEAAIIDADDZAQAAAwAQ2gEAAIIDADDgAUAAyAIAIe4BAQDwAgAhhQJAAMgCACGGAgEA8AIAIY8CAQAAAAGSAgEAxwIAIZMCAQDHAgAhlQJAAPECACGWAgEA8AIAIZsCAQDwAgAhnAIBAMcCACGdAiAA3gIAIZ4CIADeAgAhnwJAAPECACGgAgEA8AIAIQIAAAABACAVAACjBAAgAgAAAKEEACAVAACiBAAgEtgBAACgBAAw2QEAAKEEABDaAQAAoAQAMOABQADIAgAh7gEBAPACACGFAkAAyAIAIYYCAQDwAgAhjwIBAMcCACGSAgEAxwIAIZMCAQDHAgAhlQJAAPECACGWAgEA8AIAIZsCAQDwAgAhnAIBAMcCACGdAiAA3gIAIZ4CIADeAgAhnwJAAPECACGgAgEA8AIAIRLYAQAAoAQAMNkBAAChBAAQ2gEAAKAEADDgAUAAyAIAIe4BAQDwAgAhhQJAAMgCACGGAgEA8AIAIY8CAQDHAgAhkgIBAMcCACGTAgEAxwIAIZUCQADxAgAhlgIBAPACACGbAgEA8AIAIZwCAQDHAgAhnQIgAN4CACGeAiAA3gIAIZ8CQADxAgAhoAIBAPACACEO4AFAAI0DACHuAQEAvgMAIYUCQACNAwAhhgIBAL4DACGPAgEAjAMAIZICAQCMAwAhkwIBAIwDACGVAkAAvwMAIZYCAQC-AwAhnAIBAIwDACGdAiAApQMAIZ4CIAClAwAhnwJAAL8DACGgAgEAvgMAIRQEAADaAwAgCQAA2wMAIAwAANwDACANAADdAwAgDgAA3gMAIA8AAN8DACDgAUAAjQMAIe4BAQC-AwAhhQJAAI0DACGGAgEAvgMAIY8CAQCMAwAhkgIBAIwDACGTAgEAjAMAIZUCQAC_AwAhlgIBAL4DACGcAgEAjAMAIZ0CIAClAwAhngIgAKUDACGfAkAAvwMAIaACAQC-AwAhFAQAAKUEACAJAACmBAAgDAAApwQAIA0AAKgEACAOAACpBAAgDwAAqgQAIOABQAAAAAHuAQEAAAABhQJAAAAAAYYCAQAAAAGPAgEAAAABkgIBAAAAAZMCAQAAAAGVAkAAAAABlgIBAAAAAZwCAQAAAAGdAiAAAAABngIgAAAAAZ8CQAAAAAGgAgEAAAABBBwAAJkEADCpAgAAmgQAMKsCAACcBAAgrwIAAJ0EADAEHAAAjQQAMKkCAACOBAAwqwIAAJAEACCvAgAAkQQAMAQcAACEBAAwqQIAAIUEADCrAgAAhwQAIK8CAAD8AwAwBBwAAPgDADCpAgAA-QMAMKsCAAD7AwAgrwIAAPwDADAEHAAA7AMAMKkCAADtAwAwqwIAAO8DACCvAgAA8AMAMAQcAADgAwAwqQIAAOEDADCrAgAA4wMAIK8CAADkAwAwAxwAALQEACCpAgAAtQQAIK8CAAABACAOAQAArAQAIAQAAK8EACAJAACwBAAgDAAAsQQAIA0AALEEACAOAACyBAAgDwAAswQAIO4BAAC6AwAghgIAALoDACCVAgAAugMAIJYCAAC6AwAgmwIAALoDACCfAgAAugMAIKACAAC6AwAgBQUAAKwEACAHAACuBAAglAIAALoDACCVAgAAugMAIJYCAAC6AwAgAAAAAAAAFQEAAKsEACAJAACmBAAgDAAApwQAIA0AAKgEACAOAACpBAAgDwAAqgQAIOABQAAAAAHuAQEAAAABhQJAAAAAAYYCAQAAAAGPAgEAAAABkgIBAAAAAZMCAQAAAAGVAkAAAAABlgIBAAAAAZsCAQAAAAGcAgEAAAABnQIgAAAAAZ4CIAAAAAGfAkAAAAABoAIBAAAAAQIAAAABACAcAAC0BAAgDuABQAAAAAHuAQEAAAABhQJAAAAAAYYCAQAAAAGPAgEAAAABkgIBAAAAAZMCAQAAAAGVAkAAAAABlgIBAAAAAZwCAQAAAAGdAiAAAAABngIgAAAAAZ8CQAAAAAGgAgEAAAABCuABQAAAAAGFAkAAAAABjwIBAAAAAZACAQAAAAGRAgEAAAABkgIBAAAAAZMCAQAAAAGUAgEAAAABlQJAAAAAAZYCAQAAAAECigIBAAAAAYsCAgAAAAECiQIBAAAAAYsCAgAAAAEC4AFAAAAAAe8BAQAAAAED7wEBAAAAAYQCQAAAAAGFAkAAAAABAwAAAAMAIBwAALQEACAdAAC-BAAgFwAAAAMAIAEAANkDACAJAADbAwAgDAAA3AMAIA0AAN0DACAOAADeAwAgDwAA3wMAIBUAAL4EACDgAUAAjQMAIe4BAQC-AwAhhQJAAI0DACGGAgEAvgMAIY8CAQCMAwAhkgIBAIwDACGTAgEAjAMAIZUCQAC_AwAhlgIBAL4DACGbAgEAvgMAIZwCAQCMAwAhnQIgAKUDACGeAiAApQMAIZ8CQAC_AwAhoAIBAL4DACEVAQAA2QMAIAkAANsDACAMAADcAwAgDQAA3QMAIA4AAN4DACAPAADfAwAg4AFAAI0DACHuAQEAvgMAIYUCQACNAwAhhgIBAL4DACGPAgEAjAMAIZICAQCMAwAhkwIBAIwDACGVAkAAvwMAIZYCAQC-AwAhmwIBAL4DACGcAgEAjAMAIZ0CIAClAwAhngIgAKUDACGfAkAAvwMAIaACAQC-AwAhFQEAAKsEACAEAAClBAAgDAAApwQAIA0AAKgEACAOAACpBAAgDwAAqgQAIOABQAAAAAHuAQEAAAABhQJAAAAAAYYCAQAAAAGPAgEAAAABkgIBAAAAAZMCAQAAAAGVAkAAAAABlgIBAAAAAZsCAQAAAAGcAgEAAAABnQIgAAAAAZ4CIAAAAAGfAkAAAAABoAIBAAAAAQIAAAABACAcAAC_BAAgBOABQAAAAAHvAQEAAAABhQJAAAAAAY4CAAAAjgICAwAAAAMAIBwAAL8EACAdAADEBAAgFwAAAAMAIAEAANkDACAEAADaAwAgDAAA3AMAIA0AAN0DACAOAADeAwAgDwAA3wMAIBUAAMQEACDgAUAAjQMAIe4BAQC-AwAhhQJAAI0DACGGAgEAvgMAIY8CAQCMAwAhkgIBAIwDACGTAgEAjAMAIZUCQAC_AwAhlgIBAL4DACGbAgEAvgMAIZwCAQCMAwAhnQIgAKUDACGeAiAApQMAIZ8CQAC_AwAhoAIBAL4DACEVAQAA2QMAIAQAANoDACAMAADcAwAgDQAA3QMAIA4AAN4DACAPAADfAwAg4AFAAI0DACHuAQEAvgMAIYUCQACNAwAhhgIBAL4DACGPAgEAjAMAIZICAQCMAwAhkwIBAIwDACGVAkAAvwMAIZYCAQC-AwAhmwIBAL4DACGcAgEAjAMAIZ0CIAClAwAhngIgAKUDACGfAkAAvwMAIaACAQC-AwAhDAUAAM4DACDgAUAAAAAB8QEBAAAAAYUCQAAAAAGPAgEAAAABkAIBAAAAAZECAQAAAAGSAgEAAAABkwIBAAAAAZQCAQAAAAGVAkAAAAABlgIBAAAAAQIAAAAJACAcAADFBAAgAwAAAAcAIBwAAMUEACAdAADJBAAgDgAAAAcAIAUAAMADACAVAADJBAAg4AFAAI0DACHxAQEAjAMAIYUCQACNAwAhjwIBAIwDACGQAgEAjAMAIZECAQCMAwAhkgIBAIwDACGTAgEAjAMAIZQCAQC-AwAhlQJAAL8DACGWAgEAvgMAIQwFAADAAwAg4AFAAI0DACHxAQEAjAMAIYUCQACNAwAhjwIBAIwDACGQAgEAjAMAIZECAQCMAwAhkgIBAIwDACGTAgEAjAMAIZQCAQC-AwAhlQJAAL8DACGWAgEAvgMAIRUBAACrBAAgBAAApQQAIAkAAKYEACAMAACnBAAgDgAAqQQAIA8AAKoEACDgAUAAAAAB7gEBAAAAAYUCQAAAAAGGAgEAAAABjwIBAAAAAZICAQAAAAGTAgEAAAABlQJAAAAAAZYCAQAAAAGbAgEAAAABnAIBAAAAAZ0CIAAAAAGeAiAAAAABnwJAAAAAAaACAQAAAAECAAAAAQAgHAAAygQAIBUBAACrBAAgBAAApQQAIAkAAKYEACANAACoBAAgDgAAqQQAIA8AAKoEACDgAUAAAAAB7gEBAAAAAYUCQAAAAAGGAgEAAAABjwIBAAAAAZICAQAAAAGTAgEAAAABlQJAAAAAAZYCAQAAAAGbAgEAAAABnAIBAAAAAZ0CIAAAAAGeAiAAAAABnwJAAAAAAaACAQAAAAECAAAAAQAgHAAAzAQAIAMAAAADACAcAADKBAAgHQAA0AQAIBcAAAADACABAADZAwAgBAAA2gMAIAkAANsDACAMAADcAwAgDgAA3gMAIA8AAN8DACAVAADQBAAg4AFAAI0DACHuAQEAvgMAIYUCQACNAwAhhgIBAL4DACGPAgEAjAMAIZICAQCMAwAhkwIBAIwDACGVAkAAvwMAIZYCAQC-AwAhmwIBAL4DACGcAgEAjAMAIZ0CIAClAwAhngIgAKUDACGfAkAAvwMAIaACAQC-AwAhFQEAANkDACAEAADaAwAgCQAA2wMAIAwAANwDACAOAADeAwAgDwAA3wMAIOABQACNAwAh7gEBAL4DACGFAkAAjQMAIYYCAQC-AwAhjwIBAIwDACGSAgEAjAMAIZMCAQCMAwAhlQJAAL8DACGWAgEAvgMAIZsCAQC-AwAhnAIBAIwDACGdAiAApQMAIZ4CIAClAwAhnwJAAL8DACGgAgEAvgMAIQMAAAADACAcAADMBAAgHQAA0wQAIBcAAAADACABAADZAwAgBAAA2gMAIAkAANsDACANAADdAwAgDgAA3gMAIA8AAN8DACAVAADTBAAg4AFAAI0DACHuAQEAvgMAIYUCQACNAwAhhgIBAL4DACGPAgEAjAMAIZICAQCMAwAhkwIBAIwDACGVAkAAvwMAIZYCAQC-AwAhmwIBAL4DACGcAgEAjAMAIZ0CIAClAwAhngIgAKUDACGfAkAAvwMAIaACAQC-AwAhFQEAANkDACAEAADaAwAgCQAA2wMAIA0AAN0DACAOAADeAwAgDwAA3wMAIOABQACNAwAh7gEBAL4DACGFAkAAjQMAIYYCAQC-AwAhjwIBAIwDACGSAgEAjAMAIZMCAQCMAwAhlQJAAL8DACGWAgEAvgMAIZsCAQC-AwAhnAIBAIwDACGdAiAApQMAIZ4CIAClAwAhnwJAAL8DACGgAgEAvgMAIRUBAACrBAAgBAAApQQAIAkAAKYEACAMAACnBAAgDQAAqAQAIA8AAKoEACDgAUAAAAAB7gEBAAAAAYUCQAAAAAGGAgEAAAABjwIBAAAAAZICAQAAAAGTAgEAAAABlQJAAAAAAZYCAQAAAAGbAgEAAAABnAIBAAAAAZ0CIAAAAAGeAiAAAAABnwJAAAAAAaACAQAAAAECAAAAAQAgHAAA1AQAIAMAAAADACAcAADUBAAgHQAA2AQAIBcAAAADACABAADZAwAgBAAA2gMAIAkAANsDACAMAADcAwAgDQAA3QMAIA8AAN8DACAVAADYBAAg4AFAAI0DACHuAQEAvgMAIYUCQACNAwAhhgIBAL4DACGPAgEAjAMAIZICAQCMAwAhkwIBAIwDACGVAkAAvwMAIZYCAQC-AwAhmwIBAL4DACGcAgEAjAMAIZ0CIAClAwAhngIgAKUDACGfAkAAvwMAIaACAQC-AwAhFQEAANkDACAEAADaAwAgCQAA2wMAIAwAANwDACANAADdAwAgDwAA3wMAIOABQACNAwAh7gEBAL4DACGFAkAAjQMAIYYCAQC-AwAhjwIBAIwDACGSAgEAjAMAIZMCAQCMAwAhlQJAAL8DACGWAgEAvgMAIZsCAQC-AwAhnAIBAIwDACGdAiAApQMAIZ4CIAClAwAhnwJAAL8DACGgAgEAvgMAIRUBAACrBAAgBAAApQQAIAkAAKYEACAMAACnBAAgDQAAqAQAIA4AAKkEACDgAUAAAAAB7gEBAAAAAYUCQAAAAAGGAgEAAAABjwIBAAAAAZICAQAAAAGTAgEAAAABlQJAAAAAAZYCAQAAAAGbAgEAAAABnAIBAAAAAZ0CIAAAAAGeAiAAAAABnwJAAAAAAaACAQAAAAECAAAAAQAgHAAA2QQAIAMAAAADACAcAADZBAAgHQAA3QQAIBcAAAADACABAADZAwAgBAAA2gMAIAkAANsDACAMAADcAwAgDQAA3QMAIA4AAN4DACAVAADdBAAg4AFAAI0DACHuAQEAvgMAIYUCQACNAwAhhgIBAL4DACGPAgEAjAMAIZICAQCMAwAhkwIBAIwDACGVAkAAvwMAIZYCAQC-AwAhmwIBAL4DACGcAgEAjAMAIZ0CIAClAwAhngIgAKUDACGfAkAAvwMAIaACAQC-AwAhFQEAANkDACAEAADaAwAgCQAA2wMAIAwAANwDACANAADdAwAgDgAA3gMAIOABQACNAwAh7gEBAL4DACGFAkAAjQMAIYYCAQC-AwAhjwIBAIwDACGSAgEAjAMAIZMCAQCMAwAhlQJAAL8DACGWAgEAvgMAIZsCAQC-AwAhnAIBAIwDACGdAiAApQMAIZ4CIAClAwAhnwJAAL8DACGgAgEAvgMAIQgBBAEEBgEIAAgJCgIMEwUNFAUOGAYPHAcDBQABBw4DCAAEAQYAAgEHDwACCgABCwABAQUAAQEFAAEGBB0ACR4ADB8ADSAADiEADyIAAAEBLAEBATIBAwgADSIADiMADwAAAAMIAA0iAA4jAA8AAAADCAAVIgAWIwAXAAAAAwgAFSIAFiMAFwAAAAMIAB0iAB4jAB8AAAADCAAdIgAeIwAfAQUAAQEFAAEDCAAkIgAlIwAmAAAAAwgAJCIAJSMAJgEGAAIBBgACAwgAKyIALCMALQAAAAMIACsiACwjAC0CCgABCwABAgoAAQsAAQUIADIiADUjADZ0ADN1ADQAAAAAAAUIADIiADUjADZ0ADN1ADQBBQABAQUAAQMIADsiADwjAD0AAAADCAA7IgA8IwA9AAAAAwgAQyIARCMARQAAAAMIAEMiAEQjAEUBBQABAQUAAQMIAEoiAEsjAEwAAAADCABKIgBLIwBMAAAABQgAUiIAVSMAVnQAU3UAVAAAAAAABQgAUiIAVSMAVnQAU3UAVAAAAAMIAFwiAF0jAF4AAAADCABcIgBdIwBeAAAAAwgAZCIAZSMAZgAAAAMIAGQiAGUjAGYQAgERIwESJAETJQEUJgEWKAEXKgkYKwoZLgEaMAkbMQseMwEfNAEgNQkkOAwlORAmOxEnPBEoPxEpQBEqQRErQxEsRQktRhIuSBEvSgkwSxMxTBEyTREzTgk0URQ1Uhg2VBk3VRk4WBk5WRk6Whk7XBk8Xgk9Xxo-YRk_YwlAZBtBZRlCZhlDZwlEahxFayBGbAJHbQJIbgJJbwJKcAJLcgJMdAlNdSFOdwJPeQlQeiJRewJSfAJTfQlUgAEjVYEBJ1aCAQNXgwEDWIQBA1mFAQNahgEDW4gBA1yKAQldiwEoXo0BA1-PAQlgkAEpYZEBA2KSAQNjkwEJZJYBKmWXAS5mmAEFZ5kBBWiaAQVpmwEFapwBBWueAQVsoAEJbaEBL26jAQVvpQEJcKYBMHGnAQVyqAEFc6kBCXasATF3rQE3eK4BBnmvAQZ6sAEGe7EBBnyyAQZ9tAEGfrYBCX-3ATiAAbkBBoEBuwEJggG8ATmDAb0BBoQBvgEGhQG_AQmGAcIBOocBwwE-iAHFAT-JAcYBP4oByQE_iwHKAT-MAcsBP40BzQE_jgHPAQmPAdABQJAB0gE_kQHUAQmSAdUBQZMB1gE_lAHXAT-VAdgBCZYB2wFClwHcAUaYAd0BB5kB3gEHmgHfAQebAeABB5wB4QEHnQHjAQeeAeUBCZ8B5gFHoAHoAQehAeoBCaIB6wFIowHsAQekAe0BB6UB7gEJpgHxAUmnAfIBTagB9AFOqQH1AU6qAfgBTqsB-QFOrAH6AU6tAfwBTq4B_gEJrwH_AU-wAYECTrEBgwIJsgGEAlCzAYUCTrQBhgJOtQGHAgm2AYoCUbcBiwJXuAGNAli5AY4CWLoBkQJYuwGSAli8AZMCWL0BlQJYvgGXAgm_AZgCWcABmgJYwQGcAgnCAZ0CWsMBngJYxAGfAljFAaACCcYBowJbxwGkAl_IAaYCYMkBpwJgygGqAmDLAasCYMwBrAJgzQGuAmDOAbACCc8BsQJh0AGzAmDRAbUCCdIBtgJi0wG3AmDUAbgCYNUBuQIJ1gG8AmPXAb0CZw" } config.compilerWasm = { getRuntime: async () => require('./query_compiler_fast_bg.js'), diff --git a/packages/forums-prisma-client/package.json b/packages/forums-prisma-client/package.json index 84195b1..981f41e 100644 --- a/packages/forums-prisma-client/package.json +++ b/packages/forums-prisma-client/package.json @@ -1,5 +1,5 @@ { - "name": "prisma-client-07279bd72154b430dd00280c65b4b8b34dd7a3e1e8abdf51a8f22b2cf0650926", + "name": "prisma-client-891c12951ab78c3fd343b6e40286a01805630d9b94dded161d908245534b7080", "main": "index.js", "types": "index.d.ts", "browser": "default.js", diff --git a/packages/forums-prisma-client/schema.prisma b/packages/forums-prisma-client/schema.prisma index 67b2c09..0cb7665 100644 --- a/packages/forums-prisma-client/schema.prisma +++ b/packages/forums-prisma-client/schema.prisma @@ -143,6 +143,19 @@ model TopicWatch { @@schema("forums") } +// Explicit challenge-wide preferences override resource-based default watches. +model ChallengeForumWatch { + challengeId String @db.VarChar(64) + memberId String @db.VarChar(64) + watching Boolean + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + + @@id([challengeId, memberId]) + @@index([memberId]) + @@schema("forums") +} + model TopicReadState { topicId String @db.VarChar(14) memberId String @db.VarChar(64) diff --git a/prisma/migrations/20261016000000_challenge_forum_watch/migration.sql b/prisma/migrations/20261016000000_challenge_forum_watch/migration.sql new file mode 100644 index 0000000..91eb73a --- /dev/null +++ b/prisma/migrations/20261016000000_challenge_forum_watch/migration.sql @@ -0,0 +1,10 @@ +CREATE TABLE "forums"."ChallengeForumWatch" ( + "challengeId" VARCHAR(64) NOT NULL, + "memberId" VARCHAR(64) NOT NULL, + "watching" BOOLEAN NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT "ChallengeForumWatch_pkey" PRIMARY KEY ("challengeId", "memberId") +); + +CREATE INDEX "ChallengeForumWatch_memberId_idx" ON "forums"."ChallengeForumWatch"("memberId"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index ed1c300..67453ac 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -143,6 +143,19 @@ model TopicWatch { @@schema("forums") } +// Explicit challenge-wide preferences override resource-based default watches. +model ChallengeForumWatch { + challengeId String @db.VarChar(64) + memberId String @db.VarChar(64) + watching Boolean + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + + @@id([challengeId, memberId]) + @@index([memberId]) + @@schema("forums") +} + model TopicReadState { topicId String @db.VarChar(14) memberId String @db.VarChar(64) diff --git a/src/forums/challenge-forum-watch.controller.ts b/src/forums/challenge-forum-watch.controller.ts new file mode 100644 index 0000000..5f7a0b6 --- /dev/null +++ b/src/forums/challenge-forum-watch.controller.ts @@ -0,0 +1,85 @@ +import { Controller, Delete, Get, Header, Param, Put } from '@nestjs/common'; +import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger'; +import { + AUTHENTICATED_USER_ROLE, + Roles, +} from '../auth/decorators/roles.decorator'; +import { ClientIp } from '../auth/decorators/client-ip.decorator'; +import { CurrentUser } from '../auth/decorators/user.decorator'; +import { JwtUser } from '../auth/jwt.service'; +import { + ChallengeForumWatchService, + ChallengeForumWatchState, +} from './challenge-forum-watch.service'; + +/** + * Human-member routes for challenge-wide notification preferences, including + * empty forums. All operations enforce the shared challenge visibility and bans. + */ +@ApiTags('Challenge forum watches') +@ApiBearerAuth() +@Roles(AUTHENTICATED_USER_ROLE) +@Controller('challenges/:challengeId/watch') +export class ChallengeForumWatchController { + /** + * Creates the member preference controller. + * @param service Authorized preference reader/writer. + * @throws Does not throw; Nest resolves dependencies. + */ + constructor(private readonly service: ChallengeForumWatchService) {} + + /** + * Reads the caller's effective watch state for the forum overview. + * @param challengeId Challenge route identifier. + * @param user Authenticated human token. + * @param trustedClientIp Trusted client address. + * @returns Effective watch state, including resource-based defaults. + * @throws Propagates authentication, policy, ban, and database errors. + */ + @Get() + @Header('Cache-Control', 'private, no-store') + @ApiOperation({ summary: 'Read the current member’s challenge forum watch' }) + getWatch( + @Param('challengeId') challengeId: string, + @CurrentUser() user?: JwtUser, + @ClientIp() trustedClientIp?: string, + ): Promise { + return this.service.watchState(challengeId, user, trustedClientIp); + } + + /** + * Enables notifications for current and future topics in the challenge forum. + * @param challengeId Challenge route identifier. + * @param user Authenticated human token. + * @param trustedClientIp Trusted client address. + * @returns Persisted watch state. + * @throws Propagates authentication, policy, ban, and database errors. + */ + @Put() + @ApiOperation({ summary: 'Watch the challenge forum' }) + watch( + @Param('challengeId') challengeId: string, + @CurrentUser() user?: JwtUser, + @ClientIp() trustedClientIp?: string, + ): Promise { + return this.service.watchState(challengeId, user, trustedClientIp, true); + } + + /** + * Persists an opt-out from the forum-wide stream without deleting topic watches. + * @param challengeId Challenge route identifier. + * @param user Authenticated human token. + * @param trustedClientIp Trusted client address. + * @returns Persisted unwatched state. + * @throws Propagates authentication, policy, ban, and database errors. + */ + @Delete() + @ApiOperation({ summary: 'Unwatch the challenge forum' }) + unwatch( + @Param('challengeId') challengeId: string, + @CurrentUser() user?: JwtUser, + @ClientIp() trustedClientIp?: string, + ): Promise { + return this.service.watchState(challengeId, user, trustedClientIp, false); + } +} diff --git a/src/forums/challenge-forum-watch.service.spec.ts b/src/forums/challenge-forum-watch.service.spec.ts new file mode 100644 index 0000000..c93783c --- /dev/null +++ b/src/forums/challenge-forum-watch.service.spec.ts @@ -0,0 +1,138 @@ +import { ForbiddenException, UnauthorizedException } from '@nestjs/common'; +import { ChallengeForumWatchService } from './challenge-forum-watch.service'; + +/** + * Creates the watch service with isolated storage and authorization dependencies. + * @returns Service plus mocks for resource defaults, preferences, visibility, and bans. + * @throws Does not throw. + */ +function setup() { + const db = { + challengeForumWatch: { + findUnique: jest.fn().mockResolvedValue(null), + findMany: jest.fn().mockResolvedValue([]), + upsert: jest.fn().mockResolvedValue({}), + }, + }; + const resources = { + getChallengeDefaultWatcherMemberIds: jest + .fn() + .mockResolvedValue(['member']), + }; + const policy = { + decideForRestrictionVisibility: jest + .fn() + .mockResolvedValue({ allowed: true }), + }; + const moderation = { + decideForRequestActorBan: jest.fn().mockResolvedValue({ allowed: true }), + }; + const service = new ChallengeForumWatchService( + db as any, + resources as any, + policy as any, + moderation as any, + ); + return { db, resources, policy, moderation, service }; +} +const user = { userId: 'member', isMachine: false, roles: ['Topcoder User'] }; + +describe('ChallengeForumWatchService', () => { + it('defaults resource members to watching before any topics or preferences exist', async () => { + const { service, resources, db } = setup(); + await expect(service.watchState('challenge', user)).resolves.toEqual({ + challengeId: 'challenge', + memberId: 'member', + watching: true, + }); + expect(resources.getChallengeDefaultWatcherMemberIds).toHaveBeenCalledWith( + 'challenge', + 'member', + ); + expect(db.challengeForumWatch.upsert).not.toHaveBeenCalled(); + }); + + it('does not default other challenge viewers to watching', async () => { + const { service, resources } = setup(); + resources.getChallengeDefaultWatcherMemberIds.mockResolvedValue([]); + await expect(service.watchState('challenge', user)).resolves.toHaveProperty( + 'watching', + false, + ); + }); + + it.each([false, true])( + 'persists the explicit %s choice idempotently for the caller', + async (watching) => { + const { service, db, resources } = setup(); + await service.watchState('challenge', user, '127.0.0.1', watching); + expect(db.challengeForumWatch.upsert).toHaveBeenCalledWith({ + where: { + challengeId_memberId: { + challengeId: 'challenge', + memberId: 'member', + }, + }, + create: { challengeId: 'challenge', memberId: 'member', watching }, + update: { watching }, + }); + db.challengeForumWatch.findUnique.mockResolvedValue({ watching }); + await expect( + service.watchState('challenge', user), + ).resolves.toHaveProperty('watching', watching); + expect( + resources.getChallengeDefaultWatcherMemberIds, + ).not.toHaveBeenCalled(); + }, + ); + + it('merges registrants, copilots, and explicit watches while preserving opt-outs', async () => { + const { service, db, resources } = setup(); + resources.getChallengeDefaultWatcherMemberIds.mockResolvedValue([ + 'registrant', + 'copilot', + 'opted-out', + 'copilot', + ]); + db.challengeForumWatch.findMany.mockResolvedValue([ + { memberId: 'opted-out', watching: false }, + { memberId: 'other-viewer', watching: true }, + { memberId: 'copilot', watching: true }, + ]); + await expect(service.getWatcherMemberIds('challenge')).resolves.toEqual([ + 'registrant', + 'copilot', + 'other-viewer', + ]); + expect(db.challengeForumWatch.findMany).toHaveBeenCalledWith({ + where: { challengeId: 'challenge' }, + }); + }); + + it.each([undefined, { ...user, isMachine: true }, { ...user, userId: '' }])( + 'rejects callers without a human member identity', + async (caller) => { + const { service, db } = setup(); + await expect( + service.watchState('challenge', caller, undefined, true), + ).rejects.toBeInstanceOf(UnauthorizedException); + expect(db.challengeForumWatch.upsert).not.toHaveBeenCalled(); + }, + ); + + it('rejects bans and inaccessible challenges before reading or changing preferences', async () => { + const { service, db, policy, moderation } = setup(); + moderation.decideForRequestActorBan.mockResolvedValue({ allowed: false }); + await expect( + service.watchState('challenge', user, '127.0.0.1', true), + ).rejects.toBeInstanceOf(ForbiddenException); + expect(policy.decideForRestrictionVisibility).not.toHaveBeenCalled(); + moderation.decideForRequestActorBan.mockResolvedValue({ allowed: true }); + policy.decideForRestrictionVisibility.mockResolvedValue({ allowed: false }); + await expect(service.watchState('challenge', user)).rejects.toBeInstanceOf( + ForbiddenException, + ); + expect(db.challengeForumWatch.findUnique).not.toHaveBeenCalled(); + expect(db.challengeForumWatch.upsert).not.toHaveBeenCalled(); + }); +}); diff --git a/src/forums/challenge-forum-watch.service.ts b/src/forums/challenge-forum-watch.service.ts new file mode 100644 index 0000000..c2c5889 --- /dev/null +++ b/src/forums/challenge-forum-watch.service.ts @@ -0,0 +1,121 @@ +import { + ForbiddenException, + Injectable, + UnauthorizedException, +} from '@nestjs/common'; +import { JwtUser } from '../auth/jwt.service'; +import { DbService } from '../db/db.service'; +import { buildForumsPrincipal } from './forums-access.types'; +import { ForumsAccessPolicyService } from './forums-access-policy.service'; +import { ForumsModerationService } from './forums-moderation.service'; +import { ResourceAccessService } from './resource-access.service'; + +/** Current member's effective challenge-wide watch preference. */ +export interface ChallengeForumWatchState { + challengeId: string; + memberId: string; + watching: boolean; +} + +/** + * Resolves challenge-wide watches from resource assignments and persisted choices. + * Registrants and copilots default to watching; explicit opt-outs survive later + * reads and resource changes. Topic-specific watches remain independent. + */ +@Injectable() +export class ChallengeForumWatchService { + /** + * Wires persistence and the existing resource, visibility, and ban policies. + * @param db Forums preference storage. + * @param resourceAccessService Challenge assignment lookup. + * @param accessPolicyService Shared challenge visibility policy. + * @param moderationService Shared member and trusted-IP ban policy. + * @throws Does not throw; Nest resolves dependencies. + */ + constructor( + private readonly db: DbService, + private readonly resourceAccessService: ResourceAccessService, + private readonly accessPolicyService: ForumsAccessPolicyService, + private readonly moderationService: ForumsModerationService, + ) {} + + /** + * Reads or updates the authenticated member's forum-wide watch preference. + * Works before the first topic exists and never accepts a target member id. + * @param challengeId Challenge whose forum is watched. + * @param user Validated human token. + * @param trustedClientIp Trusted request IP for ban enforcement. + * @param watching Explicit choice to persist, or undefined for a read. + * @returns Effective watch state for this member and challenge. + * @throws UnauthorizedException for missing or machine identities; ForbiddenException + * for bans or denied challenge access; propagates database lookup/write errors. + */ + async watchState( + challengeId: string, + user: JwtUser | undefined, + trustedClientIp?: string, + watching?: boolean, + ): Promise { + const principal = buildForumsPrincipal(user); + if (!principal?.memberId || principal.isMachine) { + throw new UnauthorizedException('An authenticated member is required.'); + } + const ban = await this.moderationService.decideForRequestActorBan( + principal, + trustedClientIp, + ); + if (!ban.allowed) throw new ForbiddenException(ban.reason); + const visibility = + await this.accessPolicyService.decideForRestrictionVisibility(principal, { + challengeId, + roleName: null, + hasRestrictionConflict: false, + }); + if (!visibility.allowed) throw new ForbiddenException(visibility.reason); + + const memberId = principal.memberId; + const where = { challengeId_memberId: { challengeId, memberId } }; + if (watching !== undefined) { + await this.db.challengeForumWatch.upsert({ + where, + create: { challengeId, memberId, watching }, + update: { watching }, + }); + } else { + const preference = await this.db.challengeForumWatch.findUnique({ + where, + }); + watching = + preference?.watching ?? + ( + await this.resourceAccessService.getChallengeDefaultWatcherMemberIds( + challengeId, + memberId, + ) + ).includes(memberId); + } + return { challengeId, memberId, watching }; + } + + /** + * Resolves forum-wide notification candidates, applying explicit choices to defaults. + * The notification publisher still enforces each topic's visibility and bans. + * @param challengeId Effective challenge scope of the new topic or post. + * @returns Deduplicated member ids whose challenge-wide watch is enabled. + * @throws Propagates resource and preference database errors. + */ + async getWatcherMemberIds(challengeId: string): Promise { + const [defaults, preferences] = await Promise.all([ + this.resourceAccessService.getChallengeDefaultWatcherMemberIds( + challengeId, + ), + this.db.challengeForumWatch.findMany({ where: { challengeId } }), + ]); + const watchers = new Set(defaults); + for (const preference of preferences) { + if (preference.watching) watchers.add(preference.memberId); + else watchers.delete(preference.memberId); + } + return [...watchers]; + } +} diff --git a/src/forums/forums-command.service.spec.ts b/src/forums/forums-command.service.spec.ts index 22c21af..31fe3f4 100644 --- a/src/forums/forums-command.service.spec.ts +++ b/src/forums/forums-command.service.spec.ts @@ -94,10 +94,12 @@ function createCommandService(order: string[] = []) { updatedAt: createdAt, }), deleteMany: jest.fn().mockResolvedValue({ count: 1 }), - count: jest.fn().mockImplementation( - (args: { where: { reaction: PostReactionType } }) => - args.where.reaction === PostReactionType.THUMBS_UP ? 2 : 1, - ), + count: jest + .fn() + .mockImplementation( + (args: { where: { reaction: PostReactionType } }) => + args.where.reaction === PostReactionType.THUMBS_UP ? 2 : 1, + ), }, topicClosure: { findFirst: jest.fn().mockResolvedValue(null), @@ -370,6 +372,33 @@ describe('ForumsCommandService notification boundary', () => { expect(notificationService.publishPostNotification).not.toHaveBeenCalled(); }); + it('publishes a challenge root starter notification only after commit', async () => { + const order: string[] = []; + const { notificationService, service, tx } = createCommandService(order); + tx.topic.create.mockResolvedValue( + makeTopic({ challengeId: 'challenge-1' }), + ); + await service.createTopic( + { + title: 'New challenge topic', + content: 'Starter content', + challengeId: 'challenge-1', + }, + user, + ); + expect(order).toEqual(['post.create', 'commit', 'notify']); + expect(notificationService.publishPostNotification).toHaveBeenCalledWith( + expect.objectContaining({ + operationName: 'createTopic', + restrictions: { + challengeId: 'challenge-1', + roleName: null, + hasRestrictionConflict: false, + }, + }), + ); + }); + it('does not publish notifications for top-level createTopic commands', async () => { const { notificationService, service } = createCommandService(); @@ -652,7 +681,9 @@ describe('ForumsCommandService post reactions', () => { update: { reaction: PostReactionType.THUMBS_DOWN }, }); expect(tx.postReaction.count).toHaveBeenCalledTimes(2); - expect(moderationService.decideForLockedTopicMutation).not.toHaveBeenCalled(); + expect( + moderationService.decideForLockedTopicMutation, + ).not.toHaveBeenCalled(); }); it('removes a member reaction idempotently and returns a null viewer state', async () => { @@ -660,9 +691,7 @@ describe('ForumsCommandService post reactions', () => { tx.postReaction.deleteMany.mockResolvedValue({ count: 0 }); tx.postReaction.count.mockResolvedValue(0); - await expect( - service.removePostReaction('post-1', user), - ).resolves.toEqual({ + await expect(service.removePostReaction('post-1', user)).resolves.toEqual({ postId: 'post-1', viewerReaction: null, thumbsUpCount: 0, diff --git a/src/forums/forums-command.service.ts b/src/forums/forums-command.service.ts index fea1b48..a456cf8 100644 --- a/src/forums/forums-command.service.ts +++ b/src/forums/forums-command.service.ts @@ -164,7 +164,7 @@ export class ForumsCommandService { * @param dto Topic metadata and starter-post content. * @param user Authenticated token payload for the acting member. * @param trustedClientIp Optional trusted client IP resolved at the HTTP boundary. - * @returns The created topic command response and starter post after any child-topic notification attempt settles. + * @returns The created topic command response and starter post after any child-topic or challenge-topic notification attempt settles. * @throws UnauthorizedException when no authenticated command caller is present. * @throws BadRequestException when topic fields or parent linkage are invalid. * @throws ForbiddenException when shared policy, moderation bans, or parent lock state deny topic creation. @@ -306,7 +306,7 @@ export class ForumsCommandService { }, ); - if (parentTopicId) { + if (parentTopicId || restrictions.effectiveChallengeId) { await this.publishPostNotificationBestEffort( 'createTopic', result.topic, diff --git a/src/forums/forums-notification-read.integration.spec.ts b/src/forums/forums-notification-read.integration.spec.ts index 0c956ad..aec65c4 100644 --- a/src/forums/forums-notification-read.integration.spec.ts +++ b/src/forums/forums-notification-read.integration.spec.ts @@ -688,10 +688,17 @@ describe('forums notification/read integration', () => { ['6', 'six@example.com'], ['7', 'seven@example.com'], ]); + const defaultWatchers = new Set(); + const forumPreferences = new Map< + string, + { challengeId: string; memberId: string; watching: boolean } + >(); const publishedEvents: { topic: string; payload: any }[] = []; beforeEach(async () => { publishedEvents.length = 0; + defaultWatchers.clear(); + forumPreferences.clear(); seedData = { topics: [ @@ -734,7 +741,27 @@ describe('forums notification/read integration', () => { memberBans: [], ipBans: [], }; - const db = createSeededForumsDb(seedData); + const db = { + ...createSeededForumsDb(seedData), + challengeForumWatch: { + findMany: jest.fn(({ where }: any) => + [...forumPreferences.values()].filter( + (preference) => preference.challengeId === where.challengeId, + ), + ), + findUnique: jest.fn( + ({ where: { challengeId_memberId: key } }: any) => + forumPreferences.get(`${key.challengeId}:${key.memberId}`) ?? null, + ), + upsert: jest.fn(({ create }: any) => { + forumPreferences.set( + `${create.challengeId}:${create.memberId}`, + create, + ); + return create; + }), + }, + }; const moduleRef = await Test.createTestingModule({ imports: [ ConfigModule.forRoot({ @@ -768,6 +795,14 @@ describe('forums notification/read integration', () => { }) .overrideProvider(ResourceAccessService) .useValue({ + getChallengeDefaultWatcherMemberIds: jest.fn( + (challengeId: string, memberId?: string) => + challengeId === 'challenge-1' + ? [...defaultWatchers].filter( + (id) => !memberId || memberId === id, + ) + : [], + ), getChallengeCopilotMemberIds: jest.fn( (challengeId: string, memberIds: readonly string[]) => new Set( @@ -844,6 +879,78 @@ describe('forums notification/read integration', () => { await app?.close(); }); + it('defaults registrants and copilots to watching new topics and persists forum opt-out/re-watch', async () => { + // No topic in this challenge exists yet, and neither recipient has a topic watch. + defaultWatchers.add('2'); + defaultWatchers.add('6'); + seedData.topicWatches = []; + for (const memberId of ['2', '6']) { + const response = await request(app.getHttpServer()) + .get('/challenges/challenge-1/watch') + .set('x-member-id', memberId) + .expect(200); + expect(response.body).toEqual({ + challengeId: 'challenge-1', + memberId, + watching: true, + }); + } + await request(app.getHttpServer()) + .delete('/challenges/challenge-1/watch') + .set('x-member-id', '2') + .expect(200); + const preference = await request(app.getHttpServer()) + .get('/challenges/challenge-1/watch') + .set('x-member-id', '2') + .expect(200); + expect(preference.body.watching).toBe(false); + await request(app.getHttpServer()) + .post('/topics') + .set('x-member-id', '1') + .send({ + challengeId: 'challenge-1', + title: 'First challenge topic', + content: 'First post', + }) + .expect(201); + expect(publishedEvents).toHaveLength(1); + expect(publishedEvents[0].payload.recipients).toEqual(['six@example.com']); + + await request(app.getHttpServer()) + .put('/challenges/challenge-1/watch') + .set('x-member-id', '2') + .send({ memberId: '3' }) + .expect(200); + expect(forumPreferences.has('challenge-1:3')).toBe(false); + await request(app.getHttpServer()) + .post('/topics') + .set('x-member-id', '1') + .send({ + challengeId: 'challenge-1', + title: 'Another challenge topic', + content: 'Another post', + }) + .expect(201); + expect(publishedEvents).toHaveLength(2); + expect(publishedEvents[1].payload.recipients).toEqual([ + 'two@example.com', + 'six@example.com', + ]); + }); + + it('rejects inaccessible challenge watch reads and mutations', async () => { + await request(app.getHttpServer()) + .get('/challenges/challenge-1/watch') + .set('x-member-id', '4') + .expect(403); + await request(app.getHttpServer()) + .put('/challenges/challenge-1/watch') + .set('x-member-id', '4') + .send({}) + .expect(403); + expect(forumPreferences.size).toBe(0); + }); + it('notifies a member who watches through the API while excluding the posting author', async () => { seedData.topicWatches = [{ topicId: 'parent-1', memberId: '1' }]; diff --git a/src/forums/forums-watch-notification.service.spec.ts b/src/forums/forums-watch-notification.service.spec.ts index a691ca5..4aa0998 100644 --- a/src/forums/forums-watch-notification.service.spec.ts +++ b/src/forums/forums-watch-notification.service.spec.ts @@ -110,6 +110,9 @@ function createService(templateId: string | null = 'template-id') { : undefined, ), }; + const challengeWatchService = { + getWatcherMemberIds: jest.fn().mockResolvedValue([]), + }; const service = new ForumsWatchNotificationService( db as any, memberDirectoryService as any, @@ -119,9 +122,11 @@ function createService(templateId: string | null = 'template-id') { eventBusService as any, configService as any, challengeApiService as any, + challengeWatchService as any, ); return { + challengeWatchService, accessPolicyService, challengeApiService, configService, @@ -139,8 +144,99 @@ describe('ForumsWatchNotificationService', () => { jest.restoreAllMocks(); }); + it('notifies challenge-wide watchers of a new root topic, excluding its author and duplicates', async () => { + const { + challengeWatchService, + db, + memberDirectoryService, + eventBusService, + service, + } = createService(); + db.topicWatch.findMany.mockResolvedValue([{ memberId: '2' }]); + challengeWatchService.getWatcherMemberIds.mockResolvedValue([ + '1', + '2', + '3', + ]); + memberDirectoryService.getMembersByIds.mockResolvedValue([ + { memberId: '2', email: 'two@example.com', handle: 'two' }, + { memberId: '3', email: 'three@example.com', handle: 'three' }, + ]); + await service.publishPostNotification({ + topic: makeTopic({ challengeId: 'challenge-1' }), + post: makePost(), + restrictions: { + challengeId: 'challenge-1', + roleName: null, + hasRestrictionConflict: false, + }, + operationName: 'createTopic', + }); + expect(challengeWatchService.getWatcherMemberIds).toHaveBeenCalledWith( + 'challenge-1', + ); + expect(memberDirectoryService.getMembersByIds).toHaveBeenCalledWith([ + '2', + '3', + ]); + expect(eventBusService.postEvent).toHaveBeenCalledWith( + 'external.action.email', + expect.objectContaining({ + recipients: ['two@example.com', 'three@example.com'], + }), + ); + }); + + it('applies visibility and bans to challenge-wide watchers without topic watches', async () => { + const { + challengeWatchService, + db, + memberDirectoryService, + accessPolicyService, + moderationService, + eventBusService, + service, + } = createService(); + db.topicWatch.findMany.mockResolvedValue([]); + challengeWatchService.getWatcherMemberIds.mockResolvedValue([ + '2', + '3', + '4', + ]); + memberDirectoryService.getMembersByIds.mockResolvedValue( + ['2', '3', '4'].map((memberId) => ({ + memberId, + email: `${memberId}@example.com`, + handle: memberId, + })), + ); + moderationService.decideForTargetMemberBan.mockImplementation((memberId) => + Promise.resolve({ allowed: memberId !== '3' }), + ); + accessPolicyService.decideForRestrictionVisibility.mockImplementation( + (principal) => Promise.resolve({ allowed: principal.memberId !== '4' }), + ); + await service.publishPostNotification({ + topic: makeTopic({ challengeId: 'challenge-1', roleName: 'reviewer' }), + post: makePost(), + restrictions: { + challengeId: 'challenge-1', + roleName: 'reviewer', + hasRestrictionConflict: false, + }, + operationName: 'createPost', + }); + expect(eventBusService.postEvent).toHaveBeenCalledWith( + 'external.action.email', + expect.objectContaining({ + recipients: ['2@example.com'], + }), + ); + }); + it('dedupes topic and ancestor watches into one recipient email event', async () => { - const { challengeApiService, db, eventBusService, service } = createService(); + const { challengeApiService, db, eventBusService, service } = + createService(); db.topicWatch.findMany.mockResolvedValue([ { memberId: '2' }, { memberId: '2' }, @@ -206,8 +302,12 @@ describe('ForumsWatchNotificationService', () => { }); it('filters watched members who cannot view a restricted child topic', async () => { - const { accessPolicyService, challengeApiService, eventBusService, service } = - createService(); + const { + accessPolicyService, + challengeApiService, + eventBusService, + service, + } = createService(); accessPolicyService.decideForRestrictionVisibility.mockResolvedValue({ allowed: false, reason: 'Required forum role is missing.', @@ -439,7 +539,9 @@ describe('ForumsWatchNotificationService', () => { }); expect(missingTemplate.db.topicClosure.findMany).not.toHaveBeenCalled(); - expect(missingTemplate.challengeApiService.getChallengeTitle).not.toHaveBeenCalled(); + expect( + missingTemplate.challengeApiService.getChallengeTitle, + ).not.toHaveBeenCalled(); expect(missingTemplate.eventBusService.postEvent).not.toHaveBeenCalled(); expect(warnSpy).toHaveBeenCalledWith( expect.stringContaining( diff --git a/src/forums/forums-watch-notification.service.ts b/src/forums/forums-watch-notification.service.ts index df12c02..673ed91 100644 --- a/src/forums/forums-watch-notification.service.ts +++ b/src/forums/forums-watch-notification.service.ts @@ -2,6 +2,7 @@ import { Injectable, Logger } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { Post, Topic } from '../../prisma/generated/client'; import { DbService } from '../db/db.service'; +import { ChallengeForumWatchService } from './challenge-forum-watch.service'; import { ChallengeApiService } from './challenge-api.service'; import { EventBusService } from './event-bus.service'; import { ForumsAccessPolicyService } from './forums-access-policy.service'; @@ -71,7 +72,8 @@ export class ForumsNotificationPublishError extends Error { * Publishes post-commit forum watch notifications. * * The service resolves explicit watches on the created post's topic and all - * ancestors, dedupes by member id, excludes the persisted author member id, + * ancestors plus effective challenge-wide watches, dedupes by member id, + * excludes the persisted author member id, * filters active member bans and remaining recipients through the shared forums * access policy, resolves the challenge title when applicable, and publishes one * SendGrid email event for the final recipient list. IP-ban checks are intentionally @@ -92,6 +94,7 @@ export class ForumsWatchNotificationService { * @param eventBusService Local event-bus adapter. * @param configService Nest configuration service containing notification settings. * @param challengeApiService M2M-authenticated lookup for challenge titles. + * @param challengeWatchService Resource-based defaults and explicit forum preferences. * @throws Does not throw directly; dependencies are resolved by Nest. */ constructor( @@ -103,6 +106,7 @@ export class ForumsWatchNotificationService { private readonly eventBusService: EventBusService, private readonly configService: ConfigService, private readonly challengeApiService: ChallengeApiService, + private readonly challengeWatchService: ChallengeForumWatchService, ) {} /** @@ -129,6 +133,7 @@ export class ForumsWatchNotificationService { const watcherMemberIds = await this.resolveWatcherMemberIds( params.topic.id, params.post.authorMemberId, + params.restrictions.challengeId, ); if (watcherMemberIds.length === 0) { @@ -188,16 +193,18 @@ export class ForumsWatchNotificationService { } /** - * Resolves watched members from topic and ancestor watch rows. + * Resolves topic, ancestor, and challenge-wide watch candidates. * * @param topicId Topic id receiving the newly created post. * @param authorMemberId Persisted author member id to exclude. + * @param challengeId Effective challenge scope, or null for general forums. * @returns Deduped watcher member ids, excluding the author. - * @throws Prisma errors when closure or watch rows cannot be loaded. + * @throws Database errors when topic, resource, or challenge watch rows cannot be loaded. */ private async resolveWatcherMemberIds( topicId: string, authorMemberId: string, + challengeId: string | null, ): Promise { const closureRows = await this.db.topicClosure.findMany({ where: { descendantTopicId: topicId }, @@ -217,7 +224,15 @@ export class ForumsWatchNotificationService { select: { memberId: true }, }); - return Array.from(new Set(watchRows.map((watch) => watch.memberId))); + const challengeWatchers = challengeId + ? await this.challengeWatchService.getWatcherMemberIds(challengeId) + : []; + return Array.from( + new Set([ + ...watchRows.map((watch) => watch.memberId), + ...challengeWatchers, + ]), + ).filter((memberId) => memberId !== authorMemberId); } /** diff --git a/src/forums/forums.module.ts b/src/forums/forums.module.ts index afcd6f9..2923b03 100644 --- a/src/forums/forums.module.ts +++ b/src/forums/forums.module.ts @@ -1,6 +1,8 @@ import { Module } from '@nestjs/common'; import { DbModule } from '../db/db.module'; import { ChallengeAccessService } from './challenge-access.service'; +import { ChallengeForumWatchController } from './challenge-forum-watch.controller'; +import { ChallengeForumWatchService } from './challenge-forum-watch.service'; import { ChallengeApiService } from './challenge-api.service'; import { EventBusService } from './event-bus.service'; import { ForumsAccessPolicyService } from './forums-access-policy.service'; @@ -34,12 +36,14 @@ import { TopicsController } from './topics.controller'; @Module({ imports: [DbModule], controllers: [ + ChallengeForumWatchController, TopicsController, PostsController, ModerationController, PublicForumsController, ], providers: [ + ChallengeForumWatchService, ChallengeAccessService, ChallengeApiService, EventBusService, diff --git a/src/forums/resource-access.service.spec.ts b/src/forums/resource-access.service.spec.ts new file mode 100644 index 0000000..2d26e2d --- /dev/null +++ b/src/forums/resource-access.service.spec.ts @@ -0,0 +1,44 @@ +import { ResourceAccessService } from './resource-access.service'; + +describe('ResourceAccessService default forum watchers', () => { + it('selects submitters and copilot roles only within the requested challenge', async () => { + const service = new ResourceAccessService({ get: jest.fn() } as any); + const findMany = jest + .fn() + .mockResolvedValue([ + { memberId: 'registrant' }, + { memberId: 'copilot' }, + { memberId: 'copilot' }, + ]); + (service as any).initialized = true; + (service as any).client = { resource: { findMany } }; + await expect( + service.getChallengeDefaultWatcherMemberIds('challenge'), + ).resolves.toEqual(['registrant', 'copilot']); + expect(findMany).toHaveBeenCalledWith({ + where: { + challengeId: 'challenge', + resourceRole: { + OR: [ + { nameLower: 'submitter' }, + { nameLower: { contains: 'copilot' } }, + ], + }, + }, + select: { memberId: true }, + }); + await service.getChallengeDefaultWatcherMemberIds('challenge', 'member'); + expect(findMany).toHaveBeenLastCalledWith( + expect.objectContaining({ + where: expect.objectContaining({ memberId: 'member' }), + }), + ); + }); + + it('returns no defaults when the resource database is not configured', async () => { + const service = new ResourceAccessService({ get: jest.fn() } as any); + await expect( + service.getChallengeDefaultWatcherMemberIds('challenge'), + ).resolves.toEqual([]); + }); +}); diff --git a/src/forums/resource-access.service.ts b/src/forums/resource-access.service.ts index eb695a3..cf04da8 100644 --- a/src/forums/resource-access.service.ts +++ b/src/forums/resource-access.service.ts @@ -119,6 +119,39 @@ export class ResourceAccessService implements OnModuleDestroy { return new Set(resources.map((resource) => resource.memberId)); } + /** + * Finds registrants and copilots who watch a challenge forum by default. + * Resource assignments are read at delivery time, so registration and copilot + * assignment take effect without requiring a forum visit or event consumer. + * + * @param challengeId Challenge whose default watchers are requested. + * @param memberId Optional member filter for the current-member watch endpoint. + * @returns Deduplicated member ids with a Submitter or Copilot resource role. + * @throws Prisma errors when a configured resource database lookup fails. + */ + async getChallengeDefaultWatcherMemberIds( + challengeId: string, + memberId?: string, + ): Promise { + const client = this.resolveClient(); + if (!client) return []; + + const resources = await client.resource.findMany({ + where: { + challengeId, + ...(memberId ? { memberId } : {}), + resourceRole: { + OR: [ + { nameLower: 'submitter' }, + { nameLower: { contains: 'copilot' } }, + ], + }, + }, + select: { memberId: true }, + }); + return Array.from(new Set(resources.map((resource) => resource.memberId))); + } + /** * Disconnects the resource Prisma client during Nest module shutdown. * diff --git a/src/forums/topics.controller.ts b/src/forums/topics.controller.ts index d60c255..ba7a68d 100644 --- a/src/forums/topics.controller.ts +++ b/src/forums/topics.controller.ts @@ -108,7 +108,7 @@ export class TopicsController { @ApiOperation({ summary: 'Create a forum topic with a starter post', description: - 'Command route requiring an authenticated member token or `create:forums-topics`. Top-level non-challenge topics are allowed for human admins and scoped M2M callers. Top-level challenge topics are allowed for eligible challenge members, challenge copilots, and admins; M2M callers cannot create challenge roots. Child topics require visible parents, monotonic restrictions, and a resolved effective non-challenge context; challenge-scoped child creates are forbidden. Active member bans and trusted exact-IP bans return 403 before writes. Locked parents reject child-topic creation unless the caller is an administrator or eligible challenge copilot. M2M-created content uses the system author and does not seed member watch or read-state rows. Successful child-topic starter posts trigger best-effort watch notifications after commit.', + 'Command route requiring an authenticated member token or `create:forums-topics`. Top-level non-challenge topics are allowed for human admins and scoped M2M callers. Top-level challenge topics are allowed for eligible challenge members, challenge copilots, and admins; M2M callers cannot create challenge roots. Child topics require visible parents, monotonic restrictions, and a resolved effective non-challenge context; challenge-scoped child creates are forbidden. Active member bans and trusted exact-IP bans return 403 before writes. Locked parents reject child-topic creation unless the caller is an administrator or eligible challenge copilot. M2M-created content uses the system author and does not seed member watch or read-state rows. Successful child-topic and top-level challenge starter posts trigger best-effort watch notifications after commit.', }) @ApiResponse({ status: 201,