diff --git a/.gitignore b/.gitignore index d5a94220..8754c83a 100644 --- a/.gitignore +++ b/.gitignore @@ -95,3 +95,8 @@ graphify-out/cost.json # 3. Set "Required status checks" or use "Branch restrictions" to limit who can push # Or use pre-receive hook on GitHub with: git config commit.gpgsign true # Then enforce via GitHub branch protection rules + +# Turbo/tsc build caches (declared as task outputs in turbo.json). +# `*.tsbuildinfo` above does not match these, so they were tracked and every +# build dirtied the working tree. +.cache/ diff --git a/GCP_SETUP.md b/GCP_SETUP.md index 15260bd3..bd730a9f 100644 --- a/GCP_SETUP.md +++ b/GCP_SETUP.md @@ -48,10 +48,10 @@ This will pull the following from GCP: ## 4. Running the App -To run the entire stack (Main Web + Discord Bot) in development mode: +To run every workspace in development mode: ```bash -pnpm dev:full +pnpm dev ``` ## 5. Troubleshooting diff --git a/README.md b/README.md index bb09873c..7fc619e6 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,184 @@ # query The central monorepo for club operations and digital infrastructure. + +## Workspace layout + +| Path | Contents | +| --- | --- | +| `sites/mainweb` | Public club site | +| `sites/hacklytics2027` | Hacklytics 2027 event site (static export) | +| `packages/db` | Drizzle schema, client, seed script | +| `packages/api` | tRPC routers | +| `packages/auth` | NextAuth configuration | +| `packages/ui`, `packages/consts` | Shared components and constants | +| `tooling/*` | Shared eslint / tailwind / tsconfig | + +## Database + +Postgres, accessed through [Drizzle ORM](https://orm.drizzle.team). Production +runs on **Neon** (serverless Postgres, `us-west-2`, pooled endpoint); the +connection is made with `pg.Pool` in `packages/db/src/client.ts`, with SSL +required in production and a max pool size of 10. + +Configuration is a single environment variable: + +``` +DATABASE_URL=postgresql://:@/?sslmode=require +``` + +`packages/db/src/client.ts` logs a warning and leaves `db` as `null` when the +variable is absent rather than throwing, so builds that never touch the database +still succeed. + +### Schema + +Schemas live in `packages/db/src/schemas/` and are re-exported from +`schemas/index.ts`. Drizzle picks them up via `schema: "./src/schemas/**/*.ts"` +in `drizzle.config.ts`. + +| File | Tables | +| --- | --- | +| `auth.ts` | `user`, `account`, `session`, `verificationToken` | +| `members.ts` | `user_profile`, `member`, `membership_history` | +| `admins.ts` | `admin` | +| `hackathons.ts` | `hackathon`, `hackathon_team`, `hackathon_participant`, `hackathon_project`, `hackathon_event`, `hackathon_event_attendee` | +| `judge.ts` | `judge`, `judge_assignment`, `judging_project`, `judge_vote`, `judge_queue` | +| `initiatives.ts` | `project_leader`, `initiative`, `initiative_application` | +| `events.ts` | `event`, `event_check_in` | +| `stripe.ts` | `stripe_payment`, `user_account_link` | +| `security.ts` | `audit_logs` (+ `security_severity` enum) | +| `settings.ts` | `system_settings` | + +Two entities anchor the graph: + +- **`user`** — every identity-bearing table cascades from it: `account`, + `session`, `admin`, `user_profile`, `member`, `judge`, `event`, + `event_check_in`, `hackathon_team`, `hackathon_participant`, + `user_account_link`, and `stripe_payment.linked_user_id`. +- **`hackathon`** — every event-scoped table cascades from it: teams, + participants, projects, hackathon events, judges, judge assignments, judging + projects, judge queue, and maps. `member` is also scoped to a hackathon. + +Nearly all foreign keys are `onDelete: "cascade"`, so deleting a user or a +hackathon removes its dependent rows rather than orphaning them. + +### Club and hackathon are separate + +Two aspects share the database and touch nowhere: + +- **Hackathon** — editions, registration, teams, project submission, judging. + Everything here hangs off a `hackathon` row. +- **Club** — `initiative`, its applications, and the `project_leader` role. + Deliberately **not** scoped to a hackathon. A club project runs whenever + somebody leads one, and leading is a standing appointment rather than a + yearly re-grant. Nothing in this half is ever judged; judges only score + `hackathon_project`. + +`member` is the one crossing case: a paid year still hangs off an edition, so +membership resolves the current hackathon even though initiatives do not. + +#### One-off step — only for a database that already has the edition-scoped tables + +**Check first:** + +```sql +SELECT to_regclass('public.project_leader'); +``` + +If that returns `NULL`, this database has never had the club tables. Skip +everything below — `migrate:push` simply creates them in the current shape, and +the statements here would error on tables that do not exist. + +If it returns a table name, `migrate:push` cannot work the change out on its +own. `project_leader` moved from `unique(user_id, hackathon_id)` to +`unique(user_id)`, so anybody appointed in more than one edition has more than +one row; drizzle-kit fails building the new index partway and leaves the schema +half-applied. Run this against that database **once, before** the push. Every +statement is guarded, so it is safe to re-run. + +```sql +BEGIN; + +-- Collapse duplicate leader appointments to one row per person. Keeps the +-- oldest row, so created_at still reads as when they were first appointed, and +-- keeps the role switched on if ANY of their rows was active — dropping an +-- active appointment here silently locks a leader out of their own initiatives. +WITH ranked AS ( + SELECT + id, + user_id, + bool_or(is_active) OVER (PARTITION BY user_id) AS any_active, + row_number() OVER (PARTITION BY user_id ORDER BY created_at ASC, id ASC) AS rn + FROM project_leader +) +UPDATE project_leader AS pl +SET is_active = ranked.any_active +FROM ranked +WHERE pl.id = ranked.id + AND ranked.rn = 1 + AND pl.is_active IS DISTINCT FROM ranked.any_active; + +DELETE FROM project_leader +WHERE id IN ( + SELECT id FROM ( + SELECT + id, + row_number() OVER (PARTITION BY user_id ORDER BY created_at ASC, id ASC) AS rn + FROM project_leader + ) dupes + WHERE rn > 1 +); + +-- Drop the edition columns and everything hanging off them. +ALTER TABLE project_leader + DROP CONSTRAINT IF EXISTS unique_project_leader_per_hackathon; +DROP INDEX IF EXISTS project_leader_hackathon_id_idx; +ALTER TABLE project_leader DROP COLUMN IF EXISTS hackathon_id; + +DROP INDEX IF EXISTS initiative_hackathon_id_idx; +ALTER TABLE initiative DROP COLUMN IF EXISTS hackathon_id; + +-- The constraint the new schema expects. Added here rather than left to push, +-- so a collision surfaces inside this transaction where it rolls back. +ALTER TABLE project_leader + DROP CONSTRAINT IF EXISTS unique_project_leader; +ALTER TABLE project_leader + ADD CONSTRAINT unique_project_leader UNIQUE (user_id); + +COMMIT; +``` + +Initiatives themselves are untouched. Rows that were invisible because they +belonged to a past edition become visible again — that is the point, they were +club projects an edition rollover hid. Archive any that should not come back +from the leader screen afterwards. + +### Working with the schema + +```bash +pnpm --filter @query/db migrate:push # push schema changes to DATABASE_URL +pnpm --filter @query/db migrate:generate # emit SQL into packages/db/drizzle +pnpm --filter @query/db studio # Drizzle Studio +pnpm --filter @query/db db:seed # scripts/seed.ts +``` + +The project is **push-based**: `packages/db/drizzle/meta/_journal.json` has no +entries and there are no generated `.sql` files, so schema changes are applied +directly with `migrate:push` rather than through a migration history. If you +want reviewable migrations, switch to `migrate:generate` and commit the output. + +### Local database + +`docker-compose.yml` brings up a local Postgres with the same database name as +Neon, so only `DATABASE_URL` changes between the two: + +```bash +docker compose up -d +DATABASE_URL=postgresql://postgres:postgres@localhost:5433/neondb \ + pnpm --filter @query/db migrate:push +``` + +It publishes on host port **5433** to avoid colliding with a system Postgres, +and has a `pg_isready` healthcheck so `migrate:push` is not run against a +container that is still starting. diff --git a/apphosting.yaml b/apphosting.yaml index 1097a4b2..9d2fad38 100644 --- a/apphosting.yaml +++ b/apphosting.yaml @@ -51,3 +51,16 @@ env: value: datascience.gt@gmail.com - variable: CRON_SECRET secret: CRON_SECRET + # Flood-protection thresholds, sized per instance for a full venue. + # These are the ceiling for one signed-in person, not for the building — + # the limiter keys on user id when somebody is signed in. The short block + # duration bounds a false positive to a page refresh rather than locking + # an attendee out for five minutes in the middle of a workshop. + - variable: DDOS_BURST_THRESHOLD + value: "3000" + - variable: DDOS_MAX_REQUESTS_PER_MINUTE + value: "20000" + - variable: DDOS_SUSPICIOUS_THRESHOLD + value: "14000" + - variable: DDOS_BLOCK_DURATION_MS + value: "30000" diff --git a/docker-compose.yml b/docker-compose.yml index 3b73be62..1d6134f6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,15 +1,35 @@ +# Local Postgres for development. +# +# Production runs on Neon (serverless Postgres, pooled endpoint) — see README. +# The database name here matches the Neon database so switching between them is +# only a DATABASE_URL change, not a schema-qualified rewrite. +# +# docker compose up -d +# DATABASE_URL=postgresql://postgres:postgres@localhost:5433/neondb pnpm --filter @query/db migrate:push +# +# Port 5433 on the host so this does not collide with a system Postgres on 5432. + services: db: image: postgres:15 container_name: monorepo-postgres + restart: unless-stopped ports: - "5433:5432" environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres - POSTGRES_DB: app_db + POSTGRES_DB: neondb volumes: - pgdata:/var/lib/postgresql/data + healthcheck: + # drizzle-kit push against a container that is still booting fails with a + # confusing connection error; wait for Postgres to actually accept queries. + test: ["CMD-SHELL", "pg_isready -U postgres -d neondb"] + interval: 5s + timeout: 5s + retries: 10 + start_period: 10s volumes: pgdata: diff --git a/firebase.json b/firebase.json index dc0702dc..2f353be7 100644 --- a/firebase.json +++ b/firebase.json @@ -60,6 +60,19 @@ "value": "nosniff" } ] + }, + { + "source": "/sw.js", + "headers": [ + { + "key": "Cache-Control", + "value": "no-cache, no-store, must-revalidate" + }, + { + "key": "Service-Worker-Allowed", + "value": "/" + } + ] } ] } diff --git a/package.json b/package.json index e0dcb444..bdcf132d 100644 --- a/package.json +++ b/package.json @@ -12,10 +12,10 @@ "lint": "turbo run lint", "format": "prettier --write .", "typecheck": "turbo run typecheck", - "test": "vitest run packages/api" + "test": "vitest run packages/api packages/db sites/mainweb/lib" }, "dependencies": { - "next": "16.2.11", + "next": "16.3.0", "typescript": "^6.0.2" }, "devDependencies": { diff --git a/packages/api/.cache/tsbuildinfo.json b/packages/api/.cache/tsbuildinfo.json deleted file mode 100644 index cfda375f..00000000 --- a/packages/api/.cache/tsbuildinfo.json +++ /dev/null @@ -1 +0,0 @@ -{"fileNames":["../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2023.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.esnext.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2023.array.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2023.collection.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2023.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.collection.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.object.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2024.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.collection.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.float16.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.iterator.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2025.regexp.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.esnext.array.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.esnext.collection.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.esnext.date.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.esnext.error.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.esnext.temporal.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.esnext.typedarrays.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/entity.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/cache/core/types.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/cache/core/cache.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/logger.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/casing.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/subquery.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/table.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/operations.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/query-builders/select.types.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sql/sql.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/utils.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sql/expressions/conditions.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sql/expressions/select.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sql/expressions/index.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sql/functions/aggregate.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/query-builders/query-builder.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sql/functions/vector.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sql/functions/index.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sql/index.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/checks.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/sequence.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/int.common.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/bigintt.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/boolean.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/bytes.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/custom.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/date-duration.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/decimal.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/double-precision.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/duration.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/integer.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/json.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/date.common.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/localdate.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/localtime.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/real.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/relative-duration.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/smallint.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/text.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/timestamp.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/timestamptz.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/uuid.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/all.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/indexes.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/roles.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/policies.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/primary-keys.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/unique-constraint.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/table.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/foreign-keys.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/common.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/bigint.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/columns/index.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/view-base.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/relations.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/session.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/query-builders/count.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/query-promise.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/runnable-query.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/query-builders/query.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/query-builders/raw.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/subquery.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/db.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/session.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/query-builders/delete.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/query-builders/update.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/query-builders/insert.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/query-builders/refresh-materialized-view.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/query-builders/select.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/query-builders/index.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/dialect.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/query-builders/query-builder.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/view-common.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/view.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/query-builders/select.types.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/alias.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/schema.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/utils.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/gel-core/index.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/checks.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/binary.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/boolean.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/char.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/custom.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/date.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/datetime.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/decimal.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/double.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/enum.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/float.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/int.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/json.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/mediumint.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/real.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/serial.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/smallint.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/text.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/time.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/date.common.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/timestamp.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/tinyint.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/varbinary.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/varchar.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/year.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/all.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/indexes.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/primary-keys.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/unique-constraint.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/table.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/foreign-keys.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/common.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/bigint.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/columns/index.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/migrator.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/query-builders/delete.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/subquery.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/view-base.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/query-builders/select.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/query-builders/query-builder.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/query-builders/update.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/query-builders/insert.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/dialect.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/query-builders/count.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/query-builders/index.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/query-builders/query.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/db.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/session.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/view-common.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/view.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/query-builders/select.types.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/alias.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/schema.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/utils.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/mysql-core/index.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/checks.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/bigserial.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/boolean.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/char.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/cidr.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/custom.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/date.common.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/date.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/double-precision.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/inet.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/sequence.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/int.common.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/integer.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/timestamp.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/interval.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/json.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/jsonb.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/line.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/macaddr.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/macaddr8.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/numeric.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/point.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/postgis_extension/geometry.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/real.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/serial.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/smallint.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/smallserial.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/text.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/time.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/uuid.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/varchar.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/vector_extension/bit.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/vector_extension/halfvec.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/vector_extension/sparsevec.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/vector_extension/vector.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/all.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/indexes.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/roles.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/policies.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/primary-keys.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/unique-constraint.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/table.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/foreign-keys.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/common.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/bigint.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/enum.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/columns/index.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/view-base.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/query-builders/count.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/query-builders/query.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/query-builders/raw.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/query-builders/refresh-materialized-view.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/subquery.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/db.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/session.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/query-builders/delete.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/query-builders/update.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/query-builders/insert.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/query-builders/select.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/query-builders/index.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/dialect.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/query-builders/query-builder.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/view-common.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/view.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/query-builders/select.types.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/alias.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/schema.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/utils.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/utils/array.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/utils/index.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/pg-core/index.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/binary.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/boolean.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/char.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/custom.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/date.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/datetime.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/decimal.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/double.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/enum.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/float.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/int.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/json.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/mediumint.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/real.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/serial.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/smallint.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/text.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/time.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/date.common.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/timestamp.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/tinyint.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/varbinary.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/varchar.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/vector.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/year.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/all.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/indexes.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/primary-keys.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/unique-constraint.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/table.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/common.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/bigint.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/columns/index.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/query-builders/delete.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/query-builders/update.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/query-builders/insert.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/dialect.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/cache/core/index.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore/session.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore/driver.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/query-builders/count.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/subquery.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/query-builders/select.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/query-builders/query-builder.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/query-builders/index.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/db.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/session.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/query-builders/select.types.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/alias.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/schema.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/utils.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/singlestore-core/index.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/checks.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/columns/custom.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/indexes.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/primary-keys.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/unique-constraint.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/view-base.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/query-builders/count.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/query-builders/query.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/subquery.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/db.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/query-builders/raw.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/session.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/query-builders/delete.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/query-builders/update.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/query-builders/insert.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/query-builders/select.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/query-builders/index.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/dialect.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/query-builders/query-builder.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/view.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/utils.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/columns/integer.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/columns/numeric.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/columns/real.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/columns/text.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/columns/all.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/table.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/foreign-keys.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/columns/common.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/columns/blob.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/columns/index.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/query-builders/select.types.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/alias.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/sqlite-core/index.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/column-builder.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/column.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/alias.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/errors.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/view-common.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/index.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/compatibility/disposable.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/compatibility/indexable.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/compatibility/index.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/compatibility/disposable.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/compatibility/indexable.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/compatibility/index.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/globals.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/web-globals/fetch.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/assert.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/assert/strict.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/async_hooks.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/buffer.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/child_process.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/cluster.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/console.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/constants.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/crypto.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/dgram.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/dns.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/dns/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/domain.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/events.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/fs.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/fs/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/http.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/http2.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/https.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/inspector.generated.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/module.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/net.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/os.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/path.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/process.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/punycode.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/querystring.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/readline.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/readline/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/repl.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/sea.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/stream.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/stream/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/stream/web.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/string_decoder.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/test.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/timers.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/timers/promises.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/tls.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/trace_events.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/tty.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/url.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/util.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/v8.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/vm.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/wasi.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/worker_threads.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/zlib.d.ts","../../../node_modules/.pnpm/@types+node@20.19.40/node_modules/@types/node/index.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/globals.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/assert.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/assert/strict.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/async_hooks.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/buffer.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/child_process.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/cluster.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/console.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/constants.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/crypto.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/dgram.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/dns.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/dns/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/domain.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/dom-events.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/events.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/fs.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/fs/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/http.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/http2.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/https.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/inspector.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/module.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/net.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/os.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/path.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/process.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/punycode.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/querystring.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/readline.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/readline/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/repl.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/sea.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/sqlite.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/stream.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/stream/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/stream/web.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/string_decoder.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/test.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/timers.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/timers/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/tls.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/trace_events.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/tty.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/url.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/util.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/v8.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/vm.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/wasi.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/worker_threads.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/zlib.d.ts","../../../node_modules/.pnpm/@types+node@22.15.32/node_modules/@types/node/index.d.ts","../../../node_modules/.pnpm/pg-types@2.2.0/node_modules/pg-types/index.d.ts","../../../node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/messages.d.ts","../../../node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/serializer.d.ts","../../../node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/parser.d.ts","../../../node_modules/.pnpm/pg-protocol@1.13.0/node_modules/pg-protocol/dist/index.d.ts","../../../node_modules/.pnpm/@types+pg@8.20.0/node_modules/@types/pg/lib/type-overrides.d.ts","../../../node_modules/.pnpm/@types+pg@8.20.0/node_modules/@types/pg/index.d.ts","../../../node_modules/.pnpm/@types+pg@8.20.0/node_modules/@types/pg/index.d.mts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/node-postgres/session.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/node-postgres/driver.d.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_@types+pg@8.20.0_pg@8.21.0_postgres@3.4.3/node_modules/drizzle-orm/node-postgres/index.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/lib/vendored/cookie.d.ts","../../../node_modules/.pnpm/oauth4webapi@3.8.6/node_modules/oauth4webapi/build/index.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/lib/utils/cookie.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/warnings.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/lib/symbols.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/lib/index.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/lib/utils/env.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/jwt.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/lib/utils/actions.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/index.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/lib/utils/logger.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/providers/webauthn.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/lib/utils/webauthn-utils.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/types.d.ts","../../../node_modules/.pnpm/preact@10.24.3/node_modules/preact/src/jsx.d.ts","../../../node_modules/.pnpm/preact@10.24.3/node_modules/preact/src/index.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/providers/credentials.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/providers/provider-types.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/providers/nodemailer.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/providers/email.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/providers/oauth.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/providers/index.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/adapters.d.ts","../../../node_modules/.pnpm/next-auth@5.0.0-beta.32_nex_6d4db5c24c9b31d9e2a449692c1b00e3/node_modules/next-auth/adapters.d.ts","../../db/src/schemas/auth.ts","../../db/src/schemas/hackathons.ts","../../db/src/schemas/members.ts","../../db/src/schemas/admins.ts","../../db/src/schemas/events.ts","../../db/src/schemas/judge.ts","../../db/src/schemas/stripe.ts","../../db/src/schemas/security.ts","../../db/src/schemas/index.ts","../../db/src/client.ts","../../db/src/index.ts","../../../node_modules/.pnpm/@trpc+server@11.15.1_typescript@6.0.2/node_modules/@trpc/server/dist/index.d-d4qzxqjh.d.mts","../../../node_modules/.pnpm/@trpc+server@11.15.1_typescript@6.0.2/node_modules/@trpc/server/dist/unstable-core-do-not-import.d-bl-_61jq.d.mts","../../../node_modules/.pnpm/@trpc+server@11.15.1_typescript@6.0.2/node_modules/@trpc/server/dist/index.d-vq_qhko2.d.mts","../../../node_modules/.pnpm/@trpc+server@11.15.1_typescript@6.0.2/node_modules/@trpc/server/dist/adapters/fetch/index.d.mts","../src/middleware/cache.ts","../../../node_modules/.pnpm/@types+react@19.2.17/node_modules/@types/react/global.d.ts","../../../node_modules/.pnpm/csstype@3.2.3/node_modules/csstype/index.d.ts","../../../node_modules/.pnpm/@types+react@19.2.17/node_modules/@types/react/index.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/styled-jsx/types/css.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/styled-jsx/types/macro.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/styled-jsx/types/style.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/styled-jsx/types/global.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/styled-jsx/types/index.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/get-page-files.d.ts","../../../node_modules/.pnpm/@types+react@19.2.17/node_modules/@types/react/canary.d.ts","../../../node_modules/.pnpm/@types+react@19.2.17/node_modules/@types/react/experimental.d.ts","../../../node_modules/.pnpm/@types+react-dom@19.0.3_@types+react@19.2.17/node_modules/@types/react-dom/index.d.ts","../../../node_modules/.pnpm/@types+react-dom@19.0.3_@types+react@19.2.17/node_modules/@types/react-dom/canary.d.ts","../../../node_modules/.pnpm/@types+react-dom@19.0.3_@types+react@19.2.17/node_modules/@types/react-dom/experimental.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/lib/fallback.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/compiled/webpack/webpack.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/entry-constants.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/constants.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/lib/bundler.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/config.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/lib/load-custom-routes.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/image-config.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/body-streams.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/request/search-params.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/segment-cache/vary-params-decoding.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/vary-params.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/request/params.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-kind.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-definitions/route-definition.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-matches/route-match.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/app-router-headers.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/cache-control.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/app-router-types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/cache-handlers/types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/use-cache/use-cache-wrapper.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/resume-data-cache/cache-store.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/resume-data-cache/resume-data-cache.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/lib/constants.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/render-result.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/response-cache/types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/response-cache/index.d.ts","../../../node_modules/.pnpm/@types+react@19.2.17/node_modules/@types/react/jsx-runtime.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/next-devtools/userspace/pages/pages-dev-overlay-setup.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/static-paths/types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-definitions/app-page-route-definition.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/adapter/setup-node-env.external.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/instrumentation/types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/lib/setup-exception-listeners.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/lib/worker.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/experimental/ppr.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/lib/page-types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/segment-config/app/app-segment-config.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/segment-config/pages/pages-segment-config.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/analysis/get-page-static-info.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/require-hook.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/node-polyfill-crypto.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/node-environment-baseline.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/node-environment-extensions/error-inspect.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/node-environment-extensions/console-file.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/node-environment-extensions/console-exit.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/node-environment-extensions/console-dim.external.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/node-environment-extensions/unhandled-rejection.external.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/node-environment-extensions/random.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/node-environment-extensions/date.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/node-environment-extensions/web-crypto.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/node-environment-extensions/node-crypto.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/node-environment-extensions/fast-set-immediate.external.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/node-environment.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/page-extensions-type.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-modules/app-page/module.compiled.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-definitions/app-route-route-definition.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/i18n-provider.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/web/next-url.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/web/spec-extension/cookies.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/web/spec-extension/request.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/deep-readonly.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/incremental-cache/index.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-definitions/locale-route-definition.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-definitions/pages-route-definition.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/mitt.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/with-router.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/router.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/route-loader.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/page-loader.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/bloom-filter.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/router/router.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/readonly-url-search-params.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/flight-data-helpers.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/segment-cache/cache-key.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/segment-cache/types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/segment-cache/segment-value-encoding.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/segment-cache/scheduler.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/segment-cache/cache-map.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/segment-cache/vary-path.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/segment-cache/cache.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/router-reducer/ppr-navigations.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/segment-cache/navigation.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-modules/pages/vendored/contexts/entrypoints.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-modules/pages/module.compiled.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/templates/pages.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-modules/pages/module.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/render.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-definitions/pages-api-route-definition.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-matches/pages-api-route-match.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-matchers/route-matcher.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-matcher-providers/route-matcher-provider.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-matcher-managers/route-matcher-manager.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/normalizers/normalizer.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/normalizers/locale-route-normalizer.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/normalizers/request/pathname-normalizer.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/normalizers/request/suffix.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/normalizers/request/rsc.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/normalizers/request/next-data.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/after/builtin-request-context.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/normalizers/request/segment-prefix-rsc.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-modules/pages/builtin/_error.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/load-default-error-components.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/base-server.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/after/after.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/after/after-context.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/use-cache/cache-life.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/work-async-storage-instance.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/lazy-result.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/create-error-handler.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/action-revalidation-kind.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/work-async-storage.external.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/async-storage/work-store.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/web/http.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/hooks-server-context.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-modules/app-route/shared-modules.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/redirect-status-code.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/redirect-error.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/cache-signal.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/instant-validation/boundary-tracking.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/instant-validation/instant-validation-error.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/router/utils/parse-relative-url.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/instant-validation/instant-samples.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/dynamic-rendering.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/work-unit-async-storage-instance.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/implicit-tags.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/staged-rendering.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/work-unit-async-storage.external.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/templates/app-route.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/action-async-storage-instance.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/action-async-storage.external.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-modules/app-route/module.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-modules/app-route/module.compiled.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/segment-config/app/app-segments.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/get-supported-browsers.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/utils.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/rendering-mode.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/router-utils/build-prefetch-segment-data-route.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/cpu-profile.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/turborepo-access-trace/types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/turborepo-access-trace/result.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/turborepo-access-trace/helpers.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/turborepo-access-trace/index.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/export/routes/types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/export/types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/export/worker.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/worker.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/index.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/lib/coalesced-function.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/router-utils/types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/trace/types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/trace/trace.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/trace/shared.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/trace/index.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/load-jsconfig.d.ts","../../../node_modules/.pnpm/@next+env@16.2.11/node_modules/@next/env/dist/index.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/webpack/plugins/telemetry-plugin/use-cache-tracker-utils.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/webpack/plugins/telemetry-plugin/telemetry-plugin.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/telemetry/storage.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/build-context.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/webpack-config.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/swc/generated-native.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/define-env.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/swc/index.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/swc/types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/dev/parse-version-info.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/next-devtools/shared/types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/dev/dev-indicator-server-state.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/next-devtools/dev-overlay/cache-indicator.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/parse-stack.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/next-devtools/server/shared.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/next-devtools/shared/stack-frame.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/next-devtools/dev-overlay/utils/get-error-by-type.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/next-devtools/dev-overlay/container/runtime-error/render-error.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/next-devtools/dev-overlay/shared.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/dev/debug-channel.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/dev/hot-reloader-types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/web/spec-extension/response.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/segment-config/middleware/middleware-config.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/web/types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/base-http/node.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/async-callback-set.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","../../../node_modules/.pnpm/@img+colour@1.1.0/node_modules/@img/colour/index.d.ts","../../../node_modules/.pnpm/sharp@0.35.3_@types+node@20.19.40/node_modules/sharp/dist/index.d.mts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/image-optimizer.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/next-server.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/lru-cache.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/dev-bundler-service.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/dev/static-paths-worker.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/dev/next-dev-server.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/next.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/render-server.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/router-server.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/router-utils/router-server-context.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-modules/route-module.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/load-components.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/web/adapter.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/webpack/loaders/next-app-loader/index.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/lib/app-dir-module.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/app-render.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/entrypoints.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/error-boundary.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/layout-router.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/render-from-template-context.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/client-page.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/client-segment.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/http-access-fallback/error-boundary.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/lib/metadata/types/extra-types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/lib/metadata/types/resolvers.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/lib/metadata/types/icons.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/lib/metadata/resolve-metadata.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/lib/metadata/metadata.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/lib/framework/boundary-components.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/rsc/preloads.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/rsc/postpone.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/rsc/taint.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/collect-segment-data.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/instant-validation/instant-validation.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/next-devtools/userspace/app/segment-explorer-node.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/app-render/entry-base.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/templates/app-page.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-modules/app-page/helpers/prerender-manifest-matcher.d.ts","../../../node_modules/.pnpm/@types+react@19.2.17/node_modules/@types/react/jsx-dev-runtime.d.ts","../../../node_modules/.pnpm/@types+react@19.2.17/node_modules/@types/react/compiler-runtime.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/entrypoints.d.ts","../../../node_modules/.pnpm/@types+react-dom@19.0.3_@types+react@19.2.17/node_modules/@types/react-dom/client.d.ts","../../../node_modules/.pnpm/@types+react-dom@19.0.3_@types+react@19.2.17/node_modules/@types/react-dom/server.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/entrypoints.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/route-modules/app-page/module.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/request/fallback-params.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/web/spec-extension/image-response.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/web/spec-extension/url-pattern.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/after/index.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/request/connection.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/web/exports/index.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/request-meta.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/cli/next-test.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/size-limit.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/config-shared.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/base-http/index.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/api-utils/index.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/build/adapter/build-complete.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/utils.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/pages/_app.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/app.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/web/spec-extension/revalidate.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/use-cache/cache-tag.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/cache.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/pages/_document.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/document.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/dynamic.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dynamic.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/pages/_error.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/catch-error.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/api/error.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/error.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/head.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/head.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/request/cookies.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/request/headers.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/server/request/draft-mode.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/headers.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/get-img-props.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/image-component.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/shared/lib/image-external.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/image.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/link.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/link.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/unrecognized-action-error.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/redirect.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/not-found.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/forbidden.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/unauthorized.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/unstable-rethrow.server.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/unstable-rethrow.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/navigation.react-server.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/components/navigation.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/navigation.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/router.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/client/script.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/script.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/dist/compiled/@vercel/og/types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/server.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/types/global.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/types/compiled.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/types.d.ts","../../../node_modules/.pnpm/next@16.2.11_@playwright+te_b979904d474894561c59986f25356e98/node_modules/next/index.d.ts","../../../node_modules/.pnpm/next-auth@5.0.0-beta.32_nex_4a8037c68c76a116ef9d8f0c5bf19f5a/node_modules/next-auth/lib/types.d.ts","../../../node_modules/.pnpm/next-auth@5.0.0-beta.32_nex_4a8037c68c76a116ef9d8f0c5bf19f5a/node_modules/next-auth/lib/index.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/errors.d.ts","../../../node_modules/.pnpm/next-auth@5.0.0-beta.32_nex_4a8037c68c76a116ef9d8f0c5bf19f5a/node_modules/next-auth/index.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/providers/google.d.ts","../../../node_modules/.pnpm/next-auth@5.0.0-beta.32_nex_4a8037c68c76a116ef9d8f0c5bf19f5a/node_modules/next-auth/providers/google.d.ts","../../../node_modules/.pnpm/@auth+core@0.41.3_nodemailer@9.0.3/node_modules/@auth/core/providers/github.d.ts","../../../node_modules/.pnpm/next-auth@5.0.0-beta.32_nex_4a8037c68c76a116ef9d8f0c5bf19f5a/node_modules/next-auth/providers/github.d.ts","../../../node_modules/.pnpm/next-auth@5.0.0-beta.32_nex_4a8037c68c76a116ef9d8f0c5bf19f5a/node_modules/next-auth/providers/nodemailer.d.ts","../../auth/src/config.ts","../../../node_modules/.pnpm/@auth+drizzle-adapter@1.7.1_nodemailer@9.0.3/node_modules/@auth/drizzle-adapter/lib/mysql.d.ts","../../../node_modules/.pnpm/@auth+drizzle-adapter@1.7.1_nodemailer@9.0.3/node_modules/@auth/drizzle-adapter/lib/pg.d.ts","../../../node_modules/.pnpm/@auth+drizzle-adapter@1.7.1_nodemailer@9.0.3/node_modules/@auth/drizzle-adapter/lib/sqlite.d.ts","../../../node_modules/.pnpm/@auth+drizzle-adapter@1.7.1_nodemailer@9.0.3/node_modules/@auth/drizzle-adapter/lib/utils.d.ts","../../../node_modules/.pnpm/@auth+drizzle-adapter@1.7.1_nodemailer@9.0.3/node_modules/@auth/drizzle-adapter/index.d.ts","../../../node_modules/.pnpm/next-auth@5.0.0-beta.32_nex_4a8037c68c76a116ef9d8f0c5bf19f5a/node_modules/next-auth/adapters.d.ts","../../auth/src/adapter.ts","../../auth/src/auth.ts","../../auth/src/utils.ts","../../auth/src/email.ts","../../auth/src/index.ts","../src/context.ts","../../../node_modules/.pnpm/@trpc+server@11.15.1_typescript@6.0.2/node_modules/@trpc/server/dist/index.d.mts","../../../node_modules/.pnpm/superjson@2.2.3/node_modules/superjson/dist/transformer.d.ts","../../../node_modules/.pnpm/superjson@2.2.3/node_modules/superjson/dist/plainer.d.ts","../../../node_modules/.pnpm/superjson@2.2.3/node_modules/superjson/dist/types.d.ts","../../../node_modules/.pnpm/superjson@2.2.3/node_modules/superjson/dist/registry.d.ts","../../../node_modules/.pnpm/superjson@2.2.3/node_modules/superjson/dist/class-registry.d.ts","../../../node_modules/.pnpm/superjson@2.2.3/node_modules/superjson/dist/custom-transformer-registry.d.ts","../../../node_modules/.pnpm/superjson@2.2.3/node_modules/superjson/dist/index.d.ts","../../../node_modules/.pnpm/zod@3.25.53/node_modules/zod/dist/types/v3/helpers/typealiases.d.ts","../../../node_modules/.pnpm/zod@3.25.53/node_modules/zod/dist/types/v3/helpers/util.d.ts","../../../node_modules/.pnpm/zod@3.25.53/node_modules/zod/dist/types/v3/zoderror.d.ts","../../../node_modules/.pnpm/zod@3.25.53/node_modules/zod/dist/types/v3/locales/en.d.ts","../../../node_modules/.pnpm/zod@3.25.53/node_modules/zod/dist/types/v3/errors.d.ts","../../../node_modules/.pnpm/zod@3.25.53/node_modules/zod/dist/types/v3/helpers/parseutil.d.ts","../../../node_modules/.pnpm/zod@3.25.53/node_modules/zod/dist/types/v3/helpers/enumutil.d.ts","../../../node_modules/.pnpm/zod@3.25.53/node_modules/zod/dist/types/v3/helpers/errorutil.d.ts","../../../node_modules/.pnpm/zod@3.25.53/node_modules/zod/dist/types/v3/helpers/partialutil.d.ts","../../../node_modules/.pnpm/zod@3.25.53/node_modules/zod/dist/types/v3/standard-schema.d.ts","../../../node_modules/.pnpm/zod@3.25.53/node_modules/zod/dist/types/v3/types.d.ts","../../../node_modules/.pnpm/zod@3.25.53/node_modules/zod/dist/types/v3/external.d.ts","../../../node_modules/.pnpm/zod@3.25.53/node_modules/zod/dist/types/v3/index.d.ts","../../../node_modules/.pnpm/zod@3.25.53/node_modules/zod/dist/types/index.d.ts","../../../node_modules/.pnpm/htmlparser2@10.1.0/node_modules/htmlparser2/dist/esm/tokenizer.d.ts","../../../node_modules/.pnpm/htmlparser2@10.1.0/node_modules/htmlparser2/dist/esm/parser.d.ts","../../../node_modules/.pnpm/domelementtype@2.3.0/node_modules/domelementtype/lib/esm/index.d.ts","../../../node_modules/.pnpm/domhandler@5.0.3/node_modules/domhandler/lib/esm/node.d.ts","../../../node_modules/.pnpm/domhandler@5.0.3/node_modules/domhandler/lib/esm/index.d.ts","../../../node_modules/.pnpm/dom-serializer@2.0.0/node_modules/dom-serializer/lib/esm/index.d.ts","../../../node_modules/.pnpm/domutils@3.2.2/node_modules/domutils/lib/esm/stringify.d.ts","../../../node_modules/.pnpm/domutils@3.2.2/node_modules/domutils/lib/esm/traversal.d.ts","../../../node_modules/.pnpm/domutils@3.2.2/node_modules/domutils/lib/esm/manipulation.d.ts","../../../node_modules/.pnpm/domutils@3.2.2/node_modules/domutils/lib/esm/querying.d.ts","../../../node_modules/.pnpm/domutils@3.2.2/node_modules/domutils/lib/esm/legacy.d.ts","../../../node_modules/.pnpm/domutils@3.2.2/node_modules/domutils/lib/esm/helpers.d.ts","../../../node_modules/.pnpm/domutils@3.2.2/node_modules/domutils/lib/esm/feeds.d.ts","../../../node_modules/.pnpm/domutils@3.2.2/node_modules/domutils/lib/esm/index.d.ts","../../../node_modules/.pnpm/htmlparser2@10.1.0/node_modules/htmlparser2/dist/esm/index.d.ts","../../../node_modules/.pnpm/@types+sanitize-html@2.16.1/node_modules/@types/sanitize-html/index.d.ts","../src/middleware/security.ts","../src/trpc.ts","../src/routers/hello-procedures.ts","../src/routers/hello.ts","../src/types/portal-context.ts","../src/services/portal-context.ts","../../../node_modules/.pnpm/image-size@2.0.2/node_modules/image-size/dist/types/interface.d.ts","../../../node_modules/.pnpm/image-size@2.0.2/node_modules/image-size/dist/types/index.d.ts","../../../node_modules/.pnpm/image-size@2.0.2/node_modules/image-size/dist/lookup.d.ts","../../../node_modules/.pnpm/image-size@2.0.2/node_modules/image-size/dist/index.d.ts","../src/routers/user.ts","../src/middleware/procedures.ts","../src/routers/admin.ts","../src/routers/member.ts","../src/routers/hackathon/crud.ts","../src/routers/hackathon/registration.ts","../src/routers/hackathon/admin.ts","../src/routers/hackathon/events.ts","../src/routers/hackathon/content.ts","../src/routers/hackathon/index.ts","../src/routers/events.ts","../src/routers/judge/portal.ts","../src/routers/judge/helpers.ts","../src/routers/judge/rankings.ts","../src/routers/judge/admin.ts","../src/routers/judge/index.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/net/httpclient.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/stripecontext.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/apiversion.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/lib.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/striperesource.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/crypto/cryptoprovider.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/stripeemitter.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/platform/platformfunctions.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/decimal.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/shared.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/billing/metereventsummaries.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/billing/meters.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/coupons.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/promotioncodes.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/discounts.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/taxrates.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/creditnotelineitems.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/applications.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/capabilities.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/bankaccounts.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/cards.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/externalaccounts.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/loginlinks.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/multipart.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/filelinks.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/files.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/persons.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/taxids.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/accounts.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/mandates.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/paymentintentamountdetailslineitems.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/connectcollectiontransfers.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/transfers.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/transferreversals.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/refunds.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/customercashbalancetransactions.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/disputes.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/payouts.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/reservetransactions.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/taxdeductedatsources.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/sourcetransactions.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/sources.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/topups.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/issuing/cardholders.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/issuing/physicalbundles.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/issuing/personalizationdesigns.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/issuing/cards.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/issuing/tokens.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/issuing/disputes.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/issuing/transactions.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/issuing/authorizations.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/issuing/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/balancetransactionsources.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/balancetransactions.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/feerefunds.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/applicationfees.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/reviews.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/customersources.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/charges.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/paymentintents.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/setupintents.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/setupattempts.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/paymentmethods.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/entitlements/features.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/entitlements/activeentitlements.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/entitlements/activeentitlementsummaries.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/entitlements/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/productfeatures.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/prices.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/taxcodes.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/products.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/plans.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/subscriptionitems.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/confirmationtokens.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/testhelpers/confirmationtokens.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/testhelpers/customers.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/testhelpers/refunds.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/testhelpers/testclocks.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/testhelpers/issuing/authorizations.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/testhelpers/issuing/cards.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/testhelpers/issuing/personalizationdesigns.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/testhelpers/issuing/transactions.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/testhelpers/issuing/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/terminal/locations.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/terminal/readers.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/testhelpers/terminal/readers.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/testhelpers/terminal/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/treasury/creditreversals.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/treasury/debitreversals.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/treasury/outboundpayments.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/treasury/outboundtransfers.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/treasury/receivedcredits.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/treasury/receiveddebits.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/treasury/transactionentries.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/treasury/transactions.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/treasury/inboundtransfers.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/testhelpers/treasury/inboundtransfers.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/testhelpers/treasury/outboundpayments.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/testhelpers/treasury/outboundtransfers.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/testhelpers/treasury/receivedcredits.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/testhelpers/treasury/receiveddebits.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/testhelpers/treasury/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/testhelpers/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/subscriptionschedules.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/subscriptions.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/invoicelineitems.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/paymentrecords.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/invoicepayments.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/shippingrates.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/invoices.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/creditnotes.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/lineitems.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/paymentlinks.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/checkout/sessions.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/checkout/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/customerbalancetransactions.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/cashbalances.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/fundinginstructions.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/customers.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/billing/alerts.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/billing/creditbalancesummary.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/billing/creditgrants.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/billing/creditbalancetransactions.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/billing/meterevents.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/billing/metereventadjustments.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/billing/alerttriggereds.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/billing/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/billingportal/configurations.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/billingportal/sessions.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/billingportal/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/climate/suppliers.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/climate/products.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/climate/orders.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/climate/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/financialconnections/accountowners.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/financialconnections/accountownerships.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/financialconnections/accounts.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/financialconnections/sessions.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/financialconnections/transactions.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/financialconnections/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/identity/verificationreports.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/identity/verificationsessions.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/identity/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/radar/earlyfraudwarnings.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/radar/paymentevaluations.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/radar/valuelistitems.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/radar/valuelists.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/radar/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/reporting/reportruns.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/reporting/reporttypes.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/reporting/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/reserve/plans.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/reserve/holds.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/reserve/releases.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/reserve/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/sigma/scheduledqueryruns.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/sigma/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/tax/associations.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/tax/calculationlineitems.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/tax/calculations.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/tax/registrations.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/tax/settings.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/tax/transactionlineitems.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/tax/transactions.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/tax/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/terminal/configurations.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/terminal/connectiontokens.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/terminal/onboardinglinks.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/terminal/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/treasury/financialaccountfeatures.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/treasury/financialaccounts.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/treasury/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/balance.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/balancesettings.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/invoiceitems.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/quotes.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/sourcemandatenotifications.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/events.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/webhooks.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/accountlinks.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/accountsessions.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/applepaydomains.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/countryspecs.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/customersessions.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/ephemeralkeys.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/exchangerates.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/invoicerenderingtemplates.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/oauth.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/paymentattemptrecords.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/paymentmethodconfigurations.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/paymentmethoddomains.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/tokens.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/webhookendpoints.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resourcenamespace.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/apps/secrets.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/apps/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/forwarding/requests.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/forwarding/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/v2/deletedobject.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/v2/billing/meterevents.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/v2/billing/metereventadjustments.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/v2/billing/metereventsession.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/v2/billing/metereventstream.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/v2/billing/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/v2/v2amounts.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/v2/core/accountpersons.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/v2/core/accounts/persons.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/v2/core/accountpersontokens.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/v2/core/accounts/persontokens.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/v2/core/accounts.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/v2/core/accountlinks.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/v2/core/accounttokens.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/v2/core/events.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/v2/core/eventdestinations.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/v2/core/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/resources/v2/index.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/stripe.core.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/types.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/requestsender.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/error.d.ts","../../../node_modules/.pnpm/stripe@22.1.1_@types+node@22.15.32/node_modules/stripe/esm/stripe.esm.node.d.ts","../src/routers/stripe.ts","../src/routers/audit.ts","../src/routers/team.ts","../src/root.ts","../src/index.ts","../src/middleware/http-security.ts","../../../node_modules/.pnpm/@vitest+pretty-format@4.1.8/node_modules/@vitest/pretty-format/dist/index.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.8/node_modules/@vitest/utils/dist/display.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.8/node_modules/@vitest/utils/dist/types.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.8/node_modules/@vitest/utils/dist/helpers.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.8/node_modules/@vitest/utils/dist/timers.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.8/node_modules/@vitest/utils/dist/index.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.8/node_modules/@vitest/utils/dist/types.d-bcelap-c.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.8/node_modules/@vitest/utils/dist/diff.d.ts","../../../node_modules/.pnpm/@vitest+runner@4.1.8/node_modules/@vitest/runner/dist/tasks.d-deyaimiu.d.ts","../../../node_modules/.pnpm/@vitest+runner@4.1.8/node_modules/@vitest/runner/dist/index.d.ts","../../../node_modules/.pnpm/vitest@4.1.8_@types+node@22_2e43ddd113e75f57c68244d18df0bee3/node_modules/vitest/dist/chunks/traces.d.d2t_r8rx.d.ts","../../../node_modules/.pnpm/vite@7.3.6_@types+node@22.1_37ed7f1209aadc882648fbd7743a599f/node_modules/vite/types/hmrpayload.d.ts","../../../node_modules/.pnpm/vite@7.3.6_@types+node@22.1_37ed7f1209aadc882648fbd7743a599f/node_modules/vite/dist/node/chunks/modulerunnertransport.d.ts","../../../node_modules/.pnpm/vite@7.3.6_@types+node@22.1_37ed7f1209aadc882648fbd7743a599f/node_modules/vite/types/customevent.d.ts","../../../node_modules/.pnpm/vite@7.3.6_@types+node@22.1_37ed7f1209aadc882648fbd7743a599f/node_modules/vite/types/hot.d.ts","../../../node_modules/.pnpm/vite@7.3.6_@types+node@22.1_37ed7f1209aadc882648fbd7743a599f/node_modules/vite/dist/node/module-runner.d.ts","../../../node_modules/.pnpm/@vitest+snapshot@4.1.8/node_modules/@vitest/snapshot/dist/environment.d-dojxxzv9.d.ts","../../../node_modules/.pnpm/@vitest+snapshot@4.1.8/node_modules/@vitest/snapshot/dist/rawsnapshot.d-d_x3-62x.d.ts","../../../node_modules/.pnpm/@vitest+snapshot@4.1.8/node_modules/@vitest/snapshot/dist/index.d.ts","../../../node_modules/.pnpm/vitest@4.1.8_@types+node@22_2e43ddd113e75f57c68244d18df0bee3/node_modules/vitest/dist/chunks/config.d.a1h_y6jt.d.ts","../../../node_modules/.pnpm/vitest@4.1.8_@types+node@22_2e43ddd113e75f57c68244d18df0bee3/node_modules/vitest/dist/chunks/environment.d.crsxczp1.d.ts","../../../node_modules/.pnpm/vitest@4.1.8_@types+node@22_2e43ddd113e75f57c68244d18df0bee3/node_modules/vitest/dist/chunks/rpc.d.b_8spu0w.d.ts","../../../node_modules/.pnpm/vitest@4.1.8_@types+node@22_2e43ddd113e75f57c68244d18df0bee3/node_modules/vitest/dist/chunks/worker.d.zphpo4yb.d.ts","../../../node_modules/.pnpm/vitest@4.1.8_@types+node@22_2e43ddd113e75f57c68244d18df0bee3/node_modules/vitest/dist/chunks/browser.d.bcoexmfg.d.ts","../../../node_modules/.pnpm/@vitest+spy@4.1.8/node_modules/@vitest/spy/optional-types.d.ts","../../../node_modules/.pnpm/@vitest+spy@4.1.8/node_modules/@vitest/spy/dist/index.d.ts","../../../node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.d.ts","../../../node_modules/.pnpm/@standard-schema+spec@1.1.0/node_modules/@standard-schema/spec/dist/index.d.ts","../../../node_modules/.pnpm/@types+deep-eql@4.0.2/node_modules/@types/deep-eql/index.d.ts","../../../node_modules/.pnpm/assertion-error@2.0.1/node_modules/assertion-error/index.d.ts","../../../node_modules/.pnpm/@types+chai@5.2.3/node_modules/@types/chai/index.d.ts","../../../node_modules/.pnpm/@vitest+expect@4.1.8/node_modules/@vitest/expect/dist/index.d.ts","../../../node_modules/.pnpm/@vitest+runner@4.1.8/node_modules/@vitest/runner/dist/utils.d.ts","../../../node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.d.ts","../../../node_modules/.pnpm/vitest@4.1.8_@types+node@22_2e43ddd113e75f57c68244d18df0bee3/node_modules/vitest/dist/chunks/benchmark.d.daahlpsq.d.ts","../../../node_modules/.pnpm/vitest@4.1.8_@types+node@22_2e43ddd113e75f57c68244d18df0bee3/node_modules/vitest/dist/chunks/global.d.dvssrdq5.d.ts","../../../node_modules/.pnpm/vitest@4.1.8_@types+node@22_2e43ddd113e75f57c68244d18df0bee3/node_modules/vitest/optional-runtime-types.d.ts","../../../node_modules/.pnpm/@vitest+mocker@4.1.8_vite@7_d27053213f85140d8304004886c6a0fa/node_modules/@vitest/mocker/dist/types.d-bji5eawu.d.ts","../../../node_modules/.pnpm/@vitest+mocker@4.1.8_vite@7_d27053213f85140d8304004886c6a0fa/node_modules/@vitest/mocker/dist/index.d-b41z0auw.d.ts","../../../node_modules/.pnpm/@vitest+mocker@4.1.8_vite@7_d27053213f85140d8304004886c6a0fa/node_modules/@vitest/mocker/dist/index.d.ts","../../../node_modules/.pnpm/vitest@4.1.8_@types+node@22_2e43ddd113e75f57c68244d18df0bee3/node_modules/vitest/dist/chunks/suite.d.udjtyagw.d.ts","../../../node_modules/.pnpm/vitest@4.1.8_@types+node@22_2e43ddd113e75f57c68244d18df0bee3/node_modules/vitest/dist/chunks/evaluatedmodules.d.bxj5omdx.d.ts","../../../node_modules/.pnpm/vitest@4.1.8_@types+node@22_2e43ddd113e75f57c68244d18df0bee3/node_modules/vitest/dist/runners.d.ts","../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.d.ts","../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.d.ts","../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.d.ts","../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.d.ts","../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.d.ts","../../../node_modules/.pnpm/vitest@4.1.8_@types+node@22_2e43ddd113e75f57c68244d18df0bee3/node_modules/vitest/dist/index.d.ts","../src/routers/judge/helpers.test.ts","../src/routers/user/portal-context.test.ts","../src/services/portal-context.test.ts","../src/test/create-mock-context.ts","../src/.internal-tests/hackathon-flow.test.ts","../src/.internal-tests/resilience.test.ts","../src/.internal-tests/routers.test.ts","../src/.internal-tests/security.test.ts"],"fileIdsList":[[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,571,579,959],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,562,563,564,565,566,568,571,579,580],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,568,571],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,562],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,571],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,567,571],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,561,567],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,560,569,571,580],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,571,573,579],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,571,575,576,579],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,579],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,569,571,574,577,578],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,571,577],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,559,562,567,571,575,579],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,571,579],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,558,559,560,561,567,568,570,579],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,580,957],[222,385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,580],[293,385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,580],[379,385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,580],[222,293,379,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,954,955,956],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,593,594,595],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,593],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1286,1287],[391,399,405,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,394,395,396,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,491,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[386,387,388,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[389,390,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,553],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,551,552,553],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,609,611],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,604,607,608,609,610,893,938],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,875],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,604,608,611,893,938],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,604,607,611,893,938],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,598,599],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1002],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1259,1265,1283,1284,1285,1288],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1295],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1295,1296],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1263,1265,1266],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1263,1265],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1263],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1258,1263,1274,1275],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1258,1263,1274],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1282],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1258,1264],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1258],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1260],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1258,1259,1260,1261,1262],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,992],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,991],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,990],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,992,994,995,996,997,998,999,1000],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,990,992],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,992,993],[89,95,98,143,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,90,385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[91,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,99,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,167,222,293,345,379,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,95,98,99,380,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[137,142,163,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,107,137,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[111,112,113,114,115,116,117,118,119,120,122,123,124,125,126,127,128,129,130,140,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,110,139,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,139,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,132,137,138,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,137,139,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,139,380,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,137,139,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[110,111,112,113,114,115,116,117,118,119,120,122,123,124,125,126,127,128,129,130,139,140,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,109,139,380,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,121,139,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,121,137,139,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,91,94,98,99,104,137,141,142,143,145,148,149,150,152,158,159,163,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,137,141,143,158,162,163,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,137,141,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[108,109,132,133,134,135,136,137,138,141,150,151,152,158,159,161,162,164,165,166,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,137,141,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,133,137,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,137,152,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,94,97,98,137,146,147,152,159,163,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[153,154,155,156,157,160,163,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,94,95,97,98,104,132,137,139,146,147,152,154,159,160,163,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,94,98,104,141,150,157,159,163,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,137,143,146,147,152,159,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,144,146,147,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,146,147,152,159,162,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,90,94,97,98,99,104,137,141,142,146,147,150,152,159,163,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[94,95,96,97,98,99,104,137,141,142,152,157,162,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,94,95,97,98,99,137,139,142,146,147,152,159,163,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,109,137,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,90,91,99,107,143,144,151,159,163,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[94,97,98,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,95,108,131,132,134,135,136,138,139,380,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[94,98,108,132,134,135,136,137,138,141,142,162,167,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,97,98,99,104,139,142,160,161,380,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,92,94,95,96,99,107,143,146,380,381,382,383,384,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[197,205,218,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,197,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,188,189,190,191,192,200,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,199,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,99,199,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,197,198,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,197,199,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,99,197,199,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,188,189,190,191,192,199,200,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,179,199,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,99,187,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,91,94,98,99,143,197,204,205,210,211,212,213,215,218,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,143,197,199,202,203,208,209,215,218,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,197,201,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[168,194,195,196,197,198,201,204,210,212,214,215,216,217,219,220,221,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,197,201,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,197,205,215,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,94,98,99,146,197,199,210,215,218,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[203,206,207,208,209,218,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,90,95,98,104,146,147,197,199,207,208,210,215,218,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,94,204,206,210,218,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,143,146,197,210,215,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,90,94,97,98,99,104,146,194,197,201,204,205,210,215,218,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[94,95,96,97,98,99,104,197,201,205,206,215,217,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,90,94,98,99,146,197,199,210,215,218,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,197,217,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,90,91,98,99,143,210,214,218,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[94,97,98,104,207,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,95,168,193,194,195,196,198,199,380,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[94,168,194,195,196,197,198,205,206,217,222,385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,97,98,104,201,205,207,216,380,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,91,92,99,143,276,283,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,554,555],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,555,556],[89,90,92,98,99,143,277,283,287,293,331,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,554],[94,95,98,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[264,270,287,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,107,264,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[224,225,226,227,228,230,231,232,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,267,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,234,266,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,266,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,99,266,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,259,264,265,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,264,266,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,266,380,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,99,229,266,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,99,264,266,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[224,225,226,227,228,230,231,232,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,266,267,268,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,233,266,380,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,236,266,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,264,266,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,229,236,264,266,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,99,229,264,266,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,91,94,98,99,143,264,269,270,271,272,273,274,275,277,282,283,286,287,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,143,202,264,269,277,282,286,287,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,264,269,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[223,233,259,260,261,262,263,264,265,269,275,276,277,282,283,285,286,288,289,290,292,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,264,269,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,260,264,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,264,277,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,90,94,97,98,104,146,147,264,277,283,287,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[274,278,279,280,281,284,287,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,90,94,95,97,98,104,146,147,259,264,266,277,279,283,284,287,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,94,98,269,275,281,283,287,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,143,146,147,264,277,283,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,146,147,277,283,286,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,90,94,97,98,99,104,146,147,264,269,270,275,277,283,287,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[94,95,96,97,98,99,104,264,269,270,277,281,286,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,90,94,95,97,98,99,104,146,147,264,266,270,277,283,287,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,233,264,268,286,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,90,91,99,107,143,144,276,283,287,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[94,97,98,104,284,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,95,223,258,259,261,262,263,265,266,380,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[94,98,223,259,261,262,263,264,265,269,270,286,293,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[291,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,97,98,99,104,266,270,284,285,380,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,107,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[94,95,96,98,99,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,95,98,99,102,381,385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[380,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[323,341,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,313,314,315,316,317,318,325,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,324,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,99,324,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,99,323,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,323,324,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,99,323,324,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,99,107,324,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,313,314,315,316,317,318,324,325,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,304,324,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,99,312,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,91,94,98,143,323,330,333,334,335,338,340,341,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,143,202,323,324,327,328,329,340,341,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[320,321,322,323,326,330,335,338,339,340,342,343,344,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,323,326,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,323,326,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,323,340,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,94,98,99,146,323,324,330,340,341,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[327,328,329,336,337,341,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,95,98,146,147,323,324,328,330,340,341,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,94,330,335,336,341,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,90,94,97,98,99,104,146,323,326,330,335,340,341,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[94,95,96,97,98,99,104,323,326,336,340,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,94,98,99,146,323,324,330,340,341,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,323,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,90,91,98,99,143,330,339,341,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[94,97,98,104,337,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,95,319,320,321,322,324,380,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[94,98,320,321,322,323,345,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,91,92,99,143,330,332,339,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,90,92,98,99,143,330,331,340,341,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[98,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[100,101,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[103,105,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[98,104,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[98,102,106,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,93,94,95,97,99,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[351,372,377,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,372,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[347,367,368,369,370,375,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,99,374,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,372,373,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,372,374,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[347,367,368,369,370,374,375,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,99,366,372,374,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,374,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,99,372,374,380,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,91,94,98,99,143,351,352,353,354,357,362,363,372,377,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,143,202,357,362,372,376,377,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,372,376,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[346,348,349,350,354,355,357,362,363,365,366,372,373,376,378,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,372,376,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,357,365,372,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,94,97,98,99,146,147,357,363,372,374,377,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[358,359,360,361,364,377,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,94,97,98,99,104,146,147,348,357,359,363,364,372,374,377,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,94,354,361,363,377,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,99,143,146,147,357,363,372,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,98,144,146,147,363,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,90,94,97,98,99,104,146,147,351,354,357,363,372,376,377,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[94,95,96,97,98,99,104,351,357,361,365,372,376,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,94,97,98,99,146,147,351,357,363,372,374,377,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,90,91,98,143,144,146,355,356,363,377,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[94,97,98,104,364,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,95,346,348,349,350,371,373,374,380,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,372,374,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[94,98,346,348,349,350,351,365,372,373,379,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,97,98,104,351,364,374,380,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[89,96,98,99,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[91,92,95,98,381,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1301,1302],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1301,1302,1303,1304],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1301,1303],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1301],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,988,989,990,992,1001],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,988],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1010,1011,1012],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1010,1011],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1010],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,580],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,567,571,579,939,943,944,945,946],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,567,571,939,943,944],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,939],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,950],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,948],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,576],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,896],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,898,899,900,901],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,845,907,908],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,616,617,619,631,655,770,781,889],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,619,650,651,652,654,889],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,619,787,789,791,792,794,889,891],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,619,653,690,889],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,617,619,630,631,637,643,648,769,770,771,780,889,891],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,889],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,626,632,651,671,766],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,619],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,612,626,632],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,798],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,795,796,798],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,795,797,889],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,671,869,886],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,742,745,761,766,886],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,714,886],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,774],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,773,774,775],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,773],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,606,612,619,631,637,643,649,651,655,656,669,670,737,767,768,781,889,893],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,616,619,653,690,787,788,793,889,941],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,653,941],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,616,670,840,889,941],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,941],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,619,653,654,941],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,790,941],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,656,769,772,779],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,845],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,626,641],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,711],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,641],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,632,641,845],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,626,697,711,712,923,930],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,696,924,925,926,927,929],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,747],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,747,748],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,630,632,699,700],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,632,706,707],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,632,701,709],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,706],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,624,632,699,700,701,702,703,704,705,706,709],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,632,699,706,707,708,710],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,632,700,702,703],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,700,702,705,707],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,928],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,632],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,620,917],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,653,688],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,653,781],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,686,691],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,687,895],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,604,607,608,611,893,937],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,631,636,717,734,776,777,781,837,839,889,890],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,669,778],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,893],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,618],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,623,626,842,858,860],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,626,842,857,858,859,940],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,851,852,853,854,855,856],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,853],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,857],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,641,805,806,808],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,632,799,800,801,802,807],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,805,807],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,803],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,804],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,641,687,895],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,641,894,895],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,641,895],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,734,735],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,735],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,890,895],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,764],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,763],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,626,632,638,640,742,755,759,761,839,842,878,879,886,890],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,632,681,703],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,742,753,756,761],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,623,626,742,745,761,764,798,846,847,848,849,850,861,862,863,864,865,866,867,868,941],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,623,626,651,742,749,750,751,754,755],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,632,651,753,760,842,843,886],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,757],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,620,632,636,646,678,679,682,734,737,802,837,838,878,889,890,891,893,941],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,623,624,626],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,742],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,651,678,679,736,737,738,739,740,741,890],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,761],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,625,626,636,640,676,742,749,750,751,752,753,756,757,758,759,760,879],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,676,677,749,890,891],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,651,679,734,737,742,839,890],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,889,891],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,886,890,891],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,612,626,631,638,640,643,646,653,673,678,679,680,681,682,717,718,720,723,725,728,729,730,731,733,781,837,839,886,889,890,891],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,619,620,621,649,886,887,888,893,895,941],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,616,617,889],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,810],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,628,794,798,799,800,801,802,808,809,941],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,612,626,628,640,643,679,718,723,733,734,787,814,815,816,823,826,827,837,839,886,889],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,643,649,656,669,679,737,889],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,620,631,640,679,821,886,889],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,841],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,810,824,825,834],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,886,889],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,739,879],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,640,678,781,895],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,618,723,783,787,816,823,826,829,886],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,656,669,787,830],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,619,680,781,832,889,891],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,802,889],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,653,680,781,782,783,792,810,831,833,889],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,606,678,836,893,895],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,732,837],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,626,629,631,632,638,640,646,655,656,669,679,682,718,720,730,733,734,781,814,815,816,817,819,822,837,839,886,895],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,656,823,828,834,886],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,659,660,661,662,663,664,665,666,667,668],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,673,724],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,726],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,724],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,726,727],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,630,631,632,636,637,890],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,618,620,638,642,678,681,682,716,837,886,891,893,895],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,622,629,630,640,642,679,835,879,885,890],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,749],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,750],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,632,643,878],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,751],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,625],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,627,639],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,627,631,638],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,634,639],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,635],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,627,628],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,627,683],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,627],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,629,673,722],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,721],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,626,628,629],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,629,719],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,626,628],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,678,781],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,878],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,638,640,644,678,781,836,839,842,843,844,870,871,874,877,879,886,890],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,692,695,697,698,711,712],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,609,611,641,872,873],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,609,611,641,872,873,876],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,765],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,651,672,677,678,742,743,744,745,746,748,761,762,764,767,836,839,889,891],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,711],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,716,886],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,716],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,638,684,713,715,717,836,886,893,895],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,692,693,694,695,697,698,711,712,894],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,606,627,628,640,646,678,679,682,781,834,835,837,886,889,890,893],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,623,626,633],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,677,679,811,814],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,677,812,880,881,882,883,884],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,673,889],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,676,761],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,675],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,677,730],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,674,676,889],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,622,677,811,812,813,886,889,890],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,626,632,710],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,624],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,614,615],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,620],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,626,696],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,606,678,682,893,895],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,620,917,918],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,691],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,618,685,687,689,690,895],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,626,653,890],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,626,818],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,616,618,691,789,893,894],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,607,608,611,893,938],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,601,602,603,604],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,784,785,786],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,784],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,600,604,607,608,609,611,612,618,646,651,829,857,891,892,895,938],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,903],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,905],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,909],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,911],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,913,914,915],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,919],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,605,897,902,904,906,910,912,916,920,922,932,933,935,939,940,941,942],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,921],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,931],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,687],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,934],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,677,811,812,814,880,881,883,884,936,938],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,548,549,550],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,548],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,572],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,573],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,820],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1248,1249],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,1030,1031,1032,1248],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1248],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,1248],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,1030,1035,1036,1248],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1030,1033,1247,1248],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1247,1248],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1042,1043,1045,1054,1055,1057,1058,1059,1062,1064,1066,1067,1071,1072,1083,1085,1086,1088,1089,1090,1091,1092,1098,1099,1100,1101,1102,1103,1133,1134,1136,1137,1138,1139,1140,1142,1148,1202,1203,1204,1205,1207,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1048,1051,1052,1055,1056,1057],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1047,1058,1083,1084,1088],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1225,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1082],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1061,1062,1063,1064,1065,1066,1067,1068,1069,1072,1081,1084,1085,1088],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1039,1058,1148],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1041,1148],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1149],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1148],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1132,1139,1151],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1132,1148],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1040,1041,1149,1150,1151,1152,1153,1154,1155,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1040],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1047],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1157,1158,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1157],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1058],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1047,1058,1059,1062,1064,1083,1085,1086,1087,1089,1092,1148],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1143,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1042,1043,1045,1057,1058,1089,1090,1134,1138,1139,1141,1142,1148],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1160,1161,1162,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1160,1161],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1160],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1088,1091,1148],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1039,1044,1045,1156],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1044,1045,1046,1138,1139,1145,1148,1156],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1039,1139,1140,1144,1148],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1064,1083,1089,1148],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1044,1049,1057,1065,1087,1092,1132,1134,1145,1146,1147],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1049,1050,1058,1071],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1042,1043,1148],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1055,1083,1088,1089],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1093],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1094],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1093,1094,1095,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1042,1043,1044,1045,1047,1048,1051,1055,1056,1057,1058,1059,1062,1064,1065,1066,1067,1070,1071,1072,1081,1084,1085,1086,1087,1088,1089,1090,1092,1096,1098,1100,1101,1132,1133,1134,1137,1139,1140,1142,1144,1146,1148,1156,1159,1163,1169,1172,1177,1180,1184,1186,1194,1198,1201,1202,1203,1204,1205,1206],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1049,1050],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1039,1083,1085],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1055],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1053,1054],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1164],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1148,1164,1165],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1164,1165,1166,1167,1168,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1148,1166],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1227,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1039],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1170,1171,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1170],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1044,1045,1098,1132,1139,1148],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1039,1044,1098,1134,1156],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1088,1089,1136,1139],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1044,1045,1047,1057,1058,1087,1089,1090,1092,1132,1134,1135,1137,1138,1148,1156],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1073,1076,1077,1079,1083],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1073,1075],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1055,1079,1083],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1073,1074,1075,1076,1077,1078,1079,1080,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1055,1074],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1076],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1073,1076,1077,1078,1080,1083],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1039,1045,1098],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1092],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1248],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1059,1092],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1047,1058,1060,1086,1087,1088,1090,1092,1148],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1047,1057,1058,1138,1141],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1051,1083,1085],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1039,1055],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1100],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1096],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1097,1098,1099],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1042,1148],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1044,1045,1047,1058,1132,1133,1134,1139,1141,1148],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1088,1089],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1173,1174,1175,1176,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1092],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1175],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1063,1083,1088,1089],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1178,1179,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1039,1088,1181],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1181,1182,1183],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1039,1064,1066,1181,1182],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1047,1058,1059,1087,1089,1090,1092,1148],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1047,1058,1059,1087,1089,1091,1092,1148],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1099],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1185,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1071],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1070],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1044,1045,1098,1101],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1044,1045,1047,1057,1058,1087,1090,1092,1102,1132,1133,1139,1148],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1042,1043,1045,1047,1057,1058,1092,1098,1101,1132,1134,1148],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1188],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1187,1188,1189,1190,1191,1192,1193,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1192],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1047,1058,1148],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1113,1114,1195,1196,1197,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1064,1088,1089,1090,1092,1113],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1103],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1065],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1104,1105,1106,1107,1112,1116,1131,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1080],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1076],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1108,1109,1110,1111,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1075],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1079],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1064],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1115,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1114],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1125],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1126,1127,1128,1129,1130,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1119],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1120],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1121],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1122],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1049,1050],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1071,1083],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1039,1062,1064,1083],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1058,1063,1083,1088],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1124],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1199],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1059,1124],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1117,1118,1119,1120,1121,1122,1123,1124,1125,1199,1200,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1067,1117,1119,1120,1124],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1081,1117,1118,1119,1120,1121,1122,1124,1125],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1081,1117,1118,1119,1120,1121,1122,1123,1125],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1230,1231,1232,1233,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1235,1237,1239,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1229,1236],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1238],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1235],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1034,1039,1229,1243],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1031,1033,1034,1039,1156,1245],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1236,1238,1240,1241,1242,1243,1244,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1229,1234,1245,1247],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1038],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1030,1031,1032,1033,1034,1035,1037,1039,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1096,1097,1098,1099,1100,1101,1102,1103,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1144,1145,1146,1147,1148,1156,1159,1163,1169,1172,1177,1180,1186,1194,1198,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1218,1219,1220,1221,1222,1224,1226,1228,1246,1248,1249,1250],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1033,1247,1248],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,1030,1031,1033,1247,1249],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1035,1037,1207],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,969,970],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,969],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,969,970,971,972],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,967,973],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,973],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,967,968],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,463,467,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,463,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,458,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,460,463,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,458,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,392,393,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,459,462,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,463,470,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,392,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,461,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,463,484,485,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,459,463,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,484,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,457,458,459,460,461,462,463,464,465,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,485,486,487,488,489,490,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,463,478,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,463,470,471,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,461,463,471,472,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,462,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,392,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,458,463,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,463,467,471,472,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,467,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,461,463,466,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,392,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,460,463,470,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,458,463,484,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1269],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1269,1270,1271,1272],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1271],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1267,1290,1291,1293],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1267,1268,1280,1293],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1258,1265,1267,1268,1276,1293],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1273],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1258,1267,1268,1276,1289,1292,1293],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1267,1268,1273,1276,1293],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1267,1290,1291,1292,1293],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1267,1273,1277,1278,1279,1293],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1258,1263,1265,1267,1268,1273,1276,1277,1278,1279,1280,1281,1283,1289,1290,1291,1292,1293,1294,1297,1298,1299,1300,1305],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1258,1265,1267,1268,1276,1277,1290,1291,1292,1293,1298],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,986],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,976,977],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,974,975,976,978,979,984],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,975,976],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,984],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,985],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,976],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,974,975,976,979,980,981,982,983],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,974,975,986],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,592,597,1255,1306],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1004,1306],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,592,597,966,1004,1005,1255,1306],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,966,1004,1306],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,592,596,597,964],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,597,965,1004,1005,1008,1255],[385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,592,597,966,1005],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,592,966,1003],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1005,1007,1014,1016,1017,1023,1024,1029,1252,1253,1254],[385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,592,597,966,987,1005,1015],[385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,592,987,1005,1015],[385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,592,966,987,1005,1015],[385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,592,963,966,987,1005,1015],[385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,592,987,1005],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1005,1018,1019,1020,1021,1022],[385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,592,966,987,1005],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,987,1005],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1005,1006],[385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,592,966,987,1005,1015,1026],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1026,1306],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1005,1025,1027,1028],[385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,592,987,1005,1015,1026],[385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,592,597,966,987,1005],[385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,592,597,966,987,1004,1005,1251],[385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,592,597,966,987,1005,1009,1013],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,1008,1009,1306],[385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,592,1008],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,592,597,965],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,965,966,973,987,1004],[385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,580,592,958,959],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,947,953,960],[385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,592,947,949,951,952],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,953,960,961,962,963],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,961],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,554,557,590],[385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,582,583,584,585,586,589,590,591],[293,385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,582],[293,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,581],[293,385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,582,584],[391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,582,583,584,585,586,587,588,589],[293,385,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,582,583],[293,391,399,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,493,494,495,496,497,498,499,500,501,502,503,504,505,506,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545]],"fileInfos":[{"version":"bcd24271a113971ba9eb71ff8cb01bc6b0f872a85c23fdbe5d93065b375933cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f88bedbeb09c6f5a6645cb24c7c55f1aa22d19ae96c8e6959cbd8b85a707bc6","impliedFormat":1},{"version":"7fe93b39b810eadd916be8db880dd7f0f7012a5cc6ffb62de8f62a2117fa6f1f","impliedFormat":1},{"version":"bb0074cc08b84a2374af33d8bf044b80851ccc9e719a5e202eacf40db2c31600","impliedFormat":1},{"version":"1a7daebe4f45fb03d9ec53d60008fbf9ac45a697fdc89e4ce218bc94b94f94d6","impliedFormat":1},{"version":"f94b133a3cb14a288803be545ac2683e0d0ff6661bcd37e31aaaec54fc382aed","impliedFormat":1},{"version":"f59d0650799f8782fd74cf73c19223730c6d1b9198671b1c5b3a38e1188b5953","impliedFormat":1},{"version":"8a15b4607d9a499e2dbeed9ec0d3c0d7372c850b2d5f1fb259e8f6d41d468a84","impliedFormat":1},{"version":"26e0fe14baee4e127f4365d1ae0b276f400562e45e19e35fd2d4c296684715e6","impliedFormat":1},{"version":"1e9332c23e9a907175e0ffc6a49e236f97b48838cc8aec9ce7e4cec21e544b65","impliedFormat":1},{"version":"3753fbc1113dc511214802a2342280a8b284ab9094f6420e7aa171e868679f91","impliedFormat":1},{"version":"999ca32883495a866aa5737fe1babc764a469e4cde6ee6b136a4b9ae68853e4b","impliedFormat":1},{"version":"17f13ecb98cbc39243f2eee1f16d45cd8ec4706b03ee314f1915f1a8b42f6984","impliedFormat":1},{"version":"d6b1eba8496bdd0eed6fc8a685768fe01b2da4a0388b5fe7df558290bffcf32f","affectsGlobalScope":true,"impliedFormat":1},{"version":"eadcffda2aa84802c73938e589b9e58248d74c59cb7fcbca6474e3435ac15504","affectsGlobalScope":true,"impliedFormat":1},{"version":"105ba8ff7ba746404fe1a2e189d1d3d2e0eb29a08c18dded791af02f29fb4711","affectsGlobalScope":true,"impliedFormat":1},{"version":"00343ca5b2e3d48fa5df1db6e32ea2a59afab09590274a6cccb1dbae82e60c7c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ebd9f816d4002697cb2864bea1f0b70a103124e18a8cd9645eeccc09bdf80ab4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2c1afac30a01772cd2a9a298a7ce7706b5892e447bb46bdbeef720f7b5da77ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"7b0225f483e4fa685625ebe43dd584bb7973bbd84e66a6ba7bbe175ee1048b4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0a4b8ac6ce74679c1da2b3795296f5896e31c38e888469a8e0f99dc3305de60","affectsGlobalScope":true,"impliedFormat":1},{"version":"3084a7b5f569088e0146533a00830e206565de65cae2239509168b11434cd84f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5079c53f0f141a0698faa903e76cb41cd664e3efb01cc17a5c46ec2eb0bef42","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cafbc484dea6b0ab62cf8473182bbcb23020d70845b406f80b7526f38ae862","affectsGlobalScope":true,"impliedFormat":1},{"version":"fca4cdcb6d6c5ef18a869003d02c9f0fd95df8cfaf6eb431cd3376bc034cad36","affectsGlobalScope":true,"impliedFormat":1},{"version":"b93ec88115de9a9dc1b602291b85baf825c85666bf25985cc5f698073892b467","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c06dcc3fe849fcb297c247865a161f995cc29de7aa823afdd75aaaddc1419b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b77e16112127a4b169ef0b8c3a4d730edf459c5f25fe52d5e436a6919206c4d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbffd9337146eff822c7c00acbb78b01ea7ea23987f6c961eba689349e744f8c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a995c0e49b721312f74fdfb89e4ba29bd9824c770bbb4021d74d2bf560e4c6bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c7b3542146734342e440a84b213384bfa188835537ddbda50d30766f0593aff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce6180fa19b1cccd07ee7f7dbb9a367ac19c0ed160573e4686425060b6df7f57","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f02e2476bccb9dbe21280d6090f0df17d2f66b74711489415a8aa4df73c9675","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e3ab34c1c013c8ab2dc1ba4c80c780744b13b5676800ae2e3be27ae862c40c","affectsGlobalScope":true,"impliedFormat":1},{"version":"805c86f6cca8d7702a62a844856dbaa2a3fd2abef0536e65d48732441dde5b5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e42e397f1a5a77994f0185fd1466520691456c772d06bf843e5084ceb879a0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4c2b41f90c95b1c532ecc874bd3c111865793b23aebcc1c3cbbabcd5d76ffb0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab26191cfad5b66afa11b8bf935ef1cd88fabfcb28d30b2dfa6fad877d050332","affectsGlobalScope":true,"impliedFormat":1},{"version":"2088bc26531e38fb05eedac2951480db5309f6be3fa4a08d2221abb0f5b4200d","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb9d366c425fea79716a8fb3af0d78e6b22ebbab3bd64d25063b42dc9f531c1e","affectsGlobalScope":true,"impliedFormat":1},{"version":"500934a8089c26d57ebdb688fc9757389bb6207a3c8f0674d68efa900d2abb34","affectsGlobalScope":true,"impliedFormat":1},{"version":"689da16f46e647cef0d64b0def88910e818a5877ca5379ede156ca3afb780ac3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc21cc8b6fee4f4c2440d08035b7ea3c06b3511314c8bab6bef7a92de58a2593","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ca53d13d2957003abb47922a71866ba7cb2068f8d154877c596d63c359fed25","affectsGlobalScope":true,"impliedFormat":1},{"version":"54725f8c4df3d900cb4dac84b64689ce29548da0b4e9b7c2de61d41c79293611","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5594bc3076ac29e6c1ebda77939bc4c8833de72f654b6e376862c0473199323","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f3eb332c2d73e729f3364fcc0c2b375e72a121e8157d25a82d67a138c83a95c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f4427f9642ce8d500970e4e69d1397f64072ab73b97e476b4002a646ac743b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"48915f327cd1dea4d7bd358d9dc7732f58f9e1626a29cc0c05c8c692419d9bb7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7bf9377723203b5a6a4b920164df22d56a43f593269ba6ae1fdc97774b68855","affectsGlobalScope":true,"impliedFormat":1},{"version":"db9709688f82c9e5f65a119c64d835f906efe5f559d08b11642d56eb85b79357","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b25b8c874acd1a4cf8444c3617e037d444d19080ac9f634b405583fd10ce1f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be57d7c90cf1f8112ee2636a068d8fd181289f82b744160ec56a7dc158a9f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a917a49ac94cd26b754ab84e113369a75d1a47a710661d7cd25e961cc797065f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d3261badeb7843d157ef3e6f5d1427d0eeb0af0cf9df84a62cfd29fd47ac86e","affectsGlobalScope":true,"impliedFormat":1},{"version":"195daca651dde22f2167ac0d0a05e215308119a3100f5e6268e8317d05a92526","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b11e4285cd2bb164a4dc09248bdec69e9842517db4ca47c1ba913011e44ff2f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0508571a52475e245b02bc50fa1394065a0a3d05277fbf5120c3784b85651799","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f9af488f510c3015af3cc8c267a9e9d96c4dd38a1fdff0e11dc5a544711415b","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc611fea8d30ea72c6bbfb599c9b4d393ce22e2f5bfef2172534781e7d138104","affectsGlobalScope":true,"impliedFormat":1},{"version":"0bd714129fca875f7d4c477a1a392200b0bcd13fb2e80928cd334b63830ea047","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2c9037ae6cd2c52d80ceef0b3c5ffdb488627d71529cf4f63776daf11161c9a","affectsGlobalScope":true,"impliedFormat":1},{"version":"135d5cf4d345f59f1a9caadfafcd858d3d9cc68290db616cc85797224448cccc","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc238c3f81c2984751932b6aab223cd5b830e0ac6cad76389e5e9d2ffc03287d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4a07f9b76d361f572620927e5735b77d6d2101c23cdd94383eb5b706e7b36357","affectsGlobalScope":true,"impliedFormat":1},{"version":"7c4e8dc6ab834cc6baa0227e030606d29e3e8449a9f67cdf5605ea5493c4db29","affectsGlobalScope":true,"impliedFormat":1},{"version":"de7ba0fd02e06cd9a5bd4ab441ed0e122735786e67dde1e849cced1cd8b46b78","affectsGlobalScope":true,"impliedFormat":1},{"version":"6148e4e88d720a06855071c3db02069434142a8332cf9c182cda551adedf3156","affectsGlobalScope":true,"impliedFormat":1},{"version":"d63dba625b108316a40c95a4425f8d4294e0deeccfd6c7e59d819efa19e23409","affectsGlobalScope":true,"impliedFormat":1},{"version":"0568d6befee03dd435bed4fc25c4e46865b24bdcb8c563fdc21f580a2c301904","affectsGlobalScope":true,"impliedFormat":1},{"version":"30d62269b05b584741f19a5369852d5d34895aa2ac4fd948956f886d15f9cc0d","affectsGlobalScope":true,"impliedFormat":1},{"version":"f128dae7c44d8f35ee42e0a437000a57c9f06cc04f8b4fb42eebf44954d53dc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"ffbe6d7b295306b2ba88030f65b74c107d8d99bdcf596ea99c62a02f606108b0","affectsGlobalScope":true,"impliedFormat":1},{"version":"996fb27b15277369c68a4ba46ed138b4e9e839a02fb4ec756f7997629242fd9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"79b712591b270d4778c89706ca2cfc56ddb8c3f895840e477388f1710dc5eda9","affectsGlobalScope":true,"impliedFormat":1},{"version":"20884846cef428b992b9bd032e70a4ef88e349263f63aeddf04dda837a7dba26","affectsGlobalScope":true,"impliedFormat":1},{"version":"5fcab789c73a97cd43828ee3cc94a61264cf24d4c44472ce64ced0e0f148bdb2","affectsGlobalScope":true,"impliedFormat":1},{"version":"db59a81f070c1880ad645b2c0275022baa6a0c4f0acdc58d29d349c6efcf0903","affectsGlobalScope":true,"impliedFormat":1},{"version":"673294292640f5722b700e7d814e17aaf7d93f83a48a2c9b38f33cbc940ad8b0","affectsGlobalScope":true,"impliedFormat":1},{"version":"d786b48f934cbca483b3c6d0a798cb43bbb4ada283e76fb22c28e53ae05b9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ecb8e347cb6b2a8927c09b86263663289418df375f5e68e11a0ae683776978f","affectsGlobalScope":true,"impliedFormat":1},{"version":"142efd4ce210576f777dc34df121777be89eda476942d6d6663b03dcb53be3ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"379bc41580c2d774f82e828c70308f24a005b490c25ba34d679d84bcf05c3d9d","affectsGlobalScope":true,"impliedFormat":1},{"version":"ed484fb2aa8a1a23d0277056ec3336e0a0b52f9b8d6a961f338a642faf43235d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ffedae1d1c2d53fdbca1c96d3c7dda544281f7d262f99b6880634f8fd8d9820","affectsGlobalScope":true,"impliedFormat":1},{"version":"83a730b125d477dd264df8ba479afab27a3dae7152b005c214ab94dc7ee44fd3","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},{"version":"c6fe327c538417b8dd5b9bb32abcd7911534b10da3a4514f3445cdb28cf3abf2","impliedFormat":99},{"version":"32c6e3ef96f2bcbc1db7d7f891459241657633aa663cab6812fb28ade7c90608","impliedFormat":99},{"version":"17da8f27c18a2a07c1a48feb81887cb69dacc0af77c3257217016dacf9202151","impliedFormat":99},{"version":"0065cdb7ac9f5b19921632de63f888ec2cc11ad57f7fc868f44bf0faad2fce3e","impliedFormat":99},{"version":"8c1adc3171d0287f3a26f4891a7d1834c89999573a9b444aa5ff519dcc43a2b7","impliedFormat":99},{"version":"a829052855dca3affb8e2ef0afa0f013b03fa9b55762348b1fba76d9c2741c99","impliedFormat":99},{"version":"27aee784c447854a4719f11058579e49f08faa70d06d8e30abe00f5e25538de6","impliedFormat":99},{"version":"8e10049294ca78d6ddffe8628ec671f165bd06db35b858e6c6ce6eeaeb546ba3","impliedFormat":99},{"version":"531de62ccf432c13c76004416714ecd03e6fde98d70d283c1ee2578a25784edf","impliedFormat":99},{"version":"5a2cf4cd852a58131b320da62269b2143850920ce27e8fdec41fed5c2c54ec95","impliedFormat":99},{"version":"99813a55d43aa2535ca273996466414a14a9b6948018050e370f0c65909f77ad","impliedFormat":99},{"version":"6a99940a8a76a1aa20ae6f2afd8e909e47e0b17df939e7cf5a585171480655ff","impliedFormat":99},{"version":"043195af0b52aadd10713870dd60369df0377ed153104b26e6bac1213b19f63e","impliedFormat":99},{"version":"ad17a36132569045ab97c8e5badf8febb556011a8ed7b2776ff823967d6d5aca","impliedFormat":99},{"version":"698d2b22251dbbfc0735e2d6ed350addead9ad031fac48b8bb316e0103d865db","impliedFormat":99},{"version":"7298d28b75c52e89c0b3e5681eac19e14480132cd30baaba5e5ca10211a740ef","impliedFormat":99},{"version":"ff10facf373a13d2864ff4de38c4892d74be27d9c6468dac49c08adabbf9b0eb","impliedFormat":99},{"version":"97b1cf4599cc3bc2e84b997aa1af60d91ca489d96bea0e20aaff0e52a5504b29","impliedFormat":99},{"version":"853dfbcd0999d3edc6be547d83dc0e0d75bf44530365b9583e75519d35984c35","impliedFormat":99},{"version":"9c80bed388d4ed47080423402db9cb1b35a31449045a83a0487f4dfde3d9d747","impliedFormat":99},{"version":"f29bc6a122a4a26c4e23289daae3aa845a18af10da90989cb8b51987e962b7be","impliedFormat":99},{"version":"3a1f39e098971c10633a064bd7a5dbdec464fcf3864300772763c16aa24457f9","impliedFormat":99},{"version":"20e614d6e045d687c3f7d707561b7655ad6177e859afc0c55649b7e346704c77","impliedFormat":99},{"version":"aa0ae1910ba709bc9db460bdc89a6a24d262be1fbea99451bedac8cbbc5fb0cd","impliedFormat":99},{"version":"161d113c2a8b8484de2916480c7ba505c81633d201200d12678f7f91b7a086f0","impliedFormat":99},{"version":"b998a57d4f43e32ac50a1a11f4505e1d7f71c3b87f155c140debe40df10386c8","impliedFormat":99},{"version":"5710e8ed9797ae0042e815eb8f87df2956cb1bf912939c9b98eeb58494a63c13","impliedFormat":99},{"version":"a6bb421dccfec767dbd3e99180b24c07c4a216c0fd549f54a3313f6ce3f9d2c7","impliedFormat":99},{"version":"3b6f1be46f573b1c1f3e6cd949890bfb96b40ff90b6f313e425a379c1c4d5d77","impliedFormat":99},{"version":"28a2c54d0a78d32c29f7279ca04dc6c7860c008579e4e3033938c0ed0201eb9a","impliedFormat":99},{"version":"c2714a402843287624210a47ebea2b1c8dd3ad1438f448633f6831e31eaf37b8","impliedFormat":99},{"version":"b89945ec6707415d739f3e76f2820982d4927dc6b681910b3c433b5ad261b817","impliedFormat":99},{"version":"a72d5822fb2a2c1ef985b30aed889f4c00342c90e12318762fccc550c6a599cf","impliedFormat":99},{"version":"c8616ab60eda93ca87fbb20aada1d6a6cdbcd2cb181a70a2d7728a3cb0613391","impliedFormat":99},{"version":"eeddfd3e0b09890822068de5248d38144f8328e74b5292847eb4e558d8aba8cb","impliedFormat":99},{"version":"d4dc0b6592543314c8549c71e35ad2ec4a57904662d905ff9585836bde1c855a","impliedFormat":99},{"version":"56e1687a174cd10912a35a4676af434bb213aafa5d4371040986c578afe644ab","impliedFormat":99},{"version":"470c280cc484340b97d0942e0c3aa312399eba3849ceb95312d0d7413bac7458","impliedFormat":99},{"version":"ae183f4a6300aad2be92cdbd4dd12d8bcd36eddf8dd1846f998c237235fe0c33","impliedFormat":99},{"version":"4b0eeffddaf51b967e95926a825a6ba1205b81b3a8fecddbe21eaf0e86bdee91","impliedFormat":99},{"version":"bf3ec0d42e33e487c359a989b30e1c9e90fa06de484dc4751e93fb34a9b5cf90","impliedFormat":99},{"version":"7b9656a61d83df1a46c38c2984dbf96dd057bf48f477ddf3f8990311ab98ec23","impliedFormat":99},{"version":"366b85ddb698f3a035e0caa68dc9fef39a85c4368c0810eaf937c3a3c63ac31e","impliedFormat":99},{"version":"d440ee730bc60a5c605903842e398863e7ecdb7a91fc32a9152f14061bf6cc17","impliedFormat":99},{"version":"a12c86c4a691608d19a75320946c80bbce38bb62c091dda32572aee7158edd38","impliedFormat":99},{"version":"3109cb3f8ab0308d2944c26742b6a8a02b4a4ffc23f479a81f0e945d6a6721dd","impliedFormat":99},{"version":"a2289c12a987f2a06f4cf049afde4fdc9455a4af37913445148865938c6eb613","impliedFormat":99},{"version":"55933c1450edcfaf166429425dbbad0a27c0ae8672d5ab5d427e46946a6f2f63","impliedFormat":99},{"version":"6c684fda6998db4112e82367c9e82e27996dc8086a10d58ac9b51d89770d5f9d","impliedFormat":99},{"version":"5c4b4dd983471fcaed17ad3241c98a1f880729f1ca579ddbcdae7e0bf04035df","impliedFormat":99},{"version":"9e430429c7e9e70071a836ac91a1bf6e6651f91d47d9f4baf0a92eefc6130818","impliedFormat":99},{"version":"b3db7f6d7ef72669dc83fa1ff7b90a2ec31d1d8f82778f2a00ef6d101f5247e5","impliedFormat":99},{"version":"354f61bd2a5acaf20462bc4d61048aa25f8fc0dd04dfe3d2f30bdbabbab54e7d","impliedFormat":99},{"version":"d51756340928e549f076c832d7bc2b4180385597b0b4daaa50e422bed53e1a72","impliedFormat":99},{"version":"ac2ea00eb8f73665842e57e729e14c6d3feabe9859dc5e87a1ed451b20b889e4","impliedFormat":99},{"version":"730cb342a128f5a8a036ffbd6dbc1135b623ce2100cefe1e1817bb8845bc7100","impliedFormat":99},{"version":"78e387f16df573a98dd51b3c86d023ddbd5bf68e510711a9fee8340e7ccc3703","impliedFormat":99},{"version":"e2381c64702025b4d57b005e94ed0b994b5592488d76f1e5f67f59d1860ebb70","impliedFormat":99},{"version":"d7dfcb039ff9cff38ccd48d2cc1ba95ca45c316670eddbcf81784e21b7128692","impliedFormat":99},{"version":"acaf0a60eb243938f7742df08bf5d52482fbea033fd27141ee3a6d878bbb0d3d","impliedFormat":99},{"version":"fb89aeecfc8eb28f5677c2c89bced74d13442b7f4ebd01ce2ce92127d1b36d69","impliedFormat":99},{"version":"9e91cb0a5bd7aefa2b94a2872828d6d2321df0ca44412e74d99e8b94e579b7d8","impliedFormat":99},{"version":"a56827adea79fb04ecb27671b6a3529fe74c6937ebb9ca9bdd53b7bd0e8c861b","impliedFormat":99},{"version":"192c1a207b44af476190ae66920636de5d56c33b57206bbc2421adc23f673e2e","impliedFormat":99},{"version":"e5aa35b3740170492e06e60989d35a222cfda2148507c650ea55753f726c9213","impliedFormat":99},{"version":"057aa42f6983120c35373aed62b219ffcbd7b476b2df08709139a9eb8dfeed26","impliedFormat":99},{"version":"95a0c46b4675d4d02de6a7c167738f1176b53b26ebec9ccfe8e5d9acb0dc7aee","impliedFormat":99},{"version":"94ad4d9745811c482ae3bad61e5b206e0904f77e0dacf783199193a3df9f6ce6","impliedFormat":99},{"version":"407dc18ecd25802296fade17be81d0d4f499ae75fe88ed132f94e7efdad269e2","impliedFormat":99},{"version":"77dabe31d44c48782c529d5c9acddc41f799bf9b424b259596131efc77355478","impliedFormat":99},{"version":"f6dfe21d867aa5e13bc53d536b69b66427f571707a01e7c3604dc51ded097313","impliedFormat":99},{"version":"4ecd02d0e4ccf7befb9c28802c6c208060e33291d56fd1868900ca295c399077","impliedFormat":99},{"version":"37ada75be4b3f6b888f538091020d81b2a0ad721dc42734f70f639fa4703a5c8","impliedFormat":99},{"version":"aa73ff0024d5434a3e87ea2824f6faece7aad7b9f6c22bd399268241ca051dc7","impliedFormat":99},{"version":"4c9fb50b0697756bab3e4095f28839cf5b55430a4744d2ebbaf850ec8dca54d8","impliedFormat":99},{"version":"782868b723c055c5612c4a243f72a78a8b3c0c3b707ae04954e36e8ab966df4c","impliedFormat":99},{"version":"3de9d9ad4876972e7599fc0b3bddb0fddb1923be75787480a599045a30f14292","impliedFormat":99},{"version":"0f4b3c05937bbdb9cf954722ddc97cd72624e3b810f6f2cf4be334adb1796ec1","impliedFormat":99},{"version":"9fc243c4c87d8560348501080341e923be2e70bf7b5e09a1b26c585d97ae8535","impliedFormat":99},{"version":"4f97089fe15655ae448c9d005bb9a87cc4e599b155edc9e115738c87aa788464","impliedFormat":99},{"version":"f948d562d0a8085f1bd17b50798d5032529a75c147f40adfeb4fd3e453368643","impliedFormat":99},{"version":"22929f9874783b059156ee3cfa864d6f718e1abf9c139f298a037ae0274186f6","impliedFormat":99},{"version":"c72a7c316459b2e872ca4a9aca36cc05d1354798cee10077c57ff34a34440ac2","impliedFormat":99},{"version":"3e5bbf8893b975875f5325ebf790ab1ab38a4173f295ffea2ed1f108d9b1512c","impliedFormat":99},{"version":"9e4a38448c1d26d4503cf408cc96f81b7440a3f0a95d2741df2459fe29807f67","impliedFormat":99},{"version":"84124d21216da35986f92d4d7d1192ca54620baeca32b267d6d7f08b5db00df9","impliedFormat":99},{"version":"efba354914a2dc1056a55510188b6ced85ead18c5d10cc8a767b534e2db4b11b","impliedFormat":99},{"version":"25f5bf39f0785a2976d0af5ac02f5c18ca759cde62bc48dd1d0d99871d9ad86f","impliedFormat":99},{"version":"e711fa7718a2060058ff98ac6bff494c1615b9d42c4f03aa9c8270bc34927164","impliedFormat":99},{"version":"e324b2143fa6e32fac37ed9021b88815e181b045a9f17dbb555b72d55e47cdc1","impliedFormat":99},{"version":"3e90ea83e3803a3da248229e3027a01428c3b3de0f3029f86c121dc76c5cdcc2","impliedFormat":99},{"version":"9368c3e26559a30ad3431d461f3e1b9060ab1d59413f9576e37e19aaf2458041","impliedFormat":99},{"version":"915e5bb8e0e5e65f1dc5f5f36b53872ffcdcaef53903e1c5db7338ea0d57587a","impliedFormat":99},{"version":"92cf986f065f18496f7fcb4f135bff8692588c5973e6c270d523191ef13525ad","impliedFormat":99},{"version":"652f2bd447e7135918bc14c74b964e5fe48f0ba10ff05e96ed325c45ac2e65fb","impliedFormat":99},{"version":"cc2156d0ec0f00ff121ce1a91e23bd2f35b5ab310129ad9f920ddaf1a18c2a4d","impliedFormat":99},{"version":"7b371e5d6e44e49b5c4ff88312ae00e11ab798cfcdd629dee13edc97f32133d8","impliedFormat":99},{"version":"e9166dab89930e97bb2ce6fc18bcc328de1287b1d6e42c2349a0f136fc1f73e6","impliedFormat":99},{"version":"6dc0813d9091dfaed7d19df0c5a079ee72e0248ce5e412562c5633913900be25","impliedFormat":99},{"version":"e704c601079399b3f2ec4acdfc4c761f5fe42f533feaaab7d2c1c1528248ca3e","impliedFormat":99},{"version":"49104d28daa32b15716179e61d76b343635c40763d75fe11369f681a8346b976","impliedFormat":99},{"version":"04cd3418706b1851d2c1d394644775626529c23e615a829b8abfe26ec0ee3aef","impliedFormat":99},{"version":"21e459e9485fc48f21708d946c102e4aaa4a87b4c9ad178e1c5667e3ff6bbc59","impliedFormat":99},{"version":"97e685ac984fc93dcdae6c24f733a7a466274c103fdcf5d3b028eaa9245f59d6","impliedFormat":99},{"version":"68526ea8f3bbf75a95f63a3629bebe3eb8a8d2f81af790ce40bc6aad352a0c12","impliedFormat":99},{"version":"fdfd8c7050f46bb79eae64ca3ece0caf632830fbf326e1e904df352977b60317","impliedFormat":99},{"version":"b5428f35f4ebf7ea46652b0158181d9c709e40a0182e93034b291a9dc53718d8","impliedFormat":99},{"version":"0afcd28553038bca2db622646c1e7fcf3fb6a1c4d3b919ef205a6014edeeae0f","impliedFormat":99},{"version":"ee016606dd83ceedc6340f36c9873fbc319a864948bc88837e71bd3b99fdb4f6","impliedFormat":99},{"version":"0e09ffe659fdd2e452e1cbe4159a51059ae4b2de7c9a02227553f69b82303234","impliedFormat":99},{"version":"4126cb6e6864f09ca50c23a6986f74e8744e6216f08c0e1fe91ab16260dab248","impliedFormat":99},{"version":"4927dba9193c224e56aa3e71474d17623d78a236d58711d8f517322bd752b320","impliedFormat":99},{"version":"3d3f189177511d1452e7095471e3e7854b8c44d94443485dc21f6599c2161921","impliedFormat":99},{"version":"bb0519ff5ef245bbf829d51ad1f90002de702b536691f25334136864be259ec5","impliedFormat":99},{"version":"a64e28f2333ea0324632cf81fd73dc0f7090525547a76308cb1dfe5dab96596a","impliedFormat":99},{"version":"883f9faa0229f5d114f8c89dadd186d0bdf60bdafe94d67d886e0e3b81a3372e","impliedFormat":99},{"version":"d204b9ae964f73721d593e97c54fc55f7fd67de826ce9e9f14b1e762190f23d1","impliedFormat":99},{"version":"91830d20b424859e5582a141efe9a799dc520b5cce17d61b579fb053c9a6cd85","impliedFormat":99},{"version":"68115cdc58303bad32e2b6d59e821ccaada2c3fb63f964df7bd4b2ebd6735e80","impliedFormat":99},{"version":"ee27e47098f1d0955c8a70a50ab89eb0d033d28c5f2d76e071d8f52a804afe07","impliedFormat":99},{"version":"7957b11f126c6af955dc2e08a1288013260f9ec2776ff8cc69045270643bf43e","impliedFormat":99},{"version":"7acda36e46d3aab69093c27bc9765fe8db307840d804858d1b416bd04af6a948","impliedFormat":99},{"version":"85059ed9b6605d92c753daf3a534855ba944be69ff1a12ab4eca28cefbabd07a","impliedFormat":99},{"version":"687208233ae7a969baa2d0c565c9f24eb4cb1e64d6cfb30f71afec9e929e58c2","impliedFormat":99},{"version":"ea68a96f4e2ba9ca97d557b7080fbdb7f6e6cf781bb6d2e084e54da2ac2bb36c","impliedFormat":99},{"version":"fdae6a221872468d5b6ef3ee06a5ede1b7b3168b6c8346d0bf389fe0490b5269","impliedFormat":99},{"version":"424df1d45a2602f93010cb92967dfe76c3fcadad77d59deb9ca9f7ab76995d40","impliedFormat":99},{"version":"21f96085ed19d415725c5a7d665de964f8283cacef43957de10bdd0333721cc4","impliedFormat":99},{"version":"e8d4da9e0859c6d41c4f1c3f4d0e70446554ba6a6ab91e470f01af6a2dcac9bf","impliedFormat":99},{"version":"2e2421a3eec7afefa5a1344a6852d6fee6304678e2d4ee5380b7805f0ac8b58a","impliedFormat":99},{"version":"a10fd5d76a2aaba572bec4143a35ff58912e81f107aa9e6d97f0cd11e4f12483","impliedFormat":99},{"version":"1215f54401c4af167783d0f88f5bfb2dcb6f0dacf48495607920229a84005538","impliedFormat":99},{"version":"476f8eb2ea60d8ad6b2e9a056fdda655b13fd891b73556b85ef0e2af4f764180","impliedFormat":99},{"version":"2fe93aef0ee58eaa1b22a9b93c8d8279fe94490160703e1aabeff026591f8300","impliedFormat":99},{"version":"bbb02e695c037f84947e56da3485bb0d0da9493ed005fa59e4b3c5bc6d448529","impliedFormat":99},{"version":"ba666b3ab51c8bc916c0cebc11a23f4afec6c504c767fd5f0228358f7d285322","impliedFormat":99},{"version":"c10972922d1887fe48ed1722e04ab963e85e1ac12263a167edef9b804a2af097","impliedFormat":99},{"version":"6efeacbd1759ea57a4c7264eb766c531ae0ab2c00385294be58bc5031ef43ad1","impliedFormat":99},{"version":"1c261f5504d0175be4f1b6b99f101f4c3a129a5a29fc768e65c52d6861ca5784","impliedFormat":99},{"version":"f0e69b5877b378d47cbac219992b851e2bbc0f7e3a3d3579d67496dabd341ec4","impliedFormat":99},{"version":"b5ea27f19a54feca5621f5ba36a51026128ea98e7777e5d47f08b79637527cf5","impliedFormat":99},{"version":"27d065f5610a5a3e91f4941e5ebedea19507945bff28c94677909620424aa382","impliedFormat":99},{"version":"c133db4b6c17a96db7fa36607c59151dec1e5364d9444cbe15e8c0ea4943861e","impliedFormat":99},{"version":"3a0514f77606d399838431166a0da6dbd9f3c7914eae5bbfbd603e3b6a552959","impliedFormat":99},{"version":"fa568f8d605595e1cffbfca3e8c8c492cf88ae2c6ed151f6c64acf0f9e8c25d8","impliedFormat":99},{"version":"c76fb65cb2eb09a0ee91f02ff5b43a607b94a12c34d16d005b2c0afc62870766","impliedFormat":99},{"version":"cf7af60a0d4308a150df0ab01985aabb1128638df2c22dd81a2f5b74495a3e45","impliedFormat":99},{"version":"0291865a9ce360953eaa52512c9ffab4c7c3cfc69a3f022b303601a502455670","impliedFormat":99},{"version":"42d8c168ca861f0a5b3c4c1a91ff299f07e07c2dd31532cd586fd1ee7b5e3ae6","impliedFormat":99},{"version":"a29faa7cb35193109ec1777562ca52c72e7382ffe9916b26859b5874ad61ff29","impliedFormat":99},{"version":"15bdf2eeef95500ba9f1602896e288cb425e50462b77a07fa4ca23f1068abb21","impliedFormat":99},{"version":"452db58fd828ab87401f6cecc9a44e75fa40716cc4be80a6f66cf0a43c5a60cc","impliedFormat":99},{"version":"54592d0215a3fd239a6aa773b1e1a448dc598b7be6ce9554629cd006ee63a9d6","impliedFormat":99},{"version":"9ee28966bb038151e21e240234f81c6ba5be6fde90b07a9e57d4d84ae8bc030c","impliedFormat":99},{"version":"2fe1c1b2b8a41c22a4e44b0ac7316323d1627d8c72f3f898fa979e8b60d83753","impliedFormat":99},{"version":"956e43b28b5244b27fdb431a1737a90f68c042e162673769330947a8d727d399","impliedFormat":99},{"version":"92a2034da56c329a965c55fd7cffb31ccb293627c7295a114a2ccd19ab558d28","impliedFormat":99},{"version":"c1b7957cd42a98ab392ef9027565404e5826d290a2b3239a81fbac51970b2e63","impliedFormat":99},{"version":"4861ee34a633706bcbba4ea64216f52c82c0b972f3e790b14cf02202994d87c5","impliedFormat":99},{"version":"7af4e33f8b95528de005282d6cca852c48d293655dd7118ad3ce3d4e2790146f","impliedFormat":99},{"version":"df345b8d5bf736526fb45ae28992d043b2716838a128d73a47b18efffe90ffa7","impliedFormat":99},{"version":"d22c5b9861c5fc08ccd129b5fc3dcdc7536e053c0c1d463f3ab39820f751c923","impliedFormat":99},{"version":"dcc38f415a89780b34d827b45493d6dbadb05447d194feb4498172e508c416ac","impliedFormat":99},{"version":"7e917e3b599572a2dd9cfa58ff1f68fda9e659537c077a2c08380b2f2b14f523","impliedFormat":99},{"version":"20b108e922abd1c1966c3f7eb79e530d9ac2140e5f51bfa90f299ad5a3180cf9","impliedFormat":99},{"version":"2bc82315d4e4ed88dc470778e2351a11bc32d57e5141807e4cdb612727848740","impliedFormat":99},{"version":"e2dd1e90801b6cd63705f8e641e41efd1e65abd5fce082ef66d472ba1e7b531b","impliedFormat":99},{"version":"a3cb22545f99760ba147eec92816f8a96222fbb95d62e00706a4c0637176df28","impliedFormat":99},{"version":"287671a0fe52f3e017a58a7395fd8e00f1d7cd9af974a8c4b2baf35cfda63cfa","impliedFormat":99},{"version":"e2cdad7543a43a2fb6ed9b5928821558a03665d3632c95e3212094358ae5896b","impliedFormat":99},{"version":"326a980e72f7b9426be0805774c04838e95195b467bea2072189cefe708e9be7","impliedFormat":99},{"version":"e3588e9db86c6eaa572c313a23bf10f7f2f8370e62972996ac79b99da065acaa","impliedFormat":99},{"version":"1f4700278d1383d6b53ef1f5aecd88e84d1b7e77578761838ffac8e305655c29","impliedFormat":99},{"version":"6362a4854c52419f71f14d3fee88b3b434d1e89dcd58a970e9a82602c0fd707a","impliedFormat":99},{"version":"fb1cc1e09d57dfeb315875453a228948b904cbe1450aaf8fda396ff58364a740","impliedFormat":99},{"version":"50652ed03ea16011bb20e5fa5251301bb7e88c80a6bf0c2ea7ed469be353923b","impliedFormat":99},{"version":"d388e0c1c9a42d59ce88412d3f6ce111f63ce2ff558e0a3f84510092431dfee0","impliedFormat":99},{"version":"35ea0a1e995aef5ae19b1553548a793c76eb31bdf7fef30bc74656660c3a09c3","impliedFormat":99},{"version":"56f4ae4e34cbff1e4158ccada4feea68a357bae86adb3bedaa65260d0af579df","impliedFormat":99},{"version":"6eebdacf8e85b2cf70ad7a2f43ead1f8acccfd214ab57ff1d989e9e35661015d","impliedFormat":99},{"version":"a4f90a12cbfac13b45d256697ce70a6b4227790ca2bf3898ffd2359c19eab4eb","impliedFormat":99},{"version":"4a6c2ac831cff2d8fa846dfb010ee5f7afce3f1b9bd294298ee54fdc555f1161","impliedFormat":99},{"version":"8395cc6350a8233a4da1c471bdac6b63d5ed0a0605da9f1e0c50818212145b5b","impliedFormat":99},{"version":"b58dda762d6bd8608d50e1a9cc4b4a1663a9d4aa50a9476d592a6ecdc6194af4","impliedFormat":99},{"version":"bc14cb4f3868dab2a0293f54a8fe10aa23c0428f37aece586270e35631dd6b67","impliedFormat":99},{"version":"2d4530d6228c27906cb4351f0b6af52ff761a7fab728622c5f67e946f55f7f00","impliedFormat":99},{"version":"ec359d001e98bf56b0e06b4882bd1421fd088d4d181dff3138f52175c0582a51","impliedFormat":99},{"version":"2ac845b89cae82a74e549c7c1d9f983f993033ba14376ea83cd13b3e38a8537a","impliedFormat":99},{"version":"a8d491b4eb728dab387933a518d9e1f32d5c9d5a5225ff134d847b0c8cc9c8ce","impliedFormat":99},{"version":"668f628ae1f164dcf6ea8f334ea6a629d5d1a8e7a2754245720a8326ff7f1dc0","impliedFormat":99},{"version":"5105c00e1ae2c0a17c4061e552fa9ec8c74ec41f69359b8719cb88523781018e","impliedFormat":99},{"version":"d2c033af6f2ea426de4657177f0e548ee5bed6756c618a8b3b296c424e542388","impliedFormat":99},{"version":"45be28de10e6f91aacb29fbd2955ba65a0fd3d1b5fddefece9c381043e91e68d","impliedFormat":99},{"version":"77dabe31d44c48782c529d5c9acddc41f799bf9b424b259596131efc77355478","impliedFormat":99},{"version":"6801ebe0b7ab3b24832bc352e939302f481496b5d90b3bc128c00823990d7c7d","impliedFormat":99},{"version":"0abb1feddc76a0283c7e8e8910c28b366612a71f8bfdd5ca42271d7ad96e50b2","impliedFormat":99},{"version":"ac56b2f316b70d6a727fdbbcfa8d124bcd1798c293487acb2b27a43b5c886bb0","impliedFormat":99},{"version":"d849376baf73ec0b17ffd29de702a2fdbbe0c0390ec91bebf12b6732bf430d29","impliedFormat":99},{"version":"40dcd290c10cc7b04a55f7ee5c76f77250f48022cea1624eba2c0589753993b4","impliedFormat":99},{"version":"0f9c9f7d13a5cf1c63eb56318b6ae4dfa2accef1122b2e88b5ed1c22a4f24e3b","impliedFormat":99},{"version":"9c4178832d47d29c9af3b1377c6b019f7813828887b80bb96777393f700eb260","impliedFormat":99},{"version":"dddb8672a0a6d0e51958d539beb906669a0f1d3be87425aaa0ae3141a9ad6402","impliedFormat":99},{"version":"6b514d5159d0d189675a1d5a707ba068a6da6bc097afb2828aae0c98d8b32f08","impliedFormat":99},{"version":"39d7dbcfec85393fedc8c7cf62ee93f7e97c67605279492b085723b54ccaca8e","impliedFormat":99},{"version":"81882f1fa8d1e43debb7fa1c71f50aa14b81de8c94a7a75db803bb714a9d4e27","impliedFormat":99},{"version":"c727a1218e119f1549b56dd0057e721d67cfa456c060174bac8a5594d95cdb2d","impliedFormat":99},{"version":"bca335fd821572e3f8f1522f6c3999b0bc1fe3782b4d443c317df57c925543ed","impliedFormat":99},{"version":"73332a05f142e33969f9a9b4fb9c12b08b57f09ada25eb3bb94194ca035dc83d","impliedFormat":99},{"version":"c366621e6a8febe9bbca8c26275a1272d99a45440156ca11c860df7aa9d97e6d","impliedFormat":99},{"version":"d9397a54c21d12091a2c9f1d6e40d23baa327ae0b5989462a7a4c6e88e360781","impliedFormat":99},{"version":"dc0e2f7f4d1f850eb20e226de8e751d29d35254b36aa34412509e74d79348b75","impliedFormat":99},{"version":"af3102f6aec26d237c750decefdc7a37d167226bb1f90af80e1e900ceb197659","impliedFormat":99},{"version":"dea1773a15722931fbfe48c14a2a1e1ad4b06a9d9f315b6323ee112c0522c814","impliedFormat":99},{"version":"b26e3175cf5cee8367964e73647d215d1bf38be594ac5362a096c611c0e2eea8","impliedFormat":99},{"version":"4280093ace6386de2a0d941b04cff77dda252f59a0c08282bd3d41ccc79f1a50","impliedFormat":99},{"version":"fe17427083904947a4125a325d5e2afa3a3d34adaedf6630170886a74803f4a2","impliedFormat":99},{"version":"0246f9f332b3c3171dcdd10edafab6eccb918c04b2509a74e251f82e8d423fb7","impliedFormat":99},{"version":"f6ef33c2ff6bbdf1654609a6ca52e74600d16d933fda1893f969fc922160d4d7","impliedFormat":99},{"version":"1abd22816a0d992fd33b3465bf17a5c8066bf13a8c6ca4fc0cd28884b495762d","impliedFormat":99},{"version":"82032a08169ea01cf01aa5fd3f7a02f1f417697df5e42fc27d811d23450bc28d","impliedFormat":99},{"version":"9c8cbd1871126e98602502444cffb28997e6aa9fbc62d85a844d9fd142e9ae1b","impliedFormat":99},{"version":"b0e20abc4a73df8f97b3f1223cc330e9ba3b2062db1908aa2a97754a792139ac","impliedFormat":99},{"version":"bc1f2428d738ab789339030078adf313100471c37d8d69f6cf512a5715333afc","impliedFormat":99},{"version":"dc500c6a23c9432849c82478bdab762fa7bdf9245298c2279a7063dd05ae9f9a","impliedFormat":99},{"version":"cd1b6a2503fc554dcab602e053565c4696e4262b641b897664d840a61f519229","impliedFormat":99},{"version":"af1580cd202df0e33fc592fe1d75d720c15930a4127a87633542b33811316724","impliedFormat":99},{"version":"538608f9242fbf4260d694f19c95b454f855152ab3b882ac72114f19b08984d2","impliedFormat":99},{"version":"cd0e1083bd8ae52661544329c311836abdda5d5dda89fc5d7ab038956c0394e8","impliedFormat":99},{"version":"9ea6fea875302b2bb3976f7431680affc45a4319499d057ce12be04e4f487bf9","impliedFormat":99},{"version":"66e0c3f9875da7be383d0c78c8b8940b6ebae3c6a0fbfd7e77698b5e8ade3b05","impliedFormat":99},{"version":"da38d326fe6a72491cad23ea22c4c94dfc244363b6a3ec8a03b5ad5f4ee6337b","impliedFormat":99},{"version":"9742dc7ead36bcc08712e54b7d27083ed6144973b82c763106a876a9180920da","impliedFormat":99},{"version":"517a31c520e08c51cfe6d372bc0f5a6bf7bd6287b670bcaa180a1e05c6d4c4da","impliedFormat":99},{"version":"0263d94b7d33716a01d3e3a348b56c2c59e6d897d89b4210bdbf27311127223c","impliedFormat":99},{"version":"d0120e583750834bf1951c8b9936781a98426fe8d3ad3d951f96e12f43090469","impliedFormat":99},{"version":"a2e6a99c0fb4257e9301d592da0834a2cb321b9b1e0a81498424036109295f8b","impliedFormat":99},{"version":"c6b5ae9f99f1fccadc23d56307a28c8490c48e687678f2cafa006b3b9b8e73e4","impliedFormat":99},{"version":"eae178ee8d7292bcd23be2b773dda60b055bc008a0ddce2acc1bfe30cc36cf04","impliedFormat":99},{"version":"e0b5f197fb47b39a4689ad356b8488e335bbf399b283492c0ffae0cfda88837b","impliedFormat":99},{"version":"adb7aa4b8d8b423d0d7e78b6a8affb88c3a32a98e21cd54fcafd570ad8588d0c","impliedFormat":99},{"version":"643e22362c15304f344868ec0e7c0b4a1bc2b56c8b81d5b9f0ee0a6f3c690fff","impliedFormat":99},{"version":"ead5220d1cd43d1f84829c5734bd540d0e80ef6f50218a4ee03b5ec3cf178bcd","impliedFormat":99},{"version":"4e095c719ab15aa641872ab286d8be229562c4b3dc4eec79888bc4e8e0426ed8","impliedFormat":99},{"version":"6022afc443d2fe0af44f2f5912a0bdd7d17e32fd1d49e6c5694cbc2c0fa11a8f","impliedFormat":99},{"version":"6dd3f823ac463041d89c84d7bbf74931a38d874a9716040492ac7a16c7d2f023","impliedFormat":99},{"version":"a5bf6d947ce6a4f1935e692c376058493dbfbd9f69d9b60bbaf43fd5d22c324b","impliedFormat":99},{"version":"4927ef881b202105603e8416d63f317a1f1ea47d321e32826b9b20a44caa55e2","impliedFormat":99},{"version":"914d11655546eba92ac24d73e6efdb350738bcf4a9a161a2b96e904bad4de809","impliedFormat":99},{"version":"f9fdd2efc37eefc321338d39b5bd341b2aa82292b72610cb900f205f6803ff66","impliedFormat":99},{"version":"687208233ae7a969baa2d0c565c9f24eb4cb1e64d6cfb30f71afec9e929e58c2","impliedFormat":99},{"version":"ab043784438ef8945a95124d2325308554c8b53dc92ce801f09702e79234282a","impliedFormat":99},{"version":"3fb3501967b0f0224023736d0ad41419482b88a69122e5cb46a50ae5635adb6a","impliedFormat":99},{"version":"06d66a6723085295f3f0ecd254a674478c4dba80e7b01c23a9693a586682252f","impliedFormat":99},{"version":"cc411cd97607f993efb008c8b8a67207e50fdd927b7e33657e8e332c2326c9f3","impliedFormat":99},{"version":"b144c6cdf6525af185cd417dc85fd680a386f0840d7135932a8b6839fdee4da6","impliedFormat":99},{"version":"e8dfa804c81c6b3e3dc411ea7cea81adf192fe20b7c6db21bf5574255f1c9c0e","impliedFormat":99},{"version":"572ee8f367fe4068ccb83f44028ddb124c93e3b2dcc20d65e27544d77a0b84d3","impliedFormat":99},{"version":"7d604c1d876ef8b7fec441cf799296fd0d8f66844cf2232d82cf36eb2ddff8fe","impliedFormat":99},{"version":"7b86b536d3e8ca578f8fbc7e48500f89510925aeda67ed82d5b5a3213baf5685","impliedFormat":99},{"version":"861596a3b58ade9e9733374bd6b45e5833b8b80fd2eb9fe504368fc8f73ae257","impliedFormat":99},{"version":"a3da7cf20826f3344ad9a8a56da040186a1531cace94e2788a2db795f277df94","impliedFormat":99},{"version":"900a9da363740d29e4df6298e09fad18ae01771d4639b4024aa73841c6a725da","impliedFormat":99},{"version":"442f6a9e83bb7d79ff61877dc5f221eea37f1d8609d8848dfbc6228ebc7a8e90","impliedFormat":99},{"version":"4e979a85e80e332414f45089ff02f396683c0b5919598032a491eb7b981fedfd","impliedFormat":99},{"version":"6d3496cac1c65b8a645ecbb3e45ec678dd4d39ce360eecbcb6806a33e3d9a7ae","impliedFormat":99},{"version":"9909129eb7301f470e49bbf19f62a6e7dcdfe9c39fdc3f5030fd1578565c1d28","impliedFormat":99},{"version":"95cdad1f759b74b014cea71cf1a68567b17e4165ec8139930305ba1e21b10a0c","impliedFormat":99},{"version":"7e4fc245cc369ba9c1a39df427563e008b8bfe5bf73c6c3f5d3a928d926a8708","impliedFormat":99},{"version":"3aa7c4c9a6a658802099fb7f72495b9ba80d8203b2a35c4669ddfcbbe4ff402b","impliedFormat":99},{"version":"d39330cb139d83d5fa5071995bb615ea48aa093018646d4985acd3c04b4e443d","impliedFormat":99},{"version":"663800dc36a836040573a5bb161d044da01e1eaf827ccc71a40721c532125a80","impliedFormat":99},{"version":"f28691d933673efd0f69ac7eae66dea47f44d8aa29ec3f9e8b3210f3337d34df","impliedFormat":99},{"version":"ae89fb16575dc616df3ff907c6338d94cfa731881ecef82155b21ab4134b3826","impliedFormat":99},{"version":"687208233ae7a969baa2d0c565c9f24eb4cb1e64d6cfb30f71afec9e929e58c2","impliedFormat":99},{"version":"418ec48301149dd2c0db1dbd83305ae61fb8517accebdd4b02e72d66b27b6cc7","impliedFormat":99},{"version":"6b7c511d20403a5a1e3f5099056bc55973479960ceff56c066ff0dd14174c53c","impliedFormat":99},{"version":"48b83bd0962dac0e99040e91a49f794d341c7271e1744d84e1077e43ecda9e04","impliedFormat":99},{"version":"b8fd98862aa6e7ea8fe0663309f15b15f54add29d610e70d62cbccff39ea5065","impliedFormat":99},{"version":"ffa53626a9de934a9447b4152579a54a61b2ea103dbbf02b0f65519bfef98cdd","impliedFormat":99},{"version":"d171a70a6e5ff6700fa3e2f0569a15b12401ad9bc5f4d650f8b844f7f20ef977","impliedFormat":99},{"version":"b6e9b15869788861fff21ec7f371bda9a2e1a1b15040cc005db4d2e792ece5ca","impliedFormat":99},{"version":"22c844fbe7c52ee4e27da1e33993c3bbb60f378fa27bb8348f32841baecb9086","impliedFormat":99},{"version":"dee6934166088b55fe84eae24de63d2e7aae9bfe918dfe635b252f682ceca95a","impliedFormat":99},{"version":"c39b9c4f5cc37a8ed51bef12075f5d023135e11a9b215739fd0dd87ee8da804a","impliedFormat":99},{"version":"db027bc9edef650cff3cbe542959f0d4ef8532073308c04a5217af25fc4f5860","impliedFormat":99},{"version":"a4e026fe4d88d36f577fbd38a390bd846a698206b6d0ca669a70c226e444af1b","impliedFormat":99},{"version":"b5a0d4f7a2d54acbe0d05f4d9f5c9efaaeddc06c3ee0ca0c66aba037e1dca34b","impliedFormat":99},{"version":"fa910f88f55844718a277ee9519206abce66629de2692676c3e2ad1c9278bdfd","impliedFormat":99},{"version":"a886a5af337cce28fe3e956fd0ed921345933163f5b14f739266ba9400b92484","impliedFormat":99},{"version":"9ae87bd743e93b6384efbfa306bde1fa70b6ff27533983e1e1fe08a4ef7037b8","impliedFormat":99},{"version":"5f7c0a4aad7a3406db65d674a5de9e36e0d08773f638b0f49d70e441de7127c0","impliedFormat":99},{"version":"29062edaa0d16f06627831f95681877b49c576c0a439ccd1a2f2a8173774d6b2","impliedFormat":99},{"version":"49fcfda71ea42a9475b530479a547f93d4e88c2deb0c713845243f5c08af8d76","impliedFormat":99},{"version":"6d640d840f53fb5f1613829a7627096717b9b0d98356fb86bb771b6168299e2e","impliedFormat":99},{"version":"cee41a6af55d502f3863fe3238a75108dea16ac9c7339e96c2974ad3babd6d78","impliedFormat":99},{"version":"6bd4aa523d61e94da44cee0ee0f3b6c8d5f1a91ef0bd9e8a8cf14530b0a1a6df","impliedFormat":99},{"version":"e3ee1b2216275817b78d5ae0a448410089bc1bd2ed05951eb1958b66affbdec0","impliedFormat":99},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"ba481bca06f37d3f2c137ce343c7d5937029b2468f8e26111f3c9d9963d6568d","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d9ef24f9a22a88e3e9b3b3d8c40ab1ddb0853f1bfbd5c843c37800138437b61","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2677634fe27e87348825bb041651e22d50a613e2fdf6a4a3ade971d71bac37e","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f","impliedFormat":1},{"version":"8cd19276b6590b3ebbeeb030ac271871b9ed0afc3074ac88a94ed2449174b776","affectsGlobalScope":true,"impliedFormat":1},{"version":"696eb8d28f5949b87d894b26dc97318ef944c794a9a4e4f62360cd1d1958014b","impliedFormat":1},{"version":"3f8fa3061bd7402970b399300880d55257953ee6d3cd408722cb9ac20126460c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"68bd56c92c2bd7d2339457eb84d63e7de3bd56a69b25f3576e1568d21a162398","affectsGlobalScope":true,"impliedFormat":1},{"version":"3e93b123f7c2944969d291b35fed2af79a6e9e27fdd5faa99748a51c07c02d28","impliedFormat":1},{"version":"9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","impliedFormat":1},{"version":"87aad3dd9752067dc875cfaa466fc44246451c0c560b820796bdd528e29bef40","impliedFormat":1},{"version":"4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"8db0ae9cb14d9955b14c214f34dae1b9ef2baee2fe4ce794a4cd3ac2531e3255","affectsGlobalScope":true,"impliedFormat":1},{"version":"15fc6f7512c86810273af28f224251a5a879e4261b4d4c7e532abfbfc3983134","impliedFormat":1},{"version":"58adba1a8ab2d10b54dc1dced4e41f4e7c9772cbbac40939c0dc8ce2cdb1d442","impliedFormat":1},{"version":"641942a78f9063caa5d6b777c99304b7d1dc7328076038c6d94d8a0b81fc95c1","impliedFormat":1},{"version":"092c1137e31de289f3cc6a57fdccb3cca298d8a680d1e367d206d3318f1394a1","impliedFormat":1},{"version":"855cd5f7eb396f5f1ab1bc0f8580339bff77b68a770f84c6b254e319bbfd1ac7","impliedFormat":1},{"version":"5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86","impliedFormat":1},{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"7e20d899c28ca26a2a7afc98beaa69e63ff7fba0a8bc47b4e3bf3ede5e09e424","impliedFormat":1},{"version":"2d2fcaab481b31a5882065c7951255703ddbe1c0e507af56ea42d79ac3911201","impliedFormat":1},{"version":"a192fe8ec33f75edbc8d8f3ed79f768dfae11ff5735e7fe52bfa69956e46d78d","impliedFormat":1},{"version":"ca867399f7db82df981d6915bcbb2d81131d7d1ef683bc782b59f71dda59bc85","affectsGlobalScope":true,"impliedFormat":1},{"version":"372413016d17d804e1d139418aca0c68e47a83fb6669490857f4b318de8cccb3","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"6e70e9570e98aae2b825b533aa6292b6abd542e8d9f6e9475e88e1d7ba17c866","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"085f552d005479e2e6a7311cdbbe5d8c55c497b4d19274285df161ee9684cd9c","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"007faacc9268357caa21d24169f3f3f2497af3e9241308df2d89f6e6d9bb3f2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"74cf591a0f63db318651e0e04cb55f8791385f86e987a67fd4d2eaab8191f730","impliedFormat":1},{"version":"5eab9b3dc9b34f185417342436ec3f106898da5f4801992d8ff38ab3aff346b5","impliedFormat":1},{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","impliedFormat":1},{"version":"809821b8a065e3234a55b3a9d7846231ed18d66dd749f2494c66288d890daf7f","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"c3b41e74b9a84b88b1dca61ec39eee25c0dbc8e7d519ba11bb070918cfacf656","affectsGlobalScope":true,"impliedFormat":1},{"version":"4737a9dc24d0e68b734e6cfbcea0c15a2cfafeb493485e27905f7856988c6b29","affectsGlobalScope":true,"impliedFormat":1},{"version":"36d8d3e7506b631c9582c251a2c0b8a28855af3f76719b12b534c6edf952748d","impliedFormat":1},{"version":"1ca69210cc42729e7ca97d3a9ad48f2e9cb0042bada4075b588ae5387debd318","impliedFormat":1},{"version":"f5ebe66baaf7c552cfa59d75f2bfba679f329204847db3cec385acda245e574e","impliedFormat":1},{"version":"ed59add13139f84da271cafd32e2171876b0a0af2f798d0c663e8eeb867732cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7c5e2ea4a9749097c347454805e933844ed207b6eefec6b7cfd418b5f5f7b28","impliedFormat":1},{"version":"b1810689b76fd473bd12cc9ee219f8e62f54a7d08019a235d07424afbf074d25","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"a12d953aa755b14ac1d28ecdc1e184f3285b01d6d1e58abc11bf1826bc9d80e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"25d130083f833251b5b4c2794890831b1b8ce2ead24089f724181576cf9d7279","impliedFormat":1},{"version":"ffe66ee5c9c47017aca2136e95d51235c10e6790753215608bff1e712ff54ec6","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"017caf5d2a8ef581cf94f678af6ce7415e06956317946315560f1487b9a56167","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"4c3148420835de895b9218b2cea321a4607008ba5cefa57b2a57e1c1ef85d22f","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"915e18c559321c0afaa8d34674d3eb77e1ded12c3e85bf2a9891ec48b07a1ca5","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"199c8269497136f3a0f4da1d1d90ab033f899f070e0dd801946f2a241c8abba2","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"6266d94fb9165d42716e45f3a537ca9f59c07b1dfa8394a659acf139134807db","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"a7692a54334fd08960cd0c610ff509c2caa93998e0dcefa54021489bcc67c22d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"3a051941721a7f905544732b0eb819c8d88333a96576b13af08b82c4f17581e4","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"1e25f8d0a8573cafd5b5a16af22d26ab872068a693b9dbccd3f72846ab373655","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"f60e3e3060207ac982da13363181fd7ee4beecc19a7c569f0d6bb034331066c2","impliedFormat":1},{"version":"17230b34bb564a3a2e36f9d3985372ccab4ad1722df2c43f7c5c2b553f68e5db","impliedFormat":1},{"version":"6e5c9272f6b3783be7bdddaf207cccdb8e033be3d14c5beacc03ae9d27d50929","impliedFormat":1},{"version":"21ac4cf3f8d8c6e1201cb31f600be708c9a37867fc5c73b7ccf80560fae591c8","impliedFormat":1},{"version":"0dfe35191a04e8f9dc7caeb9f52f2ee07402736563d12cbccd15fb5f31ac877f","impliedFormat":1},{"version":"798367363a3274220cbed839b883fe2f52ba7197b25e8cb2ac59c1e1fd8af6b7","impliedFormat":1},{"version":"2636a309ed87d6876728d9aca846a76b372cf2a21a4fdf9940a82a2dd86687d0","impliedFormat":1},{"version":"5aea76ab98173f2c230b1f78dc010da403da622c105c468ace9fe24e3b77883c","impliedFormat":99},{"version":"45a7a6658917b9178eaf4288b8a22757dba3bc24676e166f28a3c2a4e858c4e0","impliedFormat":99},{"version":"7c699b5fea191ce032277394b78fa00208f26901efd288636d932c4b35ec4704","impliedFormat":99},{"version":"2fac70f99da22181acfda399eed248b47395a8eeb33c9c82d75ca966aee58912","impliedFormat":99},{"version":"fa2c48fd724dd8f0e11dfb04f20d727a2595890bfa95419c83b21ed575ed77d1","impliedFormat":99},{"version":"8e48713bdd38b35d69f9242d463744aed4950acb0fd56c22b33e2b8069f5b0fb","impliedFormat":99},{"version":"20be44c04e883d5fe7840d630a8d0656e95b00c2d6eebab9ab253275e7170534","impliedFormat":99},{"version":"3b674288fbdc0ff0ed2b7fc2839014c2ff209c84999fd06b6339347d0f976a85","impliedFormat":99},{"version":"cc2958d8abd86edcdf05542bb1b40ba659db5bc5a2560720cde08e8950e63bc1","impliedFormat":99},{"version":"e44e0ea195d68c0aea951809bda325322085008c0622fc4ee44db5359f37b747","impliedFormat":99},{"version":"21053659ad72fe51b9dfbde4fa14dbbac0912359fa37c9a5aa75f188782b2ee8","impliedFormat":99},{"version":"d0e327cd50cc55eb34fef7028c46f2dcb28fbfe1b5329dbd2277be5e186bbeac","impliedFormat":99},{"version":"ef816ad6735a271c4c8035a1914c3a9beaaa90b3c174da312d26bce8736e56ec","impliedFormat":99},{"version":"7202026e24c5e5b7b6e5fe6b99455a91058ef82e74a5cdf6a3a4136b7ae9c080","impliedFormat":99},{"version":"87561cc8a2d7444adf4eed4b3f15bef8c6098cceb0e7617fba1cc45d187ac8c8","impliedFormat":99},{"version":"b52f7568bb9b00bcee6c4929938226541c09d86b849b8ba8db2fe2a8bba46f49","impliedFormat":99},{"version":"d42e1872d53ebb213e7bbe15e5fecdcaa9a490d2f2a2b035ee9cf4a6d3f1e44e","impliedFormat":99},{"version":"2262d96c02073dcb17a31ae8c738651ebff75f102522eae686f5462658b687a8","impliedFormat":99},{"version":"fd40c454d56e1d14e60ce13f3bc60c7fdb9bc70c6ef9c7bfafec1f0eb5d8075b","impliedFormat":1},{"version":"155ced96d70533d95c481061e2691802fae7cfb96869d7c85ac8622f53b51cb7","impliedFormat":1},{"version":"3689b6f599705380d2ceaccb4e58eec5c9439a7a5635d6e37c1ba66ed7c34b35","impliedFormat":99},{"version":"6cf0d3cc668cdbb01358ef7c2e41bbcc14d8d8e4ca424a1b6d2838d9a1cae8ce","impliedFormat":99},{"version":"b7bd70307671536c735389e0a1748555c438c392dfceb6f2ac3aa0a50ca82530","impliedFormat":99},{"version":"661c403f4c5bbf259e03f4fdc3a9e3f51ad562684f702e1b842e6c5336de0752","impliedFormat":99},{"version":"415dd92247ca21db682f75ba7e6289ab2d093cd34c6f471c6c789afd047ad4f3","impliedFormat":99},{"version":"4fc633107330ab389f07f86af80192ac697a68a586ad76dcf43304410e7cfb6a","impliedFormat":99},{"version":"828f8b38dff4e5c47b0112cb437da379c720f0360d40d392457c9775f30c8ae8","impliedFormat":99},{"version":"d8b29e5a1a4db41c00cfed03db63c835aab6d46664f90f10fd2195db789a2200","impliedFormat":99},"10b981156c3bd1db5b9146245e30473e1fa2b58c98346f8acdb7538947df3365","957f26931c2ed5af42709bad6abb710f43631371014ef4c81fac9d5f419d4249","447f663a195a5c8d2c4ba312f9115387092f87269f630010e00c5972f64deec5","600dc6bc372ea5db0ecf68eef984fd5d509bef523ab355230a76ed227781de11","4e7d11e3921bd8923d16ce24d0d3e56053dba6f9c683ab63674c7d2bb0298a06","e0ad30d8cc36c538119167dae544bee3c93daefb2269553a8e45a02a87534257","f06dd40409e73885ed1daecf8afdc0ba400c84bc921742be9fe4a63fdbf03cdc","f1c72d16f8460774f81d19edc0669252a2fa32de15c5d0c5024b6c7e213587de","50980b4f45fc54d0874da9ae7fed6628981b618fe7cbba94952e60479119b23c","0e8cab67ed21b45b6103c42d45abb001b7f5c03a8404a787c2adb76582bebc29","4d9c5742d3c56b0aa7f9aece6be317528d9e99f9ccccbc99f39848b7a0a47205",{"version":"6b2c934c2b6c60c98da8d9427d6838665d4fe8efb2659547663d77a3ef3ac5d9","impliedFormat":99},{"version":"43e0d6f59701298bc7ad00e73386be01dec35a0a955db7585778f7defcda70c9","impliedFormat":99},{"version":"a46fefd2d219c22b10266294269555f5ab0b13237b2a719377b6c6192a62843e","impliedFormat":99},{"version":"82805e8dbdf5f2605a4089c11a495acc7fb2f3d3eebbe510a4c8c0f60f4201c0","impliedFormat":99},{"version":"24722445a3a62cb56eb509fb24724792491ab83489a2b8c97846d72a2b013c2e","signature":"fc8a8e1e4ceb929ae6dd1bfc33612511fc100345dc02ea4140aa0f2e892f7f0d"},{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"dc782ff85b2cb10075ecffc158af7bfb27ff97bf8491c917efea0c3d622d5ac4","impliedFormat":1},{"version":"acd8fd5090ac73902278889c38336ff3f48af6ba03aa665eb34a75e7ba1dccc4","impliedFormat":1},{"version":"d6258883868fb2680d2ca96bc8b1352cab69874581493e6d52680c5ffecdb6cc","impliedFormat":1},{"version":"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","impliedFormat":1},{"version":"f258e3960f324a956fc76a3d3d9e964fff2244ff5859dcc6ce5951e5413ca826","impliedFormat":1},{"version":"643f7232d07bf75e15bd8f658f664d6183a0efaca5eb84b48201c7671a266979","impliedFormat":1},{"version":"21da358700a3893281ce0c517a7a30cbd46be020d9f0c3f2834d0a8ad1f5fc75","impliedFormat":1},{"version":"2beff543f6e9a9701df88daeee3cdd70a34b4a1c11cb4c734472195a5cb2af54","impliedFormat":1},{"version":"2e07abf27aa06353d46f4448c0bbac73431f6065eef7113128a5cd804d0c384d","impliedFormat":1},{"version":"115b2ad73fa7d175cd71a5873d984c21593b2a022f1a2036cc39d9f53629e5dc","impliedFormat":1},{"version":"1be330b3a0b00590633f04c3b35db7fa618c9ee079258e2b24c137eb4ffcd728","impliedFormat":1},{"version":"3253d41f1fefc58f0ba77053f23a3c310cf1a2b880d3b98c63d52161baa730d3","impliedFormat":1},{"version":"413df52d4ea14472c2fa5bee62f7a40abd1eb49be0b9722ee01ee4e52e63beb2","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"446a50749b24d14deac6f8843e057a6355dd6437d1fac4f9e5ce4a5071f34bff","impliedFormat":1},{"version":"182e9fcbe08ac7c012e0a6e2b5798b4352470be29a64fdc114d23c2bab7d5106","impliedFormat":1},{"version":"2f4e6b4d39426a1b85ecf4bdeb9dddbf4d9b3397d95d8555d46f925c9519ec7d","impliedFormat":1},{"version":"78a2869ad0cbf3f9045dda08c0d4562b7e1b2bfe07b19e0db072f5c3c56e9584","impliedFormat":1},{"version":"89d5d28d4f57e000b836ac273079be1b75710e28ce14750d081fb420d37e2ca5","impliedFormat":1},{"version":"fd4e24ccff3966390600d7f5d6aa1fed5a512e92ada735ea5fbc933d313ad3d3","impliedFormat":1},{"version":"b7cddfe1aa6b86b5fad3c9ccb30d05b3ccb165aebbf112f48d2d8a5f69dd98b1","impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","impliedFormat":1},{"version":"ad0d1d75d129b1c80f911be438d6b61bfa8703930a8ff2be2f0e1f8a91841c64","impliedFormat":1},{"version":"bd2c7ada3dee03653d3f601011d30072194bc3970cd93208f9588fbdc0c69347","impliedFormat":1},{"version":"e480da45d32313e7174b265674da504f075f59ef326852f0c5a5d863b438ae85","impliedFormat":1},{"version":"ad54850f61fcf5d014e11be80d2f46fea9265cfa7e77456da876f7833ef81769","impliedFormat":1},{"version":"6f7c9e8bd2b5b6a080b07080065f94900bd3c7e5ebbd3047bc33fcce2fab1dd8","impliedFormat":1},{"version":"3e7efde639c6a6c3edb9847b3f61e308bf7a69685b92f665048c45132f51c218","impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","impliedFormat":1},{"version":"8a0e762ceb20c7e72504feef83d709468a70af4abccb304f32d6b9bac1129b2c","impliedFormat":1},{"version":"da5950ee2a90721df6f3fba45f5d05308f7e4c35835392215dd2cd404505e2de","impliedFormat":1},{"version":"ce75b1aebb33d510ff28af960a9221410a3eaf7f18fc5f21f9404075fba77256","impliedFormat":1},{"version":"f42d5fed19610d485c646a0c430e768115567d078c7fc855c57b0c578b3d6cd3","impliedFormat":1},{"version":"ee8df1cb8d0faaca4013a1b442e99130769ce06f438d18d510fed95890067563","impliedFormat":1},{"version":"d5630f2ad9b4541e5ce891648121022f9412ecdca1820baa1f0104f70fd7eff7","impliedFormat":1},{"version":"4d15375ab13497104bc8fe56fdef2b5fd6853f29255737d23a33fa306ff7fd69","impliedFormat":1},{"version":"2cd3fc1d0d6a1e85baffd2d4f50f5efb192b5446eef567e97c94765402f0aad4","impliedFormat":1},{"version":"e4cbf2f1e89ecccaddd2c045e600ae41b732295953fb06247c7dcbc2d281ed30","impliedFormat":1},{"version":"6dcedaef57dff0d79a05ab0ab602cde74db803d1e765468bf91263786a383e1b","impliedFormat":1},{"version":"8c1697d90c394a6fd955b98eae01238eff628e129b987a68aea10f898a48e7da","impliedFormat":1},{"version":"7580e62139cb2b44a0270c8d01abcbfcba2819a02514a527342447fa69b34ef1","impliedFormat":1},{"version":"b838d4c72740eb0afd284bf7575b74c624b105eff2e8c7b4aeead57e7ac320ff","impliedFormat":1},{"version":"f374cb24e93e7798c4d9e83ff872fa52d2cdb36306392b840a6ddf46cb925cb6","impliedFormat":1},{"version":"d10d63718e1646c2279e3b33831f82c60e31f622b2b7020f1196409ca4c09242","impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"148679c6d0f449210a96e7d2e562d589e56fcde87f843a92808b3ff103f1a774","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"02436d7e9ead85e09a2f8e27d5f47d9464bced31738dec138ca735390815c9f0","impliedFormat":1},{"version":"f8d5ff8eafd37499f2b6a98659dd9b45a321de186b8db6b6142faed0fea3de77","impliedFormat":1},{"version":"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa","impliedFormat":1},{"version":"a22dd55aa4d39906252000ab8e8a1b83b195eef7f4274eb51e457c1f11cf6580","impliedFormat":1},{"version":"540cc83ab772a2c6bc509fe1354f314825b5dba3669efdfbe4693ecd3048e34f","impliedFormat":1},{"version":"121b0696021ab885c570bbeb331be8ad82c6efe2f3b93a6e63874901bebc13e3","impliedFormat":1},{"version":"612d9da66bb046a9c1e2e8d026245ded881fc4b9f98cbfae714415d57ee0ae0b","impliedFormat":1},{"version":"32c2ad9494dad5d11b0564a619fee18f388db6c1e9e2cd3c360b3122549691eb","impliedFormat":1},{"version":"6c301d40aec56a74ec7bd7324e31a728dadf9bfba3e96def02938d3d973534ec","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"aa14cee20aa0db79f8df101fc027d929aec10feb5b8a8da3b9af3895d05b7ba2","impliedFormat":1},{"version":"493c700ac3bd317177b2eb913805c87fe60d4e8af4fb39c41f04ba81fae7e170","impliedFormat":1},{"version":"aeb554d876c6b8c818da2e118d8b11e1e559adbe6bf606cc9a611c1b6c09f670","impliedFormat":1},{"version":"acf5a2ac47b59ca07afa9abbd2b31d001bf7448b041927befae2ea5b1951d9f9","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"d71291eff1e19d8762a908ba947e891af44749f3a2cbc5bd2ec4b72f72ea795f","impliedFormat":1},{"version":"c0480e03db4b816dff2682b347c95f2177699525c54e7e6f6aa8ded890b76be7","impliedFormat":1},{"version":"25a5f6fd3a2243c859eddc99ab5fba11d970af2fe7a5df9c32b7668f76f97b01","impliedFormat":1},{"version":"8d207e1f9d2c30d6f77dfa693f3827c3fbf0d89240297e10bdfe1041d433df68","impliedFormat":1},{"version":"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"2652448ac55a2010a1f71dd141f828b682298d39728f9871e1cdf8696ef443fd","impliedFormat":1},{"version":"d682336018141807fb602709e2d95a192828fcb8d5ba06dda3833a8ea98f69e3","impliedFormat":1},{"version":"6124e973eab8c52cabf3c07575204efc1784aca6b0a30c79eb85fe240a857efa","impliedFormat":1},{"version":"0d891735a21edc75df51f3eb995e18149e119d1ce22fd40db2b260c5960b914e","impliedFormat":1},{"version":"3b414b99a73171e1c4b7b7714e26b87d6c5cb03d200352da5342ab4088a54c85","impliedFormat":1},{"version":"4fbd3116e00ed3a6410499924b6403cc9367fdca303e34838129b328058ede40","impliedFormat":1},{"version":"9c82171d836c47486074e4ca8e059735bf97b205e70b196535b5efd40cbe1bc5","impliedFormat":1},{"version":"48dcc919f76c040a999c0d46d2bf25ab089645ca21b837f120b222f56a86cd76","impliedFormat":1},{"version":"2f9c89cbb29d362290531b48880a4024f258c6033aaeb7e59fbc62db26819650","impliedFormat":1},{"version":"a365c4d3bed3be4e4e20793c999c51f5cd7e6792322f14650949d827fbcd170f","impliedFormat":1},{"version":"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","impliedFormat":1},{"version":"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","impliedFormat":1},{"version":"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","impliedFormat":1},{"version":"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","impliedFormat":1},{"version":"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","impliedFormat":1},{"version":"1ee45496b5f8bdee6f7abc233355898e5bf9bd51255db65f5ff7ede617ca0027","impliedFormat":1},{"version":"273782b8454e78f6a8b30d2cfbf6860499c930595095fcc1689637115f0eddda","affectsGlobalScope":true,"impliedFormat":1},{"version":"3fbdd025f9d4d820414417eeb4107ffa0078d454a033b506e22d3a23bc3d9c41","affectsGlobalScope":true,"impliedFormat":1},{"version":"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369","impliedFormat":1},{"version":"a8f8e6ab2fa07b45251f403548b78eaf2022f3c2254df3dc186cb2671fe4996d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","impliedFormat":1},{"version":"9f9bb6755a8ce32d656ffa4763a8144aa4f274d6b69b59d7c32811031467216e","impliedFormat":1},{"version":"5c32bdfbd2d65e8fffbb9fbda04d7165e9181b08dad61154961852366deb7540","impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","impliedFormat":1},{"version":"0c05e9842ec4f8b7bfebfd3ca61604bb8c914ba8da9b5337c4f25da427a005f2","impliedFormat":1},{"version":"faed7a5153215dbd6ebe76dfdcc0af0cfe760f7362bed43284be544308b114cf","impliedFormat":1},{"version":"7029e566b8df176f703fb59fd437a38670c7a0e02c58b2d66dfb5b2e2b2defdb","impliedFormat":1},{"version":"7f2aa4d4989a82530aaac3f72b3dceca90e9c25bee0b1a327e8a08a1262435ad","impliedFormat":1},{"version":"d96b39301d0ded3f1a27b47759676a33a02f6f5049bfcbde81e533fd10f50dcb","impliedFormat":1},{"version":"e9f147ecca73d9346a4c073432843c159ccbe50bdcb678a78f6da10eae2cecf4","impliedFormat":1},{"version":"de061f7d72bd65c06fc1419f841dfdcb29a8e22fe6fa527d1e6eb20b897d4de0","impliedFormat":1},{"version":"663beafc2446079574570cba86e9b15f986f908ddb1b01274509970126fee945","impliedFormat":1},{"version":"a3102887d5058bf4cb5b37fa6964c09e9527c42053b3b5c642b89878620748de","impliedFormat":1},{"version":"0aaaa1727edd29673d85c9b26d7ca4d54e5407a48586903c51b48b7f7d196f61","impliedFormat":1},{"version":"d35bca0b261bff02635758c48e8ab99c61c420d0dfabbcf467e847171d876b7d","impliedFormat":1},{"version":"3bc12c40d90c342ff88a3d876996c555ed5cbee5fe8c3308a240b321f401ee46","impliedFormat":1},{"version":"ba130768aae855a5477e9e148e5c879548e6e7ccbcc56fd1934c8a18ea5b7569","impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","impliedFormat":1},{"version":"d38530db0601215d6d767f280e3a3c54b2a83b709e8d9001acb6f61c67e965fc","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"b499af2054a037a162b3b72cd886f48bbf32a3502c865c6e29fac7d2ab3ce0b5","impliedFormat":1},{"version":"b83cb14474fa60c5f3ec660146b97d122f0735627f80d82dd03e8caa39b4388c","impliedFormat":1},{"version":"48773ca557b0319c2ee62ae249cf52a81709e8be139920d6479a66274de7c4ed","impliedFormat":1},{"version":"7274fbffbd7c9589d8d0ffba68157237afd5cecff1e99881ea3399127e60572f","impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","impliedFormat":1},{"version":"20865ac316b8893c1a0cc383ccfc1801443fbcc2a7255be166cf90d03fac88c9","impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","impliedFormat":1},{"version":"461d0ad8ae5f2ff981778af912ba71b37a8426a33301daa00f21c6ccb27f8156","impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","impliedFormat":1},{"version":"fcafff163ca5e66d3b87126e756e1b6dfa8c526aa9cd2a2b0a9da837d81bbd72","impliedFormat":1},{"version":"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","impliedFormat":1},{"version":"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","impliedFormat":1},{"version":"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","impliedFormat":1},{"version":"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","impliedFormat":1},{"version":"b01bd582a6e41457bc56e6f0f9de4cb17f33f5f3843a7cf8210ac9c18472fb0f","impliedFormat":1},{"version":"8b4327413e5af38cd8cb97c59f48c3c866015d5d642f28518e3a891c469f240e","impliedFormat":1},{"version":"4cceef18d7f088e797a463e90b7a9dad10c6bc667724b7686e3e740ae00122be","impliedFormat":1},{"version":"7ee86fbb3754388e004de0ef9e6505485ddfb3be7640783d6d015711c03d302d","impliedFormat":1},{"version":"cc1954b539604b1e562319119ac7e888172208b32ca873f9a357a92c826bd046","impliedFormat":1},{"version":"a67b87d0281c97dfc1197ef28dfe397fc2c865ccd41f7e32b53f647184cc7307","impliedFormat":1},{"version":"771ffb773f1ddd562492a6b9aaca648192ac3f056f0e1d997678ff97dbb6bf9b","impliedFormat":1},{"version":"43e96a3d5d1411ab40ba2f61d6a3192e58177bcf3b133a80ad2a16591611726d","impliedFormat":1},{"version":"232f70c0cf2b432f3a6e56a8dc3417103eb162292a9fd376d51a3a9ea5fbbf6f","impliedFormat":1},{"version":"bb8f2dbc03533abca2066ce4655c119bff353dd4514375beb93c08590c03e023","impliedFormat":1},{"version":"706dd95827e7ebaabda91d5db2b755233e0952d98570e9c032b0f066a15c1177","affectsGlobalScope":true,"impliedFormat":1},{"version":"0b103e9abfe82d14c0ad06a55d9f91d6747154ef7cacc73cf27ecad2bfb3afcf","impliedFormat":1},{"version":"cd9304972e6d616197fb44fce00540a904f38b54306a1951b5dbeaf3c01ab5bd","impliedFormat":1},{"version":"77438e2c397a3db78407621cfc57241a305b310ddea2c185f1d555248297f587","impliedFormat":1},{"version":"120599fd965257b1f4d0ff794bc696162832d9d8467224f4665f713a3119078b","impliedFormat":1},{"version":"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a","impliedFormat":1},{"version":"5433f33b0a20300cca35d2f229a7fc20b0e8477c44be2affeb21cb464af60c76","impliedFormat":1},{"version":"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","impliedFormat":1},{"version":"a6805fcafed712aea7759f8bc731014f9d22738c1d6ef9d43b8091d1d48346d5","impliedFormat":1},{"version":"c49469a5349b3cc1965710b5b0f98ed6c028686aa8450bcb3796728873eb923e","impliedFormat":1},{"version":"4a889f2c763edb4d55cb624257272ac10d04a1cad2ed2948b10ed4a7fda2a428","impliedFormat":1},{"version":"7bb79aa2fead87d9d56294ef71e056487e848d7b550c9a367523ee5416c44cfa","impliedFormat":1},{"version":"d88ea80a6447d7391f52352ec97e56b52ebec934a4a4af6e2464cfd8b39c3ba8","impliedFormat":1},{"version":"142617b3cdf902b69c6464c9fbd942b60ab3e733ca18c032b19e0f7e2adbefe8","impliedFormat":1},{"version":"0b603555f1881f87256ffd6344d3e3ed6d466c2e701eabf381f28be8c2125892","impliedFormat":1},{"version":"897e4f7662488e3ecc79e743bdd3b78f13bdb69a97851afa5b440c4211e32ea9","impliedFormat":1},{"version":"e2e1c6d3b2d93add5200bd7bc1a8cccb4e446836b2111ece45db8683a2c765de","impliedFormat":1},{"version":"251b03d5cd243854ce870d9a9a39f491faf69898c5d6b5eee28cc7649c57417b","impliedFormat":1},{"version":"27ff4196654e6373c9af16b6165120e2dd2169f9ad6abb5c935af5abd8c7938c","impliedFormat":1},{"version":"2c4de79f406d137390608e8c0a44fba2ff8e00bacfcae7c9d1781fef10e9440d","impliedFormat":1},{"version":"07ba23a10465791be5d22deaf5ef7de7658774ddff53721e5ea17fedea1bc721","impliedFormat":1},{"version":"dca8c645c5afeb03b1ecedbf16323f33e7d0afaa6256c8e047e6e38087a97f53","impliedFormat":1},{"version":"775f181bd4a533d6f8b5e55ec1d9f1624559720ae8a70e9432258da26b38d27c","impliedFormat":1},{"version":"796273b2edc72e78a04e86d7c58ae94d370ab93a0ddf40b1aa85a37a1c29ecd7","impliedFormat":1},{"version":"5df15a69187d737d6d8d066e189ae4f97e41f4d53712a46b2710ff9f8563ec9f","impliedFormat":1},{"version":"7715134a0cf07dd41a9da2895d708625a3a303a0385e355ecaaf0b8bfaef2550","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"622694a8522b46f6310c2a9b5d2530dde1e2854cb5829354e6d1ff8f371cf469","impliedFormat":1},{"version":"cd8ce8d68567f62dd580b3c3c37777ac3f5b81944c7417f5ea83030eab533385","impliedFormat":1},{"version":"e5c939d896565dcac0f6fbdbada11284e7728ef26a069561c09aa5aa4a788393","impliedFormat":1},{"version":"9e2739b32f741859263fdba0244c194ca8e96da49b430377930b8f721d77c000","impliedFormat":1},{"version":"a9e6c0ff3f8186fccd05752cf75fc94e147c02645087ac6de5cc16403323d870","impliedFormat":1},{"version":"49af4b52f0d4d2304c5f2c6fe5fab3e153e0acc38830d0202821b877c097dd02","impliedFormat":1},{"version":"49c346823ba6d4b12278c12c977fb3a31c06b9ca719015978cb145eb86da1c61","impliedFormat":1},{"version":"bfac6e50eaa7e73bb66b7e052c38fdc8ccfc8dbde2777648642af33cf349f7f1","impliedFormat":1},{"version":"92f7c1a4da7fbfd67a2228d1687d5c2e1faa0ba865a94d3550a3941d7527a45d","impliedFormat":1},{"version":"f53b120213a9289d9a26f5af90c4c686dd71d91487a0aa5451a38366c70dc64b","impliedFormat":1},{"version":"e68b8e5a1df7c1be2bc105141456ecba70215806e1c28bfbc5c12bfce4be6e68","impliedFormat":1},{"version":"511c8f02329808d47d00b859c532ae9115590048b17325a946c74dac48428650","impliedFormat":1},{"version":"57d67b72e06059adc5e9454de26bbfe567d412b962a501d263c75c2db430f40e","impliedFormat":1},{"version":"b5f9e66625783eefcbe3d2da074b2e7ba2066d61ce3fc6ef4f22805ad946cab4","impliedFormat":1},{"version":"e37115962d284b9f7a37c2bdd2add50f88365dde41f5e0ff591ffc48a8ec7575","impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","impliedFormat":1},{"version":"bb37588926aba35c9283fe8d46ebf4e79ffe976343105f5c6d45f282793352b2","impliedFormat":1},{"version":"f89488602bec98a142072fae7ea5ba99431a569ff580c64b7be39896474799d8","impliedFormat":1},{"version":"bbbc47961f39a57df103cf4ca3bb8f8732b4b6678a18225a0aa76d59c466956c","impliedFormat":1},{"version":"2e6114a7dd6feeef85b2c80120fdbfb59a5529c0dcc5bfa8447b6996c97a69f5","impliedFormat":1},{"version":"2ffb043dc5163458e473b7010859f86e01dc4edffcae0a93d885d028b426a546","impliedFormat":1},{"version":"c8f004e6036aa1c764ad4ec543cf89a5c1893a9535c80ef3f2b653e370de45e6","impliedFormat":1},{"version":"dd80b1e600d00f5c6a6ba23f455b84a7db121219e68f89f10552c54ba46e4dc9","impliedFormat":1},{"version":"b064c36f35de7387d71c599bfcf28875849a1dbc733e82bd26cae3d1cd060521","impliedFormat":1},{"version":"05c7280d72f3ed26f346cbe7cbbbb002fb7f15739197cbbee6ab3fd1a6cb9347","impliedFormat":1},{"version":"8de9fe97fa9e00ec00666fa77ab6e91b35d25af8ca75dabcb01e14ad3299b150","impliedFormat":1},{"version":"04b7b2e0832dfd3c31e81df3975e8d8fda28e7ff999b0aa2932608a8f6661d5c","impliedFormat":1},{"version":"ca2d34c6ed5cbd3070b8b6f32f42ae54adcc6499c1e4b99f0a5798b3f27cc653","impliedFormat":1},{"version":"9ec68995e66dd6b9dac834bf5ae85fde802714ea2e82151a5d1d53ef01b463ef","impliedFormat":1},{"version":"5c4d626b4902f2ef8a1cc146d761d276cef988016dc674e3b98fbad70e64bc9f","impliedFormat":1},{"version":"fdfaa0aad899524962e2955287b5b991ffe3be50f64e02eb60c933ca44644a94","impliedFormat":1},{"version":"53c972a0f9bc3a4ec70fff7314123ea8cfcf75b3703046f767d2dc1eea87b2fb","impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","impliedFormat":1},{"version":"50256e9c31318487f3752b7ac12ff365c8949953e04568009c8705db802776fb","impliedFormat":1},{"version":"7d73b24e7bf31dfb8a931ca6c4245f6bb0814dfae17e4b60c9e194a631fe5f7b","impliedFormat":1},{"version":"d130c5f73768de51402351d5dc7d1b36eaec980ca697846e53156e4ea9911476","impliedFormat":1},{"version":"413586add0cfe7369b64979d4ec2ed56c3f771c0667fbde1bf1f10063ede0b08","impliedFormat":1},{"version":"06472528e998d152375ad3bd8ebcb69ff4694fd8d2effaf60a9d9f25a37a097a","impliedFormat":1},{"version":"7303b45138d2511035056a5901a1490ebdcbf055cbb1276f8629c5121cbe733e","impliedFormat":1},{"version":"27f874cd5327507eeff699a74567f60c1215b94509f4308633a7b01922471ed2","impliedFormat":1},{"version":"a401617604fa1f6ce437b81689563dfdc377069e4c58465dbd8d16069aede0a5","impliedFormat":1},{"version":"2c6cf04bc525caf6546e859e8ef10bfb9573837ec0bc5ec7b53a7b1b8ca72781","impliedFormat":1},{"version":"8695dec09ad439b0ceef3776ea68a232e381135b516878f0901ed2ea114fd0fe","impliedFormat":1},{"version":"304b44b1e97dd4c94697c3313df89a578dca4930a104454c99863f1784a54357","impliedFormat":1},{"version":"0a437ae178f999b46b6153d79095b60c42c996bc0458c04955f1c996dc68b971","impliedFormat":1},{"version":"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f","impliedFormat":1},{"version":"4a7baeb6325920044f66c0f8e5e6f1f52e06e6d87588d837bdf44feb6f35c664","impliedFormat":1},{"version":"87cc05fe13108f02e12da7e3efd8e360fef78d96a0c9e11408ea1b1b9fb3e03d","impliedFormat":1},{"version":"1abbf67c218d23c2ce76887caac2df6c7dab3d97ba2b65348432b876f510002a","impliedFormat":1},{"version":"1a82deef4c1d39f6882f28d275cad4c01f907b9b39be9cbc472fcf2cf051e05b","impliedFormat":1},{"version":"4b20fcf10a5413680e39f5666464859fc56b1003e7dfe2405ced82371ebd49b6","impliedFormat":1},{"version":"c06ef3b2569b1c1ad99fcd7fe5fba8d466e2619da5375dfa940a94e0feea899b","impliedFormat":1},{"version":"f7d628893c9fa52ba3ab01bcb5e79191636c4331ee5667ecc6373cbccff8ae12","impliedFormat":1},{"version":"2467b00d963828f540f4acd7910f4c04cfe4b489550e6bb682212f65583bca5b","impliedFormat":1},{"version":"854e50b93090b3f8fd6e355b074e1d24dce1ae0240f1ce46563e35fea210a6d5","impliedFormat":99},{"version":"5a16e93d5d53d987dddda1ec606c9821f6bd31d1bdf0635e05e3841312cefa8b","impliedFormat":1},{"version":"a6dba407fc287f1e25454e75028c91bbc00675f2d1c4e8b3edcc36c08611a486","impliedFormat":1},{"version":"d663134457d8d669ae0df34eabd57028bddc04fc444c4bc04bc5215afc91e1f4","impliedFormat":1},{"version":"e91f7b1344577a02f051b9b471f33044fef8334a76dc9e1de003d17595a5219b","impliedFormat":1},{"version":"c0723195c85e19656d6b5b9fdb81d3f3403c1ae4679e722c6ea058c516b38d12","impliedFormat":1},{"version":"b55eb9f72166093b5460d34b34f5d8699c968de3bc3fc696e40f2c93f2ebf650","impliedFormat":1},{"version":"71d9eb4c4e99456b78ae182fb20a5dfc20eb1667f091dbb9335b3c017dd1c783","impliedFormat":1},{"version":"cfa846a7b7847a1d973605fbb8c91f47f3a0f0643c18ac05c47077ebc72e71c7","impliedFormat":1},{"version":"1594da19968752a22b2ac48c2d0e60575700e745c577a8a4a676b841238ad5bb","impliedFormat":1},{"version":"e0cee12109e0a10a4c3d6769fcc7644b7c1ea7f52365bea51728f5af29f8a137","impliedFormat":1},{"version":"7d4254b4c6c67a29d5e7f65e67d72540480ac2cfb041ca484847f5ae70480b62","impliedFormat":1},{"version":"3536968defef8a75514f547ead5e2e9c1e984820290ec9b00c5fdfb6ef786535","impliedFormat":1},{"version":"d83773870080c30a230e322ce13a9c6f3398e8dacea4ea8a83e26370f3bac23e","impliedFormat":1},{"version":"dcfeaf98d66314fec29a9076c4290e45d0b196a65827becc19138e9c7b855f37","impliedFormat":1},{"version":"6849fe9210fe4946d5f085bfed36758f33dc6ae15a751338d178dd4daa017c46","impliedFormat":1},{"version":"888cda0fa66d7f74e985a3f7b1af1f64b8ff03eb3d5e80d051c3cbdeb7f32ab7","impliedFormat":1},{"version":"60681e13f3545be5e9477acb752b741eae6eaf4cc01658a25ec05bff8b82a2ef","impliedFormat":1},{"version":"ffae4e1e06aa848a1e4bcef162cd1c48e5909b26223515981310af9c036bdfc7","impliedFormat":1},{"version":"a57b1802794433adec9ff3fed12aa79d671faed86c49b09e02e1ac41b4f1d33a","impliedFormat":1},{"version":"34e16eb7c31768a11a08aebcfb3d70d7b8f0b016197e98d8419e566ceae6d6c8","impliedFormat":1},{"version":"f94ec1f7e4b709d26960306c9082a7a1b728a6e13089346aa48ba57c74cbf47e","impliedFormat":1},{"version":"9a11cb4033405e96c247cd5aa29790212aaffdd127869e8a5219103f0b389fd5","impliedFormat":1},{"version":"01479d9d5a5dda16d529b91811375187f61a06e74be294a35ecce77e0b9e8d6c","impliedFormat":1},{"version":"aff5213585cb72e94054dfe17250ff315f3569b3919d1ef1ad235f37c4ee894e","impliedFormat":1},{"version":"fb2ea35e1be6388d722d7725e2b49c697d34d9c890c3b96758faaeb86d35cef8","impliedFormat":1},{"version":"ce0df82a9ae6f914ba08409d4d883983cc08e6d59eb2df02d8e4d68309e7848b","impliedFormat":1},{"version":"1a4dc28334a926d90ba6a2d811ba0ff6c22775fcc13679521f034c124269fd40","impliedFormat":1},{"version":"f05315ff85714f0b87cc0b54bcd3dde2716e5a6b99aedcc19cad02bf2403e08c","impliedFormat":1},{"version":"5fad3b31fc17a5bc58095118a8b160f5260964787c52e7eb51e3d4fcf5d4a6f0","impliedFormat":1},{"version":"72105519d0390262cf0abe84cf41c926ade0ff475d35eb21307b2f94de985778","impliedFormat":1},{"version":"456006a6975b26c0a1785feddae165f6d307e2d601ffde27e21fc4a790e448a4","impliedFormat":1},{"version":"c857e0aae3f5f444abd791ec81206020fbcc1223e187316677e026d1c1d6fe08","impliedFormat":1},{"version":"ccf6dd45b708fb74ba9ed0f2478d4eb9195c9dfef0ff83a6092fa3cf2ff53b4f","impliedFormat":1},{"version":"1fe0d18b111e1145a7e7601855bccd4ca20f24e3b9a5aba6bb1fa9d1a7059170","impliedFormat":1},{"version":"5632c3c26d420c063eebe64c45b1248b9492a67bf44f1d0c57e9dc8f6cf449bb","impliedFormat":1},{"version":"0df5aa619ab12993a39ea6dae062ee46eadbb4d738916460e636ada52bced75b","impliedFormat":1},{"version":"8fca3039857709484e5893c05c1f9126ab7451fa6c29e19bb8c2411a2e937345","impliedFormat":1},{"version":"35069c2c417bd7443ae7c7cafd1de02f665bf015479fec998985ffbbf500628c","impliedFormat":1},{"version":"10ab7be91f87ebe8916b62cf28af2e45b5601fc7b0e311adf838f912c6b31dd8","impliedFormat":1},{"version":"bc636fbc08e0979ceb7eb0731a33000283d77a33b62e1f71ee65be50394e40ba","impliedFormat":1},{"version":"7e0b7f91c5ab6e33f511efc640d36e6f933510b11be24f98836a20a2dc914c2d","impliedFormat":1},{"version":"045b752f44bf9bbdcaffd882424ab0e15cb8d11fa94e1448942e338c8ef19fba","impliedFormat":1},{"version":"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab","impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","impliedFormat":1},{"version":"75bbd3be047d539988a0ff0b56384ef7a6a25f3b676ad96bee547d44c31622a7","impliedFormat":1},{"version":"42960001a776b089ade681ab5cfddc936e0afb0615133ec1841f3dee89d3e1bf","impliedFormat":1},{"version":"0aedb02516baf3e66b2c1db9fef50666d6ed257edac0f866ea32f1aa05aa474f","impliedFormat":1},{"version":"da47712b394d944328245482603bc6f416d3949b67c9392279caab595076b510","affectsGlobalScope":true,"impliedFormat":1},{"version":"37d0071d8f0a06dc55c2c5e0ec3391affd4fd107c53410bf358196ec0bf3923f","impliedFormat":1},{"version":"b213dad76ca37fd552274c9499056e1c0d9c1bd38a55bb7f68b22ba6b84c3ad7","impliedFormat":1},{"version":"c30436b130b6218b7714314dc41d3f459590db4bdf099eecd51cb1bda32109a8","impliedFormat":1},{"version":"20fa37b636fdcc1746ea0738f733d0aed17890d1cd7cb1b2f37010222c23f13e","impliedFormat":1},{"version":"d90b9f1520366d713a73bd30c5a9eb0040d0fb6076aff370796bc776fd705943","impliedFormat":1},{"version":"88e9caa9c5d2ba629240b5913842e7c57c5c0315383b8dc9d436ef2b60f1c391","impliedFormat":1},{"version":"ddf68b3b62e49cf6fd93ba2351ad0fbbcf62ca2d5d7afc9f186114e4b481c3cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"bef86adb77316505c6b471da1d9b8c9e428867c2566270e8894d4d773a1c4dc2","impliedFormat":1},{"version":"5a49adaef698b7ad7e6127949fa1b0bbd3d46b7cbd11c54e392a4dcdd51f5190","impliedFormat":1},{"version":"6ee598cdfdd0fa52039dca135b3dfff7b49035dc13292143e0a93843e3861967","impliedFormat":1},{"version":"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","impliedFormat":1},{"version":"5c634644d45a1b6bc7b05e71e05e52ec04f3d73d9ac85d5927f647a5f965181a","impliedFormat":1},{"version":"2489bf04d77dc025ba67f49f1a56eb24b9db477d5ff88123d887e163ed1776aa","impliedFormat":1},{"version":"63a7595a5015e65262557f883463f934904959da563b4f788306f699411e9bac","impliedFormat":1},{"version":"4ba137d6553965703b6b55fd2000b4e07ba365f8caeb0359162ad7247f9707a6","impliedFormat":1},{"version":"0b77b819b5417775fccb20c678293cf614c054a5b1a65421a5b933a9124ba998","impliedFormat":1},{"version":"eb5acb58487367e502d994b57e2c58255d8241f481ea8efa8e79af23af3f41c2","impliedFormat":1},{"version":"9252d498a77517aab5d8d4b5eb9d71e4b225bbc7123df9713e08181de63180f6","impliedFormat":1},{"version":"b1f1d57fde8247599731b24a733395c880a6561ec0c882efaaf20d7df968c5af","impliedFormat":1},{"version":"5757b78830c681b3124af568b94c269259ea5e8171a4316508ef67310c2ed1ed","impliedFormat":1},{"version":"35e6379c3f7cb27b111ad4c1aa69538fd8e788ab737b8ff7596a1b40e96f4f90","impliedFormat":1},{"version":"1fffe726740f9787f15b532e1dc870af3cd964dbe29e191e76121aa3dd8693f2","impliedFormat":1},{"version":"5a3ea721d03a361ccbdd7390ccd75f6e84cbca3a3f01f4b331ecc9af31890c49","impliedFormat":1},{"version":"e7dfaee4af38d45b1cab8a1ee0b3bc1f85ddcf64545ed391d675d78ae6526274","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8daa443eaf9a27fd382cc1f8ebe30330c0f4d89511cfb469166874806751d35","impliedFormat":1},{"version":"af48e58339188d5737b608d41411a9c054685413d8ae88b8c1d0d9bfabdf6e7e","impliedFormat":1},{"version":"616775f16134fa9d01fc677ad3f76e68c051a056c22ab552c64cc281a9686790","impliedFormat":1},{"version":"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","impliedFormat":1},{"version":"f9fe6af238339a0e5f7563acee3178f51db37f32a2e7c09f85273098cee7ec49","impliedFormat":1},{"version":"1de8c302fd35220d8f29dea378a4ae45199dc8ff83ca9923aca1400f2b28848a","impliedFormat":1},{"version":"77e71242e71ebf8528c5802993697878f0533db8f2299b4d36aa015bae08a79c","impliedFormat":1},{"version":"98a787be42bd92f8c2a37d7df5f13e5992da0d967fab794adbb7ee18370f9849","impliedFormat":1},{"version":"332248ee37cca52903572e66c11bef755ccc6e235835e63d3c3e60ddda3e9b93","impliedFormat":1},{"version":"94e8cc88ae2ef3d920bb3bdc369f48436db123aa2dc07f683309ad8c9968a1e1","impliedFormat":1},{"version":"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","impliedFormat":1},{"version":"320f4091e33548b554d2214ce5fc31c96631b513dffa806e2e3a60766c8c49d9","impliedFormat":1},{"version":"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","impliedFormat":1},{"version":"d90d5f524de38889d1e1dbc2aeef00060d779f8688c02766ddb9ca195e4a713d","impliedFormat":1},{"version":"07ed3ddab975995eea41b22f3010506fb9f5fb301d04820b07d7a1aee5477d7c","impliedFormat":1},{"version":"969d8b0965849f4bae7cab0ba90bd1e1220e95999c2c6f01117fa7500901c017","impliedFormat":1},{"version":"6ec840ee5e2bc103f557fe38b1d585ee250540468713d7634ee066de372bf332","impliedFormat":1},{"version":"b0309e1eda99a9e76f87c18992d9c3689b0938266242835dd4611f2b69efe456","impliedFormat":1},{"version":"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","impliedFormat":1},{"version":"6ceb10ca57943be87ff9debe978f4ab73593c0c85ee802c051a93fc96aaf7a20","impliedFormat":1},{"version":"1de3ffe0cc28a9fe2ac761ece075826836b5a02f340b412510a59ba1d41a505a","impliedFormat":1},{"version":"e46d6cc08d243d8d0d83986f609d830991f00450fb234f5b2f861648c42dc0d8","impliedFormat":1},{"version":"1c0a98de1323051010ce5b958ad47bc1c007f7921973123c999300e2b7b0ecc0","impliedFormat":1},{"version":"ff863d17c6c659440f7c5c536e4db7762d8c2565547b2608f36b798a743606ca","impliedFormat":1},{"version":"5412ad0043cd60d1f1406fc12cb4fb987e9a734decbdd4db6f6acf71791e36fe","impliedFormat":1},{"version":"ad036a85efcd9e5b4f7dd5c1a7362c8478f9a3b6c3554654ca24a29aa850a9c5","impliedFormat":1},{"version":"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","impliedFormat":1},{"version":"e297c0a524edee7677939122f90027bfbe5f2698939d9a85728e5044b39c7124","impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","impliedFormat":1},{"version":"bc9ee0192f056b3d5527bcd78dc3f9e527a9ba2bdc0a2c296fbc9027147df4b2","impliedFormat":1},{"version":"b62381cae176db34f003cc6172ee8f3e0122014889d66391aa73698105cf4934","impliedFormat":1},{"version":"1d9c0a9a6df4e8f29dc84c25c5aa0bb1da5456ebede7a03e03df08bb8b27bae6","impliedFormat":1},{"version":"84380af21da938a567c65ef95aefb5354f676368ee1a1cbb4cae81604a4c7d17","impliedFormat":1},{"version":"1af3e1f2a5d1332e136f8b0b95c0e6c0a02aaabd5092b36b64f3042a03debf28","impliedFormat":1},{"version":"30d8da250766efa99490fc02801047c2c6d72dd0da1bba6581c7e80d1d8842a4","impliedFormat":1},{"version":"03566202f5553bd2d9de22dfab0c61aa163cabb64f0223c08431fb3fc8f70280","impliedFormat":1},{"version":"41eb514d9ce0a6e87957f08a4b7af70d93f87637f37dee706e2d92a6601c25a9","impliedFormat":1},{"version":"e7765aa8bcb74a38b3230d212b4547686eb9796621ffb4367a104451c3f9614f","impliedFormat":1},{"version":"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","impliedFormat":1},{"version":"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","impliedFormat":1},{"version":"5bf5c7a44e779790d1eb54c234b668b15e34affa95e78eada73e5757f61ed76a","impliedFormat":1},{"version":"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","impliedFormat":1},{"version":"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","impliedFormat":1},{"version":"7bd01f0f28cd3aeb2046274d85208e245965f6f2948edf4f7b2057bcf9f22ccc","impliedFormat":99},{"version":"d2f2cf2b8cc92bea913cda4a076e0f790b23a21e84f989d12f0116a7fe3906e0","impliedFormat":99},{"version":"6de125ea94866c736c6d58d68eb15272cf7d1020a5b459fea1c660027eca9a90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5b20bc288ee49989c95b20847fc93b96bf61cc0845598897a6a53a967dd7d07","affectsGlobalScope":true,"impliedFormat":1},{"version":"064ac1c2ac4b2867c2ceaa74bbdce0cb6a4c16e7c31a6497097159c18f74aa7c","impliedFormat":1},{"version":"3dc14e1ab45e497e5d5e4295271d54ff689aeae00b4277979fdd10fa563540ae","impliedFormat":1},{"version":"d3b315763d91265d6b0e7e7fa93cfdb8a80ce7cdd2d9f55ba0f37a22db00bdb8","impliedFormat":1},{"version":"69dbe5d61d2f298046513598f55bd1e719c50dfd6af2f9feea6fc84f8aa3c4bf","impliedFormat":99},{"version":"7e442e27a133b8026f45b7e2b04a7aee35dde73f48077cd0e1c6d8d7b89f1304","impliedFormat":99},{"version":"2ebe2f0255b6f301ba7bc0e10c3dda289c6cf1876f289f7a8f6444613d988e5e","impliedFormat":99},{"version":"012b5083a47ccbe050763f8df2be89daa50c1606e9a0bb31f64276d508c02d78","impliedFormat":99},{"version":"790ed69a8312f812298f3d5329e1a5198576009a8214feefa7a8d5f9dbc25046","impliedFormat":99},{"version":"96c709e09fddb3e146cdc39df645f1fde76c2bbe8f455180112af4b36811dbcf","impliedFormat":99},{"version":"7955f23e27696e82e256b5c9fd58c2a0bce85b21f2ea97584733a0456d187dce","impliedFormat":99},{"version":"2316180d3e3055f30525cc4f2c0a5d393fe5ec8de3c7a6732bd8aa7cad4b5bb9","impliedFormat":99},{"version":"aeae6c24b13d1a0c7bbc1aa2119ba91562c1b0ef89aa5aa41b1b6bb85a03887f","impliedFormat":99},"244f2d26dafad8eb5fbbda7f52fa558372b311d3fe768007775bdde801f0e1c6",{"version":"e8fc8d807069e0f94d481106510fae66792e6a66f330c45fd3c769053cfa5608","impliedFormat":99},{"version":"4c57148a2cb7736c37a7ca128fc8adec5a683413663c17604a28da143ca1a65b","impliedFormat":99},{"version":"37a5b233da6141bd6cd4e78dd8bcd9c0dd29e33ec10707cb57c66304cf743e46","impliedFormat":99},{"version":"c8e1a516135ad6fd057ddc5a01036067ff3b43b3277d18f1eb4c5df22630b50b","impliedFormat":99},{"version":"7d8b55f6b9e7a7a003063ecd596c72c23fe6d8225d6cf3e00e8b375059123513","impliedFormat":99},{"version":"d8b29e5a1a4db41c00cfed03db63c835aab6d46664f90f10fd2195db789a2200","impliedFormat":99},"55fb0f8cb5ac66d36524d612cec1415df09c4d4da07ba63fe38221e81a4b0737","5fffb2abb62be3e554943b079c8ef2d5dd4bb8373a54aab173284a96bd4ce774","4a11be49f47787b1e86cf27657d31fb3c98a1c65a935623d149db3cbfd8e5eca","fc59d4f732e424a6514fc9c3c898a330d63e21b4b850945a8c2af2caa155d76e","29b50dbd1c5c334e78a8ec8361a88be3079316f901c39b66615b41a660162dc0",{"version":"bf8716970ea00cdd194ce9d937048a9d36facefd56a4619b6dc1811d07fef85f","signature":"2c5decbc52563b489e4603e734e75ba64818a395a88d6640089460b43e6dc1c0"},{"version":"e45c2c8e531449a9746c3dc9f55fc2b9648d49757a65f25cfa3b916cd022befa","impliedFormat":99},{"version":"2883531900a29e3c7e6f8bf3a7835bce035cfb20748d8d0cfc287896c46d739e","impliedFormat":99},{"version":"22d5bafc272a4f1b6bd1aee054f08ac09a9cd90ea1a321fb9c563ae4fa3df6d4","impliedFormat":99},{"version":"c8c94fc39100a0981f81b9e9872848597575b3e3fb40a36e99de688927cb20ed","impliedFormat":99},{"version":"01545f0274a774e191f06380ddedaec2b2dfbd021ca2e8775f7819959beb2cb4","impliedFormat":99},{"version":"6c557db1095e0588b7d82d9bdd9e4328872d436a94f2025da271d5ef57845309","impliedFormat":99},{"version":"2827790fc4a5c48d032a79a8d547eca0620d7fc7c997b830417f6de5b04c7c3d","impliedFormat":99},{"version":"3f12ba187e0dc6d3586fc24a52aa80c11e8e84eb742122735bbc6f3a91044d8a","impliedFormat":99},{"version":"d3cfde44f8089768ebb08098c96d01ca260b88bccf238d55eee93f1c620ff5a5","impliedFormat":1},{"version":"293eadad9dead44c6fd1db6de552663c33f215c55a1bfa2802a1bceed88ff0ec","impliedFormat":1},{"version":"54f6ec6ea75acea6eb23635617252d249145edbc7bcd9d53f2d70280d2aef953","impliedFormat":1},{"version":"c25ce98cca43a3bfa885862044be0d59557be4ecd06989b2001a83dcf69620fd","impliedFormat":1},{"version":"8e71e53b02c152a38af6aec45e288cc65bede077b92b9b43b3cb54a37978bb33","impliedFormat":1},{"version":"754a9396b14ca3a4241591afb4edc644b293ccc8a3397f49be4dfd520c08acb3","impliedFormat":1},{"version":"f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","impliedFormat":1},{"version":"e4b03ddcf8563b1c0aee782a185286ed85a255ce8a30df8453aade2188bbc904","impliedFormat":1},{"version":"de2316e90fc6d379d83002f04ad9698bc1e5285b4d52779778f454dd12ce9f44","impliedFormat":1},{"version":"25b3f581e12ede11e5739f57a86e8668fbc0124f6649506def306cad2c59d262","impliedFormat":1},{"version":"2da997a01a6aa5c5c09de5d28f0f4407b597c5e1aecfd32f1815809c532650a2","impliedFormat":1},{"version":"5d26d2e47e2352def36f89a3e8bf8581da22b7f857e07ef3114cd52cf4813445","impliedFormat":1},{"version":"3db2efd285e7328d8014b54a7fce3f4861ebcdc655df40517092ed0050983617","impliedFormat":1},{"version":"d5d39a24c759df40480a4bfc0daffd364489702fdbcbdfc1711cde34f8739995","impliedFormat":1},{"version":"884aab8c07224434c034b49e88de0511f21536aa83ee88f1285160ba6d3fb77a","impliedFormat":99},{"version":"130b39b18c99e5678635f383ef57efaa507196838ddabb47cb104064e2ce4cd3","impliedFormat":99},{"version":"2556e7e8bb7e6f0bb3fe25f3da990d1812cb91f8c9b389354b6a0c8a6d687590","impliedFormat":99},{"version":"ad1c91ca536e0962dcbfcdff40073e3dd18da839e0baad3fe990cf0d10c93065","impliedFormat":99},{"version":"19cf605ba2a4e8fba017edebdddbbc45aea897ddc58b4aae4c55f382b570ff53","impliedFormat":99},{"version":"7618d2cb769e2093acd4623d645b683ab9fea78c262b3aa354aba9f5afdcaaee","impliedFormat":99},{"version":"029f1ce606891c3f57f4c0c60b8a46c8ced53e719d27a7c9693817f2fe37690b","impliedFormat":99},{"version":"83596c963e276a9c5911412fba37ae7c1fe280f2d77329928828eed5a3bfa9a6","impliedFormat":99},{"version":"81acfd3a01767770e559bc57d32684756989475be6ea32e2fe6255472c3ea116","impliedFormat":99},{"version":"88d0c3eae81868b4749ba5b88f9b6d564ee748321ce19a2f4269a4e9dd46020a","impliedFormat":99},{"version":"8266b39a828bfb2695cabfa403e7c1226d7d94599f21bea9f760e35f4ca7a576","impliedFormat":99},{"version":"c1c1e740195c882a776cf084acbaf963907785ee39e723c6375fec9a59bf2387","impliedFormat":99},{"version":"137f96b78e477e08876f6372072c3b6f1767672bf182013f84f8ae53d987ff86","impliedFormat":99},{"version":"29896c61d09880ff39f8a86873bf72ce4deb910158d3a496122781e29904c615","impliedFormat":99},{"version":"81ce540acef0d6972b0b163331583181be3603300f618dcd6a6a3138954ff30c","impliedFormat":99},{"version":"a82f5ba70d26e6ad9d432ab7556506d807c49f35a44af99fb8054004220aaaa1","impliedFormat":1},{"version":"4e6852cb16272dc3b8fb8ea691786bfe1692328cc9ff84cd956819c194197e1b","signature":"ed5a2f839af76f67a9999ce4d22e491a631ea158db5eb81848d62ad2c9776b50"},{"version":"781f91caaf62d093b0add69b60a3cb83d9c20362b52a82adacf883ec0a23c033","signature":"6056f5384c48e11001bd5b7d351d6036324b329f975b5e54d2c2b71619f90606"},{"version":"f424c8f51165954727c5ac5684e0a08010dcabdaabb4ad639e98a78ae9cf25d2","signature":"43610e248c9c37f8c1e78b406e06083c9ed91bd6c9c55b1a226a058a052b2785"},{"version":"7578e80c8a86bc34c5afa17a3b7674a2cf064d7972b5a64e4937400ffb922503","signature":"3a64da2dbaaea64f4834264e3c7c3e3e1c3ada3482af3a66067153bca26c04a0"},{"version":"9e8c83a4fe3c9586d744895bf50082a98069a82879963d9f794233677062b6b7","signature":"1d0156bb3dd5c0b7f50916334e78f57e8cb964997e730eaae7a852bd6a877f73"},{"version":"ebbd0c41a6e297e579e8b01b668083b9a19a370c2c442bce88eb426993cf7556","signature":"2a6864d8efb439165c54d06e1076537bfecae72743f0bf886d7d4dd037f326f1"},{"version":"48d6a957471129b99d914308ac07c534f97d9570be0ef18a9e6dbee803f59671","impliedFormat":1},{"version":"fd530c5bec0ec673875c3ca88020ad1d6cf724c536f3a8e4d25d7b096e88e645","impliedFormat":1},{"version":"90c7a9fda73928cef9023a41be545fce208546175e5b45bd988f24d4522c2a7b","impliedFormat":1},{"version":"46b55a125d671d7e1eca131a993aa0f6966a4c10e015870d430383ccb464769a","impliedFormat":1},{"version":"74157841482a1e6c20bdd62c224379a4e5f98273fe5bb96a38227ec797754fc3","signature":"a6d6b502d5540a0bca2599e1716f7b3e38098414643e16155cb2e2ca89427df5"},{"version":"d723aab8919102f129ac8f126476aea20469d473d4cc2ec5a5513c63db6d24b2","signature":"d89bd56539c435595b1f1c688996620c94c0fd23ef65b126888fe01314306b5a"},{"version":"55d3fda71889a9be10527628cc0ec7347c0dce82f3c6b065aca6b3b4d9dddac4","signature":"8dabb7da229d309e7c1dad66529738d7c7e9a996bad7c3528306dad59344393c"},{"version":"9f40aa7ae563dfd45612a547e718ec15c7cc1801183019c558bfec9b7e4be904","signature":"cf15ca354ee484f5276230e4f7097439be790dc25bf81361bbd225b4b1faa6b3"},{"version":"c6a8c230c095c57a2ebf27821b58cb14f92d72f5875118316324604852c4a3ba","signature":"db905f83d13fb701b302751026fbada25ab8c4be80eb0f710a388d28618de240"},{"version":"ec88bb2fe637034f597bc514b51c2b7796704c46dadc301a57259491c9dab24c","signature":"783a2d4ff67e8e44e02741423d039ab321aa4304cbe2a17b5846d589cbf37052"},{"version":"a8e78fa6fbed0a831830ef42df5938ebc721ea8b7cb94190972cf8b5d8375068","signature":"e4d56372c15c18fb68b034b882edde10452c8ad3a3225d89e4ff8a998f852df9"},{"version":"040ac6ae7b401467288a577d5cfb73e58f888ab83488d9ed7fdc2b23308592ba","signature":"4b0c7c6161cc3b0f414b46390232634e37cb4db905c2ccc4783e070e10dc0475"},{"version":"55792eb0b34a633e744ca74eea4a93b22a329b64e277996d08b89faca60d962f","signature":"5077cf43f15bbae0d37ca3f829caedced47cfa26de4711e24ac9b076793bac47"},{"version":"3def15280b77a6589f782a5f0b166a70aa07100e1a66e6faf4230e89fef8a371","signature":"162636cd28c27613e25108fc42519b74aa1bb731061c2f79aaaa3e6990787c2f"},{"version":"8c20a789605f6cc20a63737cdc8c1ca7dfef38d6597cd46958bb23bf80ca9e69","signature":"eb8ccfb4bb7653b462874e9ac28cdcd06d5c7743395195235d5a6671f071ad80"},{"version":"3b93fbee920bc3e83d27b15ab5d51a3a0cfa659bcc02771f9b228d8d87a26324","signature":"b63384aa94fb277d9ed1804c4f977de32a7981cccb9bb16df78a37397e34a913"},{"version":"5f98e351e4a92c276b35c90c69b35fa20122538e3ae9aaac32f93422fc02ee6a","signature":"4699cefd08ee01d20fc0cec135658f1986d913ddda5194753bad90931e076251"},{"version":"4ec626e5ecdc6cd47de4c290826a969f2f9551162816853b691cf765a9400409","signature":"ea95aac3f40a2424ada34d894514ee0ca96e28e9df638e7188cee451dd02b699"},{"version":"c3e20fce4d1c9d344bb533766069459543d9ecb1b67134dba30ea21706d49d72","signature":"0dc80c504dde90080f352b2c23714ffd2dcc99ee9c1309029df05ae804e8c5e8"},{"version":"5e8db61271ab510b2d7ac90e9dac30d467d5533731971b97e317bbe9a01a45e5","signature":"4bf32da7c20e2ecaea578d9a23b34b2ced48ad4a618b009339b01e0bedf1ae12"},{"version":"529e8d544daef015d9b7e08f3327f487ff5c1fdc9ae00969b90fe6d7f662c410","impliedFormat":99},{"version":"32d72e24ec52676fbd422d6109ba2e7326f8cb0ae09d62433609994d772b1218","impliedFormat":99},{"version":"68d7aecae568155de73f47abea696482d07d82e531829d344b5b4f2feaffc9b7","impliedFormat":99},{"version":"94c34f6addbb8215972c16680f4e122977830a4a6b72a191302915f6e6fbcacb","impliedFormat":99},{"version":"97c9b25718cea0d37894c5dd9f7e7fff4f8bcbc56ca3bba011c074560be291f1","impliedFormat":99},{"version":"abfdbcd2e417125d1b38209aa079bfec08b42611feedaebf29be8676e74c43cc","impliedFormat":99},{"version":"6d7a5d9f2190bd6d5086a130b3ef5231d7bc8a3d923133628544b265611a3afc","impliedFormat":99},{"version":"9d8acc6859de780646cb2ad73bf0b48f20f83adab18d614ba9b4f87c6046b6bd","impliedFormat":99},{"version":"7debb6b27ee0e7383618739a56fd13d9332d58a97eb1001f57ec2d4c1f133536","impliedFormat":99},{"version":"828968bfd8325c1e6b427043673be3aee122dd5125ea5ff3adcdb56cb62ac202","impliedFormat":99},{"version":"29862235bb48e3e8892a5e95aa464810a6c0282ca549f4c0f65cc2329c4ed90a","impliedFormat":99},{"version":"6b1af69b824a18b7f06a0637a1799f6697d0e0af215a2e70c7438b7413d408bf","impliedFormat":99},{"version":"3ec9cc0d5ff3509a3800802248b56f72d0bd4ddbbf4ced7238ced162f6792bf9","impliedFormat":99},{"version":"b09e328891c9b6c1e363a0dabc2b7e9bbab7ce95f4c1a42e3ebc1cb957aebe2e","impliedFormat":99},{"version":"853230b380bc84877c7e691af167bde176c500e716074acb02668713ae1b92f7","impliedFormat":99},{"version":"a861ffb4131dc6c01a9918b0c2d9eb907963a363019c8cf8441c195cc7271eb3","impliedFormat":99},{"version":"7dbfd2dc59802603b4d9d9cd35bfa777da1cd030ffc78f618701772d70c44d7a","impliedFormat":99},{"version":"0d40d64f4e5b821a820ca61cd3338fed6feaea4734081098ab99bf8b22b7a558","impliedFormat":99},{"version":"441d1761b0cdea56381964395929a7dc78cc8294f07550a4a7cbd7a471982d49","impliedFormat":99},{"version":"0a5ea01b61f08bb7fe4aee10e148a43bd63cd09c0e48c80c81853a31c63e81f1","impliedFormat":99},{"version":"0765436722d07c50dd64a72cb2ca2b828ae4d8b6c58cce1c7d69b16ed69b911f","impliedFormat":99},{"version":"a99b58cde0c933aafa9a6d539796dd39a2b6faa5868b9329611b7820e4813ed2","impliedFormat":99},{"version":"b70468dd5cce06b4500b9c744b46645bb0810bbb3f16d6f6d8a6ba099d3e3db3","impliedFormat":99},{"version":"fcad406a5312d678f0e3d9ce37e175fc3108075dda7507b33de434d815db8c3a","impliedFormat":99},{"version":"637470d7618d80acc44ce21720e911b1956fb8f35fcd7c29fca8b676569257fd","impliedFormat":99},{"version":"bbc35778ba8327cc2595d22a0492b38a4f5a23c156fe83a4f6c16e16d771a80d","impliedFormat":99},{"version":"1bf505b116e5c3adb7a621d3177726ec218b39b6fbb343a5ca9131bb4c4e4a2e","impliedFormat":99},{"version":"f8f793150b733a84ba31dc32b764f914c2b9f7ba3da22392c8700729556311de","impliedFormat":99},{"version":"52308301ab0721bea0c29c5a3286fc9af801f77107c76860958c7af512fe1db3","impliedFormat":99},{"version":"08c2ae2038dae5a129561b998d69712081de02df044668ef7c6f1a79064a781d","impliedFormat":99},{"version":"1e5ac74ec58a751a57547db79f5d0c7f55de7103b3cd608df9b865f1c20e6ec0","impliedFormat":99},{"version":"3217478b66cbc150f70691f22995b9f47d37706a904299a00cb293f8bed70a5b","impliedFormat":99},{"version":"757b25663615b67539b212022e464ab8738fe9584798abd2f1dfee3ae2bed28a","impliedFormat":99},{"version":"a4965dec5a8d5a1bd151f788d8e1e2300c4314907adc4b70e205df9bf1de1846","impliedFormat":99},{"version":"61da0187f4a66053b80903d118bcc49835a09085597419f001300e16190087b6","impliedFormat":99},{"version":"aba7430768196c0d2dda6ad7660d4bd1ce5abb9394d5ec506fddf897cd055c17","impliedFormat":99},{"version":"fef0d18210f7853a843ec8f6d8169ed6659d9cacb7a21b4e1ccc52d79cecf503","impliedFormat":99},{"version":"a20601b31b50dfe52cb6a3790977b2499dba3f590621a4a241b6b7a5a408b788","impliedFormat":99},{"version":"4d0d48b4534a83b374888c23427400974ad8e61c7d0e20c8b6e9f1ee1bc7a264","impliedFormat":99},{"version":"c89ecda51758810cde711384913cef5a52a609b120f7ff5b1b158781e8ef4a8c","impliedFormat":99},{"version":"b784c2ceea6c1279bff4ab353e5a5c5b358fde3c734fdecf85cc1db5cb44c93d","impliedFormat":99},{"version":"c08fb9233e497eb092616e3081963b6dd70103bba3ff633c072d6d944eae134e","impliedFormat":99},{"version":"3ce717047d8aa7993d8ac3c05c1719af4a4c7299bd7d2e9bda09a93b5fc3597c","impliedFormat":99},{"version":"6cabcbf5e998efa2549a3534d71f4535495687ad53f1fe345d055f5147421cb9","impliedFormat":99},{"version":"e36268446e141d540bd29d35391c14533d2de4562f2068dbfb14f5aade8813e2","impliedFormat":99},{"version":"a800401f4995f7c204a7b05fbf53224caa6f1fdc124f48aa0d0ee562cf0972d4","impliedFormat":99},{"version":"2ba4df558ac06d48bd02cc5e9c2d8a5afb3836f1d6dfbb6ff26e90b68b66e5e5","impliedFormat":99},{"version":"00780c8bb96ae1bbc2d2379b4c1ec281e708fe52ebfda507f24aa4e0c9789023","impliedFormat":99},{"version":"a73a5fd3317e948b66fa07917d15e09d94dec119897e1de780158d01cea83fd1","impliedFormat":99},{"version":"73ab4609ca508c47e721501314e36423f34f12a735fb04bbc65670a33be6ceae","impliedFormat":99},{"version":"1ae2b0f08ab3e4a81809202b17856d144be48ac64428917c7b54f5e1965a4a48","impliedFormat":99},{"version":"85d558cd59d2350273b116c240ead34786f00245c2bf147c65ffc79410e29a5e","impliedFormat":99},{"version":"816caf3469d8486812807a1eecf3b2bff4fa654abbbf07a97c4f553819ec5106","impliedFormat":99},{"version":"e25134537f026144b7cede6aea49973bed30afc37b36d1d36e6130888bc7d234","impliedFormat":99},{"version":"5c62f873da6df6521abedd307fc544d6736d04604ae168233a63e4ee38ddce51","impliedFormat":99},{"version":"58e0c95210443e453ee55336f21bb03e770430bd19722041a77a2e86fc73df95","impliedFormat":99},{"version":"0e5bf871c5afa81fd718a5b276f6a7670846ed459db52fa477267d6b9584e5d8","impliedFormat":99},{"version":"22ca8010367254aeee193d066acb7beba74fcb28c8e197bc4a4b4e4a6c3cbd54","impliedFormat":99},{"version":"a9dee488ffe1e2d5c36fcb6d051ddbab991490e1bc181824592af3e47b9590ae","impliedFormat":99},{"version":"691368eb85eb6dda063458d34b2061e66aceff8caa03305960ce1ce2596973a0","impliedFormat":99},{"version":"1b453d29404e04659bb343c2b3b1f4e5b0c980993b2b618683d748175c758798","impliedFormat":99},{"version":"991b5667ea0268fc249e7aaa8f61b546edf4ddfc5c75446b60bad452f323eb4f","impliedFormat":99},{"version":"f3c0ec27b2c3321fcea0bd90f06b3bbc036a4c53d56547a3546d3e98aa6dbabb","impliedFormat":99},{"version":"3240b3195a4a6f07397873c3d3d781d6bdac6daffef7d0e9404df25696b83821","impliedFormat":99},{"version":"8f15effea4aaabc51743128521875aba6e565e414f6d7d3311b8c2d2578e18a4","impliedFormat":99},{"version":"bd03a8a341fd6c86470267cdb4ffad025d1e31e2930c7b1b99cea0ea8ab1104c","impliedFormat":99},{"version":"db3f11cb9d283a2f6bd72d40f552921e7df63b33c8f953fc666c0c25f89a9544","impliedFormat":99},{"version":"f0c704f2d6e9a1c1af817d64c475e3060a6b61bdfe839b5d2080ea9305f09887","impliedFormat":99},{"version":"ba4471d25a0c25e54f245fbf35359e420fcd148594041a984ed021ac12c515c9","impliedFormat":99},{"version":"7ecccd7c8eb4c52bccfb5e30db1a681e6df544ffdb2e23c565b0e2765fa0c5bc","impliedFormat":99},{"version":"814ff646ef9d7ec28c867d20acdb6ab2ecc2e7620c4f06c8f5412c83e3518e7e","impliedFormat":99},{"version":"361753ee88631c6d574eceef6db3a2b73424517609fb289b37ee2b2f44762a3c","impliedFormat":99},{"version":"08fc36c68fbfb312a2a3378498c16c6db9609837cc00cd9aafeb778fb2887a03","impliedFormat":99},{"version":"b45410e6065c05621fcd1969b5afae0829cd4f0def82c8180b5302a283195798","impliedFormat":99},{"version":"74ddb9a384676ffa1e7910e5a50615c21afa55473e8f38bc38050ff2255c2d7f","impliedFormat":99},{"version":"f673abb24aaa4a63c541eef767d22e443799ddc5ab30a2269d646682a4946394","impliedFormat":99},{"version":"0c1d42ef8bcac5f74e1113e96712f5fded4971c452911263db62d98f9f51cb82","impliedFormat":99},{"version":"97e3516942284b694f1f503c8b27ecfebc229e7e190e99eb2b94da3059d0f81e","impliedFormat":99},{"version":"f0ca722c0c74e4ac885706e69e65291f8947ac5e7fae8df529cf70248bcee262","impliedFormat":99},{"version":"a90c4ed5b632a156a7682988502d5bfefc4048ff4c41d0fa505badc0c3892545","impliedFormat":99},{"version":"376eef489231c1d626a6f24d89c1029d907ad7918c0a7191419ee6be69cf90ab","impliedFormat":99},{"version":"84a68486a1e143e34a165bdc64707e74d33118a1c6adde37591223503d4e8870","impliedFormat":99},{"version":"71d6cca9ebf54d9b498f684827c00002b1cead83eb441356d49d4ce1c9759301","impliedFormat":99},{"version":"ed603cbd399f1e16d867c0498432a0c5a2be988e1162e311cfc188e919b08264","impliedFormat":99},{"version":"07012806da1431175d778c424b18c305f44bd83941851ce17d181cd46aaa3562","impliedFormat":99},{"version":"cc0af6c56da3ab10ddac0b3c805d652bf0521be6b04f83afb9baa4df1415b313","impliedFormat":99},{"version":"b7aeb363b1649acac16d5b469685e2a067ff4dc8b0b2125bca941dbb6d63e7c0","impliedFormat":99},{"version":"365add36523973ead594068a69de6a4aa5503bfed8eddd670414dfac63944876","impliedFormat":99},{"version":"83347d14f89b7d139ce2791c99b35d2b94440d76968393709964ced55b6fd85f","impliedFormat":99},{"version":"7c124c9680eb1e83dac58588d8adba36bf737ac6b3e84779b57fd2df143b137e","impliedFormat":99},{"version":"ae7cc7b326cfb2845cd76f39e445d68a5832ee3e9297615c296bb87f8f9f1c81","impliedFormat":99},{"version":"db70fa65c1194a3707ac38814e7c27321de530660b36c029bf2a4987ce89b319","impliedFormat":99},{"version":"ec22e0ef253901f5af0faf767e6a1a8bd23fb0308f282dd03b8da7097ba44973","impliedFormat":99},{"version":"63c818016d858b372d05593bfcfbf5ffcd8898e0a3877057b24f7de6a4fe9abc","impliedFormat":99},{"version":"4d9bb1151b6d71e58d9333ec33e2a20c09ce5baaf20b08d70f7ea1a4ded3c682","impliedFormat":99},{"version":"53580dd58259b91b24f63dc36083414558cab65cd622e88c3a6ba403c753c44a","impliedFormat":99},{"version":"5a72a1a08a5a56f38b2ef6a39dd31c59e0e9ba59c7d480dbdec8cac0c3d2c9c5","impliedFormat":99},{"version":"41dc9805e5387625abb6466f9dad47048aab6cfc4a49885a17a65e662ca6d055","impliedFormat":99},{"version":"aa39ccd035dcf30f31ae0cd380e4d9e265c24e4e0914cd2e7862a392d74314b3","impliedFormat":99},{"version":"fde1d645673ad1273c0a347e97528e7830f4877c1fc58966a4a7ff386977aaac","impliedFormat":99},{"version":"aed8029500a40d0b604a1925f0ad677e9b2319a95afbf38168689c5a771389af","impliedFormat":99},{"version":"41931e7f38f9d140b01f98af2234df54cd48e640012fc7ec781e8d49bef24ba5","impliedFormat":99},{"version":"c0c93965e04da47f347f8ca064d35848d46df9674d087fcc6f0c1b4ae6e93582","impliedFormat":99},{"version":"5a7c8905855ce422199dcd9f09c4c776ceb66c91198e459e13fe72c0f067b63f","impliedFormat":99},{"version":"f9f583970f896ce64d652ad2d446be0c9c86bbf1edba79c319bac296c3ae51a1","impliedFormat":99},{"version":"b9c289167bc15bfbd04b01165d9ba6794ff9c633d72d7da8b990d359ca8d7e2b","impliedFormat":99},{"version":"b64d7e023d522acc0195da49af07a1dab57165a58f6d87b5f750f12786065344","impliedFormat":99},{"version":"feaeadcfe3c44fbf3dd427110db8adf8cefe45dffde44c5ba6a743e15b39a366","impliedFormat":99},{"version":"6944a8f65e43f69e025dd6c9c9c812d34be4544ea9bc7b7c02a5b7ba2f558d84","impliedFormat":99},{"version":"0a87063988c2bca33973431320c220a3d8785d727f163184231bc5550b2c7ef0","impliedFormat":99},{"version":"57e468e73b39b2acca2ebb9e7afd847c6d3c6a8f41663da32f2aeaba5b097dc6","impliedFormat":99},{"version":"2930836e99dd2487442b71968ef1761a57f431e10b7c4ef3d62709c09bbe5240","impliedFormat":99},{"version":"91ba95d318aa35b2e383b7cc3655c56701010c3d7428e1decdb4ecd6981dadce","impliedFormat":99},{"version":"56b556db5061b0ff674cc06a708d7c6674f05f03de1c94d29c52cee5ed86922f","impliedFormat":99},{"version":"e62ef9a4c1e94586a6718189ba5be349b9a5f222169c16353f270ba0ed7da65d","impliedFormat":99},{"version":"752de46112146307379db6263890bf0a48c47f87a33335fabf53543e246e60d9","impliedFormat":99},{"version":"d9e55de2e36ed1d789753b2890ead19a590406c934bf15f5c7ea43ce6fa78ac6","impliedFormat":99},{"version":"06b7ca3e1c5036f619676330c1f754b1fcab751bbf42edce96bf1819cb6986b4","impliedFormat":99},{"version":"6fdf2d53dd4c8b74d28f26ede7b2e4c0cd3d3480f13f24fcdb89405bf88180b4","impliedFormat":99},{"version":"019e3d5c3097cbcd014394ce6943ee7eb4857948bf5951dd5c048254f3e6dd96","impliedFormat":99},{"version":"02c24f59a057d82eca00a59a2b17c9d10fb7f24b9d4875fba491959a6b5521e0","impliedFormat":99},{"version":"a53ec27d1cf48bb349d4564eecdf9f07bf5b1bcf2781d0a966411152316bd006","impliedFormat":99},{"version":"513c4869a1961af24e40b59a23ce4312682e9275288409870c40496aa389caa6","impliedFormat":99},{"version":"ee1a2bbd2002638a9625fd7fba1ab1e183559bfb68146f571ed7e4f4cf72d009","impliedFormat":99},{"version":"bc87842e67e3876a7194c5d64198b4829416dd8c8973601b3d64e7f766376363","impliedFormat":99},{"version":"c7741d898b0bbb21e03d0b8b12bf5baffe664c862b4d4425c998cc6b7a990705","impliedFormat":99},{"version":"873eca5a1a7017ebf220122e4e53dc3a6a3d2870d3ff5b171ad8f79b9b8aefd1","impliedFormat":99},{"version":"b08f9a4096d9be0571dd7dcb8d5882e2c57b3d35285e36d5fb14412baf947623","impliedFormat":99},{"version":"399dc26e4eb6aadaafbccca2cfe58c6fc2c815bdcc0ec437549a0b0c87ae5e37","impliedFormat":99},{"version":"0c4d7b8498cba32d6b066a604ebe085abc646298e6ecb6369f3a96ebb774572f","impliedFormat":99},{"version":"00627e9d43b0bfd72b337c90bfc9014fa72e8247ce5dd1495d59236b4aad3a8a","impliedFormat":99},{"version":"3af1b0691303967f388f600d28350ff71e3c4a9dee3056682620850440b6c03e","impliedFormat":99},{"version":"fa7c18eb36a647a628bc9b8389e7b09660f01bf3db4885362efc820589b54b48","impliedFormat":99},{"version":"41f025e7098cbdf6b6e18a7112385b0fab4b1c0f3f9f80dfb55dcc4429b880c0","impliedFormat":99},{"version":"86ebb0cdb36cc752597ae8d300148180d8eec489f6025ea5911fa2cbecece081","impliedFormat":99},{"version":"727a4bf89e28dc475c5f9316eece04b14a4b6b9ab277834364239e2f1d2cd9f7","impliedFormat":99},{"version":"e734b00337e9fc0a8e83365a26428106f479dcd1abc73a8779967bc827f11e3a","impliedFormat":99},{"version":"243fcd2ad3ecad05cb2e71c231ca596bc3c6c4e489e1619c52649f0e546dd26d","impliedFormat":99},{"version":"f0bb27764e181cceed0bb72f109d8b36ea2707b0f225d715f46654bb9b016393","impliedFormat":99},{"version":"118febbc2df8a862260272bba28eb7461715e1dd281b32d19da6248757350e87","impliedFormat":99},{"version":"e67ace7307642b735b7e96bb97ff9138690acebab53eaed61347427753e4d1e1","impliedFormat":99},{"version":"87a8be4c77085ca8144892dc15708da857c6a0c4013b470520831405fae88533","impliedFormat":99},{"version":"2499f46ec67f9e5204492d07e9026b1bce446d5da2d1bb4a10ae0c4447a289af","impliedFormat":99},{"version":"116c79190f08958c32c45a4f72fdcdf58df72416b32b1d54d6947b13c850201c","impliedFormat":99},{"version":"4d5a44f03a7ab2527a59afa9d14fd6bc43e37cfb98c3ea667fd46a572fe89bc2","impliedFormat":99},{"version":"3979accfb06995b82ea963a62b176ff8dbf1af7e69071b3092d1d2e6036c3cec","impliedFormat":99},{"version":"e2404517591b13257cafcab1ec9d70a2d346ed5318fed639fd699107a21545cf","impliedFormat":99},{"version":"1c787e56dba48445aa569557505d5768a3a61522392c7c25953464047b849e2f","impliedFormat":99},{"version":"0ac9ec624ddcf056cf7a2c7d60d8325b741ab9bf80cc5c18449c7e1ee75ad118","impliedFormat":99},{"version":"5681612b1dc37cf330b971d4f1f77fc48cbadc18c654f34e1a0416a99fa2c709","impliedFormat":99},{"version":"df3d6522a17005c6d7c495338111427eb02490ed1377228918c255c3b26a5be1","impliedFormat":99},{"version":"4f819f882eaf41c8e1f0d9272c5bbba78f2023ba3fe9596e240160502ff210f9","impliedFormat":99},{"version":"62880ea3cb43d6cbeaecb6d6960bba625a670806cd82eb960ba2a2aeab736eac","impliedFormat":99},{"version":"8e1605d1a47bf1dc3de175bae994f49372014e8ba6497933d2cb299c408dda09","impliedFormat":99},{"version":"3106b775494342e60566941c9dd32bcd3380179bf525edf6626da1ddcbcd3632","impliedFormat":99},{"version":"41b136e657c05de5bf2aa8639221233f31af4b631626c6754c22560549e91a6c","impliedFormat":99},{"version":"b4632f6b4b271a0f6493a15493d0f09427ea6a9b9b549835a81dd31718dbd19b","impliedFormat":99},{"version":"424263d511a2b06f5b574cb8caa6913ce277d964147ee6cf503a8f7869431622","impliedFormat":99},{"version":"91f6140bfa7d4cf2261063d9537451a20d74fc43e53450225ee9e665016b1ff0","impliedFormat":99},{"version":"36a765deb941f868aa002fa67b4809f5bb47a10ff66a15add6dfd26e330afb19","impliedFormat":99},{"version":"6f4233b155fb5052e2f583356c523fabd40dd3a9aaef05c694e6bbe538c9c27d","impliedFormat":99},{"version":"668cf592e0904f4c34423c081350dc92c1d475a9c52889ffee29149da79fdd0f","impliedFormat":99},{"version":"3e33611f899366ec8fd1dd6920684b5a5fb9572ca05f1a12f401440923fdf21b","impliedFormat":99},{"version":"079a065101f29951aac337a2308f942c6d93296b8340f2b5004aa48aa289562c","impliedFormat":99},{"version":"3bff6d4ded0ddb4d2e704f1d274292d9cbb65ff60a8ba8595bfdce822321a736","impliedFormat":99},{"version":"91ab85a45434660cb3367c73142543efc66a5fa8e5a2ca954a8e1af4581605ef","impliedFormat":99},{"version":"d9cfc4635923eb5c22406f97afdaa0272115af9cfe0fa3f33cd96fa5589187e6","impliedFormat":99},{"version":"f7c3dd2a55fd5136bebb43583a30ed46da2cf5e6afbc17222b9ceedad5b7383d","impliedFormat":99},{"version":"f688655ca29d12dafe5897efb7063979c9eb590e62358504629225003e841d34","impliedFormat":99},{"version":"057739a174619fd0ed493f452fc14a667284fe44f0a08310b31a7f6422b84b06","impliedFormat":99},{"version":"c93faec8d643450e5e92f08e34be9329cd7f57a456deae018059e3d7b5f7b928","impliedFormat":99},{"version":"124d28a946ba2b461c2ce75a511124420bd7fdcd699051d905d72d509480d6d6","impliedFormat":99},{"version":"82ab37de5dad558cf74f37a6a033f189480181f8ddf2ea096a60ac28925e1869","impliedFormat":99},{"version":"1cb84b25ea1ecb1900ba700c4907eff062b82b17af512aadef921f76242bec89","impliedFormat":99},{"version":"de0d1b781852e2255de97ce91986df37a025f541b8926851ba1435b693ab864f","impliedFormat":99},{"version":"edce5ab61d202d17d023694b94990c99ef2fef531f705361bfcb82f6a256758f","impliedFormat":99},{"version":"0fe6c53bfea404986540d104103db46224830f6912963c90d20f4c195c7000aa","impliedFormat":99},{"version":"bcb657aab954c02a8a48b50236bb889091167c651673e15d016a2e1978ce2691","impliedFormat":99},{"version":"a126ffd129b033365e8162598efba980ca90bfc0a6cc41d5152fce11896d56e7","impliedFormat":99},{"version":"66c5847742803134b02bf07c53997c8dab3e4bb4ff428ef861a2450bf7744f61","impliedFormat":99},{"version":"3e80ac50e17c60be70575505005c9c28fd69150273ced8d50d73eed68cfdbf16","impliedFormat":99},{"version":"67022bb9c3b2174baf06917f426d832e447b2e6865be713b9fc18082ea437a51","impliedFormat":99},{"version":"1f3a97a978eaaf934f1f92682bf05bcfc11b8b4a00821d6e4d8c7d6bcff0fc79","impliedFormat":99},{"version":"a771f93d971c945eacad088d558d2015aca8ac0bc533ada8e317f3883f105f32","impliedFormat":99},{"version":"d5d9ba4cdb84bb2cb3207bb01e4ba70ac6ba3432cf6963b028c06388b0cd8656","impliedFormat":99},{"version":"cdb6410d699f7e0833b9e30c344c541c7ee94abe6959a4b714eb98dcda4bfa29","impliedFormat":99},{"version":"9fc6a5e9bb59cf074c5f26e636291aca55429165b98a5ecff9aa4830518f6588","impliedFormat":99},{"version":"3f0a17b44c005c05b97d6c225f6e55141ed3a08fc8b80325b83d3837c911b1ae","impliedFormat":99},{"version":"e635757f7088be7d099538d9cbc5e555782993605879b530ab5f1993312928af","impliedFormat":99},{"version":"292673f53fe0a33f69ce57ca0a4816c6e93e7213af687247021ab6fb3fef3f69","impliedFormat":99},{"version":"0e6ef2d24419cca5b5f020f5f926c24a8a50fb77062feb87f0d759b4455c31b3","impliedFormat":99},{"version":"5b67e62aa4c0817a18ed22992e3a328f2b6402bd2ee4f9ae2dd66a3c3486529a","impliedFormat":99},{"version":"e4e21d158ac452364c3bff7b7899ef0b0515d7abb8e8e596a0bb5e893e5a4f84","impliedFormat":99},{"version":"74d927443bacd8d7d92a6a377a728e74b1a3ced3c5d96bc04634abb234ed3a8e","impliedFormat":99},{"version":"94c3242169324a0b2212dc12395d17aab5a96b23267f03e0e4142e2cc134c7ec","impliedFormat":99},{"version":"4a2770e5c1e17db9373ebd92981ba74ca2059fc1f7c88491e401875fd298dc7e","impliedFormat":99},{"version":"a6ffcc079abed93c28a5b74bfa4ed694e8d810b21ca649523e098d126791432d","impliedFormat":99},{"version":"ba669ede8b934c54f211323b782c1b65e423db29965a4c68ca3e8bd984033f10","impliedFormat":99},{"version":"cfa6e2117c4f2855c7a4866d03a146c4d2dbd65e7eee5e0182298e630ea8f7af","impliedFormat":99},{"version":"50596833b2659cbe98f138d233ab3da041734f73a82e96873ccb5056a94f3389","impliedFormat":99},{"version":"75dd74b7c8bde65a3fe491d088b671b75c60ea6a5795c651d8f929dec7bfd0d8","impliedFormat":99},{"version":"621cd97ca6ba2df7b66b773cd4e0126f959d56db59bbc262dfe627e9c0b89841","impliedFormat":99},{"version":"e19cf00b7cc08a6559f1fd47bd100c54d5989a96973b58a8980490f285fe18a8","impliedFormat":99},{"version":"cbbf88f53c2d00ec848ea9781ff435afbd6776f9dae08ba685e6f64a33711984","impliedFormat":99},{"version":"20c145001d9d205002526fa1c26151b8942b3efa99409442aa1f0c55f8a97e26","impliedFormat":99},{"version":"8615e46872d20ffe0a8ff44b9ce593f64f79a8d309ac4859e8b59906f9aa8762","impliedFormat":99},{"version":"4416521a9e7133d2e680e2977251ff783416b6bd03c5cd75bb4f47a98c128b3c","impliedFormat":99},{"version":"31d45c45e7b924c77c906237b00fe87358cc25e5e6d4771ac96c1da382b47c94","impliedFormat":99},{"version":"25a333b9b2020a43a5c4a75c277741c7ede6c01461105b5d0768aaa461de6938","impliedFormat":99},{"version":"cd154bdd2fc6cf16712e99dd953c7d0a00aa6ee37c7235f04f516cd7a2e23095","impliedFormat":99},{"version":"8672389ff1c732976deb46c971a8c21f98bdb6ea7ee73632216679d2d3a1d723","impliedFormat":99},{"version":"13346c4fc0d11d920ceb9c423a5699a77e9fc3cdf1a503bbea3f545b72ed4736","impliedFormat":99},{"version":"e107d19bb5575d072a6ef55c1d7c92df4364b7790e27ef034d43fcf11088f314","impliedFormat":99},{"version":"676d3c55c65df11cb1445503548bd4038373ce1c1e17fa1261a554df225802bd","impliedFormat":99},{"version":"a8ea887074dfa326c0b81b7726adfcf73da08b02f6d12dcc4b51ae874be45a20","impliedFormat":99},{"version":"ec1a0bd6e9cf024cbfdeeed1524c9c00b409b661871007fd4f61b22b16b597f9","impliedFormat":99},{"version":"a75c3ddc29c89704de18a47258b33ffa4236e89d2a6c7ef64d00d9b3a593ccf2","impliedFormat":99},{"version":"0e638ebfddb73f8a5b07d61da9496e3d95de249e92929970898c3725d509b0dd","impliedFormat":99},{"version":"aa6c68ae030bc57e2cf901448a1ab94f340bab7dfe544b45f8469ecc8fb11e54","impliedFormat":99},{"version":"b66fa60a872678cef7d7b8439b1ccb4b87b09aa2cede6e1dd893445fbaa07d63","impliedFormat":99},{"version":"f6c181d754f301199d23bd69d50733b29864682b7b5f714edab4841e50b0fd3c","impliedFormat":99},{"version":"eddddd25770a1b5deff6e3d5e83b57f25f90addf14ff89bee3c90867f855a4a4","impliedFormat":99},{"version":"12ec85018c44b688d4b43ee8e9c295dc9bc50c372cdb2c43e4300815fb280b13","signature":"e413731859df9d5042b5cc02864b21c5c14e2a05bf61d5a1df15e52d07c9da06"},{"version":"19fd024da0861620adcea5d685abaab76e4c8b0503050b5668b8f6e7eaa742c7","signature":"18eaffa01060741793fa65c92bd20079d403d508fe4609d4b1d6976f981b47be"},{"version":"065ee3c67961cfc048984563d5010fab758801f425dca4680cd885161a5c10b5","signature":"c1d1fe6e43255e797b27d33ac1eecf5aca2247f0d66fc973606b91cccb474f4a"},{"version":"9cc3659806ed767c2da857fa279b41ec766cb9286ccd996af81bc35dc04de7d7","signature":"7fcd2915958a1bc274ec660557d8a40a01860984c3cbe7d0f384c00c6fd3bdfa"},"da5484dc1b28a0c471c4f63f1845d1528a687179e3ce7612b183a4bc0c96b716",{"version":"6754ebd1cd458ddbb814bbecac8b7b928e342f18c00c9cfc2fed941384b223ea","signature":"fa3c1719a4e5e5a3b19c8b124733c76b092cf222343bf771042c55a4ba23a5d8"},{"version":"3a582c6e8906f5b094ccf0de6cc6f4f8a54b05a34f52517aba5c9c7f704f6b28","impliedFormat":99},{"version":"0528f6d21f7a02d4092895090d2dd86104bd5a3e79eced96d5a1a7dd90943d17","impliedFormat":99},{"version":"b5ce343886d23392be9c8280e9f24a87f1d7d3667f6672c2fe4aa61fa4ece7d4","impliedFormat":99},{"version":"72ce5b734c05da85c85a6f6dc05823b051d6aa41acaedeeb1d17c72f3b4efa72","impliedFormat":99},{"version":"b0857bb28fd5236ace84280f79a25093f919fd0eff13e47cc26ea03de60a7294","impliedFormat":99},{"version":"5e43e0824f10cd8c48e7a8c5c673638488925a12c31f0f9e0957965c290eb14c","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"49ab4f1d153a252779958fc87b700743d32b5ffa42addd70ae23ad3f429daa5c","impliedFormat":99},{"version":"53cf4076f42b29b8d411259d168d51b3a0274c42c8814e5b44dfa8803a35d4fc","impliedFormat":99},{"version":"a39461ee1f27cf3e6cfd63d21045713d26d521da55ea4d8efccb705f689e6dbb","impliedFormat":99},{"version":"61bb64660ee150f3ab618340e15cca0a81664801bede7c966ca0eca3a952fe63","impliedFormat":99},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"10073cdcf56982064c5337787cc59b79586131e1b28c106ede5bff362f912b70","impliedFormat":99},{"version":"72950913f4900b680f44d8cab6dd1ea0311698fc1eefb014eb9cdfc37ac4a734","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"ff0a83c9a0489a627e264ffcb63f2264b935b20a502afa3a018848139e3d8575","impliedFormat":99},{"version":"42a12f2faa483c9b48195ed794d22698162274e755f6e07219c2351c4f08d732","impliedFormat":99},{"version":"ec0c42bb0f465e4993f2bc68a6ce9df9a2dcbc7b83e21748f82f1b69561938e3","impliedFormat":99},{"version":"f50ff37a9cbbe74475f426474d9827083c7c2c138a954d28f1690df338f69291","impliedFormat":99},{"version":"61fd6c17235d530c40f543dd7c40afab091d91c1ef890baeed30db6d82b04b28","impliedFormat":99},{"version":"bcbd3becd08b4515225880abea0dbfbbf0d1181ce3af8f18f72f61edbe4febfb","impliedFormat":99},{"version":"091767bc841f937654ed597d49e023ed59850355e746ae1a6f20ab31076ee1fb","impliedFormat":99},{"version":"19c6d6135af59693698d384050b45a8a049493500add442f58e4bd7c8a255ab6","impliedFormat":99},{"version":"6a0dba12d55314638a8c51108b20fe2f68f1364a619d098918bda91c22dec154","impliedFormat":99},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"4ead13a482c539b77394b2a97e3b877b809eac596390371cea490286f53b996a","impliedFormat":99},{"version":"06db2f8ba1d1dfacf04529cb731081ab23f133f29c7608ebdfbcab356996827c","impliedFormat":99},{"version":"bdd14f07b4eca0b4b5203b85b8dbc4d084c749fa590bee5ea613e1641dcd3b29","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"5c935b7fc4ddc1410ea1cd7cd4e35ed106a6e4920dd27a9480a40fd224359dc3","affectsGlobalScope":true,"impliedFormat":99},{"version":"2b39c6cf59088713babbfc3e20ee85f1375d40e66953156fa658346b8346f24f","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":99},{"version":"6987dfb4b0c4e02112cc4e548e7a77b3d9ddfeffa8c8a2db13ceac361a4567d9","impliedFormat":99},{"version":"4ffba3c5848b4fe62ee59b754fd5f256ad9656a0db6d37b9a2a8cb40dfc7ac21","impliedFormat":99},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"5e2ba3d18d78aebbde1f34bde356e41e9c76eeaeaeee56a37036596a9eff4211","impliedFormat":99},{"version":"8280ae8ccc0493b32d1742d585357ab9f0a508ea050af25a5a20d64010d0a5cf","impliedFormat":99},{"version":"7adfd9f9056ecd4ae6c65fde2a98654960c662714c73f048478959d04c09e144","impliedFormat":99},{"version":"32b35cf0dc3a1b1a7118b61c34ce2ad1a29695851679f9ec34e0776f2ece2a69","impliedFormat":99},{"version":"b413fbc6658fe2774f8bf9a15cf4c53e586fc38a2d5256b3b9647da242c14389","impliedFormat":99},{"version":"59e5e964b84fdb2378e9455e4e59405030e4ed2b4c6f891ce395f17796af3cbb","impliedFormat":99},{"version":"c30a41267fc04c6518b17e55dcb2b810f267af4314b0b6d7df1c33a76ce1b330","impliedFormat":1},{"version":"72422d0bac4076912385d0c10911b82e4694fc106e2d70added091f88f0824ba","impliedFormat":1},{"version":"da251b82c25bee1d93f9fd80c5a61d945da4f708ca21285541d7aff83ecb8200","impliedFormat":1},{"version":"64db14db2bf37ac089766fdb3c7e1160fabc10e9929bc2deeede7237e4419fc8","impliedFormat":1},{"version":"98b94085c9f78eba36d3d2314affe973e8994f99864b8708122750788825c771","impliedFormat":1},{"version":"90ba95a763101bb61b8a799731a2ed60b5016b8135c1a2d5186862d4b534d4a1","impliedFormat":99},{"version":"8e9b84bb5753e12338955d809df91e1aecb30ae7694a42924f0403c5a384df07","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"625ad7db98c5285e0316f386781f4e248202ec6b81f6a119bacb0b7e9b99202d","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"2219c59b065964ea360dd46279cfddb05dc65087bc24b473a22219d8e9de327f","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"8b344907e7dcabe9451420384ae1ee8be1783eab2a42031c3af8466fdfbf5e94","signature":"ca5ad4ada07952d46cf3bd93a555fa522e1ba75c0d077d573bb942ed8331dc15"},{"version":"4e319b34066129c8aab02dd0eb0e01d6b7e91f62e2c00935b3b51edb938c8f87","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"12e19a23fcbca6ead1f210742f4cb48ad9fc20ee20fedb4a7ca06db4a4d989b1","signature":"a034d5b2ed55f8d8f04c40136d06f2b971cd01b13796c3a2b08e8d24dd232258","affectsGlobalScope":true},{"version":"b3d266af646c926702812fb1ee522b73b2e37b1879fcbf474966f6627442486d","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"fe57bf02ea26f012ef3f6e43e100b2b20018ecc93324cc7d88faf0ad9b9b39e9","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"}],"root":[597,965,[1004,1009],[1014,1029],[1252,1257],[1307,1314]],"options":{"allowJs":true,"checkJs":false,"esModuleInterop":true,"module":200,"noImplicitAny":false,"noUncheckedIndexedAccess":false,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"../dist","rootDir":"../src","skipLibCheck":true,"strict":true,"target":99,"tsBuildInfoFile":"./tsbuildinfo.json"},"referencedMap":[[580,1],[946,2],[567,3],[565,4],[563,5],[562,2],[566,6],[560,6],[564,7],[568,8],[570,9],[558,2],[574,10],[577,11],[950,12],[948,12],[579,13],[576,14],[578,15],[575,2],[569,16],[571,17],[561,2],[958,18],[954,19],[955,20],[956,21],[957,22],[820,2],[789,2],[1285,2],[596,23],[593,2],[595,2],[966,23],[594,24],[1288,25],[1286,2],[405,2],[406,26],[407,2],[399,27],[408,2],[409,2],[410,2],[394,2],[397,28],[395,2],[396,2],[411,2],[412,2],[413,2],[414,2],[415,2],[416,2],[417,2],[418,2],[419,2],[420,2],[421,2],[400,2],[398,2],[422,2],[423,2],[424,2],[456,29],[425,2],[426,2],[427,2],[428,2],[429,2],[430,2],[431,2],[432,2],[433,2],[434,2],[435,2],[436,2],[437,30],[438,2],[440,2],[439,2],[441,2],[442,2],[443,2],[444,2],[445,2],[446,2],[447,2],[448,2],[449,2],[450,2],[451,2],[452,2],[453,2],[401,2],[402,2],[403,2],[404,31],[454,31],[455,2],[493,2],[494,32],[495,2],[391,33],[496,2],[497,2],[498,2],[386,2],[389,34],[387,2],[388,2],[499,2],[500,2],[501,2],[502,2],[503,2],[504,2],[505,2],[507,2],[506,2],[508,2],[509,2],[510,2],[492,31],[390,2],[511,31],[512,2],[513,2],[546,35],[514,2],[515,2],[516,2],[517,2],[518,2],[519,2],[520,36],[521,2],[522,2],[523,2],[524,2],[525,2],[526,37],[527,2],[528,2],[530,2],[529,2],[531,2],[532,2],[533,38],[534,2],[535,2],[536,2],[537,2],[538,2],[539,2],[540,2],[541,2],[542,2],[543,2],[544,2],[545,2],[554,39],[553,40],[552,39],[610,41],[875,42],[611,43],[609,42],[876,44],[607,45],[873,2],[608,46],[598,2],[600,47],[872,42],[641,42],[1003,48],[1289,49],[1296,50],[1297,51],[1295,2],[1258,2],[1267,52],[1266,53],[1290,52],[1274,54],[1276,55],[1275,56],[1283,57],[1282,2],[1265,58],[1259,59],[1261,60],[1263,61],[1262,2],[1264,59],[1260,2],[1287,2],[599,2],[993,62],[990,2],[992,63],[991,64],[1000,62],[999,62],[1001,65],[998,66],[996,62],[997,62],[994,67],[995,62],[382,68],[91,69],[331,70],[90,2],[93,71],[380,72],[381,73],[89,2],[383,74],[164,75],[108,76],[131,77],[140,78],[111,78],[112,79],[113,79],[139,80],[114,81],[115,79],[121,82],[116,83],[117,79],[118,79],[141,84],[110,85],[119,78],[120,83],[122,86],[123,86],[124,83],[125,79],[126,78],[127,79],[128,87],[129,87],[130,79],[151,88],[159,89],[138,90],[167,91],[132,92],[134,93],[135,90],[145,94],[153,95],[158,96],[155,97],[160,98],[148,99],[149,100],[156,101],[157,102],[163,103],[154,104],[133,74],[165,105],[109,74],[152,106],[150,107],[137,108],[136,90],[166,109],[142,110],[161,2],[162,111],[385,112],[92,74],[202,2],[219,113],[168,114],[193,115],[200,116],[169,116],[170,116],[171,117],[199,118],[172,119],[187,116],[173,120],[174,120],[175,117],[176,116],[177,117],[178,116],[201,121],[179,116],[180,116],[181,122],[182,116],[183,116],[184,122],[185,117],[186,116],[188,123],[189,122],[190,116],[191,117],[192,116],[214,124],[210,125],[198,126],[222,127],[194,128],[195,126],[211,129],[203,130],[212,131],[209,132],[207,133],[213,134],[206,135],[218,136],[208,137],[220,138],[215,139],[204,140],[197,141],[196,126],[221,142],[205,110],[216,2],[217,143],[556,144],[557,145],[555,146],[96,147],[288,148],[223,149],[258,150],[267,151],[224,152],[225,152],[226,153],[227,152],[266,154],[228,155],[229,156],[230,157],[231,152],[268,158],[269,159],[232,152],[234,160],[235,151],[237,161],[238,162],[239,162],[240,153],[241,152],[242,152],[243,158],[244,153],[245,153],[246,162],[247,152],[248,151],[249,152],[250,153],[251,163],[236,164],[252,152],[253,153],[254,152],[255,152],[256,152],[257,152],[276,165],[283,166],[265,167],[293,168],[259,169],[261,170],[262,167],[271,171],[278,172],[282,173],[280,174],[284,175],[272,176],[273,100],[274,177],[281,178],[287,179],[279,180],[260,74],[289,181],[233,74],[277,182],[275,183],[264,184],[263,167],[290,185],[291,2],[292,186],[270,110],[285,2],[286,187],[104,188],[97,189],[146,74],[143,190],[147,191],[144,192],[342,193],[319,194],[325,195],[294,195],[295,195],[296,196],[324,197],[297,198],[312,195],[298,199],[299,199],[300,196],[301,195],[302,200],[303,195],[326,201],[304,195],[305,195],[306,202],[307,195],[308,195],[309,202],[310,196],[311,195],[313,203],[314,202],[315,195],[316,196],[317,195],[318,195],[339,204],[330,205],[345,206],[320,207],[321,208],[334,209],[327,210],[338,211],[329,212],[337,213],[336,214],[341,215],[328,216],[343,217],[340,218],[335,219],[323,220],[322,208],[344,221],[333,222],[332,223],[100,224],[102,225],[101,224],[103,224],[106,226],[105,227],[107,228],[98,229],[378,230],[346,231],[371,232],[375,233],[374,234],[347,235],[376,236],[367,237],[368,233],[369,238],[370,239],[355,240],[363,241],[373,242],[379,243],[348,244],[349,242],[352,245],[358,246],[362,247],[360,248],[364,249],[353,250],[356,251],[361,252],[377,253],[359,254],[357,255],[354,256],[372,257],[350,258],[366,259],[351,110],[365,260],[94,110],[95,261],[99,262],[384,2],[1303,263],[1305,264],[1304,265],[1302,266],[1301,2],[1002,267],[989,268],[988,2],[1013,269],[1012,270],[1011,271],[1010,2],[959,272],[947,273],[945,274],[944,275],[951,276],[949,277],[952,278],[581,272],[897,279],[902,280],[909,281],[892,282],[645,2],[653,283],[793,284],[796,285],[768,2],[781,286],[788,287],[670,2],[770,2],[651,2],[767,288],[813,289],[652,2],[643,290],[795,291],[797,292],[798,293],[870,294],[762,295],[715,296],[775,297],[776,298],[774,299],[773,2],[769,300],[794,301],[654,302],[840,2],[841,303],[681,304],[655,305],[682,304],[718,304],[621,304],[791,306],[790,2],[780,307],[887,2],[630,2],[908,308],[848,309],[849,309],[845,310],[926,2],[745,2],[850,311],[846,312],[931,313],[930,314],[925,2],[696,2],[748,315],[747,2],[924,316],[847,42],[701,317],[708,318],[710,319],[700,2],[705,320],[707,321],[709,322],[704,323],[702,2],[706,324],[927,2],[923,2],[929,325],[928,2],[699,326],[918,327],[921,42],[689,328],[688,329],[687,330],[934,42],[686,331],[675,2],[936,2],[937,42],[938,332],[613,2],[777,326],[778,333],[779,334],[617,2],[782,2],[637,335],[612,2],[862,42],[619,336],[861,337],[860,338],[851,2],[852,2],[859,2],[854,2],[857,339],[853,2],[855,340],[858,341],[856,340],[650,2],[647,2],[648,304],[802,2],[807,342],[808,343],[806,344],[804,345],[805,346],[800,2],[868,311],[642,311],[896,347],[903,348],[907,349],[736,350],[735,2],[730,2],[883,351],[891,352],[763,353],[764,354],[843,355],[752,2],[866,356],[740,42],[757,357],[869,358],[753,2],[756,359],[754,2],[867,360],[864,361],[863,2],[865,2],[760,2],[839,362],[625,363],[738,364],[742,365],[758,366],[761,367],[750,368],[743,369],[890,370],[816,371],[734,372],[622,2],[889,373],[618,374],[809,375],[801,2],[810,376],[828,377],[799,2],[827,378],[606,2],[822,379],[646,2],[842,380],[817,2],[631,2],[633,2],[772,2],[826,381],[649,2],[673,382],[759,383],[679,384],[739,2],[825,2],[803,2],[830,385],[831,386],[771,2],[833,387],[835,388],[834,389],[783,2],[824,2],[837,390],[733,391],[823,392],[829,393],[658,2],[662,2],[661,2],[660,2],[665,2],[659,2],[668,2],[667,2],[664,2],[663,2],[666,2],[669,394],[657,2],[725,395],[724,2],[729,396],[726,397],[728,398],[731,396],[727,397],[638,399],[717,400],[886,401],[884,2],[913,402],[915,403],[879,404],[914,405],[626,406],[623,406],[656,2],[640,407],[639,408],[635,409],[636,410],[644,411],[672,411],[683,411],[719,412],[684,412],[628,413],[627,2],[723,414],[722,415],[721,416],[720,417],[629,418],[871,419],[671,420],[878,421],[844,422],[874,423],[877,424],[766,425],[765,426],[746,427],[732,428],[714,429],[716,430],[713,431],[836,432],[737,2],[901,2],[634,433],[838,434],[885,435],[744,2],[674,436],[751,2],[749,437],[676,438],[811,439],[880,2],[677,440],[812,440],[899,2],[898,2],[900,2],[882,2],[881,2],[814,441],[741,2],[711,442],[632,443],[690,2],[616,444],[678,2],[905,42],[615,2],[917,445],[698,42],[911,311],[697,446],[894,447],[695,445],[620,2],[919,448],[693,42],[694,42],[685,2],[614,2],[692,449],[691,450],[680,451],[755,2],[815,2],[832,2],[819,452],[818,2],[703,326],[624,2],[712,42],[888,335],[895,453],[601,42],[604,454],[605,455],[602,42],[603,2],[792,2],[787,456],[786,2],[785,457],[784,2],[893,458],[904,459],[906,460],[910,461],[912,462],[916,463],[920,464],[943,465],[922,466],[932,467],[933,468],[935,469],[939,470],[942,335],[941,2],[940,471],[559,2],[551,472],[548,471],[550,473],[549,2],[547,2],[573,474],[572,475],[821,476],[1032,2],[1035,2],[1038,2],[1250,477],[1033,478],[1053,479],[1030,480],[1037,481],[1249,482],[1223,483],[1224,484],[1209,485],[1058,486],[1210,485],[1211,487],[1085,488],[1047,2],[1226,489],[1225,487],[1202,485],[1203,487],[1083,490],[1082,491],[1049,492],[1149,493],[1155,494],[1150,495],[1152,496],[1151,497],[1156,498],[1154,485],[1153,485],[1040,2],[1041,499],[1157,500],[1159,501],[1158,502],[1048,503],[1050,492],[1146,2],[1088,504],[1144,505],[1143,506],[1163,507],[1162,508],[1161,509],[1160,487],[1103,510],[1061,503],[1212,487],[1042,487],[1046,511],[1140,512],[1145,513],[1065,514],[1148,515],[1213,495],[1087,516],[1044,517],[1066,518],[1094,519],[1095,520],[1093,487],[1096,521],[1214,485],[1207,522],[1215,487],[1051,523],[1084,524],[1054,525],[1055,526],[1164,2],[1165,527],[1166,528],[1169,529],[1167,530],[1168,487],[1228,531],[1227,487],[1147,532],[1172,533],[1170,487],[1171,534],[1204,535],[1135,536],[1137,537],[1216,487],[1139,538],[1080,539],[1073,525],[1076,540],[1078,541],[1081,542],[1075,543],[1074,487],[1077,544],[1079,545],[1141,546],[1052,2],[1059,547],[1217,548],[1218,549],[1060,2],[1089,550],[1142,551],[1219,487],[1220,487],[1092,510],[1136,549],[1067,552],[1056,553],[1101,554],[1098,554],[1097,555],[1100,556],[1043,557],[1205,558],[1173,559],[1177,560],[1174,561],[1175,487],[1176,562],[1064,563],[1180,564],[1178,525],[1179,485],[1182,565],[1184,566],[1181,532],[1183,567],[1068,2],[1086,559],[1091,568],[1090,569],[1138,570],[1186,571],[1185,525],[1206,572],[1071,573],[1070,2],[1102,574],[1134,575],[1133,576],[1187,485],[1188,532],[1189,577],[1194,578],[1190,487],[1191,487],[1192,532],[1193,579],[1099,487],[1069,2],[1057,580],[1045,487],[1195,525],[1196,485],[1198,581],[1113,487],[1197,485],[1114,582],[1104,583],[1105,584],[1132,585],[1108,586],[1109,587],[1112,588],[1110,589],[1111,590],[1106,591],[1116,592],[1115,593],[1107,487],[1126,594],[1131,595],[1127,596],[1128,597],[1129,598],[1130,599],[1221,600],[1072,601],[1063,602],[1062,603],[1117,604],[1118,604],[1199,2],[1200,605],[1125,606],[1201,607],[1119,606],[1120,606],[1121,608],[1122,604],[1123,609],[1124,610],[1234,611],[1231,485],[1230,485],[1232,485],[1233,485],[1241,485],[1236,532],[1238,2],[1240,612],[1237,613],[1239,614],[1242,615],[1244,616],[1243,617],[1245,618],[1229,2],[1246,619],[1235,2],[1222,487],[1039,620],[1247,621],[1251,621],[1031,2],[1036,479],[1034,622],[1248,623],[1208,624],[971,625],[972,626],[973,627],[968,628],[970,2],[967,629],[969,630],[1291,2],[1284,2],[87,2],[88,2],[14,2],[16,2],[15,2],[2,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[23,2],[24,2],[3,2],[25,2],[26,2],[4,2],[27,2],[31,2],[28,2],[29,2],[30,2],[32,2],[33,2],[34,2],[5,2],[35,2],[36,2],[37,2],[38,2],[6,2],[42,2],[39,2],[40,2],[41,2],[43,2],[7,2],[44,2],[49,2],[50,2],[45,2],[46,2],[47,2],[48,2],[8,2],[54,2],[51,2],[52,2],[53,2],[55,2],[9,2],[56,2],[57,2],[58,2],[60,2],[59,2],[61,2],[62,2],[10,2],[63,2],[64,2],[65,2],[11,2],[66,2],[67,2],[68,2],[69,2],[70,2],[71,2],[12,2],[72,2],[73,2],[74,2],[75,2],[76,2],[1,2],[77,2],[78,2],[13,2],[79,2],[80,2],[81,2],[82,2],[83,2],[84,2],[85,2],[86,2],[470,631],[480,632],[469,631],[490,633],[461,634],[460,2],[489,471],[483,635],[488,634],[463,636],[477,637],[462,638],[486,639],[458,640],[457,471],[487,641],[459,642],[464,632],[465,2],[468,632],[392,2],[491,643],[481,644],[472,645],[473,646],[475,647],[471,648],[474,649],[484,471],[466,650],[467,651],[476,652],[393,2],[479,644],[478,632],[482,2],[485,653],[1270,654],[1273,655],[1271,654],[1269,2],[1272,656],[1292,657],[1281,658],[1277,659],[1278,54],[1299,660],[1293,661],[1279,662],[1298,663],[1268,2],[1280,664],[1306,665],[1300,666],[1294,2],[987,667],[978,668],[985,669],[980,2],[981,2],[979,670],[982,671],[974,2],[975,2],[986,672],[977,673],[983,2],[984,674],[976,675],[1311,676],[1312,677],[1313,678],[1314,679],[965,680],[1256,681],[597,2],[1257,2],[1015,682],[1004,683],[1255,684],[1016,685],[1253,686],[1024,687],[1020,688],[1022,689],[1018,685],[1021,687],[1023,690],[1019,691],[1006,692],[1007,693],[1028,694],[1307,695],[1026,2],[1029,696],[1025,685],[1027,697],[1017,698],[1252,699],[1254,691],[1014,700],[1308,676],[1309,701],[1009,702],[1310,703],[1005,704],[1008,2],[960,705],[961,706],[953,707],[963,2],[964,708],[962,709],[591,710],[592,711],[585,712],[582,713],[586,714],[583,714],[590,715],[587,716],[584,716],[589,717],[588,712]],"affectedFilesPendingEmit":[1311,1312,1313,1314,965,1256,597,1257,1015,1004,1255,1016,1253,1024,1020,1022,1018,1021,1023,1019,1006,1007,1028,1307,1026,1029,1025,1027,1017,1252,1254,1014,1308,1309,1009,1310,1005,1008],"version":"6.0.2"} \ No newline at end of file diff --git a/packages/api/package.json b/packages/api/package.json index e6db7593..19f6a3b6 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -13,10 +13,11 @@ "./middleware/cache": "./src/middleware/cache.ts", "./middleware/http-security": "./src/middleware/http-security.ts", "./middleware/security": "./src/middleware/security.ts", - "./trpc": "./src/trpc.ts" + "./trpc": "./src/trpc.ts", + "./pricing": "./src/services/pricing.ts" }, "scripts": { - "lint": "eslint .", + "lint": "eslint . --max-warnings 0", "typecheck": "tsc --noEmit", "test": "node ../../node_modules/vitest/vitest.mjs run --config vitest.config.ts" }, @@ -24,10 +25,10 @@ "@query/auth": "workspace:*", "@query/db": "workspace:*", "@tanstack/react-query": "5.90.12", - "@trpc/client": "^11.17.0", - "@trpc/next": "^11.15.1", - "@trpc/react-query": "^11.15.1", - "@trpc/server": "^11.15.1", + "@trpc/client": "11.18.0", + "@trpc/next": "11.18.0", + "@trpc/react-query": "11.18.0", + "@trpc/server": "11.18.0", "drizzle-orm": "0.45.2", "image-size": "2.0.2", "sanitize-html": "2.17.4", diff --git a/packages/api/src/.internal-tests/_db-tx-mock.ts b/packages/api/src/.internal-tests/_db-tx-mock.ts new file mode 100644 index 00000000..b8276155 --- /dev/null +++ b/packages/api/src/.internal-tests/_db-tx-mock.ts @@ -0,0 +1,173 @@ +import { vi } from "vitest"; + +/** + * Transaction semantics for the file-level `@query/db` mocks. + * + * Not a test file — no `.test.` in the name, so vitest does not collect it. + * + * A plain `transaction: (cb) => cb(db)` runs two racing callers with no + * ordering and no rollback, which is an interleaving no database produces: both + * write before either reads back. Correct claim-then-verify and + * compare-and-set code then looks broken here, and the tempting "fix" is an + * in-process JS lock — which does nothing across the instances apphosting + * actually runs. This module models the two things that make those patterns + * work, so a test that passes here is testing the guarantee production relies + * on. + * + * Lives in one place because both halves are subtle and were about to be + * copied into a second test file. + */ + +/** + * Rollback, modelled the only way a mock can: a stand-in write says how to undo + * itself, and a transaction that throws replays those undos in reverse. + */ +let undoStack: Array<() => void> | null = null; + +/** Registers an undo for the write currently executing. No-op outside a tx. */ +export const __onRollback = (undo: () => void) => undoStack?.push(undo); + +/** + * Row locking, modelled per table. + * + * An UPDATE — or a SELECT ... FOR UPDATE — inside a transaction takes the row's + * exclusive lock and holds it until that transaction ends; a second transaction + * touching the same row blocks there and only then re-reads. Keyed by table + * rather than by row, so this over-serializes unrelated rows; that direction is + * safe (it can only make a test stricter than production), while the reverse + * would let real races pass. + * + * Module-scoped so locks outlive a single transaction, which is the point. + */ +const tableLocks = new Map>(); + +type Mock = (...args: any[]) => any; + +export interface TxMockHooks { + /** + * The db stand-in whose non-transactional builders the tx inherits. + * A getter, not the object: the mock factory is hoisted above the import it + * would read, so this can only be resolved once a transaction actually runs. + */ + base: () => unknown; + insert?: Mock; + update?: Mock; + delete?: Mock; + /** + * Backs `tx.select(...).from(...).where(...)`. Only wired when supplied, so + * files that do not exercise a locking read keep their existing select stub. + */ + select?: Mock; +} + +export const createTransactionMock = ({ + base, + insert, + update, + delete: del, + select, +}: TxMockHooks) => + vi.fn().mockImplementation(async (callback: (tx: any) => unknown) => { + const heldTables = new Set(); + const held: Array<() => void> = []; + const undos: Array<() => void> = []; + + const acquire = (table: unknown) => { + // A transaction already holding a lock keeps it: touching the same table + // twice must not queue behind itself. + if (heldTables.has(table)) return Promise.resolve(); + heldTables.add(table); + const prior = tableLocks.get(table) ?? Promise.resolve(); + let release!: () => void; + tableLocks.set( + table, + new Promise((resolve) => (release = resolve)), + ); + held.push(release); + return prior; + }; + + // Scoped tightly around each synchronous stand-in so interleaved + // transactions cannot collect each other's undos. + const withUndos = (run: () => T): T => { + const outer = undoStack; + undoStack = undos; + try { + return run(); + } finally { + undoStack = outer; + } + }; + + // The db stand-in is typed nullable at the import site; spreading null is + // an empty object, which is the right answer for a mock that never ran. + const tx: any = { ...(base() as object) }; + + if (update) { + tx.update = (...updateArgs: any[]) => ({ + set: (...setArgs: any[]) => ({ + where: (...wArgs: any[]) => { + const ran = acquire(updateArgs[0]).then(() => + withUndos(() => update("update", updateArgs, setArgs, wArgs)), + ); + return Object.assign(ran, { returning: () => ran }); + }, + }), + }); + } + + if (insert) { + // No lock: concurrent INSERTs do not block each other in Postgres, they + // collide on a unique index if at all. The undo is what matters — a row + // inserted by a transaction that later throws never existed. + tx.insert = (...insertArgs: any[]) => ({ + values: (...valArgs: any[]) => { + const val = withUndos(() => insert("insert", insertArgs, valArgs)); + const ran = Promise.resolve(val); + return Object.assign(ran, { + returning: () => ran, + onConflictDoUpdate: () => ({ returning: () => ran }), + }); + }, + }); + } + + if (del) { + tx.delete = (...deleteArgs: any[]) => ({ + where: (...wArgs: any[]) => { + const ran = acquire(deleteArgs[0]).then(() => + withUndos(() => del("delete", deleteArgs, wArgs)), + ); + return Object.assign(ran, { returning: () => ran }); + }, + }); + } + + if (select) { + tx.select = (...selectArgs: any[]) => ({ + from: (...fromArgs: any[]) => ({ + // Lazy: `.for("update")` must be the thing that takes the lock, and + // eagerly building the unlocked promise would run the query twice. + where: (...wArgs: any[]) => { + const exec = (locking: boolean) => + (locking ? acquire(fromArgs[0]) : Promise.resolve()).then(() => + select("select", selectArgs, fromArgs, wArgs), + ); + return { + then: (ok: any, err: any) => exec(false).then(ok, err), + for: () => exec(true), + }; + }, + }), + }); + } + + try { + return await callback(tx); + } catch (error) { + for (const undo of undos.reverse()) undo(); + throw error; + } finally { + for (const release of held) release(); + } + }); diff --git a/packages/api/src/.internal-tests/hackathon-admin-edge.test.ts b/packages/api/src/.internal-tests/hackathon-admin-edge.test.ts new file mode 100644 index 00000000..e0e7ca90 --- /dev/null +++ b/packages/api/src/.internal-tests/hackathon-admin-edge.test.ts @@ -0,0 +1,871 @@ +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { appRouter } from "../root"; +import { cache } from "../middleware/cache"; +import { db, hackathons, hackathonParticipants } from "@query/db"; + +// Fully mock the DB at the file level. vi.mock factories are hoisted and +// file-scoped, so this mirrors the shape used by hackathon-flow.test.ts. +const mockFindFirst = vi.fn(); +const mockFindMany = vi.fn(); +const mockInsert = vi.fn(); +const mockUpdate = vi.fn(); +const mockDelete = vi.fn(); +// Row count returned by `select({ count })...from()`, keyed by table. +const mockCount = vi.fn(); +// Acceptance emails are sent through a dynamic import; intercept it so we can +// see exactly who a mass-approval actually mailed. +const mockSendAcceptanceEmail = vi.fn(); + +vi.mock("@query/auth/email", () => ({ + sendAcceptanceEmail: (...args: any[]) => mockSendAcceptanceEmail(...args), +})); + +vi.mock("@query/db", () => { + const table = (name: string) => ({ + findFirst: (...args: any[]) => mockFindFirst(name, ...args), + findMany: (...args: any[]) => mockFindMany(name, ...args), + }); + + // A promise that also answers the drizzle query-builder chain, so + // `select().from(t)` and `select().from(t).where(...)` are both awaitable. + const thenable = (rows: any[]): any => { + const node: any = Promise.resolve(rows); + node.where = () => thenable(rows); + node.orderBy = () => thenable(rows); + node.groupBy = () => thenable(rows); + node.limit = () => thenable(rows); + node.offset = () => thenable(rows); + node.innerJoin = () => thenable(rows); + node.leftJoin = () => thenable(rows); + // `.for("update")` — row locking, used before a recount so a concurrent + // registration cannot be overwritten. + node.for = () => thenable(rows); + return node; + }; + + return { + db: { + transaction: vi.fn().mockImplementation((callback) => callback(db)), + query: { + admins: table("admins"), + users: table("users"), + userProfiles: table("userProfiles"), + hackathons: table("hackathons"), + hackathonParticipants: table("hackathonParticipants"), + hackathonTeams: table("hackathonTeams"), + hackathonProjects: table("hackathonProjects"), + hackathonEvents: table("hackathonEvents"), + hackathonEventAttendees: table("hackathonEventAttendees"), + members: table("members"), + events: table("events"), + eventCheckIns: table("eventCheckIns"), + judges: table("judges"), + judgeAssignments: table("judgeAssignments"), + judgingProjects: table("judgingProjects"), + judgeVotes: table("judgeVotes"), + judgeQueue: table("judgeQueue"), + stripePayments: table("stripePayments"), + userAccountLinks: table("userAccountLinks"), + auditLogs: table("auditLogs"), + }, + insert: (...insertArgs: any[]) => ({ + values: (...valArgs: any[]) => { + const val = mockInsert("insert", insertArgs, valArgs); + return Object.assign(Promise.resolve(val), { + returning: vi.fn().mockResolvedValue(val), + onConflictDoUpdate: vi.fn().mockImplementation(() => ({ + returning: vi.fn().mockResolvedValue(val), + })), + onConflictDoNothing: vi.fn().mockImplementation(() => ({ + returning: vi.fn().mockResolvedValue(val), + })), + }); + }, + }), + update: (...updateArgs: any[]) => ({ + set: (...setArgs: any[]) => ({ + where: (...wArgs: any[]) => { + const val = mockUpdate("update", updateArgs, setArgs, wArgs); + return Object.assign(Promise.resolve(val), { + returning: vi.fn().mockResolvedValue(val), + }); + }, + }), + }), + delete: (...deleteArgs: any[]) => ({ + where: (...wArgs: any[]) => { + const val = mockDelete("delete", deleteArgs, wArgs); + return Object.assign(Promise.resolve(val), { + returning: vi.fn().mockResolvedValue(val), + }); + }, + }), + select: vi.fn().mockImplementation(() => ({ + from: (tbl: any) => thenable([{ count: mockCount(tbl?._t) ?? 0 }]), + })), + }, + admins: { + _t: "admins", + id: "id", + userId: "user_id", + isActive: "is_active", + role: "role", + }, + users: { _t: "users", id: "id", email: "email" }, + userProfiles: { _t: "userProfiles", userId: "user_id" }, + hackathons: { + _t: "hackathons", + id: "id", + name: "name", + status: "status", + isPublic: "is_public", + startDate: "start_date", + endDate: "end_date", + judgingActive: "judging_active", + currentParticipants: "current_participants", + maxParticipants: "max_participants", + }, + hackathonParticipants: { + _t: "hackathonParticipants", + id: "id", + hackathonId: "hackathon_id", + userId: "user_id", + registrationStatus: "registration_status", + checkedInAt: "checked_in_at", + }, + hackathonTeams: { + _t: "hackathonTeams", + id: "id", + hackathonId: "hackathon_id", + name: "name", + }, + hackathonProjects: { + _t: "hackathonProjects", + id: "id", + hackathonId: "hackathon_id", + status: "status", + submittedAt: "submitted_at", + }, + hackathonEvents: { + _t: "hackathonEvents", + id: "id", + hackathonId: "hackathon_id", + name: "name", + startTime: "start_time", + endTime: "end_time", + }, + hackathonEventAttendees: { + _t: "hackathonEventAttendees", + id: "id", + eventId: "event_id", + participantId: "participant_id", + checkedInAt: "checked_in_at", + }, + members: { + _t: "members", + id: "id", + userId: "user_id", + hackathonId: "hackathon_id", + }, + membershipHistory: { _t: "membershipHistory", id: "id", memberId: "member_id" }, + events: { + _t: "events", + id: "id", + title: "title", + qrCode: "qr_code", + checkInEnabled: "check_in_enabled", + eventDate: "event_date", + currentCheckIns: "current_check_ins", + }, + eventCheckIns: { + _t: "eventCheckIns", + id: "id", + eventId: "event_id", + userId: "user_id", + checkedInAt: "checked_in_at", + }, + judges: { + _t: "judges", + id: "id", + userId: "user_id", + hackathonId: "hackathon_id", + isActive: "is_active", + }, + judgeAssignments: { + _t: "judgeAssignments", + judgeId: "judge_id", + hackathonId: "hackathon_id", + }, + judgingProjects: { + _t: "judgingProjects", + id: "id", + hackathonId: "hackathon_id", + tableNumber: "table_number", + }, + judgeVotes: { + _t: "judgeVotes", + judgeId: "judge_id", + projectId: "project_id", + score: "score", + }, + judgeQueue: { + _t: "judgeQueue", + id: "id", + judgeId: "judge_id", + hackathonId: "hackathon_id", + isCompleted: "is_completed", + }, + stripePayments: { + _t: "stripePayments", + id: "id", + customerEmail: "customer_email", + stripePaymentIntentId: "stripe_payment_intent_id", + }, + userAccountLinks: { + _t: "userAccountLinks", + userId: "user_id", + stripePaymentId: "stripe_payment_id", + }, + auditLogs: { _t: "auditLogs", id: "id", severity: "severity", userId: "user_id" }, + }; +}); + +const HACK_A = "11111111-1111-4111-8111-111111111111"; +const HACK_B = "22222222-2222-4222-8222-222222222222"; +const PART_A1 = "33333333-3333-4333-8333-333333333331"; +const PART_A2 = "33333333-3333-4333-8333-333333333332"; +const PART_B1 = "33333333-3333-4333-8333-333333333333"; +const EVENT_A = "44444444-4444-4444-8444-444444444444"; +const PROJECT = "66666666-6666-4666-8666-666666666666"; +const ADMIN_ROW = "77777777-7777-4777-8777-777777777771"; + +const DAY = 24 * 60 * 60 * 1000; +const HOUR = 60 * 60 * 1000; + +const ADMIN_USER = "admin_user_id"; + +describe("Hackathon admin management edge cases", () => { + beforeEach(() => { + vi.clearAllMocks(); + cache.clear(); + mockCount.mockReturnValue(0); + mockFindMany.mockReturnValue([]); + mockInsert.mockReturnValue([{}]); + mockUpdate.mockReturnValue([{}]); + mockDelete.mockReturnValue([{}]); + }); + + const createMockCtx = (userId?: string) => + ({ + db, + session: userId ? { user: { id: userId } } : null, + userId: userId || undefined, + cache, + clientIp: "127.0.0.1", + req: { headers: { get: () => null } }, + }) as any; + + const publicCaller = () => appRouter.createCaller(createMockCtx()); + + const adminRow = (role = "admin") => ({ + id: ADMIN_ROW, + userId: ADMIN_USER, + isActive: true, + role, + }); + + /** + * Table-name-keyed findFirst. `admins` is always answered so the isAdmin + * middleware lets the caller through; everything else comes from `rows`. + */ + const adminCaller = ( + rows: Record = {}, + role = "admin", + ) => { + mockFindFirst.mockImplementation((table: string) => + table === "admins" ? adminRow(role) : (rows as any)[table], + ); + return appRouter.createCaller(createMockCtx(ADMIN_USER)); + }; + + // ===================================================================== + describe("Volunteer scan tier", () => { + const volunteerCaller = (rows: Record = {}) => + adminCaller(rows, "volunteer"); + + /** + * The whole point of the tier. A volunteer holds an admins row, so without + * an explicit role check they would pass every isAdmin gate in the API — + * including the one that deletes the hackathon and cascades every + * participant, team and vote with it. + */ + it("refuses a volunteer every full-staff action", async () => { + const caller = volunteerCaller({ + hackathons: { id: HACK_A, name: "Hacklytics 2027" }, + }); + + await expect( + caller.hackathon.adminGetAttendees({ hackathonId: HACK_A }), + ).rejects.toThrow(/Admin access required/); + + await expect( + caller.hackathon.exportAttendees({ hackathonId: HACK_A }), + ).rejects.toThrow(/Admin access required/); + + await expect( + caller.hackathon.delete({ + hackathonId: HACK_A, + confirmName: "Hacklytics 2027", + }), + ).rejects.toThrow(/Admin access required/); + + await expect( + caller.hackathon.batchUpdateParticipantStatus({ + hackathonId: HACK_A, + participantIds: [PART_A1], + status: "approved", + }), + ).rejects.toThrow(/Admin access required/); + }); + + it("lets a volunteer work a check-in desk", async () => { + const caller = volunteerCaller({ + hackathonEvents: { id: EVENT_A, hackathonId: HACK_A }, + }); + mockFindMany.mockReturnValue([]); + + await expect( + caller.hackathon.getEventAttendees({ + hackathonId: HACK_A, + eventId: EVENT_A, + }), + ).resolves.toMatchObject({ matching: 0 }); + }); + + // Full staff must keep the scan access they already had — the tier is + // additive at the desk, not a replacement for it. + it("still lets full staff scan", async () => { + const caller = adminCaller({ + hackathonEvents: { id: EVENT_A, hackathonId: HACK_A }, + }); + mockFindMany.mockReturnValue([]); + + await expect( + caller.hackathon.getEventAttendees({ + hackathonId: HACK_A, + eventId: EVENT_A, + }), + ).resolves.toBeDefined(); + }); + }); + + const liveHackathon = (overrides: Record = {}) => ({ + id: HACK_A, + name: "Hacklytics 2027", + status: "open", + isPublic: true, + startDate: new Date(Date.now() + 7 * DAY), + endDate: new Date(Date.now() + 9 * DAY), + registrationDeadline: new Date(Date.now() + 5 * DAY), + hackingStartTime: null, + maxParticipants: 500, + currentParticipants: 500, + ...overrides, + }); + + // ===================================================================== + describe("Publishing: what an unannounced hackathon leaks", () => { + // BUG: crud.list only filters on isPublic (which defaults to true), never + // on status, so an admin's unsaved-to-the-world draft is browsable. + it("does not serve draft hackathons to an anonymous browser", async () => { + mockFindMany.mockReturnValue([ + liveHackathon({ status: "draft", name: "Secret Hacklytics 2028" }), + ]); + + const res = await publicCaller().hackathon.list({ status: "draft" }); + + expect(res).toHaveLength(0); + }); + + // BUG: crud.getById applies neither an isPublic nor a status predicate. + it("hides an unpublished hackathon from an anonymous getById", async () => { + mockFindFirst.mockImplementation((table: string) => + table === "hackathons" + ? liveHackathon({ status: "draft", isPublic: false }) + : undefined, + ); + + await expect( + publicCaller().hackathon.getById({ id: HACK_A }), + ).rejects.toThrow(/not found/i); + }); + + // BUG: content.projects is a publicProcedure with no status filter, unlike + // its sibling getPublicProjects which exists precisely to hide drafts. + it("hides in-progress project drafts and their scores from rivals", async () => { + mockFindMany.mockReturnValue([ + { + id: PROJECT, + hackathonId: HACK_A, + status: "draft", + githubUrl: "https://github.com/team/secret", + score: 87, + ranking: 1, + team: { participants: [] }, + }, + ]); + + const res: any[] = await publicCaller().hackathon.projects({ + hackathonId: HACK_A, + }); + + expect(res.map((p) => p.status)).not.toContain("draft"); + }); + }); + + // ===================================================================== + describe("Mass acceptance", () => { + it("refuses to mass-accept into a hackathon that does not exist", async () => { + const caller = adminCaller({ hackathons: undefined }); + + await expect( + caller.hackathon.sendMassAcceptanceEmails({ + hackathonId: HACK_B, + participantIds: [PART_A1], + }), + ).rejects.toThrow(/Hackathon not found/); + }); + + // BUG: the recipient query is `inArray(id, participantIds)` with no + // hackathonId predicate, while the status UPDATE is scoped by hackathonId. + it("never emails an acceptance to someone registered for a different hackathon", async () => { + const caller = adminCaller({ hackathons: { name: "Hacklytics 2027" } }); + // The real query matches on id alone, so a stale id from hackathon B + // comes back in the result set. + mockFindMany.mockReturnValue([ + { id: PART_A1, hackathonId: HACK_A, user: { email: "ada@example.com" } }, + { id: PART_B1, hackathonId: HACK_B, user: { email: "grace@example.com" } }, + ]); + + const res = await caller.hackathon.sendMassAcceptanceEmails({ + hackathonId: HACK_A, + participantIds: [PART_A1, PART_B1], + }); + + const mailed = mockSendAcceptanceEmail.mock.calls.map((c) => c[0].email); + expect(mailed).toEqual(["ada@example.com"]); + // The B participant's row is never updated, so it must not be counted. + expect(res.approved).toBe(1); + }); + + // BUG: `approved` is `participantIds.length`, not the number of rows the + // scoped UPDATE actually touched. + it("reports how many participants were really approved, not how many ids were pasted", async () => { + const caller = adminCaller({ hackathons: { name: "Hacklytics 2027" } }); + mockFindMany.mockReturnValue([ + { id: PART_A1, hackathonId: HACK_A, user: { email: "ada@example.com" } }, + { id: PART_A2, hackathonId: HACK_A, user: { email: "alan@example.com" } }, + ]); + + const res = await caller.hackathon.sendMassAcceptanceEmails({ + hackathonId: HACK_A, + // PART_B1 belongs to another hackathon; the UPDATE matches zero rows. + participantIds: [PART_A1, PART_A2, PART_B1], + }); + + expect(res.approved).toBe(2); + }); + + // A send that the provider rejected must not be reported as delivered: + // "sent to 500" when 0 arrived gives the organiser no reason to look again. + it("counts emails that actually left, separately from approvals", async () => { + const caller = adminCaller({ hackathons: { name: "Hacklytics 2027" } }); + mockFindMany.mockReturnValue([ + { id: PART_A1, hackathonId: HACK_A, user: { email: "ada@example.com" } }, + { id: PART_A2, hackathonId: HACK_A, user: { email: "alan@example.com" } }, + ]); + mockSendAcceptanceEmail.mockRejectedValueOnce( + new Error("450 mailbox unavailable"), + ); + + const res = await caller.hackathon.sendMassAcceptanceEmails({ + hackathonId: HACK_A, + participantIds: [PART_A1, PART_A2], + }); + + expect(res.approved).toBe(2); + expect(res.emailed).toBe(1); + expect(res.failedEmails).toEqual(["ada@example.com"]); + }); + }); + + // ===================================================================== + describe("Participant status transitions", () => { + it("refuses to restatus a participant belonging to another hackathon", async () => { + const caller = adminCaller({ hackathonParticipants: undefined }); + + await expect( + caller.hackathon.updateParticipantStatus({ + hackathonId: HACK_A, + participantId: PART_B1, + status: "approved", + }), + ).rejects.toThrow(/Participant not found/); + }); + + // BUG: hackathonParticipants.checkedInAt is never written by any code path, + // so the admin attendees table renders a permanently blank column. + it("records when a participant was checked in", async () => { + const caller = adminCaller({ + hackathonParticipants: { + id: PART_A1, + hackathonId: HACK_A, + registrationStatus: "approved", + }, + }); + + await caller.hackathon.updateParticipantStatus({ + hackathonId: HACK_A, + participantId: PART_A1, + status: "checked_in", + }); + + const participantWrite = mockUpdate.mock.calls.find( + (c) => c[1][0] === hackathonParticipants, + ); + expect(participantWrite?.[2][0].checkedInAt).toBeInstanceOf(Date); + }); + + // BUG: hackathons.currentParticipants is incremented on register and never + // decremented, so rejected applicants permanently consume capacity. + it("frees a seat when an admin rejects a registration", async () => { + const caller = adminCaller({ + hackathonParticipants: { + id: PART_A1, + hackathonId: HACK_A, + registrationStatus: "pending", + }, + hackathons: liveHackathon(), + }); + + await caller.hackathon.updateParticipantStatus({ + hackathonId: HACK_A, + participantId: PART_A1, + status: "rejected", + }); + + const capacityWrite = mockUpdate.mock.calls.find( + (c) => c[1][0] === hackathons, + ); + expect(capacityWrite).toBeDefined(); + }); + }); + + // ===================================================================== + describe("Badge scanning at the door", () => { + const scanCtx = () => + adminCaller({ + hackathonParticipants: { + id: PART_A1, + hackathonId: HACK_A, + registrationStatus: "approved", + user: { name: "Ada Lovelace", email: "ada@example.com" }, + }, + hackathonEvents: { + id: EVENT_A, + hackathonId: HACK_A, + name: "Lunch", + startTime: new Date(Date.now() - HOUR), + endTime: new Date(Date.now() + HOUR), + }, + hackathonEventAttendees: undefined, + }); + + // BUG: the duplicate guard is a findFirst followed by an unguarded insert. + // unique('unique_event_participant') turns the losing racer's scan into a + // raw 23505 -> INTERNAL_SERVER_ERROR instead of the friendly CONFLICT. + it("tells the volunteer 'already checked in' when two scanners race", async () => { + const caller = scanCtx(); + mockInsert.mockImplementation(() => { + const err: any = new Error( + 'duplicate key value violates unique constraint "unique_event_participant"', + ); + err.code = "23505"; + throw err; + }); + + await expect( + caller.hackathon.scanParticipantPass({ + hackathonId: HACK_A, + eventId: EVENT_A, + participantId: PART_A1, + }), + ).rejects.toThrow(/already checked into/); + }); + }); + + // ===================================================================== + describe("Editing a hackathon after it exists", () => { + it("rejects a partial update that would end the hackathon before it starts", async () => { + const caller = adminCaller({ hackathons: liveHackathon() }); + + await expect( + caller.hackathon.update({ + id: HACK_A, + // endDate stays at +9d, so a start at +10d is impossible. + startDate: new Date(Date.now() + 10 * DAY), + }), + ).rejects.toThrow(/End date must be after start date/); + }); + + // INTENTIONAL, not a bug: create() refines registrationDeadline <= startDate, + // but update() deliberately does not re-check it. Organisers reopen + // registration mid-event to admit walk-ins, so an admin must be able to push + // the deadline past the start date. This test pins that behaviour so nobody + // "fixes" it back into a validation error. + it("lets an admin reopen registration after the event has started, for walk-ins", async () => { + const caller = adminCaller({ hackathons: liveHackathon() }); + mockUpdate.mockReturnValue([{ id: HACK_A }]); + + await expect( + caller.hackathon.update({ + id: HACK_A, + registrationDeadline: new Date(Date.now() + 8 * DAY), + }), + ).resolves.toBeDefined(); + }); + + /** + * `undefined` means leave alone, `null` means clear. Without the + * distinction a track list that was once set could never be emptied — the + * edit form would send `[]`, zod would drop it, and the stale value would + * keep routing judges at projects nobody entered for it. + */ + it("clears a field sent as null and leaves omitted ones alone", async () => { + const caller = adminCaller({ hackathons: liveHackathon() }); + mockUpdate.mockReturnValue([{ id: HACK_A }]); + + await caller.hackathon.update({ + id: HACK_A, + tracks: null, + rules: null, + }); + + const written = mockUpdate.mock.calls.at(-1)?.[2]?.[0]; + expect(written).toMatchObject({ tracks: null, rules: null }); + // theme was never sent, so it must not appear in the UPDATE at all. + expect(written).not.toHaveProperty("theme"); + }); + + it("stores the tracks it was given", async () => { + const caller = adminCaller({ hackathons: liveHackathon() }); + mockUpdate.mockReturnValue([{ id: HACK_A }]); + + await caller.hackathon.update({ + id: HACK_A, + tracks: ["AI", "Healthcare"], + }); + + expect(mockUpdate.mock.calls.at(-1)?.[2]?.[0]).toMatchObject({ + tracks: ["AI", "Healthcare"], + }); + }); + + // Every child table cascades off this row, so reporting success for an id + // that matched nothing hides a delete that never happened. + it("refuses to delete a hackathon id that does not exist", async () => { + const caller = adminCaller({ hackathons: undefined }); + // RETURNING names the rows the statement itself removed; against an id + // that matches nothing that is the empty set. + mockDelete.mockReturnValue([]); + + await expect( + caller.hackathon.delete({ + hackathonId: HACK_B, + confirmName: "Hacklytics 2027", + }), + ).rejects.toThrow(/not found/i); + }); + + // Eleven tables cascade off this row. A click-through confirm is one stray + // Enter key; the name has to be typed and has to match. + it("refuses to delete when the typed name does not match", async () => { + const caller = adminCaller({ + hackathons: { id: HACK_A, name: "Hacklytics 2027" }, + }); + + await expect( + caller.hackathon.delete({ + hackathonId: HACK_A, + confirmName: "hacklytics 2026", + }), + ).rejects.toThrow(/exact name/i); + + expect(mockDelete).not.toHaveBeenCalled(); + }); + }); + + // ===================================================================== + describe("Schedule editing", () => { + it("refuses to create an event that ends before it starts", async () => { + const caller = adminCaller({ hackathons: liveHackathon() }); + + await expect( + caller.hackathon.createEvent({ + hackathonId: HACK_A, + name: "Closing Ceremony", + type: "ceremony", + location: "Klaus 1443", + startTime: new Date(Date.now() + 8 * DAY), + endTime: new Date(Date.now() + 8 * DAY - HOUR), + }), + ).rejects.toThrow(/End time must be after start time/); + }); + + it("refuses to edit an event that does not exist", async () => { + const caller = adminCaller({ hackathonEvents: undefined }); + + await expect( + caller.hackathon.updateEvent({ + eventId: EVENT_A, + location: "Klaus 2443", + }), + ).rejects.toThrow(/Event not found/); + }); + + // BUG: createEvent refines endTime > startTime but updateEvent has no + // refine and no merged re-check, so a lone startTime can jump past the + // stored endTime and invert the schedule ordering. + it("refuses to move an event's start past its stored end time", async () => { + const caller = adminCaller({ + hackathonEvents: { + id: EVENT_A, + hackathonId: HACK_A, + name: "Closing Ceremony", + startTime: new Date("2027-02-14T09:00:00Z"), + endTime: new Date("2027-02-14T18:00:00Z"), + }, + }); + mockUpdate.mockReturnValue([{ id: EVENT_A }]); + + await expect( + caller.hackathon.updateEvent({ + eventId: EVENT_A, + startTime: new Date("2027-02-14T23:00:00Z"), + }), + ).rejects.toThrow(/End time must be after start time/); + }); + }); + + // ===================================================================== + describe("Authoring hackathon copy", () => { + const createInput = (description: string) => ({ + name: "Hacklytics 2027", + description, + startDate: new Date(Date.now() + 7 * DAY), + endDate: new Date(Date.now() + 9 * DAY), + }); + + it("accepts an ordinary description", async () => { + const caller = adminCaller(); + mockInsert.mockReturnValue([{ id: HACK_A, name: "Hacklytics 2027" }]); + + const res = await caller.hackathon.create( + createInput("Two days of data science hacking on campus."), + ); + expect(res).toMatchObject({ id: HACK_A }); + }); + + // BUG: sanitizeInput throws a bare BAD_REQUEST "Invalid input" whenever + // hasInjectionPattern matches, and its SQL-keyword pattern matches ordinary + // English ("Select ... from ...", "Create ... from ..."). The sanitized + // string is then discarded, so this is pure false-positive rejection. + it("accepts prose that happens to contain SQL keywords", async () => { + const caller = adminCaller(); + mockInsert.mockReturnValue([{ id: HACK_A, name: "Hacklytics 2027" }]); + + const res = await caller.hackathon.create( + createInput("Select a track from the list below to get started."), + ); + expect(res).toMatchObject({ id: HACK_A }); + }); + + // Stripping markup instead of refusing it silently truncated free text at + // the first "<": an HTML parser reads " and map.", + "Scoring is a { + const caller = adminCaller(); + mockInsert.mockReturnValue([{ id: HACK_A, name: "Hacklytics 2027" }]); + + await caller.hackathon.create(createInput(description)); + + const values = mockInsert.mock.calls[0]?.[2]?.[0]; + expect(values.description).toBe(description); + }); + + it("refuses a description carrying executable markup", async () => { + const caller = adminCaller(); + mockInsert.mockReturnValue([{ id: HACK_A }]); + + await expect( + caller.hackathon.create( + createInput("Nice event"), + ), + ).rejects.toThrow(/not allowed/i); + expect(mockInsert).not.toHaveBeenCalled(); + }); + }); + + // ===================================================================== + describe("Admin roster safety", () => { + it("refuses to let a plain admin change another admin's role", async () => { + const caller = adminCaller({}, "admin"); + + await expect( + caller.admin.update({ adminId: ADMIN_ROW, role: "moderator" }), + ).rejects.toThrow(/Super admin access required/); + }); + + it("refuses to let a super admin deactivate their own account", async () => { + const caller = adminCaller({}, "super_admin"); + mockUpdate.mockReturnValue([{ id: ADMIN_ROW }]); + + await expect( + caller.admin.update({ adminId: ADMIN_ROW, isActive: false }), + ).rejects.toThrow(/Cannot deactivate your own admin account/); + }); + + // BUG: the only self-protection is on isActive===false. Demoting your own + // row is allowed and there is no "last super admin" invariant, so the org + // can be locked out of admin management with no in-app recovery. + it("refuses to let the last super admin demote themselves", async () => { + const caller = adminCaller({}, "super_admin"); + mockFindMany.mockReturnValue([adminRow("super_admin")]); + mockUpdate.mockReturnValue([{ id: ADMIN_ROW, role: "moderator" }]); + + await expect( + caller.admin.update({ adminId: ADMIN_ROW, role: "moderator" }), + ).rejects.toThrow(/super admin/i); + }); + }); + + // ===================================================================== + describe("Day-of dashboard", () => { + // BUG: analyticsOverview counts eventCheckIns (the club check-in table), + // not hackathonEventAttendees, which is what scanParticipantPass writes. + it("counts today's hackathon badge scans", async () => { + const caller = adminCaller({}, "admin"); + mockCount.mockImplementation((t: string) => + t === "hackathonEventAttendees" ? 7 : 0, + ); + + const res = await caller.admin.analyticsOverview(); + + expect(res.checkinsToday).toBe(7); + }); + }); +}); diff --git a/packages/api/src/.internal-tests/hackathon-flow.test.ts b/packages/api/src/.internal-tests/hackathon-flow.test.ts index af17b3df..9467217c 100644 --- a/packages/api/src/.internal-tests/hackathon-flow.test.ts +++ b/packages/api/src/.internal-tests/hackathon-flow.test.ts @@ -30,7 +30,6 @@ vi.mock("@query/db", () => { hackathonProjects: table("hackathonProjects"), hackathonEvents: table("hackathonEvents"), hackathonEventAttendees: table("hackathonEventAttendees"), - hackathonMaps: table("hackathonMaps"), members: table("members"), events: table("events"), eventCheckIns: table("eventCheckIns"), @@ -118,7 +117,6 @@ vi.mock("@query/db", () => { eventId: "event_id", participantId: "participant_id", }, - hackathonMaps: { id: "id", hackathonId: "hackathon_id" }, members: { id: "id", userId: "user_id", hackathonId: "hackathon_id" }, membershipHistory: { id: "id", memberId: "member_id" }, events: { @@ -441,8 +439,11 @@ describe("Hackathon end-to-end flow", () => { ).rejects.toThrow(/Event not found/); }); - it("requires admin rights to scan a pass", async () => { - mockFindFirst.mockImplementation(() => undefined); // not an admin + // Scanning is the one action volunteers may take, so it is gated on + // holding any active admins row rather than on being full staff. An + // ordinary participant still has none and is still refused. + it("requires event staff to scan a pass", async () => { + mockFindFirst.mockImplementation(() => undefined); // no admins row at all const caller = appRouter.createCaller(createMockCtx("random_user")); await expect( @@ -451,7 +452,7 @@ describe("Hackathon end-to-end flow", () => { eventId: EVENT_A, participantId: PARTICIPANT, }), - ).rejects.toThrow(/Admin access required/); + ).rejects.toThrow(/Event staff access required/); }); }); @@ -463,6 +464,11 @@ describe("Hackathon end-to-end flow", () => { return { id: PROJECT, hackathonId: HACK_A }; if (table === "judges") return { id: "judge_1", userId: "judge_user", hackathonId: HACK_A }; + // The project was routed to this judge, which is the ordinary case + // these tests are about; scoring something never assigned to you is + // covered separately in judge-edge. + if (table === "judgeQueue") + return { id: "queue_1", judgeId: "judge_1", projectId: PROJECT }; return undefined; }); return appRouter.createCaller(createMockCtx("judge_user")); @@ -817,9 +823,13 @@ describe("Hackathon end-to-end flow", () => { if (table === "hackathons") return { id: HACK_A }; if (table === "judgeQueue") { queueLookups += 1; + // judge_queue.project_id is NOT NULL, so a slot always names the + // project it covers. Defaulted here (overridable per test) because + // completeAndNext checks the slot against the project being scored. if (skip && queueLookups === 1) - return { id: QUEUE_A, hackathonId: HACK_A }; - if (queueLookups === skip + 1) return opts.queueItem; + return { id: QUEUE_A, hackathonId: HACK_A, projectId: PROJECT }; + if (queueLookups === skip + 1) + return opts.queueItem && { projectId: PROJECT, ...opts.queueItem }; return opts.next; } if (table === "judgeAssignments") return undefined; diff --git a/packages/api/src/.internal-tests/hackathon-interest.test.ts b/packages/api/src/.internal-tests/hackathon-interest.test.ts new file mode 100644 index 00000000..21ab2b14 --- /dev/null +++ b/packages/api/src/.internal-tests/hackathon-interest.test.ts @@ -0,0 +1,309 @@ +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { appRouter } from "../root"; +import { cache } from "../middleware/cache"; +import { hackathonInterest } from "@query/db"; + +/** + * The interest list for an announced-but-not-open edition. + * + * The rules worth pinning down are the ones about WHICH editions accept + * interest: a draft must be indistinguishable from a made-up id, and an edition + * that has actually opened must send people to register rather than quietly + * taking a second, weaker signal. + */ + +const mockFindFirst = vi.fn(); +const mockInsert = vi.fn(); +const mockDelete = vi.fn(); +const mockSelectRows = vi.fn(() => [] as unknown[]); + +vi.mock("@query/db", () => { + const selectChain = () => { + const node: any = { + from: () => node, + innerJoin: () => node, + where: () => node, + orderBy: () => node, + limit: () => Promise.resolve(mockSelectRows()), + then: (ok: any, err: any) => Promise.resolve(mockSelectRows()).then(ok, err), + }; + return node; + }; + + const table = (name: string) => ({ + findFirst: (...args: any[]) => mockFindFirst(name, ...args), + findMany: async () => [], + }); + + return { + db: { + query: { + admins: table("admins"), + users: table("users"), + hackathons: table("hackathons"), + hackathonInterest: table("hackathonInterest"), + members: table("members"), + projectLeaders: table("projectLeaders"), + judges: table("judges"), + }, + select: selectChain, + insert: (...insertArgs: any[]) => ({ + values: (...valArgs: any[]) => { + const val = mockInsert("insert", insertArgs, valArgs); + return Object.assign(Promise.resolve(val), { + returning: vi.fn().mockResolvedValue(val), + onConflictDoUpdate: (...conflictArgs: any[]) => { + mockInsert("conflict", insertArgs, conflictArgs); + return Object.assign(Promise.resolve(val), { + returning: vi.fn().mockResolvedValue(val), + }); + }, + }); + }, + }), + delete: (...deleteArgs: any[]) => ({ + where: (...wArgs: any[]) => { + const val = mockDelete("delete", deleteArgs, wArgs); + return Object.assign(Promise.resolve(val), { + returning: vi.fn().mockResolvedValue(val), + }); + }, + }), + }, + admins: { userId: "user_id", isActive: "is_active", role: "role" }, + users: { id: "id", name: "name", email: "email" }, + hackathons: { + id: "id", + status: "status", + isPublic: "is_public", + startDate: "start_date", + }, + members: { userId: "user_id", hackathonId: "hackathon_id" }, + projectLeaders: { userId: "user_id", isActive: "is_active" }, + judges: { userId: "user_id", isActive: "is_active" }, + hackathonInterest: { + id: "id", + hackathonId: "hackathon_id", + userId: "user_id", + school: "school", + country: "country", + graduationYear: "graduation_year", + experience: "experience", + createdAt: "created_at", + }, + }; +}); + +import { db } from "@query/db"; + +const HACK = "22222222-2222-4222-8222-222222222222"; +const VISITOR = "user_visitor"; +const ADMIN = "user_admin"; + +const callerFor = (userId?: string) => + appRouter.createCaller({ + db, + session: userId ? { user: { id: userId } } : null, + userId, + cache, + clientIp: "127.0.0.1", + req: { headers: { get: () => null } }, + } as never); + +/** + * Deliberately a made-up edition. Real names, dates and themes belong in the + * database, not in a fixture in a public repository — an unannounced event + * should not be readable from the test suite before it is announced. + */ +const announced = (overrides: Record = {}) => ({ + id: HACK, + name: "Example Hackathon", + description: "A placeholder edition used only by this suite.", + location: "Somewhere", + startDate: new Date("2099-01-02T09:00:00Z"), + endDate: new Date("2099-01-04T21:00:00Z"), + theme: "Example Theme", + websiteUrl: "https://example.com", + status: "announced", + isPublic: true, + ...overrides, +}); + +const lookups = (opts: { + hackathon?: Record; + interest?: Record; + isAdmin?: boolean; +}) => { + mockFindFirst.mockImplementation((tableName: string) => { + if (tableName === "hackathons") return opts.hackathon; + if (tableName === "hackathonInterest") return opts.interest; + if (tableName === "admins") + return opts.isAdmin ? { id: "ad_1", role: "admin", isActive: true } : undefined; + return undefined; + }); +}; + +describe("Hackathon interest list", () => { + beforeEach(() => { + vi.clearAllMocks(); + mockFindFirst.mockReset(); + mockInsert.mockReset().mockReturnValue([]); + mockDelete.mockReset().mockReturnValue([]); + mockSelectRows.mockReset().mockReturnValue([]); + cache.clear(); + }); + + describe("1. The announced edition", () => { + it("is readable without signing in", async () => { + // A signed-out stranger is the whole audience for this page. + lookups({ hackathon: announced() }); + + const res = await callerFor().hackathon.getUpcoming(); + expect(res?.name).toBe("Example Hackathon"); + expect(res?.theme).toBe("Example Theme"); + }); + + it("answers null when nothing is announced", async () => { + lookups({ hackathon: undefined }); + await expect(callerFor().hackathon.getUpcoming()).resolves.toBeNull(); + }); + }); + + describe("2. Which editions take interest", () => { + it("hides a draft edition behind NOT_FOUND", async () => { + // Confirming a draft exists would leak that staff are planning something. + lookups({ hackathon: announced({ status: "draft" }) }); + + await expect( + callerFor(VISITOR).hackathon.registerInterest({ hackathonId: HACK }), + ).rejects.toMatchObject({ code: "NOT_FOUND" }); + expect(mockInsert).not.toHaveBeenCalled(); + }); + + it("hides a non-public edition the same way", async () => { + lookups({ hackathon: announced({ isPublic: false }) }); + + await expect( + callerFor(VISITOR).hackathon.registerInterest({ hackathonId: HACK }), + ).rejects.toMatchObject({ code: "NOT_FOUND" }); + }); + + it("sends people to register once the edition is open", async () => { + // Taking interest here would collect a weaker signal from somebody who + // could have had an actual place. + lookups({ hackathon: announced({ status: "open" }) }); + + await expect( + callerFor(VISITOR).hackathon.registerInterest({ hackathonId: HACK }), + ).rejects.toMatchObject({ + code: "BAD_REQUEST", + message: expect.stringContaining("Registration is open"), + }); + }); + + it("refuses once the edition is over", async () => { + lookups({ hackathon: announced({ status: "completed" }) }); + + await expect( + callerFor(VISITOR).hackathon.registerInterest({ hackathonId: HACK }), + ).rejects.toMatchObject({ code: "BAD_REQUEST" }); + }); + + it("requires signing in", async () => { + lookups({ hackathon: announced() }); + + await expect( + callerFor().hackathon.registerInterest({ hackathonId: HACK }), + ).rejects.toMatchObject({ code: "UNAUTHORIZED" }); + }); + }); + + describe("3. Joining and leaving", () => { + it("upserts, so a second submit edits one entry", async () => { + lookups({ hackathon: announced() }); + + const res = await callerFor(VISITOR).hackathon.registerInterest({ + hackathonId: HACK, + school: "Georgia Institute of Technology", + country: "United States", + graduationYear: 2029, + experience: "first", + }); + + expect(res.onList).toBe(true); + const [insert] = mockInsert.mock.calls; + expect(insert![2][0]).toMatchObject({ + hackathonId: HACK, + userId: VISITOR, + school: "Georgia Institute of Technology", + country: "United States", + graduationYear: 2029, + experience: "first", + }); + // The unique index is what makes a double submit safe, so the write has + // to actually name it rather than relying on the earlier read. + const conflict = mockInsert.mock.calls.find((c) => c[0] === "conflict"); + expect(conflict).toBeDefined(); + }); + + it("stores a blank answer as null rather than an empty string", async () => { + lookups({ hackathon: announced() }); + + await callerFor(VISITOR).hackathon.registerInterest({ + hackathonId: HACK, + school: "", + country: "", + }); + + const [insert] = mockInsert.mock.calls; + expect(insert![2][0].school).toBeNull(); + expect(insert![2][0].country).toBeNull(); + expect(insert![2][0].graduationYear).toBeNull(); + }); + + it("lets somebody leave the list", async () => { + lookups({ hackathon: announced() }); + + const res = await callerFor(VISITOR).hackathon.withdrawInterest({ + hackathonId: HACK, + }); + + expect(res.onList).toBe(false); + expect(mockDelete.mock.calls[0]![1][0]).toBe(hackathonInterest); + }); + + it("makes leaving twice a no-op rather than an error", async () => { + lookups({ hackathon: announced() }); + mockDelete.mockReturnValue([]); + + await expect( + callerFor(VISITOR).hackathon.withdrawInterest({ hackathonId: HACK }), + ).resolves.toEqual({ onList: false }); + }); + }); + + describe("4. The list itself", () => { + it("is refused to a caller who is not an admin", async () => { + lookups({ hackathon: announced(), isAdmin: false }); + + await expect( + callerFor(VISITOR).hackathon.listInterest({ hackathonId: HACK }), + ).rejects.toMatchObject({ code: "FORBIDDEN" }); + }); + + it("is returned to an admin", async () => { + lookups({ hackathon: announced(), isAdmin: true }); + mockSelectRows.mockReturnValue([ + { userId: VISITOR, email: "ada@example.com", school: null }, + ]); + + const rows = await callerFor(ADMIN).hackathon.listInterest({ + hackathonId: HACK, + }); + expect(rows).toHaveLength(1); + // Read through the join rather than a stored copy, so somebody who + // changes their address stays reachable. + expect(rows[0]!.email).toBe("ada@example.com"); + }); + }); +}); diff --git a/packages/api/src/.internal-tests/initiative-edge.test.ts b/packages/api/src/.internal-tests/initiative-edge.test.ts new file mode 100644 index 00000000..871aff0c --- /dev/null +++ b/packages/api/src/.internal-tests/initiative-edge.test.ts @@ -0,0 +1,688 @@ +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { appRouter } from "../root"; +import { cache } from "../middleware/cache"; +import { + initiatives, + initiativeApplications, + projectLeaders, +} from "@query/db"; + +/** + * Club initiatives: the leader role, the ownership gate, and the join flow. + * + * The half of the platform that is deliberately NOT scoped to a hackathon + * edition, so a good third of what is asserted here is that an edition — or the + * absence of one — changes nothing. + */ + +const mockFindFirst = vi.fn(); +const mockInsert = vi.fn(); +const mockUpdate = vi.fn(); +const mockDelete = vi.fn(); + +/** + * Rows a `.select()` chain resolves to, keyed by the table in `.from()`. + * Every terminal on the chain funnels through it, so a test steers the seat + * count and the list queries by table rather than by call order. + */ +let onSelect: (table: unknown) => unknown[] = () => []; + +vi.mock("@query/db", async () => { + const { createTransactionMock } = await import("./_db-tx-mock"); + + const table = (name: string) => ({ + findFirst: (...args: any[]) => mockFindFirst(name, ...args), + findMany: async () => [], + }); + + // Mirrors drizzle's builder closely enough for the chains this router uses: + // .from().innerJoin().where().orderBy().limit(), .where().groupBy(), an + // awaited .where(), and .where().for("update"). + const selectChain = () => { + let from: unknown; + const rows = () => Promise.resolve(onSelectRef.current(from)); + const node: any = { + from: (t: unknown) => ((from = t), node), + innerJoin: () => node, + where: () => node, + orderBy: () => node, + groupBy: () => rows(), + limit: () => rows(), + for: () => rows(), + then: (ok: any, err: any) => rows().then(ok, err), + }; + return node; + }; + + return { + db: { + transaction: createTransactionMock({ + base: () => db, + insert: (...a: any[]) => mockInsert(...a), + update: (...a: any[]) => mockUpdate(...a), + select: (...a: any[]) => onSelectRef.current(a[2]?.[0]), + }), + query: { + admins: table("admins"), + users: table("users"), + hackathons: table("hackathons"), + members: table("members"), + projectLeaders: table("projectLeaders"), + initiatives: table("initiatives"), + initiativeApplications: table("initiativeApplications"), + }, + select: selectChain, + insert: (...insertArgs: any[]) => ({ + values: (...valArgs: any[]) => { + const val = mockInsert("insert", insertArgs, valArgs); + return Object.assign(Promise.resolve(val), { + returning: vi.fn().mockResolvedValue(val), + }); + }, + }), + update: (...updateArgs: any[]) => ({ + set: (...setArgs: any[]) => ({ + where: (...wArgs: any[]) => { + const val = mockUpdate("update", updateArgs, setArgs, wArgs); + return Object.assign(Promise.resolve(val), { + returning: vi.fn().mockResolvedValue(val), + }); + }, + }), + }), + delete: (...deleteArgs: any[]) => ({ + where: (...wArgs: any[]) => { + const val = mockDelete("delete", deleteArgs, wArgs); + return Object.assign(Promise.resolve(val), { + returning: vi.fn().mockResolvedValue(val), + }); + }, + }), + }, + admins: { userId: "user_id", isActive: "is_active", role: "role" }, + users: { id: "id", name: "name", email: "email", image: "image" }, + hackathons: { id: "id", status: "status", startDate: "start_date", endDate: "end_date" }, + members: { userId: "user_id", hackathonId: "hackathon_id" }, + projectLeaders: { + id: "id", + userId: "user_id", + isActive: "is_active", + createdAt: "created_at", + }, + initiatives: { + id: "id", + leaderUserId: "leader_user_id", + title: "title", + summary: "summary", + description: "description", + commitment: "commitment", + status: "status", + maxMembers: "max_members", + archivedAt: "archived_at", + reviewedAt: "reviewed_at", + reviewNote: "review_note", + createdAt: "created_at", + }, + initiativeApplications: { + id: "id", + initiativeId: "initiative_id", + userId: "user_id", + status: "status", + pitch: "pitch", + appliedAt: "applied_at", + decidedAt: "decided_at", + }, + }; +}); + +// The mock factory is hoisted above `let onSelect`, so it may only close over a +// container it can read later — not the binding itself. +const onSelectRef = { get current() { return onSelect; } }; + +import { db } from "@query/db"; + +const LEADER = "user_leader"; +const OTHER_LEADER = "user_other_leader"; +const MEMBER = "user_member"; +const ADMIN = "user_admin"; +const INITIATIVE = "11111111-1111-4111-8111-111111111111"; +const DAY = 24 * 60 * 60 * 1000; + +const callerFor = (userId: string) => + appRouter.createCaller({ + db, + session: { user: { id: userId } }, + userId, + cache, + clientIp: "127.0.0.1", + req: undefined, + } as never); + +/** An initiative open to applications, led by LEADER. */ +const openInitiative = (overrides: Record = {}) => ({ + id: INITIATIVE, + leaderUserId: LEADER, + title: "Sensor Net", + summary: null, + description: null, + commitment: null, + status: "open", + maxMembers: 3, + archivedAt: null, + reviewedAt: null, + reviewedById: null, + reviewNote: null, + createdAt: new Date(), + updatedAt: new Date(), + ...overrides, +}); + +/** + * Table-keyed lookups. `who` decides the leader/admin/member answers, so each + * test states who is calling rather than restating the whole fixture. + */ +const lookups = (opts: { + isLeader?: string | null; + isAdmin?: string | null; + initiative?: Record | undefined; + application?: Record | undefined; + member?: Record | undefined; + hackathon?: Record | undefined; +}) => { + const { + isLeader = null, + isAdmin = null, + initiative, + application, + member, + hackathon = { id: "hack_1" }, + } = opts; + + mockFindFirst.mockImplementation((tableName: string, args?: any) => { + switch (tableName) { + case "projectLeaders": + return isLeader ? { id: "pl_1", userId: isLeader, isActive: true } : undefined; + case "admins": + return isAdmin ? { id: "ad_1", userId: isAdmin, role: "admin", isActive: true } : undefined; + case "hackathons": + return hackathon; + case "initiatives": + return initiative; + case "initiativeApplications": + return application; + case "members": + return member; + case "users": + return { id: (args?.where && "id") || "id" }; + default: + return undefined; + } + }); +}; + +/** A membership that has not run out — what applying requires. */ +const activeMember = { isActive: true, membershipEndDate: new Date(Date.now() + 30 * DAY) }; + +const insertedInto = (t: unknown) => + mockInsert.mock.calls.filter((c) => c[1]?.[0] === t); + +describe("Club initiatives", () => { + beforeEach(() => { + vi.clearAllMocks(); + mockFindFirst.mockReset(); + mockInsert.mockReset().mockReturnValue([{ id: INITIATIVE }]); + mockUpdate.mockReset().mockReturnValue([{ id: INITIATIVE, status: "open" }]); + mockDelete.mockReset().mockReturnValue([]); + onSelect = () => []; + cache.clear(); + }); + + // =================================================================== + describe("1. The leader role is not an edition", () => { + it("lets a leader in when no hackathon exists at all", async () => { + // The gate used to resolve the current edition first and throw NOT_FOUND + // when there was none, so a club with no event on the calendar had no + // project leaders — every leader screen 404'd out of season. + lookups({ isLeader: LEADER, hackathon: undefined }); + + await expect(callerFor(LEADER).initiative.listMine()).resolves.toEqual([]); + }); + + it("refuses somebody who holds no leader row", async () => { + lookups({ isLeader: null }); + + await expect(callerFor(MEMBER).initiative.listMine()).rejects.toMatchObject({ + code: "FORBIDDEN", + }); + }); + + it("lets an admin cover for a leader without a leader row", async () => { + lookups({ isLeader: null, isAdmin: ADMIN }); + + await expect(callerFor(ADMIN).initiative.listMine()).resolves.toEqual([]); + }); + }); + + // =================================================================== + describe("2. Ownership", () => { + it("hides another leader's initiative behind NOT_FOUND, not FORBIDDEN", async () => { + // FORBIDDEN would confirm the id exists, which is the one thing guessing + // ids is good for. + lookups({ + isLeader: OTHER_LEADER, + initiative: openInitiative({ leaderUserId: LEADER }), + }); + + await expect( + callerFor(OTHER_LEADER).initiative.getById({ id: INITIATIVE }), + ).rejects.toMatchObject({ code: "NOT_FOUND" }); + }); + + it("lets the leader who owns it through", async () => { + lookups({ isLeader: LEADER, initiative: openInitiative() }); + onSelect = () => []; + + const res = await callerFor(LEADER).initiative.getById({ id: INITIATIVE }); + expect(res.initiative.id).toBe(INITIATIVE); + }); + + it("lets an admin through to somebody else's initiative", async () => { + lookups({ isAdmin: ADMIN, initiative: openInitiative() }); + + const res = await callerFor(ADMIN).initiative.getById({ id: INITIATIVE }); + expect(res.initiative.id).toBe(INITIATIVE); + }); + + it("refuses to edit another leader's initiative", async () => { + lookups({ + isLeader: OTHER_LEADER, + initiative: openInitiative({ leaderUserId: LEADER }), + }); + + await expect( + callerFor(OTHER_LEADER).initiative.update({ + id: INITIATIVE, + title: "Hijacked", + }), + ).rejects.toMatchObject({ code: "NOT_FOUND" }); + expect(mockUpdate).not.toHaveBeenCalled(); + }); + }); + + // =================================================================== + describe("3. Creating on somebody's behalf", () => { + it("refuses an admin who names nobody", async () => { + // Defaulting the leader to the caller stored the ADMIN as leader and put + // their name in front of members. + lookups({ isLeader: null, isAdmin: ADMIN }); + + await expect( + callerFor(ADMIN).initiative.create({ title: "Sensor Net" }), + ).rejects.toMatchObject({ code: "BAD_REQUEST" }); + }); + + it("refuses naming somebody who is not a leader", async () => { + mockFindFirst.mockImplementation((tableName: string) => { + if (tableName === "admins") return { id: "ad_1", role: "admin", isActive: true }; + if (tableName === "hackathons") return { id: "hack_1" }; + // No projectLeaders row for the named user. + return undefined; + }); + + await expect( + callerFor(ADMIN).initiative.create({ + title: "Sensor Net", + leaderUserId: MEMBER, + }), + ).rejects.toMatchObject({ code: "BAD_REQUEST" }); + }); + + it("refuses a non-admin leader creating for someone else", async () => { + lookups({ isLeader: LEADER }); + + await expect( + callerFor(LEADER).initiative.create({ + title: "Sensor Net", + leaderUserId: OTHER_LEADER, + }), + ).rejects.toMatchObject({ code: "FORBIDDEN" }); + }); + + it("creates as a draft so nothing reaches members unopened", async () => { + lookups({ isLeader: LEADER }); + + await callerFor(LEADER).initiative.create({ title: "Sensor Net" }); + + const [call] = insertedInto(initiatives); + expect(call).toBeDefined(); + expect(call![2][0]).toMatchObject({ + leaderUserId: LEADER, + status: "draft", + // Leader plus three accepted members is a team of four. + maxMembers: 3, + }); + // The column is gone; writing one would be a schema error in production. + expect(call![2][0]).not.toHaveProperty("hackathonId"); + }); + + it("leaves an initiative uncapped when the leader clears the cap", async () => { + lookups({ isLeader: LEADER }); + + await callerFor(LEADER).initiative.create({ + title: "Reading group", + maxMembers: null, + }); + + const [call] = insertedInto(initiatives); + expect(call![2][0].maxMembers).toBeNull(); + }); + }); + + // =================================================================== + describe("4. Applying", () => { + it("needs a membership that has not lapsed", async () => { + lookups({ + initiative: openInitiative(), + member: { isActive: true, membershipEndDate: new Date(Date.now() - DAY) }, + }); + + await expect( + callerFor(MEMBER).initiative.requestToJoin({ initiativeId: INITIATIVE }), + ).rejects.toMatchObject({ code: "FORBIDDEN" }); + }); + + it.each(["draft", "proposed", "declined"])( + "answers a %s initiative exactly like a made-up id", + async (status) => { + // BAD_REQUEST here would tell a stranger that somebody pitched this. + lookups({ + initiative: openInitiative({ status }), + member: activeMember, + }); + + await expect( + callerFor(MEMBER).initiative.requestToJoin({ initiativeId: INITIATIVE }), + ).rejects.toMatchObject({ code: "NOT_FOUND" }); + }, + ); + + it("answers an archived initiative the same way", async () => { + lookups({ + initiative: openInitiative({ archivedAt: new Date() }), + member: activeMember, + }); + + await expect( + callerFor(MEMBER).initiative.requestToJoin({ initiativeId: INITIATIVE }), + ).rejects.toMatchObject({ code: "NOT_FOUND" }); + }); + + it("refuses the leader applying to their own initiative", async () => { + lookups({ initiative: openInitiative(), member: activeMember }); + + await expect( + callerFor(LEADER).initiative.requestToJoin({ initiativeId: INITIATIVE }), + ).rejects.toMatchObject({ code: "BAD_REQUEST" }); + }); + + it("refuses when every seat is taken", async () => { + lookups({ + initiative: openInitiative({ maxMembers: 3 }), + member: activeMember, + }); + onSelect = (t) => (t === initiativeApplications ? [{ taken: 3 }] : []); + + await expect( + callerFor(MEMBER).initiative.requestToJoin({ initiativeId: INITIATIVE }), + ).rejects.toMatchObject({ code: "BAD_REQUEST" }); + }); + + it("tells a repeat applicant where they stand instead of counting them twice", async () => { + lookups({ + initiative: openInitiative(), + application: { id: "app_1", status: "pending" }, + member: activeMember, + }); + + await expect( + callerFor(MEMBER).initiative.requestToJoin({ initiativeId: INITIATIVE }), + ).rejects.toMatchObject({ code: "CONFLICT" }); + }); + + it("reuses the row when somebody who withdrew applies again", async () => { + // The unique index still holds that row, so a second insert would collide. + lookups({ + initiative: openInitiative(), + application: { id: "app_1", status: "withdrawn" }, + member: activeMember, + }); + onSelect = (t) => (t === initiativeApplications ? [{ taken: 0 }] : []); + + const res = await callerFor(MEMBER).initiative.requestToJoin({ + initiativeId: INITIATIVE, + }); + + expect(res.status).toBe("pending"); + expect(insertedInto(initiativeApplications)).toHaveLength(0); + expect(mockUpdate).toHaveBeenCalled(); + }); + }); + + // =================================================================== + describe("5. Deciding", () => { + it("refuses to decide on somebody who withdrew", async () => { + lookups({ + isLeader: LEADER, + initiative: openInitiative(), + application: { id: "app_1", status: "withdrawn" }, + }); + + await expect( + callerFor(LEADER).initiative.decide({ + initiativeId: INITIATIVE, + userId: MEMBER, + decision: "accepted", + }), + ).rejects.toMatchObject({ code: "BAD_REQUEST" }); + }); + + it("makes a repeat of the same decision a no-op", async () => { + // Two officers on the same queue must not restamp decidedAt. + lookups({ + isLeader: LEADER, + initiative: openInitiative(), + application: { id: "app_1", status: "accepted" }, + }); + + const res = await callerFor(LEADER).initiative.decide({ + initiativeId: INITIATIVE, + userId: MEMBER, + decision: "accepted", + }); + + expect(res.status).toBe("accepted"); + expect(mockUpdate).not.toHaveBeenCalled(); + }); + + it("refuses an acceptance that would exceed the cap", async () => { + lookups({ + isLeader: LEADER, + initiative: openInitiative({ maxMembers: 3 }), + application: { id: "app_1", status: "pending" }, + }); + onSelect = (t) => (t === initiativeApplications ? [{ taken: 3 }] : []); + + await expect( + callerFor(LEADER).initiative.decide({ + initiativeId: INITIATIVE, + userId: MEMBER, + decision: "accepted", + }), + ).rejects.toMatchObject({ code: "BAD_REQUEST" }); + }); + + it("lets a rejection through when the initiative is full", async () => { + // A full initiative can still say no — the cap only bounds acceptances. + lookups({ + isLeader: LEADER, + initiative: openInitiative({ maxMembers: 3 }), + application: { id: "app_1", status: "pending" }, + }); + onSelect = (t) => (t === initiativeApplications ? [{ taken: 3 }] : []); + + const res = await callerFor(LEADER).initiative.decide({ + initiativeId: INITIATIVE, + userId: MEMBER, + decision: "rejected", + }); + expect(res.status).toBe("rejected"); + }); + + it("refuses a leader deciding on another leader's applicant", async () => { + lookups({ + isLeader: OTHER_LEADER, + initiative: openInitiative({ leaderUserId: LEADER }), + application: { id: "app_1", status: "pending" }, + }); + + await expect( + callerFor(OTHER_LEADER).initiative.decide({ + initiativeId: INITIATIVE, + userId: MEMBER, + decision: "accepted", + }), + ).rejects.toMatchObject({ code: "NOT_FOUND" }); + }); + }); + + // =================================================================== + describe("6. Proposals", () => { + it("caps a member at three waiting proposals", async () => { + lookups({ member: activeMember }); + onSelect = (t) => (t === initiatives ? [{ total: 3 }] : []); + + await expect( + callerFor(MEMBER).initiative.propose({ title: "Sensor Net" }), + ).rejects.toMatchObject({ code: "BAD_REQUEST" }); + }); + + it("files the proposal as the row itself, proposer as leader", async () => { + lookups({ member: activeMember }); + onSelect = (t) => (t === initiatives ? [{ total: 0 }] : []); + + await callerFor(MEMBER).initiative.propose({ title: "Sensor Net" }); + + const [call] = insertedInto(initiatives); + expect(call![2][0]).toMatchObject({ + leaderUserId: MEMBER, + status: "proposed", + }); + }); + + it("needs an active membership to propose", async () => { + lookups({ member: undefined }); + + await expect( + callerFor(MEMBER).initiative.propose({ title: "Sensor Net" }), + ).rejects.toMatchObject({ code: "FORBIDDEN" }); + }); + + it("refuses to withdraw a proposal that was already reviewed", async () => { + // The delete is scoped to status = proposed, so an approved one matches + // no row and the caller is told why rather than told it worked. + lookups({}); + mockDelete.mockReturnValue([]); + + await expect( + callerFor(MEMBER).initiative.withdrawProposal({ id: INITIATIVE }), + ).rejects.toMatchObject({ code: "NOT_FOUND" }); + }); + }); + + // =================================================================== + describe("7. Approving a proposal", () => { + it("grants the leader role without an edition on it", async () => { + mockFindFirst.mockImplementation((tableName: string) => { + if (tableName === "admins") return { id: "ad_1", role: "admin", isActive: true }; + if (tableName === "hackathons") return { id: "hack_1" }; + if (tableName === "initiatives") + return openInitiative({ status: "proposed", leaderUserId: MEMBER }); + if (tableName === "projectLeaders") return undefined; + return undefined; + }); + + await callerFor(ADMIN).initiative.reviewProposal({ + id: INITIATIVE, + decision: "approve", + }); + + const [call] = insertedInto(projectLeaders); + expect(call).toBeDefined(); + expect(call![2][0]).toMatchObject({ userId: MEMBER, isActive: true }); + expect(call![2][0]).not.toHaveProperty("hackathonId"); + }); + + it("restores a revoked role rather than colliding with the unique index", async () => { + mockFindFirst.mockImplementation((tableName: string) => { + if (tableName === "admins") return { id: "ad_1", role: "admin", isActive: true }; + if (tableName === "hackathons") return { id: "hack_1" }; + if (tableName === "initiatives") + return openInitiative({ status: "proposed", leaderUserId: MEMBER }); + if (tableName === "projectLeaders") + return { id: "pl_1", userId: MEMBER, isActive: false }; + return undefined; + }); + + await callerFor(ADMIN).initiative.reviewProposal({ + id: INITIATIVE, + decision: "approve", + }); + + expect(insertedInto(projectLeaders)).toHaveLength(0); + expect(mockUpdate).toHaveBeenCalled(); + }); + + it("refuses to review the same proposal twice", async () => { + mockFindFirst.mockImplementation((tableName: string) => { + if (tableName === "admins") return { id: "ad_1", role: "admin", isActive: true }; + if (tableName === "hackathons") return { id: "hack_1" }; + if (tableName === "initiatives") return openInitiative({ status: "draft" }); + return undefined; + }); + + await expect( + callerFor(ADMIN).initiative.reviewProposal({ + id: INITIATIVE, + decision: "approve", + }), + ).rejects.toMatchObject({ code: "BAD_REQUEST" }); + }); + }); + + // =================================================================== + describe("8. Status and archiving", () => { + it("refuses a status change while archived", async () => { + lookups({ + isLeader: LEADER, + initiative: openInitiative({ archivedAt: new Date() }), + }); + + await expect( + callerFor(LEADER).initiative.setStatus({ id: INITIATIVE, status: "open" }), + ).rejects.toMatchObject({ code: "BAD_REQUEST" }); + }); + + it("shuts the door when archiving", async () => { + lookups({ isLeader: LEADER, initiative: openInitiative() }); + + await callerFor(LEADER).initiative.setArchived({ + id: INITIATIVE, + archived: true, + }); + + const [, , setArgs] = mockUpdate.mock.calls[0]!; + expect(setArgs[0]).toMatchObject({ status: "closed" }); + expect(setArgs[0].archivedAt).toBeInstanceOf(Date); + }); + }); +}); diff --git a/packages/api/src/.internal-tests/judge-edge.test.ts b/packages/api/src/.internal-tests/judge-edge.test.ts new file mode 100644 index 00000000..8ebacbc6 --- /dev/null +++ b/packages/api/src/.internal-tests/judge-edge.test.ts @@ -0,0 +1,1401 @@ +/** + * Judge-side edge cases: queue ownership, vote/queue consistency, the judging + * window, reassignment on force-skip, bulk assignment coverage and admin + * cleanup paths. + * + * Tests marked `it.skip` are written against the behaviour the product SHOULD + * have. Each one currently fails against the shipped handler; the comment + * above it names the file and lines responsible. They are deliberately left in + * place — unskipping one is the acceptance criterion for its fix. + */ +import { describe, it, expect, vi, beforeEach } from "vitest"; +import { appRouter } from "../root"; +import { cache } from "../middleware/cache"; +import { db } from "@query/db"; + +// Fully mock the DB at the file level, mirroring hackathon-flow.test.ts. +const mockFindFirst = vi.fn(); +const mockFindMany = vi.fn(); +const mockInsert = vi.fn(); +const mockUpdate = vi.fn(); +const mockDelete = vi.fn(); +const mockSelect = vi.fn(); + +vi.mock("@query/db", () => { + const table = (name: string) => ({ + findFirst: (...args: any[]) => mockFindFirst(name, ...args), + findMany: (...args: any[]) => mockFindMany(name, ...args), + }); + + // A lazily-resolved builder chain. Every builder method records itself and + // returns the same object; awaiting it calls mockSelect exactly once, so a + // test can drive successive aggregate queries with mockReturnValueOnce. + const selectChain = () => { + const trace: [string, any[]][] = []; + const chain: any = { + then: (onOk: any, onErr: any) => + Promise.resolve(mockSelect(trace)).then(onOk, onErr), + }; + for (const m of [ + "from", + "where", + "innerJoin", + "leftJoin", + "groupBy", + "orderBy", + "limit", + "offset", + "for", + ]) { + chain[m] = (...a: any[]) => { + trace.push([m, a]); + return chain; + }; + } + return chain; + }; + + return { + db: { + transaction: vi.fn().mockImplementation((callback) => callback(db)), + query: { + admins: table("admins"), + users: table("users"), + userProfiles: table("userProfiles"), + hackathons: table("hackathons"), + hackathonParticipants: table("hackathonParticipants"), + hackathonTeams: table("hackathonTeams"), + hackathonProjects: table("hackathonProjects"), + hackathonEvents: table("hackathonEvents"), + hackathonEventAttendees: table("hackathonEventAttendees"), + members: table("members"), + events: table("events"), + eventCheckIns: table("eventCheckIns"), + judges: table("judges"), + judgeAssignments: table("judgeAssignments"), + judgingProjects: table("judgingProjects"), + judgeVotes: table("judgeVotes"), + judgeQueue: table("judgeQueue"), + hackathonResults: table("hackathonResults"), + stripePayments: table("stripePayments"), + userAccountLinks: table("userAccountLinks"), + auditLogs: table("auditLogs"), + }, + insert: (...insertArgs: any[]) => ({ + values: (...valArgs: any[]) => { + const val = mockInsert("insert", insertArgs, valArgs); + return Object.assign(Promise.resolve(val), { + returning: vi.fn().mockResolvedValue(val), + onConflictDoUpdate: vi.fn().mockImplementation(() => ({ + returning: vi.fn().mockResolvedValue(val), + })), + }); + }, + }), + update: (...updateArgs: any[]) => ({ + set: (...setArgs: any[]) => ({ + where: (...wArgs: any[]) => { + const val = mockUpdate("update", updateArgs, setArgs, wArgs); + return Object.assign(Promise.resolve(val), { + returning: vi.fn().mockResolvedValue(val), + }); + }, + }), + }), + delete: (...deleteArgs: any[]) => ({ + where: (...wArgs: any[]) => { + const val = mockDelete("delete", deleteArgs, wArgs); + return Object.assign(Promise.resolve(val), { + returning: vi.fn().mockResolvedValue(val), + }); + }, + }), + select: (..._args: any[]) => selectChain(), + }, + admins: { userId: "user_id", isActive: "is_active", role: "role" }, + users: { id: "id", email: "email" }, + userProfiles: { userId: "user_id" }, + hackathons: { + id: "id", + name: "name", + status: "status", + isPublic: "is_public", + startDate: "start_date", + endDate: "end_date", + judgingActive: "judging_active", + tracks: "tracks", + currentParticipants: "current_participants", + maxParticipants: "max_participants", + }, + hackathonParticipants: { + id: "id", + hackathonId: "hackathon_id", + userId: "user_id", + registrationStatus: "registration_status", + }, + hackathonTeams: { id: "id", hackathonId: "hackathon_id", name: "name" }, + hackathonProjects: { + id: "id", + hackathonId: "hackathon_id", + status: "status", + submittedAt: "submitted_at", + }, + hackathonEvents: { id: "id", hackathonId: "hackathon_id", name: "name" }, + hackathonEventAttendees: { + eventId: "event_id", + participantId: "participant_id", + }, + members: { id: "id", userId: "user_id", hackathonId: "hackathon_id" }, + membershipHistory: { id: "id", memberId: "member_id" }, + events: { + id: "id", + title: "title", + qrCode: "qr_code", + checkInEnabled: "check_in_enabled", + eventDate: "event_date", + currentCheckIns: "current_check_ins", + }, + eventCheckIns: { id: "id", eventId: "event_id", userId: "user_id" }, + judges: { + id: "id", + userId: "user_id", + hackathonId: "hackathon_id", + isActive: "is_active", + name: "name", + }, + judgeAssignments: { + id: "id", + judgeId: "judge_id", + hackathonId: "hackathon_id", + track: "track", + status: "status", + }, + judgingProjects: { + id: "id", + hackathonId: "hackathon_id", + sourceProjectId: "source_project_id", + tableNumber: "table_number", + tracks: "tracks", + challenges: "challenges", + isCreateX: "is_create_x", + }, + judgeVotes: { + id: "id", + judgeId: "judge_id", + projectId: "project_id", + score: "score", + durationSeconds: "duration_seconds", + }, + hackathonResults: { + id: "id", + hackathonId: "hackathon_id", + projectId: "project_id", + track: "track", + placement: "placement", + publishedAt: "published_at", + }, + judgeQueue: { + id: "id", + judgeId: "judge_id", + hackathonId: "hackathon_id", + projectId: "project_id", + order: "order", + isCompleted: "is_completed", + completedAt: "completed_at", + startedAt: "started_at", + }, + stripePayments: { + id: "id", + customerEmail: "customer_email", + stripePaymentIntentId: "stripe_payment_intent_id", + }, + userAccountLinks: { userId: "user_id", stripePaymentId: "stripe_payment_id" }, + auditLogs: { id: "id", severity: "severity", userId: "user_id" }, + }; +}); + +const HACK_A = "11111111-1111-4111-8111-111111111111"; +const HACK_B = "22222222-2222-4222-8222-222222222222"; +const PROJECT_A = "33333333-3333-4333-8333-333333333333"; +const PROJECT_B = "44444444-4444-4444-8444-444444444444"; +const QUEUE_A = "55555555-5555-4555-8555-555555555555"; +const JUDGE_ID = "66666666-6666-4666-8666-666666666666"; +const OTHER_JUDGE_ID = "77777777-7777-4777-8777-777777777777"; + +const JUDGE_ROW = { + id: JUDGE_ID, + userId: "judge_user", + hackathonId: HACK_A, + isActive: true, + name: "Grace Hopper", +}; +const ADMIN_ROW = { userId: "admin_user", isActive: true, role: "admin" }; + +/** Returns successive elements of `items`, then undefined forever. */ +const seq = (items: unknown[]) => { + let i = 0; + return () => items[i++]; +}; + +const scores = { + scoreCreativity: 5, + scoreImpact: 5, + scoreScope: 5, + scoreClarity: 5, + scoreSoundness: 5, +}; + +describe("Judge edge cases", () => { + beforeEach(() => { + vi.clearAllMocks(); + cache.clear(); + mockFindFirst.mockImplementation(() => undefined); + mockFindMany.mockImplementation(() => []); + // Tests drive successive aggregate reads with mockReturnValueOnce, and + // clearAllMocks does not drain that queue — a test that queues more values + // than its handler consumes would otherwise hand its leftovers to whichever + // test runs next, making results depend on file order. + mockSelect.mockReset(); + mockSelect.mockReturnValue([{ count: 0 }]); + mockInsert.mockReturnValue([{ id: "inserted" }]); + mockUpdate.mockReturnValue([{ id: "updated" }]); + mockDelete.mockReturnValue([{ id: "deleted" }]); + }); + + const ctxFor = (userId?: string) => + ({ + db, + session: userId ? { user: { id: userId } } : null, + userId: userId || undefined, + cache, + clientIp: "127.0.0.1", + req: { headers: { get: () => null } }, + }) as any; + + const judgeCaller = () => appRouter.createCaller(ctxFor("judge_user")); + const adminCaller = () => appRouter.createCaller(ctxFor("admin_user")); + + /** + * Wires mockFindFirst for the judge portal. `queue` is consumed in call + * order: `isJudge` burns the first judgeQueue lookup whenever the input + * carries only a queueId (procedures.ts resolves hackathonId that way). + */ + const wireJudge = (opts: { + queue?: unknown[]; + project?: Record; + hackathon?: Record; + myAssignment?: Record; + judge?: Record | undefined; + }) => { + const nextQueue = seq(opts.queue ?? []); + mockFindFirst.mockImplementation((table: string) => { + if (table === "judges") + return "judge" in opts ? opts.judge : JUDGE_ROW; + if (table === "judgingProjects") + return opts.project ?? { id: PROJECT_A, hackathonId: HACK_A }; + if (table === "hackathons") return opts.hackathon ?? { id: HACK_A }; + if (table === "judgeQueue") return nextQueue(); + if (table === "judgeAssignments") return opts.myAssignment; + return undefined; + }); + }; + + /** Every judgeQueue row written by a mutation, flattened. */ + const insertedRows = () => + mockInsert.mock.calls.flatMap((c) => { + const values = c[2]?.[0]; + return Array.isArray(values) ? values : values ? [values] : []; + }); + + // ===================================================================== + describe("1. A judge may only act on their own queue", () => { + // BUG: portal.ts:405-419 loads the row with eq(judgeQueue.id, queueId) + // only. Any active judge of the hackathon can complete another judge's + // assignment. Left skipped: the product does not enforce ownership. + it("refuses to force-skip a queue item that belongs to another judge", async () => { + wireJudge({ + queue: [ + { id: QUEUE_A, hackathonId: HACK_A }, + { + id: QUEUE_A, + judgeId: OTHER_JUDGE_ID, + hackathonId: HACK_A, + projectId: PROJECT_A, + isCompleted: false, + project: { id: PROJECT_A, tracks: [] }, + }, + ], + }); + + await expect( + judgeCaller().judge.forceSkipOvertime({ queueId: QUEUE_A }), + ).rejects.toThrow(/not found|forbidden|access/i); + expect(mockUpdate).not.toHaveBeenCalled(); + }); + + // BUG: portal.ts:350-367 — same missing ownership predicate, and the + // MAX(order) subquery is computed over the CALLER's rows, so the victim's + // ordering is rewritten from a foreign sequence. + it("refuses to skip a queue item that belongs to another judge", async () => { + wireJudge({ + queue: [ + { id: QUEUE_A, hackathonId: HACK_A }, + { + id: QUEUE_A, + judgeId: OTHER_JUDGE_ID, + hackathonId: HACK_A, + order: 1, + isCompleted: false, + }, + ], + }); + + await expect( + judgeCaller().judge.skipProject({ queueId: QUEUE_A }), + ).rejects.toThrow(/not found|forbidden|access/i); + expect(mockUpdate).not.toHaveBeenCalled(); + }); + }); + + // ===================================================================== + describe("2. completeAndNext queue/vote consistency", () => { + const vote = { queueId: QUEUE_A, projectId: PROJECT_A, ...scores }; + + // BUG: portal.ts:267-305 writes the vote for input.projectId and completes + // input.queueId with no cross-check, and isJudge resolves the hackathon + // from projectId first, so a foreign-hackathon queueId still authorises. + it("refuses to score one project while completing a queue slot for another", async () => { + wireJudge({ + project: { id: PROJECT_A, hackathonId: HACK_A }, + queue: [ + { + id: QUEUE_A, + judgeId: JUDGE_ID, + hackathonId: HACK_B, + projectId: PROJECT_B, + }, + ], + }); + + await expect(judgeCaller().judge.completeAndNext(vote)).rejects.toThrow( + /bad request|mismatch|does not/i, + ); + expect(mockInsert).not.toHaveBeenCalled(); + }); + + // BUG: portal.ts:312-314 returns done for a stale queueId without ever + // asking whether the judge has uncompleted rows left. + it("does not declare judging finished when the queue row simply no longer exists", async () => { + wireJudge({ + project: { id: PROJECT_A, hackathonId: HACK_A }, + queue: [ + undefined, + // The slot this judge owns for the project being scored. The stale + // queueId resolves to nothing, but they are still assigned it. + { id: QUEUE_A }, + { + id: "queue_b", + hackathonId: HACK_A, + project: { id: PROJECT_B, name: "Still Waiting" }, + }, + ], + }); + + const res = await judgeCaller().judge.completeAndNext(vote); + expect(res.done).toBe(false); + }); + + it("returns the same next project when the same completion is submitted twice", async () => { + const nextRow = { + id: "queue_b", + hackathonId: HACK_A, + project: { id: PROJECT_B, name: "Next Project" }, + }; + + wireJudge({ + project: { id: PROJECT_A, hackathonId: HACK_A }, + queue: [ + { id: QUEUE_A, judgeId: JUDGE_ID, hackathonId: HACK_A, projectId: PROJECT_A }, + nextRow, + ], + }); + const first = await judgeCaller().judge.completeAndNext(vote); + + // Retry from a second tab: the row is already completed, so the next + // uncompleted row is still the same one. + wireJudge({ + project: { id: PROJECT_A, hackathonId: HACK_A }, + queue: [ + { + id: QUEUE_A, + judgeId: JUDGE_ID, + hackathonId: HACK_A, + projectId: PROJECT_A, + isCompleted: true, + }, + nextRow, + ], + }); + const second = await judgeCaller().judge.completeAndNext(vote); + + expect(first).toMatchObject({ done: false, nextQueueId: "queue_b" }); + expect(second).toMatchObject({ done: false, nextQueueId: "queue_b" }); + }); + }); + + // ===================================================================== + describe("3. Judging window", () => { + // BUG: neither submitVote (portal.ts:190) nor completeAndNext + // (portal.ts:245) reads hackathons.judgingActive, so "close judging" is + // advisory only and the upsert can still overwrite scores afterwards. + it("rejects a vote once judging has been closed", async () => { + wireJudge({ + project: { id: PROJECT_A, hackathonId: HACK_A }, + hackathon: { id: HACK_A, judgingActive: false }, + }); + + await expect( + judgeCaller().judge.submitVote({ projectId: PROJECT_A, ...scores }), + ).rejects.toThrow(/clos/i); + }); + + // BUG: the handler never consults judgeQueue, so any judge can score any + // project in the hackathon, including ones routed away from them. + it("rejects a vote for a project that was never in the judge's queue", async () => { + wireJudge({ + project: { id: PROJECT_A, hackathonId: HACK_A }, + queue: [undefined], + }); + + await expect( + judgeCaller().judge.submitVote({ projectId: PROJECT_A, ...scores }), + ).rejects.toThrow(); + }); + }); + + // ===================================================================== + describe("4. skipProject response shape", () => { + it("returns the next project with its name and table number", async () => { + wireJudge({ + queue: [ + { id: QUEUE_A, hackathonId: HACK_A }, + { id: QUEUE_A, judgeId: JUDGE_ID, hackathonId: HACK_A, order: 1 }, + { + id: "queue_b", + hackathonId: HACK_A, + project: { id: PROJECT_B, name: "Next Project", tableNumber: 12 }, + }, + ], + }); + + const res = await judgeCaller().judge.skipProject({ queueId: QUEUE_A }); + expect(res.skippedToEnd).toBe(false); + expect(res.project).toMatchObject({ name: "Next Project", tableNumber: 12 }); + }); + + // The caller renders a project card either way, so the last-project branch + // has to hand back the joined project, not the judgeQueue row — returning + // the queue row leaves the UI with an empty card on a judge's final table. + it("still returns a named project when only the last project remains", async () => { + wireJudge({ + queue: [ + { id: QUEUE_A, hackathonId: HACK_A }, + // project_id is NOT NULL and the handler loads this row with + // `with: { project: true }`, so a slot always arrives carrying one. + { + id: QUEUE_A, + judgeId: JUDGE_ID, + hackathonId: HACK_A, + order: 1, + projectId: PROJECT_A, + project: { id: PROJECT_A, name: "Last Project", tableNumber: 7 }, + }, + undefined, + ], + }); + + const res = await judgeCaller().judge.skipProject({ queueId: QUEUE_A }); + expect(res.skippedToEnd).toBe(true); + expect(res.project).toMatchObject({ + name: "Last Project", + tableNumber: 7, + }); + }); + }); + + // ===================================================================== + describe("5. forceSkipOvertime reassignment", () => { + /** + * Candidate selection now runs two set-based queries rather than two per + * candidate: who already holds this project, and each judge's uncompleted + * count. The mocks mirror that shape — feeding the old per-candidate + * counts here would make these tests pass without exercising the sort. + */ + const wireForceSkip = (opts: { + myAssignment?: Record; + others: Record[]; + /** judgeIds already holding the skipped project */ + holders?: string[]; + /** judgeId -> uncompleted queue length */ + remaining?: Record; + /** the judge's own next uncompleted slot, if any */ + next?: Record; + }) => { + const nextQueue = seq([ + { id: QUEUE_A, hackathonId: HACK_A }, // isJudge middleware lookup + { + id: QUEUE_A, + judgeId: JUDGE_ID, + hackathonId: HACK_A, + projectId: PROJECT_A, + project: { id: PROJECT_A, tracks: [] }, + }, + // the "what do I do next" lookup at the end + opts.next, + ]); + mockFindFirst.mockImplementation((table: string) => { + if (table === "judges") return JUDGE_ROW; + if (table === "hackathons") return { id: HACK_A }; + if (table === "judgeQueue") return nextQueue(); + if (table === "judgeAssignments") + return "myAssignment" in opts + ? opts.myAssignment + : { judgeId: JUDGE_ID, hackathonId: HACK_A }; + return undefined; + }); + mockFindMany.mockImplementation((table: string) => + table === "judgeAssignments" ? opts.others : [], + ); + mockSelect.mockReturnValueOnce( + (opts.holders ?? []).map((judgeId) => ({ judgeId })), + ); + mockSelect.mockReturnValueOnce( + Object.entries(opts.remaining ?? {}).map(([judgeId, remaining]) => ({ + judgeId, + remaining, + })), + ); + }; + + // BUG: portal.ts:428-486 draws candidates from every judgeAssignments row + // with no isActive/status filter and sorts by fewest remaining, so a judge + // who was never activated (empty queue) sorts first and is handed the + // project it can never open. + it("never hands the project to a judge who is not active", async () => { + wireForceSkip({ + others: [ + { + judgeId: "inactive_judge", + track: null, + status: "pending", + judge: { id: "inactive_judge", isActive: false }, + }, + { + judgeId: "active_judge", + track: null, + status: "approved", + judge: { id: "active_judge", isActive: true }, + }, + ], + remaining: { inactive_judge: 0, active_judge: 4 }, + }); + + await judgeCaller().judge.forceSkipOvertime({ queueId: QUEUE_A }); + + const reassigned = insertedRows().find((r: any) => r.projectId === PROJECT_A); + expect(reassigned?.judgeId).toBe("active_judge"); + }); + + // A judge already holding this project must not be handed it twice — they + // would see the same table appear again later in their own queue. + it("never hands the project to a judge who already has it", async () => { + wireForceSkip({ + others: [ + { + judgeId: "has_it", + track: null, + judge: { id: "has_it", isActive: true }, + }, + { + judgeId: "free_judge", + track: null, + judge: { id: "free_judge", isActive: true }, + }, + ], + holders: [JUDGE_ID, "has_it"], + remaining: { has_it: 0, free_judge: 9 }, + }); + + await judgeCaller().judge.forceSkipOvertime({ queueId: QUEUE_A }); + + const reassigned = insertedRows().find( + (r: any) => r.projectId === PROJECT_A, + ); + expect(reassigned?.judgeId).toBe("free_judge"); + }); + + // Between two eligible judges the lighter queue wins, so the reassigned + // project is actually reached before judging closes. + it("prefers the judge with the fewest projects left", async () => { + wireForceSkip({ + others: [ + { + judgeId: "busy", + track: null, + judge: { id: "busy", isActive: true }, + }, + { + judgeId: "light", + track: null, + judge: { id: "light", isActive: true }, + }, + ], + remaining: { busy: 11, light: 2 }, + }); + + await judgeCaller().judge.forceSkipOvertime({ queueId: QUEUE_A }); + + const reassigned = insertedRows().find( + (r: any) => r.projectId === PROJECT_A, + ); + expect(reassigned?.judgeId).toBe("light"); + }); + + // BUG: portal.ts:422-424 loads myAssignment with no hackathonId filter and + // then uses myAssignment.hackathonId (not queueItem.hackathonId) for the + // reassignment row, orphaning it in the wrong hackathon. + it("files the reassignment under the hackathon the skipped project belongs to", async () => { + wireForceSkip({ + myAssignment: { judgeId: JUDGE_ID, hackathonId: HACK_B }, + others: [ + { + judgeId: "active_judge", + track: null, + status: "approved", + judge: { id: "active_judge", isActive: true }, + }, + ], + remaining: { active_judge: 1 }, + }); + + await judgeCaller().judge.forceSkipOvertime({ queueId: QUEUE_A }); + + const reassigned = insertedRows().find((r: any) => r.projectId === PROJECT_A); + expect(reassigned?.hackathonId).toBe(HACK_A); + }); + + // Both siblings (completeAndNext, skipProject) stamp startedAt on the slot + // they hand over. Without it here the next table stays unclaimed and the + // following judge to ask for work is sent to the table this judge just + // walked up to. + it("claims the table it hands the judge next", async () => { + wireForceSkip({ + others: [], + next: { + id: "queue_next", + judgeId: JUDGE_ID, + hackathonId: HACK_A, + projectId: "project_next", + project: { id: "project_next", tracks: [] }, + }, + }); + + const res = await judgeCaller().judge.forceSkipOvertime({ + queueId: QUEUE_A, + }); + + expect(res.queueId).toBe("queue_next"); + const claimed = mockUpdate.mock.calls.some( + (call: any) => + call[2]?.[0]?.startedAt instanceof Date && + !("isCompleted" in (call[2]?.[0] ?? {})), + ); + expect(claimed).toBe(true); + }); + + // BUG: with no judgeAssignments row the whole reassignment block is + // skipped (portal.ts:426) yet the response still looks like a success, so + // the project is dropped with nobody left to judge it. + it("reports that nothing was reassigned when the judge has no assignment row", async () => { + wireForceSkip({ myAssignment: undefined, others: [] }); + + const res = await judgeCaller().judge.forceSkipOvertime({ + queueId: QUEUE_A, + }); + expect(res).toHaveProperty("reassigned", false); + }); + }); + + // ===================================================================== + describe("6. Bulk assignment coverage", () => { + const projectsFor = (track: string, count: number, from = 1) => + Array.from({ length: count }, (_, i) => ({ + id: `${track}_${i + from}`, + hackathonId: HACK_A, + tracks: [track], + challenges: null, + tableNumber: i + from, + isCreateX: false, + })); + + const wireAssign = (opts: { + hackathonTracks: string[] | null; + assignments: Record[]; + projects: Record[]; + }) => { + mockFindFirst.mockImplementation((table: string) => { + if (table === "admins") return ADMIN_ROW; + if (table === "hackathons") + return { id: HACK_A, name: "Hacklytics", tracks: opts.hackathonTracks }; + return undefined; + }); + mockFindMany.mockImplementation((table: string) => { + if (table === "judgeAssignments") return opts.assignments; + if (table === "judgingProjects") return opts.projects; + return []; + }); + }; + + const runAssign = () => + adminCaller().judge.assignJudgesToProjects({ + hackathonId: HACK_A, + minProjects: 3, + maxProjects: 5, + shuffle: false, + autoCalculate: false, + }); + + const trackedJudges = [ + { judgeId: "j_sports", track: "Sports", judge: { name: "Sports Judge" } }, + { judgeId: "j_finance", track: "Finance", judge: { name: "Finance Judge" } }, + ]; + + it("caps each track judge at maxProjects when the hackathon tracks are configured", async () => { + wireAssign({ + hackathonTracks: ["Sports", "Finance"], + assignments: trackedJudges, + projects: [...projectsFor("Sports", 8), ...projectsFor("Finance", 8, 9)], + }); + + const res = await runAssign(); + + expect(res.success).toBe(true); + for (const a of res.assignments) { + expect(a.assignedCount).toBeLessThanOrEqual(5); + expect(a.assignedCount).toBeGreaterThanOrEqual(3); + } + expect(res.coverage.max).toBe(1); + }); + + // BUG: admin.ts:497 builds MAIN_TRACKS from hackathon.tracks. When that + // column is null every tracked judge is classified "special" + // (helpers.ts:67) and bypasses minProjects/maxProjects entirely. + it("still caps each judge at maxProjects when the hackathon has no tracks configured", async () => { + wireAssign({ + hackathonTracks: null, + assignments: trackedJudges, + projects: [...projectsFor("Sports", 8), ...projectsFor("Finance", 8, 9)], + }); + + const res = await runAssign(); + + for (const a of res.assignments) { + expect(a.assignedCount).toBeLessThanOrEqual(5); + } + }); + + // BUG: admin.ts:499-502 filters allAssignments by hackathonId only, so + // pending applicants whose judges row is isActive:false get real queue + // rows and inflate coverage.min even though isJudge will never let them in. + it("gives no queue to an applicant who has not been approved", async () => { + wireAssign({ + hackathonTracks: ["Sports"], + assignments: [ + { + judgeId: "j_approved", + track: "Sports", + status: "approved", + judge: { name: "Approved", isActive: true }, + }, + { + judgeId: "j_pending", + track: "Sports", + status: "pending", + judge: { name: "Pending", isActive: false }, + }, + ], + projects: projectsFor("Sports", 8), + }); + + const res = await runAssign(); + + const pending = res.assignments.find((a) => a.judgeId === "j_pending"); + expect(pending?.assignedCount).toBe(0); + }); + + // BUG: admin.ts:509-514 rejects zero projects but not zero judges, so an + // event with no judges reports success with coverage {min:0,max:0}. + it("refuses to run an assignment when the hackathon has no judges", async () => { + wireAssign({ + hackathonTracks: ["Sports"], + assignments: [], + projects: projectsFor("Sports", 8), + }); + + await expect(runAssign()).rejects.toThrow(/judge/i); + }); + + it("refuses an assignment run for a hackathon with no projects", async () => { + wireAssign({ + hackathonTracks: ["Sports"], + assignments: trackedJudges, + projects: [], + }); + + await expect(runAssign()).rejects.toThrow(/No projects found/); + }); + }); + + // ===================================================================== + describe("7. initializeQueue track filtering", () => { + const wireInit = ( + track: string, + projects: Record[], + judgeHackathonId: string = HACK_A, + ) => { + mockFindFirst.mockImplementation((table: string) => { + if (table === "admins") return ADMIN_ROW; + // The judge's own edition. initializeQueue reads this to refuse + // building a queue nobody could ever open. + if (table === "judges") return { hackathonId: judgeHackathonId }; + if (table === "judgeAssignments") + return { judgeId: JUDGE_ID, hackathonId: HACK_A, track }; + return undefined; + }); + mockFindMany.mockImplementation((table: string) => + table === "judgingProjects" ? projects : [], + ); + }; + + const pool = [ + { + id: PROJECT_A, + tracks: ["Sports"], + challenges: null, + isCreateX: false, + tableNumber: 1, + }, + { + id: PROJECT_B, + tracks: null, + challenges: null, + isCreateX: true, + tableNumber: 2, + }, + ]; + + it("queues only the projects carrying the judge's track", async () => { + wireInit("Sports", pool); + + const res = await adminCaller().judge.initializeQueue({ + judgeId: JUDGE_ID, + hackathonId: HACK_A, + shuffle: false, + }); + + expect(res).toMatchObject({ success: true, projectCount: 1 }); + expect(insertedRows()[0]).toMatchObject({ projectId: PROJECT_A }); + }); + + // BUG: admin.ts:433-440 omits the `track === 'createx' && p.isCreateX` + // branch that assignToHackathon (admin.ts:152) and buildCoverageQueues + // (helpers.ts:72) both apply, so re-initializing a createX judge silently + // wipes their entire workload and still reports success. + it("queues the createX pool for a judge assigned to the createX track", async () => { + wireInit("createX", pool); + + const res = await adminCaller().judge.initializeQueue({ + judgeId: JUDGE_ID, + hackathonId: HACK_A, + shuffle: false, + }); + + expect(res.projectCount).toBe(1); + }); + + /** + * A judges row belongs to one hackathon and isJudge authorizes against it, + * so a queue built across editions can never be opened — the projects in + * it are simply never scored, with nothing anywhere reporting a problem. + * assignToHackathon already refuses this; this path did not. + */ + it("refuses to build a queue for a judge from another hackathon", async () => { + wireInit("Sports", pool, HACK_B); + + await expect( + adminCaller().judge.initializeQueue({ + judgeId: JUDGE_ID, + hackathonId: HACK_A, + shuffle: false, + }), + ).rejects.toThrow(/different hackathon/i); + + expect(mockDelete).not.toHaveBeenCalled(); + }); + }); + + // ===================================================================== + describe("8. Removing a judge", () => { + // BUG: admin.ts:460-467 hard-deletes the judges row. judgeVotes.judgeId + // cascades, so every score that judge already submitted disappears and the + // normalization in getRankings shifts for every project. + it("refuses to delete a judge who has already submitted votes", async () => { + mockFindFirst.mockImplementation((table: string) => { + if (table === "admins") return ADMIN_ROW; + if (table === "judges") return JUDGE_ROW; + if (table === "judgeVotes") return { id: "vote_1", judgeId: JUDGE_ID }; + return undefined; + }); + mockFindMany.mockImplementation((table: string) => + table === "judgeVotes" ? [{ id: "vote_1", judgeId: JUDGE_ID }] : [], + ); + + await expect( + adminCaller().judge.remove({ judgeId: JUDGE_ID }), + ).rejects.toThrow(); + expect(mockDelete).not.toHaveBeenCalled(); + }); + + // isJudge caches the judges row for 60s under + // `judge:::role` (procedures.ts:97-110). Nothing in + // admin.ts clears that key explicitly — the protection comes from + // cacheInvalidationMiddleware (trpc.ts:181-198), which has no entry for + // `judge.remove` and so falls back to evicting the whole `judge:*` + // namespace. This test pins that fallback: without it, a revoked judge + // would keep force-skip rights for a full minute on every warm instance. + it("locks a removed judge out on their very next request", async () => { + wireJudge({ + project: { id: PROJECT_A, hackathonId: HACK_A }, + // The judge legitimately holds this project, so the vote turns only on + // whether they are still a judge. + queue: [{ id: QUEUE_A, judgeId: JUDGE_ID, projectId: PROJECT_A }], + }); + await judgeCaller().judge.submitVote({ projectId: PROJECT_A, ...scores }); + + mockFindFirst.mockImplementation((table: string) => + table === "admins" ? ADMIN_ROW : undefined, + ); + await adminCaller().judge.remove({ judgeId: JUDGE_ID }); + + // The judges row is gone now. + mockFindFirst.mockImplementation((table: string) => + table === "judgingProjects" + ? { id: PROJECT_A, hackathonId: HACK_A } + : undefined, + ); + + await expect( + judgeCaller().judge.submitVote({ projectId: PROJECT_A, ...scores }), + ).rejects.toThrow(/Judge access required/); + }); + }); + + // ===================================================================== + describe("9. Promoting submissions into judging", () => { + const asAdmin = () => + mockFindFirst.mockImplementation((table: string) => + table === "admins" ? ADMIN_ROW : undefined, + ); + + const submission = (id: string, extra: Record = {}) => ({ + id, + hackathonId: HACK_A, + name: `Project ${id}`, + description: "d", + tracks: ["AI"], + challenges: null, + isCreateX: false, + teamMembers: ["Ada", "Grace"], + githubUrl: null, + demoUrl: null, + team: null, + ...extra, + }); + + it("writes nothing when no project has been submitted", async () => { + asAdmin(); + mockFindMany.mockReturnValue([]); + + const res = await adminCaller().judge.promoteSubmissions({ + hackathonId: HACK_A, + }); + + expect(res).toMatchObject({ created: 0, total: 0 }); + expect(mockInsert).not.toHaveBeenCalled(); + }); + + // The whole point of the source link: an organiser presses this again as + // late submissions land, and must not get a second copy of every project + // with a fresh table number. + it("skips submissions that are already judgeable", async () => { + asAdmin(); + mockFindMany.mockImplementation((table: string) => { + if (table === "hackathonProjects") + return [submission("s1"), submission("s2")]; + if (table === "judgingProjects") + return [{ id: "jp1", sourceProjectId: "s1", tableNumber: 7 }]; + return []; + }); + mockSelect.mockResolvedValue([{ count: 0 }]); + + const res = await adminCaller().judge.promoteSubmissions({ + hackathonId: HACK_A, + }); + + expect(res).toMatchObject({ created: 1, alreadyPresent: 1, total: 2 }); + + const rows = mockInsert.mock.calls[0]?.[2]?.[0]; + expect(rows).toHaveLength(1); + expect(rows[0].sourceProjectId).toBe("s2"); + // Numbering continues past the highest table already handed out. + expect(rows[0].tableNumber).toBe(8); + }); + + // hackathon_project.teamMembers is text[]; judging_project.teamMembers is + // a single text column. Assigning the array straight across puts + // "[object Object]" on a judge's screen. + it("flattens the team member array into the scalar column", async () => { + asAdmin(); + mockFindMany.mockImplementation((table: string) => + table === "hackathonProjects" ? [submission("s1")] : [], + ); + mockSelect.mockResolvedValue([{ count: 0 }]); + + await adminCaller().judge.promoteSubmissions({ hackathonId: HACK_A }); + + const rows = mockInsert.mock.calls[0]?.[2]?.[0]; + expect(rows[0].teamMembers).toBe("Ada, Grace"); + }); + + // Queues are built from a snapshot of the project list. A project promoted + // afterwards is in nobody's queue and would never be judged, silently. + it("warns when queues already exist and new projects were added", async () => { + asAdmin(); + mockFindMany.mockImplementation((table: string) => + table === "hackathonProjects" ? [submission("s1")] : [], + ); + mockSelect.mockResolvedValue([{ count: 12 }]); + + const res = await adminCaller().judge.promoteSubmissions({ + hackathonId: HACK_A, + }); + + expect(res.queuesNeedRebuild).toBe(true); + }); + }); + + // ===================================================================== + describe("10. Rankings", () => { + const RANKING_PROJECTS = [ + { + id: "p_real", + name: "Real", + hackathonId: HACK_A, + tableNumber: 1, + votes: [ + { judgeId: "j_a", score: 45, judge: { user: { name: "A" } } }, + { judgeId: "j_b", score: 47, judge: { user: { name: "B" } } }, + ], + }, + { + id: "p_weak", + name: "Weak", + hackathonId: HACK_A, + tableNumber: 2, + votes: [ + { judgeId: "j_a", score: 30, judge: { user: { name: "A" } } }, + { judgeId: "j_b", score: 28, judge: { user: { name: "B" } } }, + ], + }, + { + id: "p_hype", + name: "Hype", + hackathonId: HACK_A, + tableNumber: 3, + votes: [{ judgeId: "j_single", score: 50, judge: { user: { name: "S" } } }], + }, + ]; + + it("does not let a lone perfect score from a single-vote judge take first place", async () => { + mockFindFirst.mockImplementation((table: string) => + table === "admins" ? ADMIN_ROW : undefined, + ); + mockFindMany.mockImplementation((table: string) => + table === "judgingProjects" ? RANKING_PROJECTS : [], + ); + + const res = await adminCaller().judge.getRankings({ hackathonId: HACK_A }); + + expect(res.rankings[0]?.project.id).toBe("p_real"); + const hype = res.rankings.find((r) => r.project.id === "p_hype"); + // zNormalize (helpers.ts:27) replaces a single-vote judge's score with + // the global mean, so the 50 is erased entirely. + expect(hype?.confidenceLevel).toBe("LOW"); + expect(hype?.normalizedAvg).toBe(res.globalAvg); + expect(hype?.scoreShift).toBe(-10); + }); + + // rankings.ts:324 caches the leaderboard for 30s, which would be long + // enough for two organizers to read two different top-3 orderings while + // calling winners. The save is CACHE_INVALIDATION_MAP["judge.submitVote"] + // (trpc.ts:158), which evicts `hackathon:*:rankings` after every vote. + it("shows a vote submitted moments earlier on the next rankings read", async () => { + mockFindFirst.mockImplementation((table: string) => + table === "admins" ? ADMIN_ROW : undefined, + ); + mockFindMany.mockImplementation((table: string) => + table === "judgingProjects" + ? [{ ...RANKING_PROJECTS[0], votes: [] }] + : [], + ); + const before = await adminCaller().judge.getRankings({ hackathonId: HACK_A }); + expect(before.rankings[0]?.voteCount).toBe(0); + + wireJudge({ + project: { id: "p_real", hackathonId: HACK_A }, + queue: [{ id: QUEUE_A, judgeId: JUDGE_ID, projectId: PROJECT_A }], + }); + await judgeCaller().judge.submitVote({ projectId: PROJECT_A, ...scores }); + + mockFindFirst.mockImplementation((table: string) => + table === "admins" ? ADMIN_ROW : undefined, + ); + mockFindMany.mockImplementation((table: string) => + table === "judgingProjects" ? [RANKING_PROJECTS[0]] : [], + ); + const after = await adminCaller().judge.getRankings({ hackathonId: HACK_A }); + + expect(after.rankings[0]?.voteCount).toBe(2); + }); + }); + + // ===================================================================== + describe("11. Judge analytics", () => { + // The judge an organizer needs mid-event is the one who has not started, so + // the list is driven by the queues as well as the votes. Iterating votes + // alone drops them entirely and they read as "not in this hackathon". + it("lists a judge who has a queue but has not started voting", async () => { + mockFindFirst.mockImplementation((table: string) => + table === "admins" ? ADMIN_ROW : undefined, + ); + mockSelect + .mockReturnValueOnce([ + { + judgeId: "j_busy", + projectId: PROJECT_A, + score: 40, + durationSeconds: 600, + judgeName: "Busy", + judgeUserId: "u_busy", + }, + ]) + .mockReturnValueOnce([ + { judgeId: "j_busy", total: 5, completed: 1 }, + { judgeId: "j_idle", total: 6, completed: 0 }, + ]); + + const res = (await adminCaller().judge.getJudgeAnalytics({ + hackathonId: HACK_A, + })) as { analytics: { judgeId: string; votesSubmitted: number }[] }; + + const idle = res.analytics.find((a) => a.judgeId === "j_idle"); + expect(idle).toBeDefined(); + expect(idle?.votesSubmitted).toBe(0); + }); + }); + + // ===================================================================== + describe("12. getMyAssignments hackathon resolution", () => { + // BUG: getMyAssignments takes no input, so isJudge falls back to the + // newest hackathon by startDate (procedures.ts:82-88). A judge for an + // older hackathon — or every current judge the moment a future draft row + // is created — is locked out of the procedure that lists their hackathons. + it("lets a judge list their assignments when a newer hackathon exists", async () => { + // The user judges HACK_A. HACK_B is newer by startDate, so the middleware + // resolves the context to HACK_B and finds no judges row there. + mockFindFirst.mockImplementation((table: string) => { + if (table === "hackathons") return { id: HACK_B }; + if (table === "judges") return undefined; + return undefined; + }); + mockFindMany.mockImplementation((table: string) => + table === "judgeAssignments" + ? [{ judgeId: JUDGE_ID, hackathonId: HACK_A }] + : [], + ); + + await expect(judgeCaller().judge.getMyAssignments()).resolves.toBeDefined(); + }); + + it("reports no judging context when the platform has no hackathons at all", async () => { + mockFindFirst.mockImplementation(() => undefined); + + await expect(judgeCaller().judge.getMyAssignments()).rejects.toThrow( + /No hackathon context found for judging/, + ); + }); + }); + + // ===================================================================== + describe("13. Two judges, one table", () => { + const BUSY = { + id: QUEUE_A, + projectId: PROJECT_A, + order: 1, + project: { id: PROJECT_A, name: "Busy Table", tableNumber: 1 }, + }; + const FREE = { + id: "queue_b", + projectId: PROJECT_B, + order: 2, + project: { id: PROJECT_B, name: "Free Table", tableNumber: 2 }, + }; + + /** First judgeQueue.findMany is this judge's queue, second is the claims. */ + const wireQueue = (queue: unknown[], claims: unknown[]) => { + wireJudge({}); + let calls = 0; + mockFindMany.mockImplementation((table: string) => { + if (table !== "judgeQueue") return []; + calls += 1; + return calls === 1 ? queue : claims; + }); + }; + + it("routes around a table another judge is already standing at", async () => { + wireQueue( + [BUSY, FREE], + [{ projectId: PROJECT_A, startedAt: new Date() }], + ); + + const res = await judgeCaller().judge.getNextTable({ + hackathonId: HACK_A, + }); + + // Sent to the free table, and nothing in the response hints that a table + // was passed over — the judge has nothing to decide or dismiss. + expect(res.project).toMatchObject({ tableNumber: 2 }); + expect(res.queueId).toBe("queue_b"); + expect(res.done).toBe(false); + // The skipped table is still owed, so it stays in the count. + expect(res.remaining).toBe(2); + }); + + it("hands over a table whose claim has gone stale", async () => { + // Nothing comes back from the claim query once the window has passed, + // so an abandoned table needs no admin to release it. + wireQueue([BUSY, FREE], []); + + const res = await judgeCaller().judge.getNextTable({ + hackathonId: HACK_A, + }); + + expect(res.project).toMatchObject({ tableNumber: 1 }); + expect(res.queueId).toBe(QUEUE_A); + }); + + it("serves a claimed table rather than stranding a judge with nothing to do", async () => { + const now = Date.now(); + wireQueue( + [BUSY, FREE], + [ + { projectId: PROJECT_A, startedAt: new Date(now - 9 * 60 * 1000) }, + { projectId: PROJECT_B, startedAt: new Date(now - 1 * 60 * 1000) }, + ], + ); + + const res = await judgeCaller().judge.getNextTable({ + hackathonId: HACK_A, + }); + + // Every table is busy, so the judge still gets one — the table claimed + // longest ago, being the one most likely to be free by the time they + // walk over. + expect(res.done).toBe(false); + expect(res.project).toMatchObject({ tableNumber: 1 }); + }); + + it("claims the table it hands out, so the next judge routes around it", async () => { + wireQueue([BUSY, FREE], []); + + await judgeCaller().judge.getNextTable({ hackathonId: HACK_A }); + + const claimWrite = mockUpdate.mock.calls.find( + (call) => call[2]?.[0]?.startedAt instanceof Date, + ); + expect(claimWrite).toBeDefined(); + }); + }); + + // ===================================================================== + describe("12. Freezing results", () => { + const wireResults = (opts: { + judgingActive?: boolean; + published?: Record; + }) => { + mockFindFirst.mockImplementation((table: string) => { + if (table === "admins") return ADMIN_ROW; + if (table === "hackathons") + return { id: HACK_A, judgingActive: opts.judgingActive ?? false }; + if (table === "hackathonResults") return opts.published; + return undefined; + }); + mockFindMany.mockReturnValue([]); + }; + + /** + * The z-score normalisation runs over the whole vote set, so one late vote + * shifts every project's score. A snapshot taken while judging is live is + * already stale by the time anyone reads it. + */ + it("refuses to freeze results while judging is still live", async () => { + wireResults({ judgingActive: true }); + + await expect( + adminCaller().judge.computeResults({ hackathonId: HACK_A }), + ).rejects.toThrow(/still live/i); + + expect(mockInsert).not.toHaveBeenCalled(); + }); + + it("computes once judging has closed", async () => { + wireResults({ judgingActive: false }); + + const res = await adminCaller().judge.computeResults({ + hackathonId: HACK_A, + }); + + // No projects wired, so nothing to place — but it got past the guard. + expect(res).toMatchObject({ computed: 0 }); + }); + + // Recomputing under a published ordering would change placings people + // have already been told about, with no record that it happened. + it("refuses to recompute over published results", async () => { + wireResults({ judgingActive: false, published: { id: "r1" } }); + + await expect( + adminCaller().judge.computeResults({ hackathonId: HACK_A }), + ).rejects.toThrow(/already published/i); + }); + + it("refuses to publish when nothing has been computed", async () => { + wireResults({ judgingActive: false }); + mockUpdate.mockReturnValue([]); + + await expect( + adminCaller().judge.publishResults({ hackathonId: HACK_A }), + ).rejects.toThrow(/compute the results first/i); + }); + }); +}); \ No newline at end of file diff --git a/packages/api/src/.internal-tests/participant-edge.test.ts b/packages/api/src/.internal-tests/participant-edge.test.ts new file mode 100644 index 00000000..9fe5f807 --- /dev/null +++ b/packages/api/src/.internal-tests/participant-edge.test.ts @@ -0,0 +1,1166 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import { appRouter } from "../root"; +import { cache } from "../middleware/cache"; +import { + db, + hackathons, + hackathonParticipants, + hackathonTeams, + hackathonProjects, + members, + membershipHistory, +} from "@query/db"; +import { __onRollback } from "./_db-tx-mock"; + +// Same file-level DB mock as hackathon-flow.test.ts: every drizzle entry point +// is a spy, and each test supplies a table-name-keyed findFirst implementation. +const mockFindFirst = vi.fn(); +const mockFindMany = vi.fn(); +const mockInsert = vi.fn(); +const mockUpdate = vi.fn(); +const mockDelete = vi.fn(); + +vi.mock("@query/db", async () => { + const { createTransactionMock } = await import("./_db-tx-mock"); + + const table = (name: string) => ({ + findFirst: (...args: any[]) => mockFindFirst(name, ...args), + findMany: (...args: any[]) => mockFindMany(name, ...args), + }); + + return { + db: { + // Every hook is wrapped rather than passed by reference: the factory is + // hoisted above the `const mock*` declarations, so it may only close over + // them, never read them. + transaction: createTransactionMock({ + base: () => db, + update: (...a: any[]) => mockUpdate(...a), + insert: (...a: any[]) => mockInsert(...a), + }), + query: { + admins: table("admins"), + users: table("users"), + userProfiles: table("userProfiles"), + hackathons: table("hackathons"), + hackathonParticipants: table("hackathonParticipants"), + hackathonTeams: table("hackathonTeams"), + hackathonProjects: table("hackathonProjects"), + hackathonEvents: table("hackathonEvents"), + hackathonEventAttendees: table("hackathonEventAttendees"), + members: table("members"), + membershipHistory: table("membershipHistory"), + events: table("events"), + eventCheckIns: table("eventCheckIns"), + judges: table("judges"), + judgeAssignments: table("judgeAssignments"), + judgingProjects: table("judgingProjects"), + judgeVotes: table("judgeVotes"), + judgeQueue: table("judgeQueue"), + stripePayments: table("stripePayments"), + userAccountLinks: table("userAccountLinks"), + auditLogs: table("auditLogs"), + }, + insert: (...insertArgs: any[]) => ({ + values: (...valArgs: any[]) => { + const val = mockInsert("insert", insertArgs, valArgs); + return Object.assign(Promise.resolve(val), { + returning: vi.fn().mockResolvedValue(val), + onConflictDoUpdate: vi.fn().mockImplementation(() => ({ + returning: vi.fn().mockResolvedValue(val), + })), + }); + }, + }), + update: (...updateArgs: any[]) => ({ + set: (...setArgs: any[]) => ({ + where: (...wArgs: any[]) => { + const val = mockUpdate("update", updateArgs, setArgs, wArgs); + return Object.assign(Promise.resolve(val), { + returning: vi.fn().mockResolvedValue(val), + }); + }, + }), + }), + delete: (...deleteArgs: any[]) => ({ + where: (...wArgs: any[]) => { + const val = mockDelete("delete", deleteArgs, wArgs); + return Object.assign(Promise.resolve(val), { + returning: vi.fn().mockResolvedValue(val), + }); + }, + }), + select: vi.fn().mockImplementation(() => ({ + from: vi.fn().mockImplementation(() => ({ + where: vi.fn().mockImplementation(() => ({ + orderBy: vi.fn().mockResolvedValue([{ count: 0 }]), + groupBy: vi.fn().mockResolvedValue([]), + limit: vi.fn().mockResolvedValue([]), + offset: vi.fn().mockResolvedValue([]), + // `.for("update")` row-locks before a seat recount. + for: vi.fn().mockResolvedValue([{ count: 0 }]), + })), + orderBy: vi.fn().mockResolvedValue([{ count: 0 }]), + groupBy: vi.fn().mockResolvedValue([]), + innerJoin: vi.fn().mockImplementation(() => ({ + innerJoin: vi.fn().mockImplementation(() => ({ + where: vi.fn().mockResolvedValue([]), + })), + where: vi.fn().mockResolvedValue([]), + })), + })), + })), + }, + admins: { userId: "user_id", isActive: "is_active", role: "role" }, + users: { id: "id", email: "email", name: "name", image: "image" }, + userProfiles: { userId: "user_id" }, + hackathons: { + id: "id", + name: "name", + status: "status", + isPublic: "is_public", + startDate: "start_date", + endDate: "end_date", + hackingStartTime: "hacking_start_time", + registrationDeadline: "registration_deadline", + judgingActive: "judging_active", + currentParticipants: "current_participants", + maxParticipants: "max_participants", + }, + hackathonParticipants: { + id: "id", + hackathonId: "hackathon_id", + userId: "user_id", + teamId: "team_id", + registrationStatus: "registration_status", + hasSubmittedProject: "has_submitted_project", + registeredAt: "registered_at", + }, + hackathonTeams: { + id: "id", + hackathonId: "hackathon_id", + name: "name", + captainId: "captain_id", + currentMembers: "current_members", + maxMembers: "max_members", + isOpen: "is_open", + createdAt: "created_at", + }, + hackathonProjects: { + id: "id", + hackathonId: "hackathon_id", + teamId: "team_id", + name: "name", + status: "status", + }, + hackathonEvents: { id: "id", hackathonId: "hackathon_id", name: "name" }, + hackathonEventAttendees: { + eventId: "event_id", + participantId: "participant_id", + }, + members: { + id: "id", + userId: "user_id", + hackathonId: "hackathon_id", + isActive: "is_active", + memberType: "member_type", + membershipEndDate: "membership_end_date", + }, + membershipHistory: { id: "id", memberId: "member_id" }, + events: { + id: "id", + title: "title", + qrCode: "qr_code", + checkInEnabled: "check_in_enabled", + eventDate: "event_date", + currentCheckIns: "current_check_ins", + }, + eventCheckIns: { id: "id", eventId: "event_id", userId: "user_id" }, + judges: { + id: "id", + userId: "user_id", + hackathonId: "hackathon_id", + isActive: "is_active", + }, + judgeAssignments: { judgeId: "judge_id", hackathonId: "hackathon_id" }, + judgingProjects: { + id: "id", + hackathonId: "hackathon_id", + tableNumber: "table_number", + }, + judgeVotes: { judgeId: "judge_id", projectId: "project_id", score: "score" }, + judgeQueue: { + id: "id", + judgeId: "judge_id", + hackathonId: "hackathon_id", + isCompleted: "is_completed", + }, + stripePayments: { + id: "id", + customerEmail: "customer_email", + stripePaymentIntentId: "stripe_payment_intent_id", + }, + userAccountLinks: { userId: "user_id", stripePaymentId: "stripe_payment_id" }, + auditLogs: { id: "id", severity: "severity", userId: "user_id" }, + }; +}); + +const HOUR = 60 * 60 * 1000; +const DAY = 24 * HOUR; + +const HACK_A = "11111111-1111-4111-8111-111111111111"; +const HACK_NEXT = "22222222-2222-4222-8222-222222222222"; +const TEAM_A = "77777777-7777-4777-8777-777777777777"; +const PARTICIPANT_A = "33333333-3333-4333-8333-333333333333"; +const PARTICIPANT_B = "44444444-4444-4444-8444-444444444444"; +const PROJECT_A = "66666666-6666-4666-8666-666666666666"; + +const createMockCtx = (userId?: string) => + ({ + db, + session: userId ? { user: { id: userId } } : null, + userId: userId || undefined, + cache, + clientIp: "127.0.0.1", + req: { headers: { get: () => null } }, + }) as any; + +const callerFor = (userId?: string) => + appRouter.createCaller(createMockCtx(userId)); + +/** A running hackathon whose hacking clock started `hours` ago. */ +const runningHackathon = (hours: number, overrides: Record = {}) => ({ + id: HACK_A, + name: "Data for Good", + status: "open", + startDate: new Date(Date.now() - hours * HOUR), + endDate: new Date(Date.now() + 24 * HOUR), + hackingStartTime: new Date(Date.now() - hours * HOUR), + registrationDeadline: new Date(Date.now() + 5 * DAY), + maxParticipants: 500, + currentParticipants: 10, + ...overrides, +}); + +const projectInput = (overrides: Record = {}) => ({ + hackathonId: HACK_A, + name: "Flood Risk Mapper", + description: "Maps flood risk from open census and elevation data.", + ...overrides, +}); + +const registrationInput = (overrides: Record = {}) => ({ + hackathonId: HACK_A, + firstName: "Ada", + lastName: "Lovelace", + phone: "555-0100", + age: 20, + school: "Georgia Tech", + major: "Computer Science", + graduationYear: 2027, + levelOfStudy: "Junior" as const, + country: "United States", + agreeToCodeOfConduct: true as const, + ...overrides, +}); + +/** Tables touched by insert/update/delete, so tests can assert on writes. */ +const insertedInto = (t: unknown) => + mockInsert.mock.calls.filter((c) => c[1]?.[0] === t); +const updatedTables = () => mockUpdate.mock.calls.map((c) => c[1]?.[0]); +const deletedTables = () => mockDelete.mock.calls.map((c) => c[1]?.[0]); + +describe("Participant edge cases", () => { + beforeEach(() => { + vi.clearAllMocks(); + // clearAllMocks keeps implementations, so per-test write simulations would + // leak into the next test. Reset the five drizzle entry points explicitly. + mockFindFirst.mockReset(); + mockFindMany.mockReset().mockReturnValue([]); + mockInsert.mockReset().mockReturnValue([]); + mockUpdate.mockReset().mockReturnValue([]); + mockDelete.mockReset().mockReturnValue([]); + cache.clear(); + }); + + // ===================================================================== + describe("1. Project submission ownership", () => { + /** A participant who belongs to a team captained by someone else. */ + const teammateCaller = ( + hoursIn: number, + opts: { + captainId?: string; + status?: string; + hackathonStatus?: string; + existingProject?: Record; + } = {}, + ) => { + // A project that has been inserted is findable afterwards, so a resubmit + // sees the row the first submit created rather than an empty table. + let projectRow = opts.existingProject; + mockFindFirst.mockImplementation((table) => { + if (table === "hackathons") + return runningHackathon(hoursIn, { + status: opts.hackathonStatus ?? "open", + }); + if (table === "hackathonParticipants") + return { + id: PARTICIPANT_A, + hackathonId: HACK_A, + userId: "user_a", + teamId: TEAM_A, + registrationStatus: opts.status ?? "approved", + team: { id: TEAM_A, captainId: opts.captainId ?? "captain_user" }, + }; + if (table === "hackathonTeams") + return { + id: TEAM_A, + hackathonId: HACK_A, + captainId: opts.captainId ?? "captain_user", + currentMembers: 3, + maxMembers: 4, + }; + if (table === "hackathonProjects") return projectRow; + return undefined; + }); + mockInsert.mockImplementation((_op, insertArgs, valArgs) => { + if (insertArgs[0] === hackathonProjects) { + projectRow = { id: PROJECT_A, status: "submitted", ...valArgs[0] }; + } + return [{ id: PROJECT_A, status: "submitted" }]; + }); + mockUpdate.mockReturnValue([{ id: PROJECT_A, status: "submitted" }]); + return callerFor("user_a"); + }; + + // BUG: team.ts:515-542 only enforces captain ownership inside + // `if (input.teamId)`. Omitting teamId skips the check entirely. + it("refuses a submission from a team member who is not the captain", async () => { + const caller = teammateCaller(20); + + await expect( + caller.team.submitProject(projectInput()), + ).rejects.toThrow(/captain/i); + }); + + // BUG: team.ts:494 only looks up an existing project when input.teamId is + // set, so the teamId-less path always takes the INSERT branch. + it("updates the existing project instead of inserting a duplicate on resubmit", async () => { + // Starts with nothing filed: the first submit creates the project, the + // second has to find and update it rather than file a second row. + const caller = teammateCaller(20, { captainId: "user_a" }); + + await caller.team.submitProject(projectInput()); + await caller.team.submitProject(projectInput({ name: "Renamed" })); + + expect(insertedInto(hackathonProjects)).toHaveLength(1); + expect(updatedTables()).toContain(hackathonProjects); + }); + + // BUG: submitProject reads hackingStartTime/startDate off the hackathon but + // never inspects hackathon.status (team.ts:453-464). + it("refuses a submission to a cancelled hackathon", async () => { + const caller = teammateCaller(20, { + captainId: "user_a", + hackathonStatus: "cancelled", + }); + + await expect( + caller.team.submitProject(projectInput({ teamId: TEAM_A })), + ).rejects.toThrow(/cancelled|not open|closed/i); + }); + + it("accepts a captain's submission landing exactly on the +36h hard deadline", async () => { + // Freeze on the real clock: winding the system clock backwards would + // drive the rate limiter's token refill negative. + vi.useFakeTimers(); + try { + const caller = teammateCaller(36, { captainId: "user_a" }); + + const res = await caller.team.submitProject( + projectInput({ teamId: TEAM_A }), + ); + expect(res).toMatchObject({ id: PROJECT_A }); + } finally { + vi.useRealTimers(); + } + }); + + it("still allows an edit landing exactly on the +34h devpost freeze", async () => { + // Freeze on the real clock: winding the system clock backwards would + // drive the rate limiter's token refill negative. + vi.useFakeTimers(); + try { + const caller = teammateCaller(34, { + captainId: "user_a", + existingProject: { id: PROJECT_A, status: "submitted" }, + }); + + const res = await caller.team.submitProject( + projectInput({ teamId: TEAM_A }), + ); + expect(res).toMatchObject({ id: PROJECT_A }); + expect(insertedInto(hackathonProjects)).toHaveLength(0); + } finally { + vi.useRealTimers(); + } + }); + }); + + // ===================================================================== + describe("2. Team window milestones", () => { + /** Frozen on the real clock so "now" is exact to the millisecond. */ + let FIXED: Date; + + beforeEach(() => { + vi.useFakeTimers(); + FIXED = new Date(); + }); + afterEach(() => { + vi.useRealTimers(); + }); + + /** Places "now" exactly `offsetMs` after the hacking start. */ + const atOffset = (offsetMs: number, participant?: Record) => { + mockFindFirst.mockImplementation((table) => { + if (table === "hackathons") + return { + id: HACK_A, + status: "open", + startDate: new Date(FIXED.getTime() - offsetMs), + endDate: new Date(FIXED.getTime() + 24 * HOUR), + hackingStartTime: new Date(FIXED.getTime() - offsetMs), + }; + if (table === "hackathonParticipants") + return participant ?? { id: PARTICIPANT_A, teamId: null }; + if (table === "hackathonTeams") + return { + id: TEAM_A, + hackathonId: HACK_A, + captainId: "other_user", + currentMembers: 2, + maxMembers: 4, + isOpen: true, + }; + return undefined; + }); + mockInsert.mockReturnValue([{ id: TEAM_A, name: "meow" }]); + return callerFor("user_a"); + }; + + it.each([ + { label: "+12h, the instant the window opens", offset: 12 * HOUR, isOpen: true, canLeave: true }, + { label: "+24h, the instant rosters lock", offset: 24 * HOUR, isOpen: true, canLeave: false }, + { label: "+34h, the instant the window closes", offset: 34 * HOUR, isOpen: true, canLeave: false }, + { label: "+36h, the submission hard deadline", offset: 36 * HOUR, isOpen: false, canLeave: false }, + ])( + "reports $label as open=$isOpen, canLeave=$canLeave", + async ({ offset, isOpen, canLeave }) => { + const caller = atOffset(offset); + + const res = await caller.team.window({ hackathonId: HACK_A }); + expect(res.isOpen).toBe(isOpen); + expect(res.canCreate).toBe(isOpen); + expect(res.canJoin).toBe(isOpen); + expect(res.canLeave).toBe(canLeave); + }, + ); + + it("lets a team form at exactly +12h but not one millisecond earlier", async () => { + const early = atOffset(12 * HOUR - 1); + await expect( + early.team.createTeam({ hackathonId: HACK_A, name: "meow", maxMembers: 4 }), + ).rejects.toThrow(/not open yet/); + + const onTime = atOffset(12 * HOUR); + await expect( + onTime.team.createTeam({ hackathonId: HACK_A, name: "meow", maxMembers: 4 }), + ).resolves.toMatchObject({ id: TEAM_A }); + }); + + it("lets a team form at exactly +34h but not one millisecond later", async () => { + const onTime = atOffset(34 * HOUR); + await expect( + onTime.team.createTeam({ hackathonId: HACK_A, name: "meow", maxMembers: 4 }), + ).resolves.toMatchObject({ id: TEAM_A }); + + const late = atOffset(34 * HOUR + 1); + await expect( + late.team.createTeam({ hackathonId: HACK_A, name: "meow", maxMembers: 4 }), + ).rejects.toThrow(/closed/); + }); + + it("refuses to let a member leave from the exact instant rosters lock at +24h", async () => { + const locked = atOffset(24 * HOUR, { + id: PARTICIPANT_A, + teamId: TEAM_A, + }); + await expect( + locked.team.leaveTeam({ hackathonId: HACK_A }), + ).rejects.toThrow(/within 12 hours of the project deadline/); + + const stillOpen = atOffset(24 * HOUR - 1, { + id: PARTICIPANT_A, + teamId: TEAM_A, + }); + await expect( + stillOpen.team.leaveTeam({ hackathonId: HACK_A }), + ).resolves.toMatchObject({ success: true }); + }); + }); + + // ===================================================================== + describe("3. Roster changes during the freeze", () => { + const captainCaller = ( + hoursIn: number, + opts: { currentMembers?: number; project?: Record } = {}, + ) => { + mockFindFirst.mockImplementation((table) => { + if (table === "hackathons") return runningHackathon(hoursIn); + if (table === "hackathonParticipants") + return { + id: PARTICIPANT_A, + hackathonId: HACK_A, + userId: "user_a", + teamId: TEAM_A, + registrationStatus: "approved", + }; + if (table === "hackathonTeams") + return { + id: TEAM_A, + hackathonId: HACK_A, + captainId: "user_a", + currentMembers: opts.currentMembers ?? 3, + maxMembers: 4, + isOpen: true, + }; + if (table === "hackathonProjects") return opts.project; + return undefined; + }); + return callerFor("user_a"); + }; + + // BUG: disbandTeam calls checkTeamEditWindow (opensAt/closesAt only) and + // never consults window.canLeave the way leaveTeam does at team.ts:255. + it("refuses to disband a team once rosters have locked at +24h", async () => { + const caller = captainCaller(30, { + project: { id: PROJECT_A, teamId: TEAM_A, status: "submitted" }, + }); + + await expect( + caller.team.disbandTeam({ hackathonId: HACK_A, teamId: TEAM_A }), + ).rejects.toThrow(/lock|leave|within 12 hours/i); + }); + + // BUG: team.ts:293-309 deletes hackathonProjects unconditionally when a + // solo captain leaves — no check on project.status. + it("keeps a submitted project when its solo captain leaves the team", async () => { + const caller = captainCaller(20, { + currentMembers: 1, + project: { id: PROJECT_A, teamId: TEAM_A, status: "submitted" }, + }); + + await caller.team.leaveTeam({ hackathonId: HACK_A }).catch(() => undefined); + + expect(deletedTables()).not.toContain(hackathonProjects); + }); + + // leaveTeam and disbandTeam both refuse while a submission stands and tell + // the captain to withdraw it first, so that has to be something they can + // actually do — otherwise both flows are dead ends. + it("lets the captain withdraw the submission the disband error names", async () => { + const caller = captainCaller(20, { + currentMembers: 1, + project: { id: PROJECT_A, teamId: TEAM_A, status: "submitted" }, + }); + + await expect( + caller.team.disbandTeam({ hackathonId: HACK_A, teamId: TEAM_A }), + ).rejects.toThrow(/withdrawn/i); + + await expect( + caller.team.withdrawProject({ hackathonId: HACK_A }), + ).resolves.toMatchObject({ success: true }); + + const setStatuses = mockUpdate.mock.calls + .filter((c) => c[1]?.[0] === hackathonProjects) + .map((c) => c[2]?.[0]?.status); + expect(setStatuses).toContain("draft"); + }); + + it("refuses to withdraw once judging has the project", async () => { + const caller = captainCaller(20, { + currentMembers: 1, + project: { id: PROJECT_A, teamId: TEAM_A, status: "judging" }, + }); + + await expect( + caller.team.withdrawProject({ hackathonId: HACK_A }), + ).rejects.toThrow(/Judging has started/i); + }); + }); + + // ===================================================================== + describe("4. Registration status gates team actions", () => { + const rejectedApplicant = (status: string) => { + mockFindFirst.mockImplementation((table) => { + if (table === "hackathons") return runningHackathon(20); + if (table === "hackathonParticipants") + return { + id: PARTICIPANT_A, + hackathonId: HACK_A, + userId: "user_a", + teamId: null, + registrationStatus: status, + }; + if (table === "hackathonTeams") + return { + id: TEAM_A, + hackathonId: HACK_A, + captainId: "user_a", + currentMembers: 1, + maxMembers: 4, + isOpen: true, + }; + return undefined; + }); + mockInsert.mockReturnValue([{ id: TEAM_A, name: "meow" }]); + return callerFor("user_a"); + }; + + // BUG: createTeam/joinTeam/submitProject only assert that a participant row + // exists (team.ts:98, 170, 445) — registrationStatus is never inspected, + // unlike hackathon.scanParticipantPass. + it.each(["rejected", "waitlisted"])( + "keeps a %s applicant out of teams and out of judging", + async (status) => { + const caller = rejectedApplicant(status); + + await expect( + caller.team.createTeam({ hackathonId: HACK_A, name: "meow", maxMembers: 4 }), + ).rejects.toThrow(new RegExp(status)); + await expect( + caller.team.joinTeam({ hackathonId: HACK_A, teamId: TEAM_A }), + ).rejects.toThrow(new RegExp(status)); + await expect( + caller.team.submitProject(projectInput()), + ).rejects.toThrow(new RegExp(status)); + }, + ); + }); + + // ===================================================================== + describe("5. Concurrent team mutations", () => { + // The seat is taken by `update ... where currentMembers < maxMembers`, so + // the count each caller read is only a hint; the UPDATE re-tests it. A + // plain `team.currentMembers + 1` written from the snapshot would be a lost + // update and would seat five people in a team of four. + it("admits only one of two racing joins into the last free seat", async () => { + // A team with 3 of 4 seats taken. findFirst hands out snapshots, exactly + // as an unlocked SELECT inside a transaction would. + const teamRow = { + id: TEAM_A, + hackathonId: HACK_A, + captainId: "captain_user", + currentMembers: 3, + maxMembers: 4, + isOpen: true, + }; + let participantLookups = 0; + + mockFindFirst.mockImplementation((table) => { + if (table === "hackathons") return runningHackathon(20); + if (table === "hackathonParticipants") { + participantLookups += 1; + return { + id: participantLookups === 1 ? PARTICIPANT_A : PARTICIPANT_B, + hackathonId: HACK_A, + teamId: null, + registrationStatus: "approved", + }; + } + if (table === "hackathonTeams") return { ...teamRow }; + return undefined; + }); + mockUpdate.mockImplementation((_op, updateArgs) => { + // `where currentMembers < maxMembers` is re-evaluated against the row + // as it stands when the statement runs — not against the snapshot the + // caller read — and rowCount reports whether it matched. That is the + // whole reason the capacity test lives in the UPDATE, so the stand-in + // has to re-check it too rather than blindly applying the write. + if (updateArgs[0] === hackathonTeams) { + if (teamRow.currentMembers >= teamRow.maxMembers) + return { rowCount: 0 }; + teamRow.currentMembers += 1; + return { rowCount: 1 }; + } + // Each caller claims their own participant row, and both start with + // teamId null, so `where teamId is null` matches for both. + return { rowCount: 1 }; + }); + + const results = await Promise.allSettled([ + callerFor("user_a").team.joinTeam({ hackathonId: HACK_A, teamId: TEAM_A }), + callerFor("user_b").team.joinTeam({ hackathonId: HACK_A, teamId: TEAM_A }), + ]); + + const rejected = results.filter((r) => r.status === "rejected"); + expect(rejected).toHaveLength(1); + expect(String((rejected[0] as PromiseRejectedResult)?.reason)).toMatch( + /full/, + ); + // Both writers computed 3 + 1, so the counter reads 4 while five people + // actually hold teamId = TEAM_A. + expect(teamRow.currentMembers).toBe(4); + }); + + // Both clicks read teamId = null and both insert a team; what stops the + // orphan — a team with currentMembers=1 and a captain who is not in it, + // still listed and still accepting joins — is that the slot claim is + // `where teamId is null`, so the loser matches no row and takes its own + // insert down with the transaction. + it("creates only one team when a participant double-clicks Create", async () => { + const participantRow = { + id: PARTICIPANT_A, + hackathonId: HACK_A, + userId: "user_a", + teamId: null as string | null, + registrationStatus: "approved", + }; + let created = 0; + + mockFindFirst.mockImplementation((table) => { + if (table === "hackathons") return runningHackathon(20); + if (table === "hackathonParticipants") return { ...participantRow }; + return undefined; + }); + mockInsert.mockImplementation((_op, insertArgs) => { + if (insertArgs[0] === hackathonTeams) { + created += 1; + // A team inserted by the transaction that then loses the slot claim + // never existed — counting attempts instead of surviving rows would + // call the rollback a failure. + __onRollback(() => { + created -= 1; + }); + return [{ id: `team_${created}`, name: "meow" }]; + } + return []; + }); + mockUpdate.mockImplementation((_op, updateArgs, setArgs) => { + if (updateArgs[0] === hackathonParticipants) { + // `where teamId is null`: the second click finds the slot already + // claimed and matches nothing. + if (participantRow.teamId) return { rowCount: 0 }; + Object.assign(participantRow, setArgs[0]); + return { rowCount: 1 }; + } + return { rowCount: 1 }; + }); + + const caller = callerFor("user_a"); + const input = { hackathonId: HACK_A, name: "meow", maxMembers: 4 as const }; + const results = await Promise.allSettled([ + caller.team.createTeam(input), + caller.team.createTeam(input), + ]); + + expect(created).toBe(1); + const rejected = results.filter((r) => r.status === "rejected"); + expect(String((rejected[0] as PromiseRejectedResult)?.reason)).toMatch( + /already in a team/, + ); + }); + }); + + // ===================================================================== + describe("6. Registration under contention", () => { + // BUG: the duplicate guard at registration.ts:95-108 is an unlocked + // findFirst; the unique_participant_per_hackathon violation that follows is + // not a TRPCError, so registration.ts:182 rethrows it as a 500. + it("reports a double-submitted registration form as already registered", async () => { + mockFindFirst.mockImplementation((table) => + table === "hackathons" ? runningHackathon(-24) : undefined, + ); + mockInsert.mockImplementation(() => { + throw new Error( + 'duplicate key value violates unique constraint "unique_participant_per_hackathon"', + ); + }); + + await expect( + callerFor("user_a").hackathon.register(registrationInput()), + ).rejects.toMatchObject({ + code: "BAD_REQUEST", + message: expect.stringMatching(/already registered/), + }); + }); + + // BUG: registration.ts:110-118 reads currentParticipants with a plain + // findFirst and increments at :173 — two racers both see 499/500. + it("admits only one of two racing registrations into the last seat", async () => { + const hackathonRow = runningHackathon(-24, { + maxParticipants: 500, + currentParticipants: 499, + }); + mockFindFirst.mockImplementation((table) => + table === "hackathons" ? { ...hackathonRow } : undefined, + ); + mockInsert.mockReturnValue([{ id: PARTICIPANT_A }]); + mockUpdate.mockImplementation((_op, updateArgs) => { + // Stands in for sql`currentParticipants + 1`, including the rollback: + // the loser of the race claims a seat and then hands it straight back + // when the re-read shows it went over. + if (updateArgs[0] === hackathons) { + hackathonRow.currentParticipants += 1; + __onRollback(() => { + hackathonRow.currentParticipants -= 1; + }); + } + return []; + }); + + const results = await Promise.allSettled([ + callerFor("user_a").hackathon.register(registrationInput()), + callerFor("user_b").hackathon.register(registrationInput()), + ]); + + const rejected = results.filter((r) => r.status === "rejected"); + expect(rejected).toHaveLength(1); + expect(String((rejected[0] as PromiseRejectedResult)?.reason)).toMatch( + /full/, + ); + expect(hackathonRow.currentParticipants).toBe(500); + }); + + // BUG: registration.ts:178 calls deletePattern("hackathon*") inside the + // transaction, wiping every hackathon-namespaced key for every user. + it("evicts only the caches its own registration changed", async () => { + mockFindFirst.mockImplementation((table) => + table === "hackathons" ? runningHackathon(-24) : undefined, + ); + mockInsert.mockReturnValue([{ id: PARTICIPANT_A }]); + cache.set("hackathons:list", ["cached"], 60); + cache.set("hackathon:registrations:other_user", ["cached"], 60); + + await callerFor("user_a").hackathon.register(registrationInput()); + + expect(cache.get("hackathons:list")).not.toBeNull(); + expect(cache.get("hackathon:registrations:other_user")).not.toBeNull(); + }); + + // BUG: currentParticipants is only ever incremented (one write in the whole + // router tree, registration.ts:173). Rejected applicants hold a seat forever + // and there is no withdraw/cancelRegistration procedure at all. + it("frees a seat when an admin rejects a participant", async () => { + mockFindFirst.mockImplementation((table) => { + if (table === "admins") + return { userId: "admin_user_id", isActive: true, role: "admin" }; + if (table === "hackathonParticipants") + return { + id: PARTICIPANT_A, + hackathonId: HACK_A, + registrationStatus: "pending", + }; + return undefined; + }); + + await callerFor("admin_user_id").hackathon.updateParticipantStatus({ + hackathonId: HACK_A, + participantId: PARTICIPANT_A, + status: "rejected", + }); + + expect(updatedTables()).toContain(hackathons); + }); + + // BUG: registration.ts:222-239 is a publicProcedure whose column allow-list + // includes registrationStatus, and the query has no limit. + it("hides who was rejected from the public roster", async () => { + mockFindMany.mockReturnValue([]); + + await callerFor().hackathon.participants({ hackathonId: HACK_A }); + + const cfg = mockFindMany.mock.calls.find( + (c) => c[0] === "hackathonParticipants", + )?.[1]; + expect(cfg.columns.registrationStatus).toBeFalsy(); + expect(cfg.limit).toBeDefined(); + }); + }); + + // ===================================================================== + describe("7. Membership status arithmetic", () => { + const memberCaller = (member: Record | undefined) => { + mockFindFirst.mockImplementation((table) => { + if (table === "hackathons") return { id: HACK_A }; + if (table === "members") return member; + return undefined; + }); + return callerFor("user_a"); + }; + + it("reports an expired membership as lapsed, with days remaining gone negative", async () => { + const caller = memberCaller({ + id: "member_1", + isActive: true, + memberType: "new", + renewalCount: 0, + membershipEndDate: new Date(Date.now() - 2 * DAY), + }); + + const res = await caller.member.checkStatus(); + // A row that outlived its paid year is not a membership. Answering true + // here is what greeted a lapsed member as active and hid the one button + // that would have let them renew. + expect(res.isMember).toBe(false); + expect(res.isActive).toBe(false); + expect(res.hasLapsed).toBe(true); + expect(res.daysRemaining).toBeLessThan(0); + }); + + it("does not report a revoked but unexpired membership as lapsed", async () => { + const caller = memberCaller({ + id: "member_1", + isActive: false, + memberType: "new", + renewalCount: 0, + membershipEndDate: new Date(Date.now() + 30 * DAY), + }); + + const res = await caller.member.checkStatus(); + expect(res.isActive).toBe(false); + // Switched off by staff while the term still runs — renewing is not the + // remedy, so the renew prompt stays down. + expect(res.hasLapsed).toBe(false); + }); + + // BUG: member.ts:435 `member.isActive && expiresAt && expiresAt > now` + // returns the literal null (not false) when membershipEndDate is null. + it("reports a membership with no end date as inactive, as a real boolean", async () => { + const caller = memberCaller({ + id: "member_1", + isActive: true, + memberType: "new", + renewalCount: 0, + membershipEndDate: null, + }); + + const res = await caller.member.checkStatus(); + expect(res.isActive).toBe(false); + expect(res.daysRemaining).toBeNull(); + }); + + // BUG: getHackathonId (member.ts:20-27) resolves the default hackathon by + // `orderBy desc(startDate)` with no status or date filter, so a future draft + // hijacks every member lookup the moment staff create next year's event. + it("resolves the hackathon in progress, not next year's draft", async () => { + const catalogue = [ + { id: HACK_A, status: "open", startDate: new Date(Date.now() - DAY) }, + { + id: HACK_NEXT, + status: "draft", + startDate: new Date(Date.now() + 300 * DAY), + }, + ]; + mockFindFirst.mockImplementation((table, args) => { + if (table === "hackathons") { + if (args?.orderBy) + return [...catalogue].sort( + (a, b) => b.startDate.getTime() - a.startDate.getTime(), + )[0]; + return catalogue[0]; + } + if (table === "members") + return { + id: "member_1", + hackathonId: HACK_A, + isActive: true, + memberType: "continuous", + renewalCount: 1, + membershipEndDate: new Date(Date.now() + 100 * DAY), + }; + return undefined; + }); + + const res = await callerFor("user_a").member.checkStatus(); + + expect(res.isMember).toBe(true); + // The cache key records which hackathon the lookup actually targeted. + expect(cache.get(`member:status:user_a:${HACK_A}`)).not.toBeNull(); + }); + }); + + // ===================================================================== + describe("8. Membership writes", () => { + /** + * `register` writes a PROFILE, not a membership. It used to stamp + * `membershipEndDate = now + 1 year` and let `isActive` default to true, + * which handed any signed-in caller a full paid-tier membership over tRPC + * for nothing. Only a completed payment may set a term, so there is also no + * "joined" history row to write and nothing to wrap in a transaction. + */ + it("grants no membership term when a profile is created", async () => { + mockFindFirst.mockImplementation((table) => { + if (table === "hackathons") return { id: HACK_A }; + return undefined; + }); + mockInsert.mockImplementation(() => [{ id: "member_1" }]); + + await callerFor("user_a").member.register({ + firstName: "Ada", + lastName: "Lovelace", + }); + + const memberInsert = mockInsert.mock.calls.find( + (call) => call[1]?.[0] === members, + ); + expect(memberInsert).toBeDefined(); + const values = memberInsert![2][0]; + expect(values.isActive).toBe(false); + expect(values.membershipEndDate).toBeNull(); + + // Nothing was joined until a payment lands, so no audit row is written. + const historyInsert = mockInsert.mock.calls.find( + (call) => call[1]?.[0] === membershipHistory, + ); + expect(historyInsert).toBeUndefined(); + }); + + // BUG: nameSchema (member.ts:9-13) is /^[a-zA-Z\s'-]+$/, so any accented or + // non-Latin name is a hard BAD_REQUEST — while hackathon.register (which the + // same person already passed) puts no such restriction on firstName. + it.each(["José", "Nguyễn", "O’Brien"])( + "lets %s become a member, exactly as hackathon registration already does", + async (firstName) => { + mockFindFirst.mockImplementation((table) => + table === "hackathons" ? { id: HACK_A } : undefined, + ); + mockInsert.mockReturnValue([{ id: "member_1", firstName }]); + + await expect( + callerFor("user_a").member.register({ firstName, lastName: "Tan" }), + ).resolves.toMatchObject({ firstName }); + }, + ); + }); + + // ===================================================================== + describe("9. Input sanitisation reaches the resolver", () => { + const teamCaller = () => { + mockFindFirst.mockImplementation((table) => { + if (table === "hackathons") return runningHackathon(20); + if (table === "hackathonParticipants") + return { + id: PARTICIPANT_A, + hackathonId: HACK_A, + userId: "user_a", + teamId: null, + registrationStatus: "approved", + }; + return undefined; + }); + mockInsert.mockReturnValue([{ id: TEAM_A, name: "meow" }]); + return callerFor("user_a"); + }; + + it("rejects a javascript: payload before the resolver ever runs", async () => { + const caller = teamCaller(); + + await expect( + caller.team.createTeam({ + hackathonId: HACK_A, + name: "meow", + description: "javascript:alert(1)", + maxMembers: 4, + }), + ).rejects.toThrow(/Invalid input/); + expect(mockInsert).not.toHaveBeenCalled(); + }); + + // BUG: trpc.ts:76 calls `sanitizeInput(rawInput);` and throws the return + // value away, then calls next() with the untouched input. sanitizeInput is + // pure, so stripping never reaches the resolver; and because the injection + // check runs on the already-stripped copy, "" + // sanitizes to "" (no throw) while the raw tags are written verbatim. + it("never lets raw script markup reach the insert", async () => { + const caller = teamCaller(); + + await caller.team + .createTeam({ + hackathonId: HACK_A, + name: "", + description: "Totally fine description", + maxMembers: 4, + }) + .catch(() => undefined); + + const values = insertedInto(hackathonTeams)[0]?.[2]?.[0]; + expect(values?.name ?? "").not.toMatch(/", - "{{7*7}}", - "\\u0000", - "undefined", - "NaN", - "unicode_test_accents_and_foreign_chars_汉字", - "zalgo_t̹e̖x̗t", - "__proto__", // The one that broke 'ask.ts' - "$$$$$$$$", -]; - -class MockInteraction { - commandName: string; - optionsMap: Map; - replied: boolean = false; - deferred: boolean = false; - logs: string[] = []; - - channelId = "channel-123"; - user = { id: "user-999", username: "TestUser", discriminator: "0000" }; - - constructor(commandName: string, optionsData: Record = {}) { - this.commandName = commandName; - this.optionsMap = new Map(Object.entries(optionsData)); - } - - isChatInputCommand() { - return true; - } - isButton() { - return false; - } - isStringSelectMenu() { - return false; - } - - get options() { - return { - getString: (name: string) => this.optionsMap.get(name) ?? null, - getInteger: (name: string) => this.optionsMap.get(name) ?? 0, - getBoolean: (name: string) => this.optionsMap.get(name) ?? false, - getRole: (name: string) => ({ - id: "role-123", - name: "MockRole", - toString: () => "<@&role-123>", - }), - getChannel: (name: string) => this._createMockChannel("channel-target"), - getUser: (name: string) => this.user, - }; - } - - // --- 1. MOCK CLIENT (Fixes crashes accessing client.user, client.uptime, etc) --- - get client() { - return { - user: { id: "bot-id", username: "HackBot" }, - uptime: 1000, - users: { - cache: { - get: (id: string) => ({ id, username: "MockUser" }), - has: (id: string) => true, - }, - }, - guilds: { - cache: { - get: (id: string) => this.guild, - }, - }, - }; - } - - // --- 2. MOCK GUILD (Fixes crashes accessing guild.members.cache) --- - get guild() { - return { - id: "guild-001", - name: "Hacklytics Guild", - members: { - cache: { - get: (id: string) => ({ - id, - user: { username: "Member" }, - roles: { cache: [] }, - }), - find: (fn: Function) => null, - has: (id: string) => true, - }, - // In case command uses .fetch() - fetch: async (id: string) => ({ - id, - user: { username: "FetchedMember" }, - }), - }, - roles: { - cache: { - get: (id: string) => ({ id, name: "some-role" }), - find: () => null, - }, - }, - }; - } - - get channel() { - return this._createMockChannel("channel-current"); - } - - _createMockChannel(id: string) { - return { - id, - name: "general", - isTextBased: () => true, - send: async (payload: any) => { - const content = typeof payload === "string" ? payload : payload.content; - this._log(`[CHANNEL_SEND] to #${id}: ${content}`); - return { id: "msg-123" }; - }, - }; - } - - async deferReply(opts?: any) { - this.deferred = true; - this._log(`[DEFER] Ephemeral: ${opts?.ephemeral ?? false}`); - } - - async reply(response: any) { - if (this.replied) throw new Error("Double Reply Detected!"); - this.replied = true; - this._extractContent("REPLY", response); - } - - async editReply(response: any) { - this._extractContent("EDIT_REPLY", response); - } - - async followUp(response: any) { - this._extractContent("FOLLOW_UP", response); - } - - async deferUpdate() { - this._log("[DEFER_UPDATE]"); - } - - _extractContent(type: string, response: any) { - let text = ""; - if (typeof response === "string") text = response; - else if (response?.content) text = response.content; - else if (response?.embeds?.[0]) - text = `[Embed] ${response.embeds[0].data.title}`; - else text = "[Complex Object]"; - - this._log(`[${type}] ${text.substring(0, 60).replace(/\n/g, " ")}...`); - } - - _log(msg: string) { - this.logs.push(msg); - } -} - -async function runSuite() { - const commandsPath = path.join(__dirname, "../commands"); - const commandFiles = fs - .readdirSync(commandsPath) - .filter((file) => file.endsWith(".ts")); - - for (const file of commandFiles) { - const filePath = path.join(commandsPath, file); - const commandName = file.replace(".ts", ""); - - try { - const module = await import(`file://${filePath}`); - if (!module.execute) continue; - - const happyInputs = { - query: "food", - event_name: "Test Event", - channel: "announcements", - input: "test", - }; - await runTest(module, commandName, happyInputs, "[SUCCESS] Happy Path"); - - for (const evil of edgeCases) { - const evilInputs = { - query: evil, - event_name: evil, - start_time: evil, - input: evil, - }; - await runTest( - module, - commandName, - evilInputs, - `[FUZZ] Fuzz: "${evil.substring(0, 10)}..."`, - ); - } - } catch (error) { - console.error(` [ERROR] FATAL LOAD ERROR: ${file}`, error); - } - } -} - -async function runTest(module: any, name: string, inputs: any, label: string) { - const mock = new MockInteraction(name, inputs); - try { - await module.execute(mock); - } catch (err: any) { - console.error(` [ERROR] CRASH | ${label}`); - console.error(` Stack: ${err.message.split("\n")[0]}`); - } -} - -runSuite(); diff --git a/sites/discordBot/start.sh b/sites/discordBot/start.sh deleted file mode 100644 index 67e66f23..00000000 --- a/sites/discordBot/start.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -set -e - -if [ ! -f .env ]; then - echo ".env file not found!" - exit 1 -fi - -docker compose -p hacklytics up -d --build - -docker logs -f hacklytics-bot diff --git a/sites/discordBot/startup.sh b/sites/discordBot/startup.sh deleted file mode 100644 index efd06056..00000000 --- a/sites/discordBot/startup.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -set -e - -echo "--- Smart Startup Script Initiated ---" - -# Navigate to container directory -cd /home/container - -# Check if node_modules exists, otherwise install -if [ ! -d "node_modules" ]; then - echo "node_modules not found. Installing dependencies..." - npm install --no-audit --no-fund --quiet -else - echo "node_modules found. Skipping install." -fi - -# Always rebuild to ensure latest changes are applied -echo "Building project..." -npm run build - -# Start the bot -echo "Starting bot..." -exec node dist/index.js diff --git a/sites/discordBot/temp_checkin.cjs b/sites/discordBot/temp_checkin.cjs deleted file mode 100644 index 94448080..00000000 --- a/sites/discordBot/temp_checkin.cjs +++ /dev/null @@ -1,44 +0,0 @@ -const https = require("https"); - -const token = process.env.NOTION_API_TOKEN; -const pageId = "2aac5c7f-72ad-80bf-a0f9-c66c9626abfb"; - -function getChildren(id) { - return new Promise((resolve) => { - https.get( - { - hostname: "api.notion.com", - path: "/v1/blocks/" + id + "/children", - headers: { - Authorization: "Bearer " + token, - "Notion-Version": "2022-06-28", - }, - }, - (res) => { - let data = ""; - res.on("data", (chunk) => (data += chunk)); - res.on("end", () => resolve(JSON.parse(data).results)); - }, - ); - }); -} - -async function printCheckIn(id) { - const children = await getChildren(id); - let inCheckIn = false; - for (let i = 0; i < children.length; i++) { - const b = children[i]; - const text = (b[b.type]?.rich_text || []).map((x) => x.plain_text).join(""); - if (b.type === "heading_1" && text.includes("Check In")) { - inCheckIn = true; - console.log("??? " + text); - continue; - } - if (inCheckIn) { - if (b.type === "heading_1") break; // stop at next heading_1 - console.log(text); - } - } -} - -printCheckIn(pageId); diff --git a/sites/discordBot/tsconfig.json b/sites/discordBot/tsconfig.json deleted file mode 100644 index 68c2c417..00000000 --- a/sites/discordBot/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilerOptions": { - "rootDir": "src", - "outDir": "dist", - "target": "ES2022", - "module": "Node16", - "moduleResolution": "Node16", - "strict": false, - "noImplicitAny": false, - "esModuleInterop": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "allowSyntheticDefaultImports": true, - "types": ["node"], - "forceConsistentCasingInFileNames": true, - "declaration": true, - "sourceMap": true - }, - "include": ["src/**/*"], - "exclude": ["node_modules", "dist"] -} diff --git a/sites/hacklytics2027/app/CodeOfConductFooter.tsx b/sites/hacklytics2027/app/CodeOfConductFooter.tsx deleted file mode 100644 index 036062d2..00000000 --- a/sites/hacklytics2027/app/CodeOfConductFooter.tsx +++ /dev/null @@ -1,181 +0,0 @@ -"use client"; -import { useState } from "react"; - -export default function CodeOfConductFooter() { - const [open, setOpen] = useState(false); - return ( -
- {open && ( -
-
- - MLH Code of Conduct - - -
-
- - TL;DR. Be respectful. Harassment and abuse are never tolerated. If - you are in a situation that makes you uncomfortable at an MLH - Member Event, if the event itself creates an unsafe or - inappropriate environment, or if interacting with an MLH - representative or event organizer makes you uncomfortable, please - report it using the procedures included in this document. - - -

- Major League Hacking (MLH) stands for inclusivity. We believe that - every single person has the right to hack in a safe and welcoming - environment. -

- -

- Harassment includes but is not limited to offensive verbal or - written comments related to gender, age, sexual orientation, - disability, physical appearance, body size, race, religion, social - class, economic status, and veteran status. Additional cases of - harassment include but are not limited to sharing sexual images, - violent depictions, vulgar language, deliberate intimidation, - stalking, following, brigading, doxxing, harassing photography or - recording, sustained disruption of talks or other events, - inappropriate physical contact, and unwelcome sexual attention. -

- -

- In particular, attendees should not use sexualized images, - activities, or other material both in their hacks and during the - event. Booth staff (including volunteers) should not use - sexualized clothing/uniforms/costumes or otherwise create a - sexualized environment. -

- -

- If what you're doing is making someone feel uncomfortable, that - counts as harassment and is enough reason to stop doing it. - Participants asked to stop any harassing behavior are expected to - comply immediately. -

- -

- Sponsors, judges, mentors, volunteers, organizers, MLH staff, and - anyone else participating in the event are also subject to the - anti-harassment policy. -

- -

- If a participant engages in harassing behavior, MLH may take any - action it deems appropriate, including warning the offender or - expulsion from the event with no eligibility for reimbursement or - refund of any type. -

- -

- If you are being harassed, notice that someone else is being - harassed, or have any other concerns, please contact MLH using the - reporting procedures defined below. -

- -

- MLH representatives can help participants contact campus security - or local law enforcement, provide escorts, or otherwise assist - those experiencing harassment to feel safe for the duration of the - event. We value your attendance. -

- -

- We expect participants to follow these rules at all hackathon - venues, hackathon-related social events, hackathon-supplied - transportation, and online interactions related to the event. -

- - - Reporting Procedures - -

- If you feel uncomfortable or think there may be a potential - violation of the code of conduct, please report it immediately - using one of the following methods. All reporters have the right - to remain anonymous. -

-

- By sending information to the general reporting line, your report - will go to our incident response team members. -

- -
    -
  • - - North America General Reporting - {" "} - - +1 409 202 6060, incidents@mlh.io -
  • -
  • - Canada General Reporting - - +1 343 453 4532, incidents@mlh.io -
  • -
  • - Europe General Reporting - - +44 800 808 5675, incidents@mlh.io -
  • -
  • - - Asia-Pacific General Reporting - {" "} - - +91 000 80004 02492, incidents@mlh.io -
  • -
  • - India General Reporting - - 000 80004 02492, incidents@mlh.io -
  • -
- - - Special Incidents - -

- If you are uncomfortable reporting your situation to one or more - of these people or need to contact any of them directly in case of - emergency, direct contact details are listed below. -

- -
    -
  • - Mary Siebert - +1 (516) - 362-1835, mary@mlh.io -
  • -
  • - Swift - +1 (347) 220-8667, - swift@mlh.io -
  • -
- -

- MLH reserves the right to revise, make exceptions to, or otherwise - amend these policies in whole or in part. If you have any - questions regarding these policies, please contact MLH by e-mail - at incidents@mlh.io. -

- - - This document was last updated on: February 14th 2025 - -
-
- )} - -
- ); -} diff --git a/sites/hacklytics2027/app/globals.css b/sites/hacklytics2027/app/globals.css index 45511348..4753052c 100644 --- a/sites/hacklytics2027/app/globals.css +++ b/sites/hacklytics2027/app/globals.css @@ -129,6 +129,278 @@ body { contain-intrinsic-size: auto 600px; } +/* ─── Pixel flora — Terraria-style sprite layer ─── */ +.pixelated { image-rendering: pixelated; } + +@keyframes sway { + 0%, 100% { transform: rotate(-3.5deg); } + 50% { transform: rotate(3.5deg); } +} +/* No will-change here on purpose: there are ~100 of these on the page and + promoting each to its own compositor layer costs far more than it saves. */ +.animate-sway { animation: sway ease-in-out infinite; } + +/* Off-screen flora stops animating entirely — set by an IntersectionObserver + on the row wrapper. Compositing a sway nobody can see is pure waste. */ +[data-anim="paused"] .animate-sway, +[data-anim="paused"] .animate-drift, +[data-anim="paused"] .animate-bob { animation-play-state: paused; } + +@keyframes drift { + 0% { transform: translate3d(0, 0, 0); opacity: 0; } + 12% { opacity: 0.9; } + 50% { transform: translate3d(16px, -46px, 0); opacity: 0.55; } + 88% { opacity: 0.75; } + 100% { transform: translate3d(-12px, -96px, 0); opacity: 0; } +} +.animate-drift { animation: drift linear infinite; } + +@keyframes bob { + 0%, 100% { transform: translateY(0); } + 50% { transform: translateY(-3px); } +} +.animate-bob { animation: bob 3s ease-in-out infinite; } + +/* Chunky notched frame — the Terraria inventory-slot look, drawn with shadows + so it stays crisp at any size and needs no image asset. The notched corners + come from the cross-shaped shadow stack: no corner pixels are painted. */ +.pixel-frame { + position: relative; + border-radius: 0; + --pixel-edge: rgba(255, 255, 255, 0.2); + --pixel-glow: rgba(0, 229, 255, 0); + box-shadow: + 0 -4px 0 0 var(--pixel-edge), + 0 4px 0 0 var(--pixel-edge), + -4px 0 0 0 var(--pixel-edge), + 4px 0 0 0 var(--pixel-edge), + 0 0 26px var(--pixel-glow), + 0 0 30px rgba(0, 0, 0, 0.55) inset; + transition: box-shadow 200ms steps(3), background-color 200ms linear; +} +.pixel-frame:hover { --pixel-edge: rgba(0, 229, 255, 0.6); --pixel-glow: rgba(0, 229, 255, 0.3); } + +/* Neon tints — pair with .pixel-frame */ +.pixel-cyan { --pixel-edge: rgba(0, 229, 255, 0.55); --pixel-glow: rgba(0, 229, 255, 0.22); } +.pixel-pink { --pixel-edge: rgba(255, 45, 120, 0.55); --pixel-glow: rgba(255, 45, 120, 0.22); } +.pixel-lime { --pixel-edge: rgba(200, 255, 0, 0.5); --pixel-glow: rgba(200, 255, 0, 0.2); } +.pixel-purple { --pixel-edge: rgba(155, 0, 255, 0.55); --pixel-glow: rgba(155, 0, 255, 0.24); } +.pixel-cyan:hover { --pixel-edge: rgba(0, 229, 255, 0.95); --pixel-glow: rgba(0, 229, 255, 0.45); } +.pixel-pink:hover { --pixel-edge: rgba(255, 45, 120, 0.95); --pixel-glow: rgba(255, 45, 120, 0.45); } +.pixel-lime:hover { --pixel-edge: rgba(200, 255, 0, 0.9); --pixel-glow: rgba(200, 255, 0, 0.4); } +.pixel-purple:hover { --pixel-edge: rgba(155, 0, 255, 0.95); --pixel-glow: rgba(155, 0, 255, 0.45); } + +/* Solid neon slab button — chunky, no radius, steps() so it feels 8-bit */ +.pixel-btn { + position: relative; + border-radius: 0; + background: var(--btn-bg, #00e5ff); + color: #04040a; + box-shadow: + 0 -4px 0 0 rgba(255, 255, 255, 0.35), + 0 4px 0 0 rgba(0, 0, 0, 0.6), + 0 0 28px var(--btn-glow, rgba(0, 229, 255, 0.5)); + transition: transform 120ms steps(2), box-shadow 160ms steps(2), filter 160ms linear; +} +.pixel-btn:hover { transform: translateY(-2px); filter: brightness(1.12); } +.pixel-btn:active { transform: translateY(2px); } + +/* Neon text glow, tuned per accent */ +.neon-cyan { color: #00e5ff; text-shadow: 0 0 8px rgba(0, 229, 255, 0.65), 0 0 22px rgba(0, 229, 255, 0.35); } +.neon-pink { color: #ff2d78; text-shadow: 0 0 8px rgba(255, 45, 120, 0.65), 0 0 22px rgba(255, 45, 120, 0.35); } +.neon-lime { color: #c8ff00; text-shadow: 0 0 8px rgba(200, 255, 0, 0.6), 0 0 22px rgba(200, 255, 0, 0.3); } +.neon-purple { color: #9b00ff; text-shadow: 0 0 8px rgba(155, 0, 255, 0.7), 0 0 22px rgba(155, 0, 255, 0.4); } + +/* ─── Neo / synthwave layer ───────────────────────────────────────────── + Everything here is gradients and transforms only — no filter(), no + backdrop-filter, no mix-blend-mode, so it composites for free. */ + +/* Perspective horizon grid. One element, one slow transform. */ +.neo-grid { + position: absolute; + inset: auto 0 0 0; + height: 46vh; + pointer-events: none; + overflow: hidden; + perspective: 260px; + perspective-origin: 50% 0%; + /* fade in below the horizon line at the top of the box */ + mask-image: linear-gradient(to bottom, transparent 0%, black 22%, black 78%, transparent 100%); + -webkit-mask-image: linear-gradient(to bottom, transparent 0%, black 22%, black 78%, transparent 100%); + opacity: 0.55; +} +.neo-grid::before { + content: ""; + position: absolute; + top: 0; + bottom: auto; + left: -50%; + right: -50%; + height: 260%; + transform-origin: 50% 0%; + background-image: + repeating-linear-gradient(to right, rgba(0, 229, 255, 0.5) 0 1px, transparent 1px 64px), + repeating-linear-gradient(to bottom, rgba(255, 45, 120, 0.45) 0 1px, transparent 1px 40px); + /* Transform-only: animating background-position repaints this whole + 3D-transformed surface every frame. Translating it is composited. */ + animation: neo-grid-run 6s linear infinite; +} +@keyframes neo-grid-run { + from { transform: rotateX(80deg) translate3d(0, 0, 0); } + to { transform: rotateX(80deg) translate3d(0, 40px, 0); } +} + +/* Chromatic aberration — RGB split, done with text-shadow (no filters). */ +.neo-split { + text-shadow: + -2px 0 rgba(255, 45, 120, 0.55), + 2px 0 rgba(0, 229, 255, 0.55); +} +.neo-split-sm { + text-shadow: + -1px 0 rgba(255, 45, 120, 0.6), + 1px 0 rgba(0, 229, 255, 0.6); +} + +/* Glitch on hover: two clipped ghosts jitter in steps. Idle cost is zero. */ +.neo-glitch { position: relative; } +.neo-glitch::before, +.neo-glitch::after { + content: attr(data-text); + position: absolute; + inset: 0; + opacity: 0; + pointer-events: none; +} +.neo-glitch:hover::before { + opacity: 1; + color: #ff2d78; + clip-path: inset(0 0 62% 0); + animation: neo-glitch-a 0.5s steps(2) infinite; +} +.neo-glitch:hover::after { + opacity: 1; + color: #00e5ff; + clip-path: inset(58% 0 0 0); + animation: neo-glitch-b 0.5s steps(2) infinite; +} +@keyframes neo-glitch-a { + 0%, 100% { transform: translate3d(-3px, -1px, 0); } + 50% { transform: translate3d(3px, 1px, 0); } +} +@keyframes neo-glitch-b { + 0%, 100% { transform: translate3d(3px, 1px, 0); } + 50% { transform: translate3d(-3px, -1px, 0); } +} + +/* HUD corner brackets — pairs with .pixel-frame on panels. */ +.hud { position: relative; } +.hud::before, +.hud::after { + content: ""; + position: absolute; + width: 14px; + height: 14px; + pointer-events: none; + border-color: var(--hud-color, rgba(0, 229, 255, 0.9)); +} +.hud::before { + top: -6px; left: -6px; + border-top: 3px solid; border-left: 3px solid; +} +.hud::after { + bottom: -6px; right: -6px; + border-bottom: 3px solid; border-right: 3px solid; +} +.hud-pink { --hud-color: rgba(255, 45, 120, 0.9); } +.hud-lime { --hud-color: rgba(200, 255, 0, 0.85); } +.hud-purple { --hud-color: rgba(155, 0, 255, 0.9); } + +/* Neon sweep — a light run that travels along a rule. The highlight is a + child that translates, so nothing repaints. */ +.neo-rule { + position: relative; + height: 2px; + width: 100%; + overflow: hidden; + background: rgba(0, 229, 255, 0.2); +} +.neo-rule::after { + content: ""; + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 45%; + background: linear-gradient( + 90deg, + transparent, + rgba(0, 229, 255, 0.9), + rgba(255, 45, 120, 0.9), + transparent + ); + animation: neo-sweep 7s linear infinite; +} +@keyframes neo-sweep { + from { transform: translate3d(-110%, 0, 0); } + to { transform: translate3d(320%, 0, 0); } +} + +/* Blinking status dot for the HUD chips */ +@keyframes neo-blink { + 0%, 45% { opacity: 1; } + 50%, 95% { opacity: 0.15; } + 100% { opacity: 1; } +} +.neo-blink { animation: neo-blink 1.6s steps(1) infinite; } + +/* Vignette — static, keeps the neon from washing out the edges */ +.neo-vignette::before { + content: ""; + position: fixed; + inset: 0; + pointer-events: none; + z-index: 39; + background: radial-gradient(ellipse at center, transparent 45%, rgba(0, 0, 0, 0.55) 100%); +} + +@media (prefers-reduced-motion: reduce) { + .neo-grid::before, + .neo-rule, + .neo-blink { animation: none; } +} + +/* CRT scanlines — plain alpha, no mix-blend-mode. A full-viewport blended + layer forces the whole page to re-composite through the blend on every + frame; straight alpha over the top looks the same here and is free. */ +.scanlines::after { + content: ""; + position: fixed; + inset: 0; + pointer-events: none; + z-index: 40; + background: repeating-linear-gradient( + to bottom, + rgba(255, 255, 255, 0.022) 0px, + rgba(255, 255, 255, 0.022) 1px, + transparent 1px, + transparent 3px + ); +} + +/* Pixel typography accents */ +.font-pixel { + font-family: var(--font-pixel), "Courier New", monospace; + letter-spacing: 0.06em; + text-transform: uppercase; +} + +@media (prefers-reduced-motion: reduce) { + .animate-sway, + .animate-drift, + .animate-bob { animation: none; } +} + /* ─── Divider ─── */ .bloom-divider { width: 100%; diff --git a/sites/hacklytics2027/app/layout.tsx b/sites/hacklytics2027/app/layout.tsx index 025ee18b..798f299a 100644 --- a/sites/hacklytics2027/app/layout.tsx +++ b/sites/hacklytics2027/app/layout.tsx @@ -1,9 +1,10 @@ import "./globals.css"; import type { Metadata, Viewport } from "next"; -import { Roboto_Mono, Space_Grotesk } from "next/font/google"; +import { Roboto_Mono, Space_Grotesk, Silkscreen } from "next/font/google"; import Navbar from "../components/Navbar"; import ServiceWorkerRegistrar from "../components/ServiceWorkerRegistrar"; import Footer from "../components/Footer"; +import { INTEREST_URL } from "../lib/links"; const robotoMono = Roboto_Mono({ subsets: ["latin"], @@ -17,6 +18,13 @@ const spaceGrotesk = Space_Grotesk({ variable: "--font-sans", }); +// Pixel face for the Terraria-style flora labels and badges. +const silkscreen = Silkscreen({ + subsets: ["latin"], + weight: ["400", "700"], + variable: "--font-pixel", +}); + export const viewport: Viewport = { themeColor: "#050508", }; @@ -82,10 +90,14 @@ export default function RootLayout({ children }: { children: React.ReactNode }) description: "Data Science @ GT — The premier data science hackathon in the Southeast. 36 hours of coding, data science, and AI.", offers: { "@type": "Offer", - url: "https://form.typeform.com/to/GvqBCdAe", + url: INTEREST_URL, price: "0", priceCurrency: "USD", - availability: "https://schema.org/InStock", + // PreOrder, not InStock: registration has not opened, and the link behind + // this offer joins an interest list rather than securing a place. Search + // results that promise "register now" against a page that cannot are the + // kind of thing that gets rich results pulled. + availability: "https://schema.org/PreOrder", validFrom: "2026-08-01T00:00:00-04:00" }, organizer: { @@ -104,7 +116,7 @@ export default function RootLayout({ children }: { children: React.ReactNode }) /> diff --git a/sites/hacklytics2027/app/not-found.tsx b/sites/hacklytics2027/app/not-found.tsx index d68beeea..4ef6a4a2 100644 --- a/sites/hacklytics2027/app/not-found.tsx +++ b/sites/hacklytics2027/app/not-found.tsx @@ -1,4 +1,7 @@ import Link from "next/link"; +import PixelSprite from "../components/pixel/PixelSprite"; +import { PixelFloraRow } from "../components/pixel/PixelBits"; +import { MUSHROOM } from "../components/pixel/sprites"; export default function NotFound() { return ( @@ -12,16 +15,16 @@ export default function NotFound() { /> {/* Content Card */} -
+
-
+

404

-

+

Signal Lost

@@ -32,12 +35,17 @@ export default function NotFound() { RETURN HOME
+ + {/* pixel flower bed along the bottom */} +
+ +
); } diff --git a/sites/hacklytics2027/app/page.tsx b/sites/hacklytics2027/app/page.tsx index 3c873535..6aca16b3 100644 --- a/sites/hacklytics2027/app/page.tsx +++ b/sites/hacklytics2027/app/page.tsx @@ -1,6 +1,10 @@ "use client"; import React, { useState, useEffect } from "react"; import HomeSections from "@/components/HomeSections"; +import PixelGarden, { PixelGround } from "@/components/pixel/PixelGarden"; +import PixelSprite from "@/components/pixel/PixelSprite"; +import { BLOOM, DAISY, SPROUT, TULIP } from "@/components/pixel/sprites"; +import { INTEREST_URL } from "@/lib/links"; // ─── Elegant Floral Background ───────────────────────────────────────────── const FloralBackground = () => ( @@ -8,12 +12,15 @@ const FloralBackground = () => ( {/* Subtle grid base */}
- {/* Center majestic digital bloom (Abstract rotating lotus) */} -
+ {/* Center digital bloom (rotating lotus). + No backdrop-blur on the petals: they sit over a near-black backdrop, so + the blur produced nothing visible while forcing 20 full-screen readbacks + per frame while rotating. Gradients alone look identical here. */} +
{Array.from({ length: 12 }).map((_, i) => (
( /> ))}
- + {/* Secondary Bloom */} -
+
{Array.from({ length: 8 }).map((_, i) => (
( ))}
- {/* Ambient light fields */} -
-
+ {/* Ambient light fields — static radial gradients instead of pulsing + blur() layers, which re-rasterized a 50vw surface every frame. */} +
+
); @@ -81,7 +95,7 @@ const Countdown: React.FC<{ targetDate: Date }> = ({ targetDate }) => { {mounted ? fmt(value) : "00"} - + {label}
@@ -93,13 +107,17 @@ const Countdown: React.FC<{ targetDate: Date }> = ({ targetDate }) => { // ─── Page ───────────────────────────────────────────────────────────────── export default function HomePage() { return ( -
+
+ {/* ── HERO ── */}
- + + {/* Synthwave horizon grid */} +
-
+
diff --git a/sites/hacklytics2027/components/FloatingFlowers.tsx b/sites/hacklytics2027/components/FloatingFlowers.tsx deleted file mode 100644 index c3092727..00000000 --- a/sites/hacklytics2027/components/FloatingFlowers.tsx +++ /dev/null @@ -1,535 +0,0 @@ -"use client"; - -import React, { useMemo, memo } from "react"; - -/* ─── SVG Flower Variants ─── */ - -// Cherry blossom — 5 rounded petals with a warm center -const CherryBlossom: React.FC<{ - size: number; - color: string; - opacity: number; -}> = ({ size, color, opacity }) => ( - - - - - - - - - {[0, 72, 144, 216, 288].map((angle, i) => ( - - ))} - - - -); - -// Lotus petal — elegant elongated petals in layers -const LotusFlower: React.FC<{ - size: number; - color: string; - opacity: number; -}> = ({ size, color, opacity }) => ( - - - - - - - - - {/* Outer petals */} - {[0, 45, 90, 135, 180, 225, 270, 315].map((angle, i) => ( - - ))} - {/* Inner petals */} - {[22, 67, 112, 157, 202, 247, 292, 337].map((angle, i) => ( - - ))} - - - -); - -// Small daisy — simple 6-petal flower good for background scatter -const SmallDaisy: React.FC<{ - size: number; - color: string; - opacity: number; -}> = ({ size, color, opacity }) => ( - - {[0, 60, 120, 180, 240, 300].map((angle, i) => ( - - ))} - - -); - -// Falling petal — single floating petal shape -const FallingPetal: React.FC<{ - size: number; - color: string; - opacity: number; -}> = ({ size, color, opacity }) => ( - - - - -); - -// Abstract bloom spiral — a tech-organic spiral flower -const SpiralBloom: React.FC<{ - size: number; - color: string; - opacity: number; -}> = ({ size, color, opacity }) => ( - - - - - - - - {Array.from({ length: 12 }, (_, i) => { - const angle = i * 30; - const len = 18 + (i % 3) * 6; - return ( - - ); - })} - - - -); - -/* ─── Flower Data Generator ─── */ - -interface FlowerInstance { - id: number; - type: "cherry" | "lotus" | "daisy" | "petal" | "spiral"; - x: number; // % from left - y: number; // % from top (of total page height) - size: number; // px - color: string; - opacity: number; - rotation: number; - animDelay: number; - animDuration: number; - driftClass: string; -} - -const COLORS = [ - "#ff007f", // bloom pink - "#ff3399", // hot pink - "#ff66b2", // soft pink - "#cc44ff", // purple - "#9d00ff", // deep purple - "#00f3ff", // cyan - "#66ffee", // light cyan - "#ccff00", // lime - "#ff9ecd", // rose - "#ffb3d9", // light rose - "#e0aaff", // lavender - "#7df9ff", // electric blue -]; - -const DRIFT_CLASSES = [ - "flower-drift-1", - "flower-drift-2", - "flower-drift-3", - "flower-drift-4", - "flower-sway-1", - "flower-sway-2", -]; - -function seededRandom(seed: number) { - let s = seed; - return () => { - s = (s * 16807 + 0) % 2147483647; - return (s - 1) / 2147483646; - }; -} - -function generateFlowers(count: number): FlowerInstance[] { - const rand = seededRandom(42); - const types: FlowerInstance["type"][] = [ - "cherry", - "lotus", - "daisy", - "petal", - "spiral", - ]; - - return Array.from({ length: count }, (_, i) => ({ - id: i, - type: types[Math.floor(rand() * types.length)], - x: rand() * 100, - y: rand() * 100, - size: 16 + rand() * 50, - color: COLORS[Math.floor(rand() * COLORS.length)], - opacity: 0.15 + rand() * 0.35, - rotation: rand() * 360, - animDelay: rand() * 20, - animDuration: 15 + rand() * 25, - driftClass: DRIFT_CLASSES[Math.floor(rand() * DRIFT_CLASSES.length)], - })); -} - -/* ─── Render Component ─── */ - -const FlowerRenderer = memo(function FlowerRenderer({ - flower, -}: { - flower: FlowerInstance; -}) { - const svgElement = useMemo(() => { - const props = { - size: flower.size, - color: flower.color, - opacity: flower.opacity, - }; - switch (flower.type) { - case "cherry": - return ; - case "lotus": - return ; - case "daisy": - return ; - case "petal": - return ; - case "spiral": - return ; - } - }, [flower.type, flower.size, flower.color, flower.opacity]); - - return ( -
- {svgElement} -
- ); -}); - -/* ─── Main Floating Flowers Component ─── */ - -export default function FloatingFlowers({ count = 15 }: { count?: number }) { - const [isMobile, setIsMobile] = React.useState(false); - - React.useEffect(() => { - const checkMobile = () => { - setIsMobile(window.innerWidth < 768); - }; - checkMobile(); - window.addEventListener("resize", checkMobile); - return () => window.removeEventListener("resize", checkMobile); - }, []); - - const activeCount = isMobile ? Math.min(count, 6) : count; - const flowers = useMemo(() => generateFlowers(activeCount), [activeCount]); - - return ( - - ); -} - -/* ─── Section Divider Flower Cluster ─── */ -// Decorative flower clusters to place between sections - -export function FlowerDivider({ - variant = "pink", -}: { - variant?: "pink" | "cyan" | "lime" | "purple"; -}) { - const colorMap = { - pink: ["#ff007f", "#ff66b2", "#ff9ecd"], - cyan: ["#00f3ff", "#66ffee", "#7df9ff"], - lime: ["#ccff00", "#b8e600", "#99cc00"], - purple: ["#9d00ff", "#cc44ff", "#e0aaff"], - }; - const colors = colorMap[variant]; - - return ( -
- - - - - - - - - - - {attendees && attendees.length > 0 ? ( - attendees.map((attendee) => ( - - - - - - - - )) - ) : ( - - - - )} - -
- 0 && selectedIds.size === attendees.length} - onChange={handleSelectAll} - className="accent-accent" - /> - NameEmailStatusTeam
- handleSelect(attendee.id)} - className="accent-accent" - /> - {attendee.user?.name || "No Name"}{attendee.user?.email || "No Email"} - - {attendee.registrationStatus} - - {attendee.team?.name || "Solo"}
- No attendees found. -
- - - - ); -} diff --git a/sites/mainweb/app/(portal)/admin/hackathons/[id]/page.tsx b/sites/mainweb/app/(portal)/admin/hackathons/[id]/page.tsx index c7cffc4c..7b6a7864 100644 --- a/sites/mainweb/app/(portal)/admin/hackathons/[id]/page.tsx +++ b/sites/mainweb/app/(portal)/admin/hackathons/[id]/page.tsx @@ -12,9 +12,16 @@ import { AttendeesTab } from "@/components/admin/hackathons/AttendeesTab"; import { AnalyticsTab } from "@/components/admin/hackathons/AnalyticsTab"; import { EventsTab } from "@/components/admin/hackathons/EventsTab"; import { JudgesTab } from "@/components/admin/hackathons/JudgesTab"; -import { Gavel } from "lucide-react"; +import { AnnouncementsTab } from "@/components/admin/hackathons/AnnouncementsTab"; +import { Gavel, Megaphone } from "lucide-react"; -type Tab = "events" | "scanner" | "attendees" | "analytics" | "judges"; +type Tab = + | "events" + | "scanner" + | "attendees" + | "analytics" + | "judges" + | "announcements"; export default function AdminHackathonDashboard() { const { status } = useSession(); @@ -52,6 +59,11 @@ export default function AdminHackathonDashboard() { icon: , }, { id: "judges", label: "Judges", icon: }, + { + id: "announcements", + label: "Email", + icon: , + }, ]; return ( @@ -100,8 +112,11 @@ export default function AdminHackathonDashboard() {
{["scanner", "attendees"].includes(activeTab) && ( - setActiveTab("scanner")} className="group relative px-4 py-2 rounded-none bg-gradient-to-r from-accent/15 to-emerald-500/10 border border-accent/30 text-accent text-xs font-bold uppercase tracking-widest hover:bg-emerald-500/25 active:scale-95 transition-all overflow-hidden" >
@@ -121,7 +136,7 @@ export default function AdminHackathonDashboard() { Quick Scan - + )}
@@ -174,6 +189,9 @@ export default function AdminHackathonDashboard() { )} {activeTab === "judges" && } + {activeTab === "announcements" && ( + + )} diff --git a/sites/mainweb/app/(portal)/admin/initiatives/page.tsx b/sites/mainweb/app/(portal)/admin/initiatives/page.tsx new file mode 100644 index 00000000..c904385b --- /dev/null +++ b/sites/mainweb/app/(portal)/admin/initiatives/page.tsx @@ -0,0 +1,288 @@ +"use client"; + +import { useState } from "react"; +import { useSession } from "next-auth/react"; +import { Rocket } from "lucide-react"; +import { LiquidGlass } from "@/components/portal/LiquidGlass"; +import { LoadingScreen } from "@/components/portal/LoadingScreen"; +import { trpc } from "@/lib/trpc"; +import type { RouterOutputs } from "@query/api"; + +/** + * Who runs club initiatives. + * + * Granting takes a user id rather than an email search: this reuses the + * attendees list every officer already works from, and a leader has to have + * signed in at least once to have an id at all. + */ +function ProposalRow({ + proposal, +}: { + proposal: RouterOutputs["initiative"]["listProposals"][number]; +}) { + const utils = trpc.useUtils(); + const [note, setNote] = useState(""); + const [declining, setDeclining] = useState(false); + + const review = trpc.initiative.reviewProposal.useMutation({ + onSuccess: async () => { + await Promise.all([ + utils.initiative.listProposals.invalidate(), + // Approving mints a project leader, so that list moves too. + utils.initiative.listLeaders.invalidate(), + ]); + }, + }); + + return ( + +
+
+

{proposal.title}

+

+ {proposal.proposerName ?? proposal.proposerEmail} ·{" "} + {proposal.proposerEmail} +

+ {proposal.summary && ( +

{proposal.summary}

+ )} + {proposal.description && ( +

+ {proposal.description} +

+ )} +

+ {proposal.commitment ?? "No commitment given"} ·{" "} + {proposal.maxMembers === null + ? "no team cap" + : `cap ${proposal.maxMembers}`} +

+
+ +
+ + +
+
+ + {/* A decline without a reason is the thing a member can do nothing with, + so the note is asked for at the moment of declining. */} + {declining && ( +
+ +