From 33cbeaa9a3e5e970e1366017f8c43a9aad7f62ab Mon Sep 17 00:00:00 2001 From: bootunloader Date: Wed, 11 Sep 2024 02:57:43 +0300 Subject: [PATCH] initial commit ?? --- .dockerignore | 3 + .gitignore | 4 + Dockerfile | 19 + Dockerfile.bun | 15 + components.json | 14 + package.json | 67 + pnpm-lock.yaml | 3543 +++++++++++++++++ postcss.config.js | 6 + src/__tests__/postdata.test.ts | 57 + src/app.css | 90 + src/app.d.ts | 18 + src/app.html | 15 + src/auto-imports.d.ts | 22 + src/hooks.server.ts | 66 + src/index.test.ts | 7 + src/lib/components/atoms/button.styles.ts | 35 + src/lib/components/atoms/button.svelte | 30 + src/lib/components/atoms/checkbox.svelte | 43 + src/lib/components/atoms/fab.svelte | 48 + .../components/atoms/headless.select.svelte | 107 + src/lib/components/atoms/icon-button.svelte | 36 + src/lib/components/atoms/input.svelte | 143 + src/lib/components/atoms/line.svelte | 7 + src/lib/components/atoms/link-button.svelte | 56 + src/lib/components/atoms/modal.svelte | 89 + .../components/atoms/navigation-links.svelte | 30 + src/lib/components/atoms/pagination.svelte | 82 + src/lib/components/atoms/pill.svelte | 25 + src/lib/components/atoms/select.svelte | 39 + .../components/atoms/skeleton-loader.svelte | 25 + src/lib/components/atoms/switch.svelte | 65 + src/lib/components/atoms/title.svelte | 59 + .../molecules/centered-spinner.svelte | 8 + src/lib/components/molecules/loader.svelte | 30 + .../molecules/session-validator.svelte | 23 + .../alert-dialog/alert-dialog-action.svelte | 21 + .../alert-dialog/alert-dialog-cancel.svelte | 21 + .../alert-dialog/alert-dialog-content.svelte | 28 + .../alert-dialog-description.svelte | 16 + .../alert-dialog/alert-dialog-footer.svelte | 16 + .../alert-dialog/alert-dialog-header.svelte | 13 + .../alert-dialog/alert-dialog-overlay.svelte | 21 + .../alert-dialog/alert-dialog-portal.svelte | 9 + .../ui/alert-dialog/alert-dialog-title.svelte | 14 + src/lib/components/ui/alert-dialog/index.ts | 40 + src/lib/components/ui/button/button.svelte | 25 + src/lib/components/ui/button/index.ts | 54 + .../components/ui/checkbox/checkbox.svelte | 35 + src/lib/components/ui/checkbox/index.ts | 6 + .../ui/dialog/dialog-content.svelte | 36 + .../ui/dialog/dialog-description.svelte | 16 + .../components/ui/dialog/dialog-footer.svelte | 16 + .../components/ui/dialog/dialog-header.svelte | 13 + .../ui/dialog/dialog-overlay.svelte | 21 + .../components/ui/dialog/dialog-portal.svelte | 8 + .../components/ui/dialog/dialog-title.svelte | 16 + src/lib/components/ui/dialog/index.ts | 37 + src/lib/components/ui/input/index.ts | 29 + src/lib/components/ui/input/input.svelte | 42 + src/lib/components/ui/label/index.ts | 7 + src/lib/components/ui/label/label.svelte | 21 + src/lib/components/ui/table/index.ts | 28 + src/lib/components/ui/table/table-body.svelte | 13 + .../components/ui/table/table-caption.svelte | 13 + src/lib/components/ui/table/table-cell.svelte | 18 + .../components/ui/table/table-footer.svelte | 13 + src/lib/components/ui/table/table-head.svelte | 19 + .../components/ui/table/table-header.svelte | 14 + src/lib/components/ui/table/table-row.svelte | 23 + src/lib/components/ui/table/table.svelte | 15 + src/lib/components/ui/textarea/index.ts | 28 + .../components/ui/textarea/textarea.svelte | 38 + src/lib/server/array.chunk.ts | 9 + src/lib/server/connectors/redis.ts | 10 + src/lib/server/connectors/surreal.db.ts | 36 + src/lib/server/cookie.functions.ts | 50 + src/lib/server/db/apidata.db.ts | 212 + src/lib/server/db/apidraw.db.ts | 100 + src/lib/server/db/apipostdata.db.ts | 96 + src/lib/server/db/apiuser.db.ts | 279 ++ src/lib/server/db/booking.db.ts | 4 + src/lib/server/db/finalsheet.db.ts | 40 + src/lib/server/db/presetdata.db.ts | 65 + src/lib/server/db/user.db.ts | 90 + src/lib/server/deprecated.fs.hlprz.ts | 291 ++ .../server/external/api.scraping.helpers.ts | 316 ++ src/lib/server/finalsheet.helpers.ts | 270 ++ src/lib/server/hashing.ts | 11 + src/lib/server/postdata/post.handler.ts | 445 +++ .../postdata/postdata.gen.controller.ts | 447 +++ .../server/postdata/postdata.gen.helpers.ts | 213 + src/lib/server/session.helpers.ts | 103 + src/lib/server/test.booking.helpers.ts | 0 src/lib/server/utils/session.service.ts | 63 + src/lib/stores/booking.state.ts | 75 + src/lib/trpc/client.ts | 12 + src/lib/trpc/context.ts | 17 + src/lib/trpc/router.ts | 22 + src/lib/trpc/routers/apiauth.router.ts | 102 + src/lib/trpc/routers/apidata.router.ts | 187 + src/lib/trpc/routers/apiuser.router.ts | 37 + src/lib/trpc/routers/booking.router.ts | 72 + src/lib/trpc/routers/draws.router.ts | 30 + src/lib/trpc/routers/postdata.router.ts | 212 + src/lib/trpc/routers/presetdata.router.ts | 35 + src/lib/trpc/routers/session.router.ts | 13 + src/lib/trpc/t.ts | 29 + src/lib/trpc/trpc.ts | 19 + src/lib/utils.ts | 188 + .../utils/booking/booking-field-controller.ts | 0 src/lib/utils/booking/booking.sync.ts | 105 + src/lib/utils/booking/data.entry.helpers.ts | 35 + src/lib/utils/constants.ts | 213 + src/lib/utils/data.types.ts | 382 ++ src/lib/utils/datetime.helper.utils.ts | 59 + src/lib/utils/entry.parser.ts | 42 + src/lib/utils/finalsheet.utils.ts | 237 ++ src/lib/utils/permutations.ts | 52 + src/lib/utils/rng.ts | 3 + src/routes/+error.svelte | 22 + src/routes/+layout.server.ts | 5 + src/routes/+layout.svelte | 25 + src/routes/+page.server.ts | 14 + src/routes/+page.svelte | 6 + src/routes/admin/+layout.svelte | 8 + src/routes/admin/+page.svelte | 130 + src/routes/admin/admin-navbar.svelte | 79 + src/routes/admin/api-controls/+page.server.ts | 55 + src/routes/admin/api-controls/+page.svelte | 47 + .../api-controls/fetch-latest-data.svelte | 153 + .../admin/api-controls/refetch-dealers.svelte | 65 + .../api-controls/refetch-distributors.svelte | 61 + .../api-controls/session-verifier.svelte | 66 + .../api-controls/set-new-session-form.svelte | 110 + src/routes/admin/copy-counts.ls.ts | 19 + src/routes/admin/data-fetching-filters.svelte | 97 + src/routes/admin/fs-info.svelte | 36 + src/routes/admin/fs-modal.svelte | 591 +++ src/routes/admin/fs-table.svelte | 426 ++ src/routes/admin/fs.stores.ts | 28 + .../admin/post-data-config/+page.svelte | 97 + .../add-post-user-modal.svelte | 102 + .../post-data-config/data-fetch-config.svelte | 86 + .../post-user-controls.svelte | 23 + .../post-data-config/session-verifier.svelte | 72 + .../set-new-session-form.svelte | 110 + src/routes/admin/post-data-config/stores.ts | 43 + .../admin/post-data-history/+page.svelte | 177 + .../data-fetch-config.svelte | 104 + .../data-fetching-filters.svelte | 100 + .../post-data-history/post-data-view.svelte | 233 ++ src/routes/admin/post-data-history/stores.ts | 29 + src/routes/admin/post-data-panel/+page.svelte | 125 + .../data-entry-input-section.svelte | 73 + .../post-data-panel/data-fetch-config.svelte | 104 + .../data-fetching-filters.svelte | 39 + .../post-data-panel/preset-data-view.svelte | 302 ++ src/routes/admin/post-data-panel/stores.ts | 45 + .../admin/post-data-preview-table.svelte | 248 ++ .../admin/post-data-summary-section.svelte | 88 + src/routes/admin/stores.ts | 32 + src/routes/admin/user-data/+page.svelte | 294 ++ src/routes/admin/users/+page.svelte | 7 + src/routes/api/auth/logout/+server.ts | 17 + src/routes/api/auth/signin/+server.ts | 117 + src/routes/api/auth/verify/+server.ts | 16 + src/routes/api/debug/user/+server.ts | 59 + src/routes/auth/signin/+page.svelte | 13 + src/routes/auth/signin/signinform.svelte | 162 + src/routes/user/+layout.svelte | 1 + src/routes/user/+page.svelte | 208 + .../components/data-entry-input-field.svelte | 41 + .../user/components/data-entry-section.svelte | 384 ++ .../user/components/data-entry-view.svelte | 145 + src/routes/user/components/draw-select.svelte | 55 + src/routes/user/components/live-clock.svelte | 44 + .../user/components/schemes-section.svelte | 90 + src/routes/user/page.types.ts | 0 src/routes/user/user-navbar.svelte | 57 + static/favicon.png | Bin 0 -> 3117 bytes static/fonts/InterV.ttf | Bin 0 -> 803384 bytes static/images/signin-bg.svg | 103 + svelte.config.js | 17 + tailwind.config.ts | 64 + tsconfig.json | 17 + vite.config.ts | 26 + 186 files changed, 17269 insertions(+) create mode 100755 .dockerignore create mode 100755 .gitignore create mode 100755 Dockerfile create mode 100755 Dockerfile.bun create mode 100644 components.json create mode 100755 package.json create mode 100755 pnpm-lock.yaml create mode 100755 postcss.config.js create mode 100644 src/__tests__/postdata.test.ts create mode 100755 src/app.css create mode 100755 src/app.d.ts create mode 100755 src/app.html create mode 100755 src/auto-imports.d.ts create mode 100755 src/hooks.server.ts create mode 100755 src/index.test.ts create mode 100644 src/lib/components/atoms/button.styles.ts create mode 100755 src/lib/components/atoms/button.svelte create mode 100755 src/lib/components/atoms/checkbox.svelte create mode 100755 src/lib/components/atoms/fab.svelte create mode 100755 src/lib/components/atoms/headless.select.svelte create mode 100755 src/lib/components/atoms/icon-button.svelte create mode 100755 src/lib/components/atoms/input.svelte create mode 100755 src/lib/components/atoms/line.svelte create mode 100755 src/lib/components/atoms/link-button.svelte create mode 100755 src/lib/components/atoms/modal.svelte create mode 100755 src/lib/components/atoms/navigation-links.svelte create mode 100755 src/lib/components/atoms/pagination.svelte create mode 100755 src/lib/components/atoms/pill.svelte create mode 100755 src/lib/components/atoms/select.svelte create mode 100755 src/lib/components/atoms/skeleton-loader.svelte create mode 100755 src/lib/components/atoms/switch.svelte create mode 100755 src/lib/components/atoms/title.svelte create mode 100755 src/lib/components/molecules/centered-spinner.svelte create mode 100755 src/lib/components/molecules/loader.svelte create mode 100755 src/lib/components/molecules/session-validator.svelte create mode 100644 src/lib/components/ui/alert-dialog/alert-dialog-action.svelte create mode 100644 src/lib/components/ui/alert-dialog/alert-dialog-cancel.svelte create mode 100644 src/lib/components/ui/alert-dialog/alert-dialog-content.svelte create mode 100644 src/lib/components/ui/alert-dialog/alert-dialog-description.svelte create mode 100644 src/lib/components/ui/alert-dialog/alert-dialog-footer.svelte create mode 100644 src/lib/components/ui/alert-dialog/alert-dialog-header.svelte create mode 100644 src/lib/components/ui/alert-dialog/alert-dialog-overlay.svelte create mode 100644 src/lib/components/ui/alert-dialog/alert-dialog-portal.svelte create mode 100644 src/lib/components/ui/alert-dialog/alert-dialog-title.svelte create mode 100644 src/lib/components/ui/alert-dialog/index.ts create mode 100644 src/lib/components/ui/button/button.svelte create mode 100644 src/lib/components/ui/button/index.ts create mode 100644 src/lib/components/ui/checkbox/checkbox.svelte create mode 100644 src/lib/components/ui/checkbox/index.ts create mode 100644 src/lib/components/ui/dialog/dialog-content.svelte create mode 100644 src/lib/components/ui/dialog/dialog-description.svelte create mode 100644 src/lib/components/ui/dialog/dialog-footer.svelte create mode 100644 src/lib/components/ui/dialog/dialog-header.svelte create mode 100644 src/lib/components/ui/dialog/dialog-overlay.svelte create mode 100644 src/lib/components/ui/dialog/dialog-portal.svelte create mode 100644 src/lib/components/ui/dialog/dialog-title.svelte create mode 100644 src/lib/components/ui/dialog/index.ts create mode 100644 src/lib/components/ui/input/index.ts create mode 100644 src/lib/components/ui/input/input.svelte create mode 100644 src/lib/components/ui/label/index.ts create mode 100644 src/lib/components/ui/label/label.svelte create mode 100644 src/lib/components/ui/table/index.ts create mode 100644 src/lib/components/ui/table/table-body.svelte create mode 100644 src/lib/components/ui/table/table-caption.svelte create mode 100644 src/lib/components/ui/table/table-cell.svelte create mode 100644 src/lib/components/ui/table/table-footer.svelte create mode 100644 src/lib/components/ui/table/table-head.svelte create mode 100644 src/lib/components/ui/table/table-header.svelte create mode 100644 src/lib/components/ui/table/table-row.svelte create mode 100644 src/lib/components/ui/table/table.svelte create mode 100644 src/lib/components/ui/textarea/index.ts create mode 100644 src/lib/components/ui/textarea/textarea.svelte create mode 100755 src/lib/server/array.chunk.ts create mode 100755 src/lib/server/connectors/redis.ts create mode 100755 src/lib/server/connectors/surreal.db.ts create mode 100755 src/lib/server/cookie.functions.ts create mode 100755 src/lib/server/db/apidata.db.ts create mode 100755 src/lib/server/db/apidraw.db.ts create mode 100755 src/lib/server/db/apipostdata.db.ts create mode 100755 src/lib/server/db/apiuser.db.ts create mode 100755 src/lib/server/db/booking.db.ts create mode 100755 src/lib/server/db/finalsheet.db.ts create mode 100755 src/lib/server/db/presetdata.db.ts create mode 100755 src/lib/server/db/user.db.ts create mode 100755 src/lib/server/deprecated.fs.hlprz.ts create mode 100755 src/lib/server/external/api.scraping.helpers.ts create mode 100755 src/lib/server/finalsheet.helpers.ts create mode 100755 src/lib/server/hashing.ts create mode 100644 src/lib/server/postdata/post.handler.ts create mode 100644 src/lib/server/postdata/postdata.gen.controller.ts create mode 100644 src/lib/server/postdata/postdata.gen.helpers.ts create mode 100755 src/lib/server/session.helpers.ts create mode 100755 src/lib/server/test.booking.helpers.ts create mode 100644 src/lib/server/utils/session.service.ts create mode 100755 src/lib/stores/booking.state.ts create mode 100755 src/lib/trpc/client.ts create mode 100755 src/lib/trpc/context.ts create mode 100755 src/lib/trpc/router.ts create mode 100755 src/lib/trpc/routers/apiauth.router.ts create mode 100755 src/lib/trpc/routers/apidata.router.ts create mode 100644 src/lib/trpc/routers/apiuser.router.ts create mode 100755 src/lib/trpc/routers/booking.router.ts create mode 100755 src/lib/trpc/routers/draws.router.ts create mode 100644 src/lib/trpc/routers/postdata.router.ts create mode 100644 src/lib/trpc/routers/presetdata.router.ts create mode 100755 src/lib/trpc/routers/session.router.ts create mode 100755 src/lib/trpc/t.ts create mode 100755 src/lib/trpc/trpc.ts create mode 100755 src/lib/utils.ts create mode 100755 src/lib/utils/booking/booking-field-controller.ts create mode 100755 src/lib/utils/booking/booking.sync.ts create mode 100755 src/lib/utils/booking/data.entry.helpers.ts create mode 100755 src/lib/utils/constants.ts create mode 100755 src/lib/utils/data.types.ts create mode 100755 src/lib/utils/datetime.helper.utils.ts create mode 100644 src/lib/utils/entry.parser.ts create mode 100755 src/lib/utils/finalsheet.utils.ts create mode 100755 src/lib/utils/permutations.ts create mode 100755 src/lib/utils/rng.ts create mode 100755 src/routes/+error.svelte create mode 100755 src/routes/+layout.server.ts create mode 100755 src/routes/+layout.svelte create mode 100755 src/routes/+page.server.ts create mode 100755 src/routes/+page.svelte create mode 100755 src/routes/admin/+layout.svelte create mode 100755 src/routes/admin/+page.svelte create mode 100755 src/routes/admin/admin-navbar.svelte create mode 100755 src/routes/admin/api-controls/+page.server.ts create mode 100755 src/routes/admin/api-controls/+page.svelte create mode 100755 src/routes/admin/api-controls/fetch-latest-data.svelte create mode 100755 src/routes/admin/api-controls/refetch-dealers.svelte create mode 100755 src/routes/admin/api-controls/refetch-distributors.svelte create mode 100755 src/routes/admin/api-controls/session-verifier.svelte create mode 100755 src/routes/admin/api-controls/set-new-session-form.svelte create mode 100755 src/routes/admin/copy-counts.ls.ts create mode 100755 src/routes/admin/data-fetching-filters.svelte create mode 100755 src/routes/admin/fs-info.svelte create mode 100755 src/routes/admin/fs-modal.svelte create mode 100755 src/routes/admin/fs-table.svelte create mode 100755 src/routes/admin/fs.stores.ts create mode 100644 src/routes/admin/post-data-config/+page.svelte create mode 100644 src/routes/admin/post-data-config/add-post-user-modal.svelte create mode 100644 src/routes/admin/post-data-config/data-fetch-config.svelte create mode 100644 src/routes/admin/post-data-config/post-user-controls.svelte create mode 100755 src/routes/admin/post-data-config/session-verifier.svelte create mode 100755 src/routes/admin/post-data-config/set-new-session-form.svelte create mode 100644 src/routes/admin/post-data-config/stores.ts create mode 100644 src/routes/admin/post-data-history/+page.svelte create mode 100644 src/routes/admin/post-data-history/data-fetch-config.svelte create mode 100755 src/routes/admin/post-data-history/data-fetching-filters.svelte create mode 100644 src/routes/admin/post-data-history/post-data-view.svelte create mode 100644 src/routes/admin/post-data-history/stores.ts create mode 100644 src/routes/admin/post-data-panel/+page.svelte create mode 100644 src/routes/admin/post-data-panel/data-entry-input-section.svelte create mode 100644 src/routes/admin/post-data-panel/data-fetch-config.svelte create mode 100755 src/routes/admin/post-data-panel/data-fetching-filters.svelte create mode 100644 src/routes/admin/post-data-panel/preset-data-view.svelte create mode 100644 src/routes/admin/post-data-panel/stores.ts create mode 100644 src/routes/admin/post-data-preview-table.svelte create mode 100644 src/routes/admin/post-data-summary-section.svelte create mode 100644 src/routes/admin/stores.ts create mode 100755 src/routes/admin/user-data/+page.svelte create mode 100755 src/routes/admin/users/+page.svelte create mode 100755 src/routes/api/auth/logout/+server.ts create mode 100755 src/routes/api/auth/signin/+server.ts create mode 100755 src/routes/api/auth/verify/+server.ts create mode 100755 src/routes/api/debug/user/+server.ts create mode 100755 src/routes/auth/signin/+page.svelte create mode 100755 src/routes/auth/signin/signinform.svelte create mode 100755 src/routes/user/+layout.svelte create mode 100755 src/routes/user/+page.svelte create mode 100755 src/routes/user/components/data-entry-input-field.svelte create mode 100755 src/routes/user/components/data-entry-section.svelte create mode 100755 src/routes/user/components/data-entry-view.svelte create mode 100755 src/routes/user/components/draw-select.svelte create mode 100755 src/routes/user/components/live-clock.svelte create mode 100755 src/routes/user/components/schemes-section.svelte create mode 100755 src/routes/user/page.types.ts create mode 100755 src/routes/user/user-navbar.svelte create mode 100755 static/favicon.png create mode 100755 static/fonts/InterV.ttf create mode 100755 static/images/signin-bg.svg create mode 100755 svelte.config.js create mode 100644 tailwind.config.ts create mode 100755 tsconfig.json create mode 100755 vite.config.ts diff --git a/.dockerignore b/.dockerignore new file mode 100755 index 0000000..a735ebe --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +node_modules +build +.env diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..e825215 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules +build +.env +.svelte-kit diff --git a/Dockerfile b/Dockerfile new file mode 100755 index 0000000..ea31894 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM node:18-alpine as builder + +RUN apk add --no-cache libc6-compat + +RUN npm i -g pnpm + +WORKDIR /app + +COPY package.json pnpm-lock.yaml ./ + +RUN pnpm install + +COPY . . + +RUN pnpm run build + +EXPOSE 80 + +CMD ["pnpm", "run", "start"] diff --git a/Dockerfile.bun b/Dockerfile.bun new file mode 100755 index 0000000..115ffd5 --- /dev/null +++ b/Dockerfile.bun @@ -0,0 +1,15 @@ +FROM oven/bun:1.0.0 + +WORKDIR /app + +COPY package.json bun.lockb ./ + +RUN bun install + +COPY . . + +RUN bun run build + +EXPOSE 80 + +CMD ["bun", "run", "start"] diff --git a/components.json b/components.json new file mode 100644 index 0000000..0d5c9a5 --- /dev/null +++ b/components.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://shadcn-svelte.com/schema.json", + "style": "default", + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/app.css", + "baseColor": "gray" + }, + "aliases": { + "components": "$lib/components", + "utils": "$lib/utils" + }, + "typescript": true +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100755 index 0000000..e92d4d1 --- /dev/null +++ b/package.json @@ -0,0 +1,67 @@ +{ + "name": "rdv", + "description": "", + "version": "0.0.1", + "private": true, + "type": "module", + "scripts": { + "dev": "vite dev", + "start": "HOST=0.0.0.0 PORT=80 node ./build/index.js", + "build": "pnpm run check && vite build", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "test:unit": "vitest --watch" + }, + "dependencies": { + "@melt-ui/svelte": "^0.22.2", + "@sveltejs/svelte-virtual-list": "^3.0.1", + "@tanstack/match-sorter-utils": "^8.8.4", + "@tanstack/svelte-query": "^4.35.3", + "@tanstack/svelte-table": "^8.9.4", + "@trpc/client": "^10.45.2", + "@trpc/server": "^10.45.2", + "add": "^2.0.6", + "bcryptjs": "^2.4.3", + "bits-ui": "^0.21.13", + "clsx": "^2.1.1", + "date-fns": "^3.6.0", + "date-fns-tz": "^3.1.3", + "dayjs": "^1.11.9", + "dotenv": "^16.3.1", + "https-proxy-agent": "^7.0.5", + "ioredis": "^5.3.2", + "lucide-svelte": "^0.424.0", + "node-fetch": "^3.3.2", + "surrealdb.js": "^0.8.2", + "svelte-french-toast": "^1.1.0", + "svelte-headlessui": "^0.0.20", + "tailwind-merge": "^2.4.0", + "tailwind-variants": "^0.2.1", + "trpc-svelte-query-adapter": "^2.1.0", + "trpc-sveltekit": "^3.6.2", + "ulid": "^2.3.0", + "uuid": "^9.0.0", + "vite": "^5.3.5", + "zod": "^3.21.4" + }, + "devDependencies": { + "@iconify/json": "^2.2.91", + "@sveltejs/adapter-auto": "^2.1.0", + "@sveltejs/adapter-node": "^1.3.1", + "@sveltejs/kit": "^1.22.3", + "@tailwindcss/typography": "^0.5.13", + "@types/bcryptjs": "^2.4.2", + "@types/node": "^20.4.2", + "@types/uuid": "^9.0.2", + "autoprefixer": "^10.4.19", + "postcss": "^8.4.38", + "svelte": "^4.0.5", + "svelte-check": "^3.4.6", + "tailwindcss": "^3.4.4", + "tslib": "^2.6.0", + "typescript": "^5.1.6", + "unplugin-auto-import": "^0.16.6", + "unplugin-icons": "^0.16.5", + "vitest": "^0.33.0" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100755 index 0000000..0c44873 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3543 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@melt-ui/svelte': + specifier: ^0.22.2 + version: 0.22.2(svelte@4.2.1) + '@sveltejs/svelte-virtual-list': + specifier: ^3.0.1 + version: 3.0.1 + '@tanstack/match-sorter-utils': + specifier: ^8.8.4 + version: 8.8.4 + '@tanstack/svelte-query': + specifier: ^4.35.3 + version: 4.35.3(svelte@4.2.1) + '@tanstack/svelte-table': + specifier: ^8.9.4 + version: 8.10.1(svelte@4.2.1) + '@trpc/client': + specifier: ^10.45.2 + version: 10.45.2(@trpc/server@10.45.2) + '@trpc/server': + specifier: ^10.45.2 + version: 10.45.2 + add: + specifier: ^2.0.6 + version: 2.0.6 + bcryptjs: + specifier: ^2.4.3 + version: 2.4.3 + bits-ui: + specifier: ^0.21.13 + version: 0.21.13(svelte@4.2.1) + clsx: + specifier: ^2.1.1 + version: 2.1.1 + date-fns: + specifier: ^3.6.0 + version: 3.6.0 + date-fns-tz: + specifier: ^3.1.3 + version: 3.1.3(date-fns@3.6.0) + dayjs: + specifier: ^1.11.9 + version: 1.11.10 + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + https-proxy-agent: + specifier: ^7.0.5 + version: 7.0.5 + ioredis: + specifier: ^5.3.2 + version: 5.3.2 + lucide-svelte: + specifier: ^0.424.0 + version: 0.424.0(svelte@4.2.1) + node-fetch: + specifier: ^3.3.2 + version: 3.3.2 + surrealdb.js: + specifier: ^0.8.2 + version: 0.8.4 + svelte-french-toast: + specifier: ^1.1.0 + version: 1.2.0(svelte@4.2.1) + svelte-headlessui: + specifier: ^0.0.20 + version: 0.0.20(svelte@4.2.1) + tailwind-merge: + specifier: ^2.4.0 + version: 2.4.0 + tailwind-variants: + specifier: ^0.2.1 + version: 0.2.1(tailwindcss@3.4.7) + trpc-svelte-query-adapter: + specifier: ^2.1.0 + version: 2.1.0 + trpc-sveltekit: + specifier: ^3.6.2 + version: 3.6.2(@sveltejs/adapter-node@1.3.1(@sveltejs/kit@1.25.0(svelte@4.2.1)(vite@5.3.5(@types/node@20.6.4))))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(ws@8.14.2) + ulid: + specifier: ^2.3.0 + version: 2.3.0 + uuid: + specifier: ^9.0.0 + version: 9.0.1 + vite: + specifier: ^5.3.5 + version: 5.3.5(@types/node@20.6.4) + zod: + specifier: ^3.21.4 + version: 3.22.2 + devDependencies: + '@iconify/json': + specifier: ^2.2.91 + version: 2.2.119 + '@sveltejs/adapter-auto': + specifier: ^2.1.0 + version: 2.1.0(@sveltejs/kit@1.25.0(svelte@4.2.1)(vite@5.3.5(@types/node@20.6.4))) + '@sveltejs/adapter-node': + specifier: ^1.3.1 + version: 1.3.1(@sveltejs/kit@1.25.0(svelte@4.2.1)(vite@5.3.5(@types/node@20.6.4))) + '@sveltejs/kit': + specifier: ^1.22.3 + version: 1.25.0(svelte@4.2.1)(vite@5.3.5(@types/node@20.6.4)) + '@tailwindcss/typography': + specifier: ^0.5.13 + version: 0.5.13(tailwindcss@3.4.7) + '@types/bcryptjs': + specifier: ^2.4.2 + version: 2.4.4 + '@types/node': + specifier: ^20.4.2 + version: 20.6.4 + '@types/uuid': + specifier: ^9.0.2 + version: 9.0.4 + autoprefixer: + specifier: ^10.4.19 + version: 10.4.20(postcss@8.4.40) + postcss: + specifier: ^8.4.38 + version: 8.4.40 + svelte: + specifier: ^4.0.5 + version: 4.2.1 + svelte-check: + specifier: ^3.4.6 + version: 3.5.2(postcss-load-config@4.0.1(postcss@8.4.40))(postcss@8.4.40)(svelte@4.2.1) + tailwindcss: + specifier: ^3.4.4 + version: 3.4.7 + tslib: + specifier: ^2.6.0 + version: 2.6.2 + typescript: + specifier: ^5.1.6 + version: 5.2.2 + unplugin-auto-import: + specifier: ^0.16.6 + version: 0.16.6(rollup@3.29.2) + unplugin-icons: + specifier: ^0.16.5 + version: 0.16.6 + vitest: + specifier: ^0.33.0 + version: 0.33.0 + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.2.1': + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + + '@antfu/install-pkg@0.1.1': + resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==} + + '@antfu/utils@0.7.6': + resolution: {integrity: sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@floating-ui/core@1.5.0': + resolution: {integrity: sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==} + + '@floating-ui/dom@1.5.3': + resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==} + + '@floating-ui/utils@0.1.4': + resolution: {integrity: sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==} + + '@iconify/json@2.2.119': + resolution: {integrity: sha512-tYvxJpBds6UgXe6/iq2pW7hblsniDGWuKEwCr8PnSKLmZMilrtzHX7v+pg7FFmV2l2qA2Iw4toMRpe11tWBI4Q==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@2.1.10': + resolution: {integrity: sha512-0/+5hxjzCZ9RoYpqxnOzbnpQyMdZRuHcMxPJeuX+x/aZkAAD/N4TajDjAPT7LpX+M0bfLExj/p0bbDkUfp0lrg==} + + '@internationalized/date@3.5.5': + resolution: {integrity: sha512-H+CfYvOZ0LTJeeLOqm19E3uj/4YjrmOFtBufDHPfvtI80hFAMqtrp7oCACpe4Cil5l8S0Qu/9dYfZc/5lY8WQQ==} + + '@ioredis/commands@1.2.0': + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.3': + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.1': + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.1.2': + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.19': + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + + '@melt-ui/svelte@0.22.2': + resolution: {integrity: sha512-mcXyoEW5/74y3QWnxHeSZgj+F/zG6mK4F//Wqig3KUGZ6uUEDwjkRCGDhY3EvL5n8MfY2P8uJWXiTZ16kLeh7g==} + peerDependencies: + svelte: '>=3 <5' + + '@melt-ui/svelte@0.76.2': + resolution: {integrity: sha512-7SbOa11tXUS95T3fReL+dwDs5FyJtCEqrqG3inRziDws346SYLsxOQ6HmX+4BkIsQh1R8U3XNa+EMmdMt38lMA==} + peerDependencies: + svelte: '>=3 <5' + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@polka/url@1.0.0-next.23': + resolution: {integrity: sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==} + + '@rollup/plugin-commonjs@25.0.4': + resolution: {integrity: sha512-L92Vz9WUZXDnlQQl3EwbypJR4+DM2EbsO+/KOcEkP4Mc6Ct453EeDB2uH9lgRwj4w5yflgNpq9pHOiY8aoUXBQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-json@6.0.0': + resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@15.2.1': + resolution: {integrity: sha512-nsbUg588+GDSu8/NS8T4UAshO6xeaOfINNuXeVHcKV02LJtoRaM1SiOacClw4kws1SFiNhdLGxlbMY9ga/zs/w==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.0.4': + resolution: {integrity: sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.20.0': + resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.20.0': + resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.20.0': + resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.20.0': + resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.20.0': + resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.20.0': + resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.20.0': + resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.20.0': + resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.20.0': + resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.20.0': + resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.20.0': + resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.20.0': + resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.20.0': + resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.20.0': + resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==} + cpu: [x64] + os: [win32] + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sveltejs/adapter-auto@2.1.0': + resolution: {integrity: sha512-o2pZCfATFtA/Gw/BB0Xm7k4EYaekXxaPGER3xGSY3FvzFJGTlJlZjBseaXwYSM94lZ0HniOjTokN3cWaLX6fow==} + peerDependencies: + '@sveltejs/kit': ^1.0.0 + + '@sveltejs/adapter-node@1.3.1': + resolution: {integrity: sha512-A0VgRQDCDPzdLNoiAbcOxGw4zT1Mc+n1LwT1OmO350R7WxrEqdMUChPPOd1iMfIDWlP4ie6E2d/WQf5es2d4Zw==} + peerDependencies: + '@sveltejs/kit': ^1.0.0 + + '@sveltejs/kit@1.25.0': + resolution: {integrity: sha512-+VqMWJJYtcLoF8hYkdqY2qs/MPaawrMwA/gNBJW2o2UrcuYdNiy0ZZnjQQuPD33df/VcAulnoeyzF5ZtaajFEw==} + engines: {node: ^16.14 || >=18} + hasBin: true + peerDependencies: + svelte: ^3.54.0 || ^4.0.0-next.0 + vite: ^4.0.0 + + '@sveltejs/svelte-virtual-list@3.0.1': + resolution: {integrity: sha512-aF9TptS7NKKS7/TqpsxQBSDJ9Q0XBYzBehCeIC5DzdMEgrJZpIYao9LRLnyyo6SVodpapm2B7FE/Lj+FSA5/SQ==} + + '@sveltejs/vite-plugin-svelte-inspector@1.0.4': + resolution: {integrity: sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==} + engines: {node: ^14.18.0 || >= 16} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^2.2.0 + svelte: ^3.54.0 || ^4.0.0 + vite: ^4.0.0 + + '@sveltejs/vite-plugin-svelte@2.4.6': + resolution: {integrity: sha512-zO79p0+DZnXPnF0ltIigWDx/ux7Ni+HRaFOw720Qeivc1azFUrJxTl0OryXVibYNx1hCboGia1NRV3x8RNv4cA==} + engines: {node: ^14.18.0 || >= 16} + peerDependencies: + svelte: ^3.54.0 || ^4.0.0 + vite: ^4.0.0 + + '@swc/helpers@0.5.12': + resolution: {integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==} + + '@tailwindcss/typography@0.5.13': + resolution: {integrity: sha512-ADGcJ8dX21dVVHIwTRgzrcunY6YY9uSlAHHGVKvkA+vLc5qLwEszvKts40lx7z0qc4clpjclwLeK5rVCV2P/uw==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + + '@tanstack/match-sorter-utils@8.8.4': + resolution: {integrity: sha512-rKH8LjZiszWEvmi01NR72QWZ8m4xmXre0OOwlRGnjU01Eqz/QnN+cqpty2PJ0efHblq09+KilvyR7lsbzmXVEw==} + engines: {node: '>=12'} + + '@tanstack/query-core@4.35.3': + resolution: {integrity: sha512-PS+WEjd9wzKTyNjjQymvcOe1yg8f3wYc6mD+vb6CKyZAKvu4sIJwryfqfBULITKCla7P9C4l5e9RXePHvZOZeQ==} + + '@tanstack/svelte-query@4.35.3': + resolution: {integrity: sha512-4gAWm6L+rofZOXZH//JKqKZoGOC1+/j0WgycpM9CwKKq/qIbXCoGW0r+0cO31s7O/F4v0qm+YZ3U7owOWfaiwQ==} + peerDependencies: + svelte: '>=3 <5' + + '@tanstack/svelte-table@8.10.1': + resolution: {integrity: sha512-JvCDqZ8iSMDX1qu2S76bE6QjyiOEr5VdlWiFTGXKIiD1WKEH1BOMddh+BPx6RUbUZddlhlZHlOfULA+FR48+hg==} + engines: {node: '>=12'} + peerDependencies: + svelte: ^4.0.0 || ^3.49.0 + + '@tanstack/table-core@8.10.1': + resolution: {integrity: sha512-dvO7wz+WjnT+7KI6ZZ+GAe9tljIFResDaV/TfOhfpeTB0ud9pILsavuM22HAXG2NsVaIG2Zax2OaVIsNt0z7Og==} + engines: {node: '>=12'} + + '@trpc/client@10.45.2': + resolution: {integrity: sha512-ykALM5kYWTLn1zYuUOZ2cPWlVfrXhc18HzBDyRhoPYN0jey4iQHEFSEowfnhg1RvYnrAVjNBgHNeSAXjrDbGwg==} + peerDependencies: + '@trpc/server': 10.45.2 + + '@trpc/server@10.45.2': + resolution: {integrity: sha512-wOrSThNNE4HUnuhJG6PfDRp4L2009KDVxsd+2VYH8ro6o/7/jwYZ8Uu5j+VaW+mOmc8EHerHzGcdbGNQSAUPgg==} + + '@types/bcryptjs@2.4.4': + resolution: {integrity: sha512-9wlJI7k5gRyJEC4yrV7DubzNQFTPiykYxUA6lBtsk5NlOfW9oWLJ1HdIA4YtE+6C3i3mTpDQQEosJ2rVZfBWnw==} + + '@types/chai-subset@1.3.3': + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + + '@types/chai@4.3.6': + resolution: {integrity: sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==} + + '@types/cookie@0.5.2': + resolution: {integrity: sha512-DBpRoJGKJZn7RY92dPrgoMew8xCWc2P71beqsjyhEI/Ds9mOyVmBwtekyfhpwFIVt1WrxTonFifiOZ62V8CnNA==} + + '@types/estree@1.0.2': + resolution: {integrity: sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/node@20.6.4': + resolution: {integrity: sha512-nU6d9MPY0NBUMiE/nXd2IIoC4OLvsLpwAjheoAeuzgvDZA1Cb10QYg+91AF6zQiKWRN5i1m07x6sMe0niBznoQ==} + + '@types/pug@2.0.6': + resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@types/uuid@9.0.4': + resolution: {integrity: sha512-zAuJWQflfx6dYJM62vna+Sn5aeSWhh3OB+wfUEACNcqUSc0AGc5JKl+ycL1vrH7frGTXhJchYjE1Hak8L819dA==} + + '@vitest/expect@0.33.0': + resolution: {integrity: sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==} + + '@vitest/runner@0.33.0': + resolution: {integrity: sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==} + + '@vitest/snapshot@0.33.0': + resolution: {integrity: sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==} + + '@vitest/spy@0.33.0': + resolution: {integrity: sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==} + + '@vitest/utils@0.33.0': + resolution: {integrity: sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==} + + acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + + acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + + add@2.0.6: + resolution: {integrity: sha512-j5QzrmsokwWWp6kUcJQySpbG+xfOBqqKnup3OIk1pz+kB/80SLorZ9V8zHFLO92Lcd+hbvq8bT+zOGoPkmBV0Q==} + + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bcryptjs@2.4.3: + resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==} + + binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + bits-ui@0.21.13: + resolution: {integrity: sha512-7nmOh6Ig7ND4DXZHv1FhNsY9yUGrad0+mf3tc4YN//3MgnJT1LnHtk4HZAKgmxCOe7txSX7/39LtYHbkrXokAQ==} + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.118 + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + caniuse-lite@1.0.30001647: + resolution: {integrity: sha512-n83xdNiyeNcHpzWY+1aFbqCK7LuLfBricc4+alSQL2Xb6OR3XpnQAmlDG+pQcdTfiHRuLcQ96VOfrPSGiNJYSg==} + + chai@4.3.8: + resolution: {integrity: sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==} + engines: {node: '>=4'} + + check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + + chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + + code-red@1.0.4: + resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + date-fns-tz@3.1.3: + resolution: {integrity: sha512-ZfbMu+nbzW0mEzC8VZrLiSWvUIaI3aRHeq33mTe7Y38UctKukgqPR4nTDwcwS4d64Gf8GghnVsroBuMY3eiTeA==} + peerDependencies: + date-fns: ^3.0.0 + + date-fns@3.6.0: + resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + + dayjs@1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + devalue@4.3.2: + resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + + electron-to-chromium@1.5.4: + resolution: {integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==} + + es6-promise@3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + esm-env@1.0.0: + resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + + fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + focus-trap@7.5.2: + resolution: {integrity: sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + + globalyzer@0.1.0: + resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + + https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + engines: {node: '>= 14'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-meta-resolve@3.0.0: + resolution: {integrity: sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ioredis@5.3.2: + resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} + engines: {node: '>=12.22.0'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + + jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + + lucide-svelte@0.424.0: + resolution: {integrity: sha512-mrEapPPlH5PWGMI0zs3dctR/6NylLx1VM9avRmH4OHN5aaldk4QYd/wTooROD4H6OKlC+7XOdgz0zX1tSxFlXw==} + peerDependencies: + svelte: ^3 || ^4 || ^5.0.0-next.42 + + magic-string@0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + + magic-string@0.30.3: + resolution: {integrity: sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==} + engines: {node: '>=12'} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mlly@1.4.2: + resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@4.0.2: + resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==} + engines: {node: ^14 || ^16 || >=18} + hasBin: true + + nanoid@5.0.7: + resolution: {integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==} + engines: {node: ^18 || >=20} + hasBin: true + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.1: + resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.0.1: + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.40: + resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} + engines: {node: ^10 || ^12 || >=14} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + proxy-deep@3.1.1: + resolution: {integrity: sha512-kppbvLUNJ4IOMZds9/4gz/rtT5OFiesy3XosLsgMKlF3vb6GA5Y3ptyDlzKLcOcUBW+zaY+RiMINTsgE+O6e+Q==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + + redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + + remove-accents@0.4.2: + resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.6: + resolution: {integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + + rollup@3.29.2: + resolution: {integrity: sha512-CJouHoZ27v6siztc21eEQGo0kIcE5D1gVPA571ez0mMYb25LGYGKnVNXpEj5MGlepmDWGXNjDB5q7uNiPHC11A==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + rollup@4.20.0: + resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + sander@0.5.1: + resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} + + scule@1.0.0: + resolution: {integrity: sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==} + + set-cookie-parser@2.6.0: + resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + sirv@2.0.3: + resolution: {integrity: sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==} + engines: {node: '>= 10'} + + sorcery@0.11.0: + resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} + hasBin: true + + source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + + std-env@3.4.3: + resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + + sucrase@3.34.0: + resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} + engines: {node: '>=8'} + hasBin: true + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + surrealdb.js@0.8.4: + resolution: {integrity: sha512-ToCyBHxpVPGXth31ZktQvv+s7fvZG6+sR3mXHNAlhq0/43yYiYx3+3cYvCDGZQNBNUI42KENv8/aBQ5mGQZEEA==} + + svelte-check@3.5.2: + resolution: {integrity: sha512-5a/YWbiH4c+AqAUP+0VneiV5bP8YOk9JL3jwvN+k2PEPLgpu85bjQc5eE67+eIZBBwUEJzmO3I92OqKcqbp3fw==} + hasBin: true + peerDependencies: + svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 + + svelte-french-toast@1.2.0: + resolution: {integrity: sha512-5PW+6RFX3xQPbR44CngYAP1Sd9oCq9P2FOox4FZffzJuZI2mHOB7q5gJBVnOiLF5y3moVGZ7u2bYt7+yPAgcEQ==} + peerDependencies: + svelte: ^3.57.0 || ^4.0.0 + + svelte-headlessui@0.0.20: + resolution: {integrity: sha512-Jobm+E5PW9Ya0EG5ELl9/vU4u2zKh9edhQV4BpFVos53VBgiZbC8bhwr0fefFLLlZim8z/L7WVUl3RWz7DPYlg==} + + svelte-hmr@0.15.3: + resolution: {integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==} + engines: {node: ^12.20 || ^14.13.1 || >= 16} + peerDependencies: + svelte: ^3.19.0 || ^4.0.0 + + svelte-preprocess@5.0.4: + resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==} + engines: {node: '>= 14.10.0'} + peerDependencies: + '@babel/core': ^7.10.2 + coffeescript: ^2.5.1 + less: ^3.11.3 || ^4.0.0 + postcss: ^7 || ^8 + postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 + pug: ^3.0.0 + sass: ^1.26.8 + stylus: ^0.55.0 + sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 + svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 + typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0' + peerDependenciesMeta: + '@babel/core': + optional: true + coffeescript: + optional: true + less: + optional: true + postcss: + optional: true + postcss-load-config: + optional: true + pug: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + typescript: + optional: true + + svelte-transition@0.0.10: + resolution: {integrity: sha512-BN8XDA7dKyuh+Lmdn3vxCzJd3M7L4BLdRziIAJew2AiBFMcrJJg8srEMYYoTCOLtYJ2Oqlv3+3/K5b6uHM8LSg==} + peerDependencies: + svelte: ^3.59.1 || ^4.0.0 + + svelte-writable-derived@3.1.0: + resolution: {integrity: sha512-cTvaVFNIJ036vSDIyPxJYivKC7ZLtcFOPm1Iq6qWBDo1fOHzfk6ZSbwaKrxhjgy52Rbl5IHzRcWgos6Zqn9/rg==} + peerDependencies: + svelte: ^3.2.1 || ^4.0.0-next.1 + + svelte@3.59.2: + resolution: {integrity: sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA==} + engines: {node: '>= 8'} + + svelte@4.2.1: + resolution: {integrity: sha512-LpLqY2Jr7cRxkrTc796/AaaoMLF/1ax7cto8Ot76wrvKQhrPmZ0JgajiWPmg9mTSDqO16SSLiD17r9MsvAPTmw==} + engines: {node: '>=16'} + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + tailwind-merge@2.4.0: + resolution: {integrity: sha512-49AwoOQNKdqKPd9CViyH5wJoSKsCDjUlzL8DxuGp3P1FsGY36NJDAa18jLZcaHAUUuTj+JB8IAo8zWgBNvBF7A==} + + tailwind-variants@0.2.1: + resolution: {integrity: sha512-2xmhAf4UIc3PijOUcJPA1LP4AbxhpcHuHM2C26xM0k81r0maAO6uoUSHl3APmvHZcY5cZCY/bYuJdfFa4eGoaw==} + engines: {node: '>=16.x', pnpm: '>=7.x'} + peerDependencies: + tailwindcss: '*' + + tailwindcss@3.4.7: + resolution: {integrity: sha512-rxWZbe87YJb4OcSopb7up2Ba4U82BoiSGUdoDr3Ydrg9ckxFS/YWsvhN323GMcddgU65QRy7JndC7ahhInhvlQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tiny-glob@0.2.9: + resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + + tinybench@2.5.1: + resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} + + tinypool@0.6.0: + resolution: {integrity: sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.1.1: + resolution: {integrity: sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==} + engines: {node: '>=14.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + trpc-svelte-query-adapter@2.1.0: + resolution: {integrity: sha512-PQP/OurS8Vr6NtZyk0SOXry4yQaQpz9PBvnBHNHT7TMASyUavHqe/x95QuUlMsa6+KXN2o2bz2Qcz6Qt2JDBvQ==} + + trpc-sveltekit@3.6.2: + resolution: {integrity: sha512-wfcUGpasdSQjNaMnbaaHs4gnh5580oNoOYBsnWujE8+tXyyYAxYA2z6vrQmuG4/rOLdbiEns5ISfsejZz9l+2Q==} + peerDependencies: + '@sveltejs/adapter-node': '>=1.2' + '@trpc/client': ^10.0.0 + '@trpc/server': ^10.0.0 + ws: '>=8' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.3.0: + resolution: {integrity: sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==} + + ulid@2.3.0: + resolution: {integrity: sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==} + hasBin: true + + undici@5.23.0: + resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} + engines: {node: '>=14.0'} + + unimport@3.3.0: + resolution: {integrity: sha512-3jhq3ZG5hFZzrWGDCpx83kjPzefP/EeuKkIO1T0MA4Zwj+dO/Og1mFvZ4aZ5WSDm0FVbbdVIRH1zKBG7c4wOpg==} + + unplugin-auto-import@0.16.6: + resolution: {integrity: sha512-M+YIITkx3C/Hg38hp8HmswP5mShUUyJOzpifv7RTlAbeFlO2Tyw0pwrogSSxnipHDPTtI8VHFBpkYkNKzYSuyA==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': ^3.2.2 + '@vueuse/core': '*' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + '@vueuse/core': + optional: true + + unplugin-icons@0.16.6: + resolution: {integrity: sha512-jL70sAC7twp4hI/MTfm+vyvTRtHqiEIzf3XOjJz7yzhMEEQnk5Ey5YIXRAU03Mc4BF99ITvvnBzfyRZee86OeA==} + peerDependencies: + '@svgr/core': '>=7.0.0' + '@svgx/core': ^1.0.1 + '@vue/compiler-sfc': ^3.0.2 || ^2.7.0 + vue-template-compiler: ^2.6.12 + vue-template-es2015-compiler: ^1.9.0 + peerDependenciesMeta: + '@svgr/core': + optional: true + '@svgx/core': + optional: true + '@vue/compiler-sfc': + optional: true + vue-template-compiler: + optional: true + vue-template-es2015-compiler: + optional: true + + unplugin@1.5.0: + resolution: {integrity: sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==} + + unws@0.2.4: + resolution: {integrity: sha512-/N1ajiqrSp0A/26/LBg7r10fOcPtGXCqJRJ61sijUFoGZMr6ESWGYn7i0cwr7fR7eEECY5HsitqtjGHDZLAu2w==} + engines: {node: '>=16.14.0'} + peerDependencies: + ws: '*' + + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + vite-node@0.33.0: + resolution: {integrity: sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==} + engines: {node: '>=v14.18.0'} + hasBin: true + + vite@4.4.9: + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vite@5.3.5: + resolution: {integrity: sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitefu@0.2.4: + resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 + peerDependenciesMeta: + vite: + optional: true + + vitest@0.33.0: + resolution: {integrity: sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack-virtual-modules@0.5.0: + resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.14.2: + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + yaml@2.3.2: + resolution: {integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==} + engines: {node: '>= 14'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + + zod@3.22.2: + resolution: {integrity: sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.2.1': + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + + '@antfu/install-pkg@0.1.1': + dependencies: + execa: 5.1.1 + find-up: 5.0.0 + + '@antfu/utils@0.7.6': {} + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@floating-ui/core@1.5.0': + dependencies: + '@floating-ui/utils': 0.1.4 + + '@floating-ui/dom@1.5.3': + dependencies: + '@floating-ui/core': 1.5.0 + '@floating-ui/utils': 0.1.4 + + '@floating-ui/utils@0.1.4': {} + + '@iconify/json@2.2.119': + dependencies: + '@iconify/types': 2.0.0 + pathe: 1.1.1 + + '@iconify/types@2.0.0': {} + + '@iconify/utils@2.1.10': + dependencies: + '@antfu/install-pkg': 0.1.1 + '@antfu/utils': 0.7.6 + '@iconify/types': 2.0.0 + debug: 4.3.4 + kolorist: 1.8.0 + local-pkg: 0.4.3 + transitivePeerDependencies: + - supports-color + + '@internationalized/date@3.5.5': + dependencies: + '@swc/helpers': 0.5.12 + + '@ioredis/commands@1.2.0': {} + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jridgewell/gen-mapping@0.3.3': + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 + + '@jridgewell/resolve-uri@3.1.1': {} + + '@jridgewell/set-array@1.1.2': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.19': + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@melt-ui/svelte@0.22.2(svelte@4.2.1)': + dependencies: + '@floating-ui/core': 1.5.0 + '@floating-ui/dom': 1.5.3 + focus-trap: 7.5.2 + nanoid: 4.0.2 + svelte: 4.2.1 + + '@melt-ui/svelte@0.76.2(svelte@4.2.1)': + dependencies: + '@floating-ui/core': 1.5.0 + '@floating-ui/dom': 1.5.3 + '@internationalized/date': 3.5.5 + dequal: 2.0.3 + focus-trap: 7.5.2 + nanoid: 5.0.7 + svelte: 4.2.1 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + '@polka/url@1.0.0-next.23': {} + + '@rollup/plugin-commonjs@25.0.4(rollup@3.29.2)': + dependencies: + '@rollup/pluginutils': 5.0.4(rollup@3.29.2) + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 8.1.0 + is-reference: 1.2.1 + magic-string: 0.27.0 + optionalDependencies: + rollup: 3.29.2 + + '@rollup/plugin-json@6.0.0(rollup@3.29.2)': + dependencies: + '@rollup/pluginutils': 5.0.4(rollup@3.29.2) + optionalDependencies: + rollup: 3.29.2 + + '@rollup/plugin-node-resolve@15.2.1(rollup@3.29.2)': + dependencies: + '@rollup/pluginutils': 5.0.4(rollup@3.29.2) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-builtin-module: 3.2.1 + is-module: 1.0.0 + resolve: 1.22.6 + optionalDependencies: + rollup: 3.29.2 + + '@rollup/pluginutils@5.0.4(rollup@3.29.2)': + dependencies: + '@types/estree': 1.0.2 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 3.29.2 + + '@rollup/rollup-android-arm-eabi@4.20.0': + optional: true + + '@rollup/rollup-android-arm64@4.20.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.20.0': + optional: true + + '@rollup/rollup-darwin-x64@4.20.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.20.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.20.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.20.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.20.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.20.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.20.0': + optional: true + + '@sinclair/typebox@0.27.8': {} + + '@sveltejs/adapter-auto@2.1.0(@sveltejs/kit@1.25.0(svelte@4.2.1)(vite@5.3.5(@types/node@20.6.4)))': + dependencies: + '@sveltejs/kit': 1.25.0(svelte@4.2.1)(vite@5.3.5(@types/node@20.6.4)) + import-meta-resolve: 3.0.0 + + '@sveltejs/adapter-node@1.3.1(@sveltejs/kit@1.25.0(svelte@4.2.1)(vite@5.3.5(@types/node@20.6.4)))': + dependencies: + '@rollup/plugin-commonjs': 25.0.4(rollup@3.29.2) + '@rollup/plugin-json': 6.0.0(rollup@3.29.2) + '@rollup/plugin-node-resolve': 15.2.1(rollup@3.29.2) + '@sveltejs/kit': 1.25.0(svelte@4.2.1)(vite@5.3.5(@types/node@20.6.4)) + rollup: 3.29.2 + + '@sveltejs/kit@1.25.0(svelte@4.2.1)(vite@5.3.5(@types/node@20.6.4))': + dependencies: + '@sveltejs/vite-plugin-svelte': 2.4.6(svelte@4.2.1)(vite@5.3.5(@types/node@20.6.4)) + '@types/cookie': 0.5.2 + cookie: 0.5.0 + devalue: 4.3.2 + esm-env: 1.0.0 + kleur: 4.1.5 + magic-string: 0.30.3 + mime: 3.0.0 + sade: 1.8.1 + set-cookie-parser: 2.6.0 + sirv: 2.0.3 + svelte: 4.2.1 + tiny-glob: 0.2.9 + undici: 5.23.0 + vite: 5.3.5(@types/node@20.6.4) + transitivePeerDependencies: + - supports-color + + '@sveltejs/svelte-virtual-list@3.0.1': {} + + '@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.4.6(svelte@4.2.1)(vite@5.3.5(@types/node@20.6.4)))(svelte@4.2.1)(vite@5.3.5(@types/node@20.6.4))': + dependencies: + '@sveltejs/vite-plugin-svelte': 2.4.6(svelte@4.2.1)(vite@5.3.5(@types/node@20.6.4)) + debug: 4.3.4 + svelte: 4.2.1 + vite: 5.3.5(@types/node@20.6.4) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@2.4.6(svelte@4.2.1)(vite@5.3.5(@types/node@20.6.4))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 1.0.4(@sveltejs/vite-plugin-svelte@2.4.6(svelte@4.2.1)(vite@5.3.5(@types/node@20.6.4)))(svelte@4.2.1)(vite@5.3.5(@types/node@20.6.4)) + debug: 4.3.4 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.3 + svelte: 4.2.1 + svelte-hmr: 0.15.3(svelte@4.2.1) + vite: 5.3.5(@types/node@20.6.4) + vitefu: 0.2.4(vite@5.3.5(@types/node@20.6.4)) + transitivePeerDependencies: + - supports-color + + '@swc/helpers@0.5.12': + dependencies: + tslib: 2.6.2 + + '@tailwindcss/typography@0.5.13(tailwindcss@3.4.7)': + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.7 + + '@tanstack/match-sorter-utils@8.8.4': + dependencies: + remove-accents: 0.4.2 + + '@tanstack/query-core@4.35.3': {} + + '@tanstack/svelte-query@4.35.3(svelte@3.59.2)': + dependencies: + '@tanstack/query-core': 4.35.3 + svelte: 3.59.2 + + '@tanstack/svelte-query@4.35.3(svelte@4.2.1)': + dependencies: + '@tanstack/query-core': 4.35.3 + svelte: 4.2.1 + + '@tanstack/svelte-table@8.10.1(svelte@4.2.1)': + dependencies: + '@tanstack/table-core': 8.10.1 + svelte: 4.2.1 + + '@tanstack/table-core@8.10.1': {} + + '@trpc/client@10.45.2(@trpc/server@10.45.2)': + dependencies: + '@trpc/server': 10.45.2 + + '@trpc/server@10.45.2': {} + + '@types/bcryptjs@2.4.4': {} + + '@types/chai-subset@1.3.3': + dependencies: + '@types/chai': 4.3.6 + + '@types/chai@4.3.6': {} + + '@types/cookie@0.5.2': {} + + '@types/estree@1.0.2': {} + + '@types/estree@1.0.5': {} + + '@types/node@20.6.4': {} + + '@types/pug@2.0.6': {} + + '@types/resolve@1.20.2': {} + + '@types/uuid@9.0.4': {} + + '@vitest/expect@0.33.0': + dependencies: + '@vitest/spy': 0.33.0 + '@vitest/utils': 0.33.0 + chai: 4.3.8 + + '@vitest/runner@0.33.0': + dependencies: + '@vitest/utils': 0.33.0 + p-limit: 4.0.0 + pathe: 1.1.1 + + '@vitest/snapshot@0.33.0': + dependencies: + magic-string: 0.30.3 + pathe: 1.1.1 + pretty-format: 29.7.0 + + '@vitest/spy@0.33.0': + dependencies: + tinyspy: 2.1.1 + + '@vitest/utils@0.33.0': + dependencies: + diff-sequences: 29.6.3 + loupe: 2.3.6 + pretty-format: 29.7.0 + + acorn-walk@8.2.0: {} + + acorn@8.10.0: {} + + add@2.0.6: {} + + agent-base@7.1.1: + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + ansi-styles@5.2.0: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + assertion-error@1.1.0: {} + + autoprefixer@10.4.20(postcss@8.4.40): + dependencies: + browserslist: 4.23.3 + caniuse-lite: 1.0.30001647 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.1 + postcss: 8.4.40 + postcss-value-parser: 4.2.0 + + axobject-query@3.2.1: + dependencies: + dequal: 2.0.3 + + balanced-match@1.0.2: {} + + bcryptjs@2.4.3: {} + + binary-extensions@2.2.0: {} + + bits-ui@0.21.13(svelte@4.2.1): + dependencies: + '@internationalized/date': 3.5.5 + '@melt-ui/svelte': 0.76.2(svelte@4.2.1) + nanoid: 5.0.7 + svelte: 4.2.1 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.2: + dependencies: + fill-range: 7.0.1 + + browserslist@4.23.3: + dependencies: + caniuse-lite: 1.0.30001647 + electron-to-chromium: 1.5.4 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + + buffer-crc32@0.2.13: {} + + builtin-modules@3.3.0: {} + + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + + cac@6.7.14: {} + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + caniuse-lite@1.0.30001647: {} + + chai@4.3.8: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + + check-error@1.0.2: {} + + chokidar@3.5.3: + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + clsx@2.1.1: {} + + cluster-key-slot@1.1.2: {} + + code-red@1.0.4: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + '@types/estree': 1.0.2 + acorn: 8.10.0 + estree-walker: 3.0.3 + periscopic: 3.1.0 + + commander@4.1.1: {} + + commondir@1.0.1: {} + + concat-map@0.0.1: {} + + cookie@0.5.0: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.0.2 + + cssesc@3.0.0: {} + + data-uri-to-buffer@4.0.1: {} + + date-fns-tz@3.1.3(date-fns@3.6.0): + dependencies: + date-fns: 3.6.0 + + date-fns@3.6.0: {} + + dayjs@1.11.10: {} + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + deep-eql@4.1.3: + dependencies: + type-detect: 4.0.8 + + deepmerge@4.3.1: {} + + denque@2.1.0: {} + + dequal@2.0.3: {} + + detect-indent@6.1.0: {} + + devalue@4.3.2: {} + + didyoumean@1.2.2: {} + + diff-sequences@29.6.3: {} + + dlv@1.1.3: {} + + dotenv@16.3.1: {} + + electron-to-chromium@1.5.4: {} + + es6-promise@3.3.1: {} + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.1.2: {} + + escape-string-regexp@5.0.0: {} + + esm-env@1.0.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.2 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + fast-glob@3.3.1: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + fastq@1.15.0: + dependencies: + reusify: 1.0.4 + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + fill-range@7.0.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + focus-trap@7.5.2: + dependencies: + tabbable: 6.2.0 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + fraction.js@4.3.7: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.1: {} + + get-func-name@2.0.0: {} + + get-stream@6.0.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.1.6: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + globalyzer@0.1.0: {} + + globrex@0.1.2: {} + + graceful-fs@4.2.11: {} + + has@1.0.3: + dependencies: + function-bind: 1.1.1 + + https-proxy-agent@7.0.5: + dependencies: + agent-base: 7.1.1 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-meta-resolve@3.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ioredis@5.3.2: + dependencies: + '@ioredis/commands': 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.3.4 + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.2.0 + + is-builtin-module@3.2.1: + dependencies: + builtin-modules: 3.3.0 + + is-core-module@2.13.0: + dependencies: + has: 1.0.3 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-module@1.0.0: {} + + is-number@7.0.0: {} + + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.2 + + is-reference@3.0.2: + dependencies: + '@types/estree': 1.0.2 + + is-stream@2.0.1: {} + + isexe@2.0.0: {} + + jiti@1.21.6: {} + + jsonc-parser@3.2.0: {} + + kleur@4.1.5: {} + + kolorist@1.8.0: {} + + lilconfig@2.1.0: {} + + lines-and-columns@1.2.4: {} + + local-pkg@0.4.3: {} + + locate-character@3.0.0: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.castarray@4.4.0: {} + + lodash.defaults@4.2.0: {} + + lodash.isarguments@3.1.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.merge@4.6.2: {} + + loupe@2.3.6: + dependencies: + get-func-name: 2.0.0 + + lucide-svelte@0.424.0(svelte@4.2.1): + dependencies: + svelte: 4.2.1 + + magic-string@0.27.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + magic-string@0.30.3: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + mdn-data@2.0.30: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.5: + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + mime@3.0.0: {} + + mimic-fn@2.1.0: {} + + min-indent@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + mlly@1.4.2: + dependencies: + acorn: 8.10.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.3.0 + + mri@1.2.0: {} + + mrmime@1.0.1: {} + + ms@2.1.2: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.7: {} + + nanoid@4.0.2: {} + + nanoid@5.0.7: {} + + node-domexception@1.0.0: {} + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-releases@2.0.18: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.0.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + pathe@1.1.1: {} + + pathval@1.1.1: {} + + periscopic@3.1.0: + dependencies: + '@types/estree': 1.0.2 + estree-walker: 3.0.3 + is-reference: 3.0.2 + + picocolors@1.0.0: {} + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pirates@4.0.6: {} + + pkg-types@1.0.3: + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.2 + pathe: 1.1.1 + + postcss-import@15.1.0(postcss@8.4.40): + dependencies: + postcss: 8.4.40 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.6 + + postcss-js@4.0.1(postcss@8.4.40): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.40 + + postcss-load-config@4.0.1(postcss@8.4.40): + dependencies: + lilconfig: 2.1.0 + yaml: 2.3.2 + optionalDependencies: + postcss: 8.4.40 + + postcss-nested@6.0.1(postcss@8.4.40): + dependencies: + postcss: 8.4.40 + postcss-selector-parser: 6.0.13 + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@6.0.13: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.40: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + + proxy-deep@3.1.1: {} + + queue-microtask@1.2.3: {} + + react-is@18.2.0: {} + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + redis-errors@1.2.0: {} + + redis-parser@3.0.0: + dependencies: + redis-errors: 1.2.0 + + remove-accents@0.4.2: {} + + resolve-from@4.0.0: {} + + resolve@1.22.6: + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.0.4: {} + + rimraf@2.7.1: + dependencies: + glob: 7.2.3 + + rollup@3.29.2: + optionalDependencies: + fsevents: 2.3.3 + + rollup@4.20.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.20.0 + '@rollup/rollup-android-arm64': 4.20.0 + '@rollup/rollup-darwin-arm64': 4.20.0 + '@rollup/rollup-darwin-x64': 4.20.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.20.0 + '@rollup/rollup-linux-arm-musleabihf': 4.20.0 + '@rollup/rollup-linux-arm64-gnu': 4.20.0 + '@rollup/rollup-linux-arm64-musl': 4.20.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.20.0 + '@rollup/rollup-linux-riscv64-gnu': 4.20.0 + '@rollup/rollup-linux-s390x-gnu': 4.20.0 + '@rollup/rollup-linux-x64-gnu': 4.20.0 + '@rollup/rollup-linux-x64-musl': 4.20.0 + '@rollup/rollup-win32-arm64-msvc': 4.20.0 + '@rollup/rollup-win32-ia32-msvc': 4.20.0 + '@rollup/rollup-win32-x64-msvc': 4.20.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + sander@0.5.1: + dependencies: + es6-promise: 3.3.1 + graceful-fs: 4.2.11 + mkdirp: 0.5.6 + rimraf: 2.7.1 + + scule@1.0.0: {} + + set-cookie-parser@2.6.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + siginfo@2.0.0: {} + + signal-exit@3.0.7: {} + + sirv@2.0.3: + dependencies: + '@polka/url': 1.0.0-next.23 + mrmime: 1.0.1 + totalist: 3.0.1 + + sorcery@0.11.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + buffer-crc32: 0.2.13 + minimist: 1.2.8 + sander: 0.5.1 + + source-map-js@1.0.2: {} + + source-map-js@1.2.0: {} + + stackback@0.0.2: {} + + standard-as-callback@2.1.0: {} + + std-env@3.4.3: {} + + streamsearch@1.1.0: {} + + strip-final-newline@2.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-literal@1.3.0: + dependencies: + acorn: 8.10.0 + + sucrase@3.34.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-preserve-symlinks-flag@1.0.0: {} + + surrealdb.js@0.8.4: + dependencies: + unws: 0.2.4(ws@8.14.2) + ws: 8.14.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + svelte-check@3.5.2(postcss-load-config@4.0.1(postcss@8.4.40))(postcss@8.4.40)(svelte@4.2.1): + dependencies: + '@jridgewell/trace-mapping': 0.3.19 + chokidar: 3.5.3 + fast-glob: 3.3.1 + import-fresh: 3.3.0 + picocolors: 1.0.0 + sade: 1.8.1 + svelte: 4.2.1 + svelte-preprocess: 5.0.4(postcss-load-config@4.0.1(postcss@8.4.40))(postcss@8.4.40)(svelte@4.2.1)(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - '@babel/core' + - coffeescript + - less + - postcss + - postcss-load-config + - pug + - sass + - stylus + - sugarss + + svelte-french-toast@1.2.0(svelte@4.2.1): + dependencies: + svelte: 4.2.1 + svelte-writable-derived: 3.1.0(svelte@4.2.1) + + svelte-headlessui@0.0.20(svelte@4.2.1): + dependencies: + svelte-transition: 0.0.10(svelte@4.2.1) + transitivePeerDependencies: + - svelte + + svelte-hmr@0.15.3(svelte@4.2.1): + dependencies: + svelte: 4.2.1 + + svelte-preprocess@5.0.4(postcss-load-config@4.0.1(postcss@8.4.40))(postcss@8.4.40)(svelte@4.2.1)(typescript@5.2.2): + dependencies: + '@types/pug': 2.0.6 + detect-indent: 6.1.0 + magic-string: 0.27.0 + sorcery: 0.11.0 + strip-indent: 3.0.0 + svelte: 4.2.1 + optionalDependencies: + postcss: 8.4.40 + postcss-load-config: 4.0.1(postcss@8.4.40) + typescript: 5.2.2 + + svelte-transition@0.0.10(svelte@4.2.1): + dependencies: + svelte: 4.2.1 + + svelte-writable-derived@3.1.0(svelte@4.2.1): + dependencies: + svelte: 4.2.1 + + svelte@3.59.2: {} + + svelte@4.2.1: + dependencies: + '@ampproject/remapping': 2.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 + acorn: 8.10.0 + aria-query: 5.3.0 + axobject-query: 3.2.1 + code-red: 1.0.4 + css-tree: 2.3.1 + estree-walker: 3.0.3 + is-reference: 3.0.2 + locate-character: 3.0.0 + magic-string: 0.30.3 + periscopic: 3.1.0 + + tabbable@6.2.0: {} + + tailwind-merge@2.4.0: {} + + tailwind-variants@0.2.1(tailwindcss@3.4.7): + dependencies: + tailwind-merge: 2.4.0 + tailwindcss: 3.4.7 + + tailwindcss@3.4.7: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.1 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.1 + postcss: 8.4.40 + postcss-import: 15.1.0(postcss@8.4.40) + postcss-js: 4.0.1(postcss@8.4.40) + postcss-load-config: 4.0.1(postcss@8.4.40) + postcss-nested: 6.0.1(postcss@8.4.40) + postcss-selector-parser: 6.0.13 + resolve: 1.22.6 + sucrase: 3.34.0 + transitivePeerDependencies: + - ts-node + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tiny-glob@0.2.9: + dependencies: + globalyzer: 0.1.0 + globrex: 0.1.2 + + tinybench@2.5.1: {} + + tinypool@0.6.0: {} + + tinyspy@2.1.1: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + totalist@3.0.1: {} + + trpc-svelte-query-adapter@2.1.0: + dependencies: + '@tanstack/svelte-query': 4.35.3(svelte@3.59.2) + '@trpc/client': 10.45.2(@trpc/server@10.45.2) + '@trpc/server': 10.45.2 + proxy-deep: 3.1.1 + svelte: 3.59.2 + + trpc-sveltekit@3.6.2(@sveltejs/adapter-node@1.3.1(@sveltejs/kit@1.25.0(svelte@4.2.1)(vite@5.3.5(@types/node@20.6.4))))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(ws@8.14.2): + dependencies: + '@sveltejs/adapter-node': 1.3.1(@sveltejs/kit@1.25.0(svelte@4.2.1)(vite@5.3.5(@types/node@20.6.4))) + '@trpc/client': 10.45.2(@trpc/server@10.45.2) + '@trpc/server': 10.45.2 + ws: 8.14.2 + + ts-interface-checker@0.1.13: {} + + tslib@2.6.2: {} + + type-detect@4.0.8: {} + + typescript@5.2.2: {} + + ufo@1.3.0: {} + + ulid@2.3.0: {} + + undici@5.23.0: + dependencies: + busboy: 1.6.0 + + unimport@3.3.0(rollup@3.29.2): + dependencies: + '@rollup/pluginutils': 5.0.4(rollup@3.29.2) + escape-string-regexp: 5.0.0 + fast-glob: 3.3.1 + local-pkg: 0.4.3 + magic-string: 0.30.3 + mlly: 1.4.2 + pathe: 1.1.1 + pkg-types: 1.0.3 + scule: 1.0.0 + strip-literal: 1.3.0 + unplugin: 1.5.0 + transitivePeerDependencies: + - rollup + + unplugin-auto-import@0.16.6(rollup@3.29.2): + dependencies: + '@antfu/utils': 0.7.6 + '@rollup/pluginutils': 5.0.4(rollup@3.29.2) + fast-glob: 3.3.1 + local-pkg: 0.4.3 + magic-string: 0.30.3 + minimatch: 9.0.3 + unimport: 3.3.0(rollup@3.29.2) + unplugin: 1.5.0 + transitivePeerDependencies: + - rollup + + unplugin-icons@0.16.6: + dependencies: + '@antfu/install-pkg': 0.1.1 + '@antfu/utils': 0.7.6 + '@iconify/utils': 2.1.10 + debug: 4.3.4 + kolorist: 1.8.0 + local-pkg: 0.4.3 + unplugin: 1.5.0 + transitivePeerDependencies: + - supports-color + + unplugin@1.5.0: + dependencies: + acorn: 8.10.0 + chokidar: 3.5.3 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.5.0 + + unws@0.2.4(ws@8.14.2): + dependencies: + ws: 8.14.2 + + update-browserslist-db@1.1.0(browserslist@4.23.3): + dependencies: + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.0.1 + + util-deprecate@1.0.2: {} + + uuid@9.0.1: {} + + vite-node@0.33.0(@types/node@20.6.4): + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.4.2 + pathe: 1.1.1 + picocolors: 1.0.0 + vite: 4.4.9(@types/node@20.6.4) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vite@4.4.9(@types/node@20.6.4): + dependencies: + esbuild: 0.18.20 + postcss: 8.4.40 + rollup: 3.29.2 + optionalDependencies: + '@types/node': 20.6.4 + fsevents: 2.3.3 + + vite@5.3.5(@types/node@20.6.4): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.40 + rollup: 4.20.0 + optionalDependencies: + '@types/node': 20.6.4 + fsevents: 2.3.3 + + vitefu@0.2.4(vite@5.3.5(@types/node@20.6.4)): + optionalDependencies: + vite: 5.3.5(@types/node@20.6.4) + + vitest@0.33.0: + dependencies: + '@types/chai': 4.3.6 + '@types/chai-subset': 1.3.3 + '@types/node': 20.6.4 + '@vitest/expect': 0.33.0 + '@vitest/runner': 0.33.0 + '@vitest/snapshot': 0.33.0 + '@vitest/spy': 0.33.0 + '@vitest/utils': 0.33.0 + acorn: 8.10.0 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.8 + debug: 4.3.4 + local-pkg: 0.4.3 + magic-string: 0.30.3 + pathe: 1.1.1 + picocolors: 1.0.0 + std-env: 3.4.3 + strip-literal: 1.3.0 + tinybench: 2.5.1 + tinypool: 0.6.0 + vite: 4.4.9(@types/node@20.6.4) + vite-node: 0.33.0(@types/node@20.6.4) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + web-streams-polyfill@3.3.3: {} + + webpack-sources@3.2.3: {} + + webpack-virtual-modules@0.5.0: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.2.2: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wrappy@1.0.2: {} + + ws@8.14.2: {} + + yaml@2.3.2: {} + + yocto-queue@0.1.0: {} + + yocto-queue@1.0.0: {} + + zod@3.22.2: {} diff --git a/postcss.config.js b/postcss.config.js new file mode 100755 index 0000000..ba80730 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +}; diff --git a/src/__tests__/postdata.test.ts b/src/__tests__/postdata.test.ts new file mode 100644 index 0000000..4865a1a --- /dev/null +++ b/src/__tests__/postdata.test.ts @@ -0,0 +1,57 @@ +import { expect, test } from "vitest"; +import { + generatePostDataArrayFromBaseInfo, + rebalancePostDataListByBalanceOfUsers, +} from "$lib/server/postdata/postdata.gen.controller"; + +import type { ApiPostUser, PostDataEntry } from "$lib/utils/data.types"; +import { buildMessageString } from "$lib/server/postdata/post.handler"; + +test("test rebalancePostDataListByBalanceOfUsers", () => { + // empty case + + const testA = {} as Record; + const testB = [] as any[]; + const testC = [] as any[]; + + rebalancePostDataListByBalanceOfUsers(testA, testB, testC); + + expect(testA).toEqual({}); + expect(testB).toEqual([]); + expect(testC).toEqual([]); + + const balanceCounts: Record = {}; + const users: ApiPostUser[] = []; + const result: PostDataEntry[] = []; +}); + +test("post body message string generation function", () => { + let i = 0, + data = [] as PostDataEntry[], + distId = 1, + dealerId = 2, + drawId = 69, + date = new Date().toISOString().split("T")[0]; + let out = buildMessageString(i, data, distId, dealerId, drawId, date); + expect(out.message).toEqual(""); + + // data.push({ + // id: "123123", + // first: 10, + // second: 20, + // number: "1234", + // }); + // out = buildMessageString(i, data, distId, dealerId, drawId, date); + // expect(out.message).toEqual(`1,1,2,${drawId},${date},1234,10,20,30`); + + // data.push({ + // id: "123124", + // first: 0, + // second: 5, + // number: "0987", + // }); + // out = buildMessageString(i, data, distId, dealerId, drawId, date); + // expect(out.message).toEqual( + // `1,1,2,${drawId},${date},1234,10,20,30;2,1,2,${drawId},${date},0987,0,5,5`, + // ); +}); diff --git a/src/app.css b/src/app.css new file mode 100755 index 0000000..a8b6561 --- /dev/null +++ b/src/app.css @@ -0,0 +1,90 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@font-face { + font-family: "Inter"; + src: url("/fonts/InterV.ttf"); +} + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 224 71.4% 4.1%; + + --muted: 220 14.3% 95.9%; + --muted-foreground: 220 8.9% 46.1%; + + --popover: 0 0% 100%; + --popover-foreground: 224 71.4% 4.1%; + + --card: 0 0% 100%; + --card-foreground: 224 71.4% 4.1%; + + --border: 220 13% 91%; + --input: 220 13% 91%; + + --primary: 220.9 39.3% 11%; + --primary-foreground: 210 20% 98%; + + --secondary: 220 14.3% 95.9%; + --secondary-foreground: 220.9 39.3% 11%; + + --accent: 220 14.3% 95.9%; + --accent-foreground: 220.9 39.3% 11%; + + --destructive: 0 72.2% 50.6%; + --destructive-foreground: 210 20% 98%; + + --ring: 224 71.4% 4.1%; + + --radius: 0.5rem; + } +} + +@layer base { + * { + @apply border-border; + } + + body { + @apply bg-background text-foreground; + font-family: + "Inter", + system-ui, + -apple-system, + BlinkMacSystemFont, + "Segoe UI", + Roboto, + Oxygen, + Ubuntu, + Cantarell, + "Open Sans", + "Helvetica Neue", + sans-serif; + } +} + +input::-webkit-outer-spin-button, +input::-webkit-inner-spin-button { + /* display: none; <- Crashes Chrome on hover */ + -webkit-appearance: none; + margin: 0; + /* <-- Apparently some margin are still there even though it's hidden */ +} + +input[type="number"] { + -moz-appearance: textfield; + /* Firefox */ +} + +select { + /* for Firefox */ + -moz-appearance: none; + /* for Safari, Chrome, Opera */ + -webkit-appearance: none; +} + +select::-ms-expand { + display: none; +} diff --git a/src/app.d.ts b/src/app.d.ts new file mode 100755 index 0000000..b4cf122 --- /dev/null +++ b/src/app.d.ts @@ -0,0 +1,18 @@ +/// +/// +import type { SessionData } from "$lib/server/cookie.functions"; + +// See https://kit.svelte.dev/docs/types#app +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + interface Locals { + user?: SessionData; + } + // interface PageData {} + // interface Platform {} + } +} + +export { }; diff --git a/src/app.html b/src/app.html new file mode 100755 index 0000000..6e8ce1f --- /dev/null +++ b/src/app.html @@ -0,0 +1,15 @@ + + + + + + + + %sveltekit.head% + + + +
%sveltekit.body%
+ + + diff --git a/src/auto-imports.d.ts b/src/auto-imports.d.ts new file mode 100755 index 0000000..e6fe5cf --- /dev/null +++ b/src/auto-imports.d.ts @@ -0,0 +1,22 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// noinspection JSUnusedGlobalSymbols +// Generated by unplugin-auto-import +export {} +declare global { + const afterUpdate: typeof import('svelte')['afterUpdate'] + const beforeUpdate: typeof import('svelte')['beforeUpdate'] + const createEventDispatcher: typeof import('svelte')['createEventDispatcher'] + const first: typeof import('./hooks.server')['first'] + const getAllContexts: typeof import('svelte')['getAllContexts'] + const getContext: typeof import('svelte')['getContext'] + const handle: typeof import('./hooks.server')['handle'] + const handleError: typeof import('./hooks.server')['handleError'] + const hasContext: typeof import('svelte')['hasContext'] + const onDestroy: typeof import('svelte')['onDestroy'] + const onMount: typeof import('svelte')['onMount'] + const second: typeof import('./hooks.server')['second'] + const setContext: typeof import('svelte')['setContext'] + const tick: typeof import('svelte')['tick'] +} diff --git a/src/hooks.server.ts b/src/hooks.server.ts new file mode 100755 index 0000000..14e2cb0 --- /dev/null +++ b/src/hooks.server.ts @@ -0,0 +1,66 @@ +import type { Handle, HandleServerError } from "@sveltejs/kit"; +import { + getParsedSession, + parseCookieString, + type SessionData, +} from "$lib/server/cookie.functions"; +import { createContext } from "$lib/trpc/context"; +import { router } from "$lib/trpc/router"; +import { createTRPCHandle } from "trpc-sveltekit"; +import { sequence } from "@sveltejs/kit/hooks"; + +export const handleError: HandleServerError = async ({ error, event }) => { + console.log("[-] Running error middleware for : ", event.url.pathname); + console.log(error); + return { + message: (error as Error).message, + }; +}; + +export const first: Handle = createTRPCHandle({ router, createContext }); + +export const second: Handle = async ({ resolve, event }) => { + if ( + event.url.pathname.includes("/api/auth") || + event.url.pathname.includes("/api/debug") || + event.url.pathname.includes("/trpc") || + event.url.pathname.includes("/auth") + ) { + return await resolve(event); + } + console.log("[+] Running hook middleware for : ", event.url.pathname); + const sessionId = parseCookieString( + event.request.headers.get("cookie") || "", + ).SID; + const baseUrl = event.url.origin; + const signInUrl = baseUrl + "/auth/signin"; + const isSignInPage = event.url.pathname === "/auth/signin"; + const redirectResponse = new Response(null, { + status: 302, + headers: { + Location: signInUrl, + "Set-Cookie": sessionId + ? "SID=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT" + : "", + }, + }); + if (!sessionId && !isSignInPage) { + return redirectResponse; + } + const user = await getParsedSession(sessionId); + if (!user && !isSignInPage) { + return redirectResponse; + } else if (user && isSignInPage) { + return new Response(null, { + status: 302, + headers: { + Location: baseUrl, + }, + }); + } + event.locals.user = (user ?? undefined) as SessionData | undefined; + // optional: make this a variable to run code after the request is prepared + return await resolve(event); +}; + +export const handle = sequence(first, second); diff --git a/src/index.test.ts b/src/index.test.ts new file mode 100755 index 0000000..e07cbbd --- /dev/null +++ b/src/index.test.ts @@ -0,0 +1,7 @@ +import { describe, it, expect } from 'vitest'; + +describe('sum test', () => { + it('adds 1 + 2 to equal 3', () => { + expect(1 + 2).toBe(3); + }); +}); diff --git a/src/lib/components/atoms/button.styles.ts b/src/lib/components/atoms/button.styles.ts new file mode 100644 index 0000000..f6466b2 --- /dev/null +++ b/src/lib/components/atoms/button.styles.ts @@ -0,0 +1,35 @@ +import clsx from "clsx"; +import { tv } from "tailwind-variants"; + +export const buttonStyles = tv( + { + base: clsx( + "p-2 px-4 flex gap-1.5 items-center justify-center rounded-md transition-all duration-150 shadow-sm font-medium tracking-wide", + ), + variants: { + intent: { + primary: clsx("bg-sky-500 text-white hover:bg-sky-600"), + secondary: "bg-sky-800 text-white", + success: "bg-emerald-500 text-white hover:bg-emerald-600", + danger: "bg-rose-500 text-white hover:bg-rose-600", + warning: "bg-amber-500 text-white hover:bg-amber-600", + ghost: clsx( + "bg-slate-100 text-slate-500 hover:text-slate-600 hover:bg-slate-200", + ), + primaryInverted: clsx("bg-sky-50 text-sky-600 hover:bg-sky-100"), + successInverted: clsx( + "bg-emerald-50 hover:bg-emerald-100 text-emerald-600", + ), + dangerInverted: clsx("bg-slate-100 hover:bg-slate-200 text-rose-600"), + warningInverted: clsx("bg-amber-50 hover:bg-amber-100 text-amber-600"), + }, + size: { sm: "text-sm", md: "text-md", lg: "text-lg" }, + fullwidth: { yes: "w-full", max: "w-max", no: "" }, + }, + defaultVariants: { + intent: "primary", + size: "sm", + }, + }, + {}, +); diff --git a/src/lib/components/atoms/button.svelte b/src/lib/components/atoms/button.svelte new file mode 100755 index 0000000..ea4ae32 --- /dev/null +++ b/src/lib/components/atoms/button.svelte @@ -0,0 +1,30 @@ + + + diff --git a/src/lib/components/atoms/checkbox.svelte b/src/lib/components/atoms/checkbox.svelte new file mode 100755 index 0000000..57dd4be --- /dev/null +++ b/src/lib/components/atoms/checkbox.svelte @@ -0,0 +1,43 @@ + + +
+ +
diff --git a/src/lib/components/atoms/fab.svelte b/src/lib/components/atoms/fab.svelte new file mode 100755 index 0000000..fb75a6d --- /dev/null +++ b/src/lib/components/atoms/fab.svelte @@ -0,0 +1,48 @@ + + + diff --git a/src/lib/components/atoms/headless.select.svelte b/src/lib/components/atoms/headless.select.svelte new file mode 100755 index 0000000..47fb469 --- /dev/null +++ b/src/lib/components/atoms/headless.select.svelte @@ -0,0 +1,107 @@ + + +
+ + + +
+
    + {#each options as value} + {@const chosen = selected.find((item) => item.value === value.value)} + {@const active = $listbox.active === value} +
  • + {value.label} + {#if chosen} + + + + {/if} +
  • + {/each} +
+
+
diff --git a/src/lib/components/atoms/icon-button.svelte b/src/lib/components/atoms/icon-button.svelte new file mode 100755 index 0000000..bd1bd72 --- /dev/null +++ b/src/lib/components/atoms/icon-button.svelte @@ -0,0 +1,36 @@ + + + diff --git a/src/lib/components/atoms/input.svelte b/src/lib/components/atoms/input.svelte new file mode 100755 index 0000000..3283692 --- /dev/null +++ b/src/lib/components/atoms/input.svelte @@ -0,0 +1,143 @@ + + + diff --git a/src/lib/components/atoms/line.svelte b/src/lib/components/atoms/line.svelte new file mode 100755 index 0000000..48f0c0a --- /dev/null +++ b/src/lib/components/atoms/line.svelte @@ -0,0 +1,7 @@ + + +
diff --git a/src/lib/components/atoms/link-button.svelte b/src/lib/components/atoms/link-button.svelte new file mode 100755 index 0000000..8c021a3 --- /dev/null +++ b/src/lib/components/atoms/link-button.svelte @@ -0,0 +1,56 @@ + + +{#if disabled} +
+ {#if iconleft} + + {/if} + + {text} + + {#if iconright} + + {/if} +
+ ); +{:else} + + {#if iconleft} + + {/if} + + {text} + + {#if iconright} + + {/if} + +{/if} diff --git a/src/lib/components/atoms/modal.svelte b/src/lib/components/atoms/modal.svelte new file mode 100755 index 0000000..da2dab0 --- /dev/null +++ b/src/lib/components/atoms/modal.svelte @@ -0,0 +1,89 @@ + + +
+ +
+ {#if $open} +
+
+

+ Edit profile +

+

+ Make changes to your profile here. Click save when you're done. +

+ +
+ + +
+
+ + +
+
+ + +
+ + +
+ {/if} +
+
diff --git a/src/lib/components/atoms/navigation-links.svelte b/src/lib/components/atoms/navigation-links.svelte new file mode 100755 index 0000000..ed2d306 --- /dev/null +++ b/src/lib/components/atoms/navigation-links.svelte @@ -0,0 +1,30 @@ + + +{#each links as link} + +
+ +

{link.label}

+
+
+{/each} +{#each functionalLinks as link} + +{/each} diff --git a/src/lib/components/atoms/pagination.svelte b/src/lib/components/atoms/pagination.svelte new file mode 100755 index 0000000..cb277b9 --- /dev/null +++ b/src/lib/components/atoms/pagination.svelte @@ -0,0 +1,82 @@ + + + diff --git a/src/lib/components/atoms/pill.svelte b/src/lib/components/atoms/pill.svelte new file mode 100755 index 0000000..6316a81 --- /dev/null +++ b/src/lib/components/atoms/pill.svelte @@ -0,0 +1,25 @@ + + +
+ {text} +
diff --git a/src/lib/components/atoms/select.svelte b/src/lib/components/atoms/select.svelte new file mode 100755 index 0000000..fc9863a --- /dev/null +++ b/src/lib/components/atoms/select.svelte @@ -0,0 +1,39 @@ + + +
+ + +
diff --git a/src/lib/components/atoms/skeleton-loader.svelte b/src/lib/components/atoms/skeleton-loader.svelte new file mode 100755 index 0000000..eddc78d --- /dev/null +++ b/src/lib/components/atoms/skeleton-loader.svelte @@ -0,0 +1,25 @@ + + +
+ loader +
diff --git a/src/lib/components/atoms/switch.svelte b/src/lib/components/atoms/switch.svelte new file mode 100755 index 0000000..4623c65 --- /dev/null +++ b/src/lib/components/atoms/switch.svelte @@ -0,0 +1,65 @@ + + +
+
+ + + {label} + +
+
diff --git a/src/lib/components/atoms/title.svelte b/src/lib/components/atoms/title.svelte new file mode 100755 index 0000000..58539f8 --- /dev/null +++ b/src/lib/components/atoms/title.svelte @@ -0,0 +1,59 @@ + + +{#if size == "h1"} +

+ {text} +

+{:else if size == "h2"} +

+ {text} +

+{:else if size == "h3"} +

+ {text} +

+{:else if size == "h4"} +

+ {text} +

+{/if} diff --git a/src/lib/components/molecules/centered-spinner.svelte b/src/lib/components/molecules/centered-spinner.svelte new file mode 100755 index 0000000..ffa4477 --- /dev/null +++ b/src/lib/components/molecules/centered-spinner.svelte @@ -0,0 +1,8 @@ + + + + + diff --git a/src/lib/components/molecules/loader.svelte b/src/lib/components/molecules/loader.svelte new file mode 100755 index 0000000..c09c97c --- /dev/null +++ b/src/lib/components/molecules/loader.svelte @@ -0,0 +1,30 @@ + + +
+
+ {#if loader === "normal"} + + {/if} + {#if loader === "sync"} + + {/if} +
+
diff --git a/src/lib/components/molecules/session-validator.svelte b/src/lib/components/molecules/session-validator.svelte new file mode 100755 index 0000000..e73b68f --- /dev/null +++ b/src/lib/components/molecules/session-validator.svelte @@ -0,0 +1,23 @@ + + + diff --git a/src/lib/components/ui/alert-dialog/alert-dialog-action.svelte b/src/lib/components/ui/alert-dialog/alert-dialog-action.svelte new file mode 100644 index 0000000..57d643b --- /dev/null +++ b/src/lib/components/ui/alert-dialog/alert-dialog-action.svelte @@ -0,0 +1,21 @@ + + + + + diff --git a/src/lib/components/ui/alert-dialog/alert-dialog-cancel.svelte b/src/lib/components/ui/alert-dialog/alert-dialog-cancel.svelte new file mode 100644 index 0000000..ef0a953 --- /dev/null +++ b/src/lib/components/ui/alert-dialog/alert-dialog-cancel.svelte @@ -0,0 +1,21 @@ + + + + + diff --git a/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte b/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte new file mode 100644 index 0000000..28ecc39 --- /dev/null +++ b/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte @@ -0,0 +1,28 @@ + + + + + + + + diff --git a/src/lib/components/ui/alert-dialog/alert-dialog-description.svelte b/src/lib/components/ui/alert-dialog/alert-dialog-description.svelte new file mode 100644 index 0000000..f35ac20 --- /dev/null +++ b/src/lib/components/ui/alert-dialog/alert-dialog-description.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/src/lib/components/ui/alert-dialog/alert-dialog-footer.svelte b/src/lib/components/ui/alert-dialog/alert-dialog-footer.svelte new file mode 100644 index 0000000..a235d1f --- /dev/null +++ b/src/lib/components/ui/alert-dialog/alert-dialog-footer.svelte @@ -0,0 +1,16 @@ + + +
+ +
diff --git a/src/lib/components/ui/alert-dialog/alert-dialog-header.svelte b/src/lib/components/ui/alert-dialog/alert-dialog-header.svelte new file mode 100644 index 0000000..2650ef9 --- /dev/null +++ b/src/lib/components/ui/alert-dialog/alert-dialog-header.svelte @@ -0,0 +1,13 @@ + + +
+ +
diff --git a/src/lib/components/ui/alert-dialog/alert-dialog-overlay.svelte b/src/lib/components/ui/alert-dialog/alert-dialog-overlay.svelte new file mode 100644 index 0000000..edf4840 --- /dev/null +++ b/src/lib/components/ui/alert-dialog/alert-dialog-overlay.svelte @@ -0,0 +1,21 @@ + + + diff --git a/src/lib/components/ui/alert-dialog/alert-dialog-portal.svelte b/src/lib/components/ui/alert-dialog/alert-dialog-portal.svelte new file mode 100644 index 0000000..e227219 --- /dev/null +++ b/src/lib/components/ui/alert-dialog/alert-dialog-portal.svelte @@ -0,0 +1,9 @@ + + + + + diff --git a/src/lib/components/ui/alert-dialog/alert-dialog-title.svelte b/src/lib/components/ui/alert-dialog/alert-dialog-title.svelte new file mode 100644 index 0000000..7f98004 --- /dev/null +++ b/src/lib/components/ui/alert-dialog/alert-dialog-title.svelte @@ -0,0 +1,14 @@ + + + + + diff --git a/src/lib/components/ui/alert-dialog/index.ts b/src/lib/components/ui/alert-dialog/index.ts new file mode 100644 index 0000000..be56dd7 --- /dev/null +++ b/src/lib/components/ui/alert-dialog/index.ts @@ -0,0 +1,40 @@ +import { AlertDialog as AlertDialogPrimitive } from "bits-ui"; + +import Title from "./alert-dialog-title.svelte"; +import Action from "./alert-dialog-action.svelte"; +import Cancel from "./alert-dialog-cancel.svelte"; +import Portal from "./alert-dialog-portal.svelte"; +import Footer from "./alert-dialog-footer.svelte"; +import Header from "./alert-dialog-header.svelte"; +import Overlay from "./alert-dialog-overlay.svelte"; +import Content from "./alert-dialog-content.svelte"; +import Description from "./alert-dialog-description.svelte"; + +const Root = AlertDialogPrimitive.Root; +const Trigger = AlertDialogPrimitive.Trigger; + +export { + Root, + Title, + Action, + Cancel, + Portal, + Footer, + Header, + Trigger, + Overlay, + Content, + Description, + // + Root as AlertDialog, + Title as AlertDialogTitle, + Action as AlertDialogAction, + Cancel as AlertDialogCancel, + Portal as AlertDialogPortal, + Footer as AlertDialogFooter, + Header as AlertDialogHeader, + Trigger as AlertDialogTrigger, + Overlay as AlertDialogOverlay, + Content as AlertDialogContent, + Description as AlertDialogDescription, +}; diff --git a/src/lib/components/ui/button/button.svelte b/src/lib/components/ui/button/button.svelte new file mode 100644 index 0000000..86827f3 --- /dev/null +++ b/src/lib/components/ui/button/button.svelte @@ -0,0 +1,25 @@ + + + + + diff --git a/src/lib/components/ui/button/index.ts b/src/lib/components/ui/button/index.ts new file mode 100644 index 0000000..9cd7a1d --- /dev/null +++ b/src/lib/components/ui/button/index.ts @@ -0,0 +1,54 @@ +import { type VariantProps, tv } from "tailwind-variants"; +import type { Button as ButtonPrimitive } from "bits-ui"; +import Root from "./button.svelte"; + +const buttonVariants = tv({ + base: "ring-offset-background focus-visible:ring-ring inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", + variants: { + variant: { + default: "bg-sky-500 text-white hover:bg-sky-600/90", + primaryInverted: "bg-sky-50 text-sky-600 hover:bg-sky-100", + destructive: + "bg-destructive text-destructive-foreground hover:bg-destructive/90", + destructiveInverted: + "bg-destructive/10 text-rose-500 hover:bg-destructive/30", + success: "bg-emerald-500 text-emerald-50 hover:bg-emerald-600/90", + outline: + "border-input bg-background hover:bg-accent hover:text-accent-foreground border", + secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, +}); + +type Variant = VariantProps["variant"]; +type Size = VariantProps["size"]; + +type Props = ButtonPrimitive.Props & { + variant?: Variant; + size?: Size; +}; + +type Events = ButtonPrimitive.Events; + +export { + Root, + type Props, + type Events, + // + Root as Button, + type Props as ButtonProps, + type Events as ButtonEvents, + buttonVariants, +}; diff --git a/src/lib/components/ui/checkbox/checkbox.svelte b/src/lib/components/ui/checkbox/checkbox.svelte new file mode 100644 index 0000000..8c35d91 --- /dev/null +++ b/src/lib/components/ui/checkbox/checkbox.svelte @@ -0,0 +1,35 @@ + + + + + {#if isChecked} + + {:else if isIndeterminate} + + {/if} + + diff --git a/src/lib/components/ui/checkbox/index.ts b/src/lib/components/ui/checkbox/index.ts new file mode 100644 index 0000000..6d92d94 --- /dev/null +++ b/src/lib/components/ui/checkbox/index.ts @@ -0,0 +1,6 @@ +import Root from "./checkbox.svelte"; +export { + Root, + // + Root as Checkbox, +}; diff --git a/src/lib/components/ui/dialog/dialog-content.svelte b/src/lib/components/ui/dialog/dialog-content.svelte new file mode 100644 index 0000000..e7c3ba5 --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-content.svelte @@ -0,0 +1,36 @@ + + + + + + + + + Close + + + diff --git a/src/lib/components/ui/dialog/dialog-description.svelte b/src/lib/components/ui/dialog/dialog-description.svelte new file mode 100644 index 0000000..8bc70cc --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-description.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/src/lib/components/ui/dialog/dialog-footer.svelte b/src/lib/components/ui/dialog/dialog-footer.svelte new file mode 100644 index 0000000..a235d1f --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-footer.svelte @@ -0,0 +1,16 @@ + + +
+ +
diff --git a/src/lib/components/ui/dialog/dialog-header.svelte b/src/lib/components/ui/dialog/dialog-header.svelte new file mode 100644 index 0000000..6b4448c --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-header.svelte @@ -0,0 +1,13 @@ + + +
+ +
diff --git a/src/lib/components/ui/dialog/dialog-overlay.svelte b/src/lib/components/ui/dialog/dialog-overlay.svelte new file mode 100644 index 0000000..1d376e4 --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-overlay.svelte @@ -0,0 +1,21 @@ + + + diff --git a/src/lib/components/ui/dialog/dialog-portal.svelte b/src/lib/components/ui/dialog/dialog-portal.svelte new file mode 100644 index 0000000..eb5d0a5 --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-portal.svelte @@ -0,0 +1,8 @@ + + + + + diff --git a/src/lib/components/ui/dialog/dialog-title.svelte b/src/lib/components/ui/dialog/dialog-title.svelte new file mode 100644 index 0000000..06574f3 --- /dev/null +++ b/src/lib/components/ui/dialog/dialog-title.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/src/lib/components/ui/dialog/index.ts b/src/lib/components/ui/dialog/index.ts new file mode 100644 index 0000000..b17ba5e --- /dev/null +++ b/src/lib/components/ui/dialog/index.ts @@ -0,0 +1,37 @@ +import { Dialog as DialogPrimitive } from "bits-ui"; + +import Title from "./dialog-title.svelte"; +import Portal from "./dialog-portal.svelte"; +import Footer from "./dialog-footer.svelte"; +import Header from "./dialog-header.svelte"; +import Overlay from "./dialog-overlay.svelte"; +import Content from "./dialog-content.svelte"; +import Description from "./dialog-description.svelte"; + +const Root = DialogPrimitive.Root; +const Trigger = DialogPrimitive.Trigger; +const Close = DialogPrimitive.Close; + +export { + Root, + Title, + Portal, + Footer, + Header, + Trigger, + Overlay, + Content, + Description, + Close, + // + Root as Dialog, + Title as DialogTitle, + Portal as DialogPortal, + Footer as DialogFooter, + Header as DialogHeader, + Trigger as DialogTrigger, + Overlay as DialogOverlay, + Content as DialogContent, + Description as DialogDescription, + Close as DialogClose, +}; diff --git a/src/lib/components/ui/input/index.ts b/src/lib/components/ui/input/index.ts new file mode 100644 index 0000000..75e3bc2 --- /dev/null +++ b/src/lib/components/ui/input/index.ts @@ -0,0 +1,29 @@ +import Root from "./input.svelte"; + +export type FormInputEvent = T & { + currentTarget: EventTarget & HTMLInputElement; +}; +export type InputEvents = { + blur: FormInputEvent; + change: FormInputEvent; + click: FormInputEvent; + focus: FormInputEvent; + focusin: FormInputEvent; + focusout: FormInputEvent; + keydown: FormInputEvent; + keypress: FormInputEvent; + keyup: FormInputEvent; + mouseover: FormInputEvent; + mouseenter: FormInputEvent; + mouseleave: FormInputEvent; + mousemove: FormInputEvent; + paste: FormInputEvent; + input: FormInputEvent; + wheel: FormInputEvent; +}; + +export { + Root, + // + Root as Input, +}; diff --git a/src/lib/components/ui/input/input.svelte b/src/lib/components/ui/input/input.svelte new file mode 100644 index 0000000..1ff364b --- /dev/null +++ b/src/lib/components/ui/input/input.svelte @@ -0,0 +1,42 @@ + + + diff --git a/src/lib/components/ui/label/index.ts b/src/lib/components/ui/label/index.ts new file mode 100644 index 0000000..8bfca0b --- /dev/null +++ b/src/lib/components/ui/label/index.ts @@ -0,0 +1,7 @@ +import Root from "./label.svelte"; + +export { + Root, + // + Root as Label, +}; diff --git a/src/lib/components/ui/label/label.svelte b/src/lib/components/ui/label/label.svelte new file mode 100644 index 0000000..2a7d479 --- /dev/null +++ b/src/lib/components/ui/label/label.svelte @@ -0,0 +1,21 @@ + + + + + diff --git a/src/lib/components/ui/table/index.ts b/src/lib/components/ui/table/index.ts new file mode 100644 index 0000000..14695c8 --- /dev/null +++ b/src/lib/components/ui/table/index.ts @@ -0,0 +1,28 @@ +import Root from "./table.svelte"; +import Body from "./table-body.svelte"; +import Caption from "./table-caption.svelte"; +import Cell from "./table-cell.svelte"; +import Footer from "./table-footer.svelte"; +import Head from "./table-head.svelte"; +import Header from "./table-header.svelte"; +import Row from "./table-row.svelte"; + +export { + Root, + Body, + Caption, + Cell, + Footer, + Head, + Header, + Row, + // + Root as Table, + Body as TableBody, + Caption as TableCaption, + Cell as TableCell, + Footer as TableFooter, + Head as TableHead, + Header as TableHeader, + Row as TableRow, +}; diff --git a/src/lib/components/ui/table/table-body.svelte b/src/lib/components/ui/table/table-body.svelte new file mode 100644 index 0000000..f2109d6 --- /dev/null +++ b/src/lib/components/ui/table/table-body.svelte @@ -0,0 +1,13 @@ + + + + + diff --git a/src/lib/components/ui/table/table-caption.svelte b/src/lib/components/ui/table/table-caption.svelte new file mode 100644 index 0000000..b838270 --- /dev/null +++ b/src/lib/components/ui/table/table-caption.svelte @@ -0,0 +1,13 @@ + + + + + diff --git a/src/lib/components/ui/table/table-cell.svelte b/src/lib/components/ui/table/table-cell.svelte new file mode 100644 index 0000000..fcb04f6 --- /dev/null +++ b/src/lib/components/ui/table/table-cell.svelte @@ -0,0 +1,18 @@ + + + + + diff --git a/src/lib/components/ui/table/table-footer.svelte b/src/lib/components/ui/table/table-footer.svelte new file mode 100644 index 0000000..c6c1570 --- /dev/null +++ b/src/lib/components/ui/table/table-footer.svelte @@ -0,0 +1,13 @@ + + + + + diff --git a/src/lib/components/ui/table/table-head.svelte b/src/lib/components/ui/table/table-head.svelte new file mode 100644 index 0000000..49ab7a9 --- /dev/null +++ b/src/lib/components/ui/table/table-head.svelte @@ -0,0 +1,19 @@ + + + + + diff --git a/src/lib/components/ui/table/table-header.svelte b/src/lib/components/ui/table/table-header.svelte new file mode 100644 index 0000000..a3e59ee --- /dev/null +++ b/src/lib/components/ui/table/table-header.svelte @@ -0,0 +1,14 @@ + + + + + + diff --git a/src/lib/components/ui/table/table-row.svelte b/src/lib/components/ui/table/table-row.svelte new file mode 100644 index 0000000..731c5d5 --- /dev/null +++ b/src/lib/components/ui/table/table-row.svelte @@ -0,0 +1,23 @@ + + + + + diff --git a/src/lib/components/ui/table/table.svelte b/src/lib/components/ui/table/table.svelte new file mode 100644 index 0000000..788d4ee --- /dev/null +++ b/src/lib/components/ui/table/table.svelte @@ -0,0 +1,15 @@ + + +
+ + +
+
diff --git a/src/lib/components/ui/textarea/index.ts b/src/lib/components/ui/textarea/index.ts new file mode 100644 index 0000000..6eb6ba3 --- /dev/null +++ b/src/lib/components/ui/textarea/index.ts @@ -0,0 +1,28 @@ +import Root from "./textarea.svelte"; + +type FormTextareaEvent = T & { + currentTarget: EventTarget & HTMLTextAreaElement; +}; + +type TextareaEvents = { + blur: FormTextareaEvent; + change: FormTextareaEvent; + click: FormTextareaEvent; + focus: FormTextareaEvent; + keydown: FormTextareaEvent; + keypress: FormTextareaEvent; + keyup: FormTextareaEvent; + mouseover: FormTextareaEvent; + mouseenter: FormTextareaEvent; + mouseleave: FormTextareaEvent; + paste: FormTextareaEvent; + input: FormTextareaEvent; +}; + +export { + Root, + // + Root as Textarea, + type TextareaEvents, + type FormTextareaEvent, +}; diff --git a/src/lib/components/ui/textarea/textarea.svelte b/src/lib/components/ui/textarea/textarea.svelte new file mode 100644 index 0000000..933e528 --- /dev/null +++ b/src/lib/components/ui/textarea/textarea.svelte @@ -0,0 +1,38 @@ + + + diff --git a/src/lib/server/array.chunk.ts b/src/lib/server/array.chunk.ts new file mode 100755 index 0000000..f6a9993 --- /dev/null +++ b/src/lib/server/array.chunk.ts @@ -0,0 +1,9 @@ +export function chunkArray(array: T[], size: number): T[][] { + const chunked_arr = []; + let index = 0; + while (index < array.length) { + chunked_arr.push(array.slice(index, size + index)); + index += size; + } + return chunked_arr; +} diff --git a/src/lib/server/connectors/redis.ts b/src/lib/server/connectors/redis.ts new file mode 100755 index 0000000..157bda3 --- /dev/null +++ b/src/lib/server/connectors/redis.ts @@ -0,0 +1,10 @@ +import Redis from "ioredis"; + +const redisUrl = process.env.REDIS_URL ?? ""; + +console.log(`\n\n[//] Redis URL: ${redisUrl}`); + +const _redis = + redisUrl && redisUrl.length > 0 ? new Redis(redisUrl) : undefined; + +export const redis = _redis as Redis; diff --git a/src/lib/server/connectors/surreal.db.ts b/src/lib/server/connectors/surreal.db.ts new file mode 100755 index 0000000..edbcbc8 --- /dev/null +++ b/src/lib/server/connectors/surreal.db.ts @@ -0,0 +1,36 @@ +import Surreal from "surrealdb.js"; +export type { QueryResult } from "surrealdb.js/script/types"; + +try { + if (document || window) { + throw new Error("SurrealDB needs a NodeJS environment to run."); + } +} catch (err) {} + +const CONFIG = { + url: process.env.SURREAL_URL ?? "", + user: process.env.SURREAL_USER ?? "", + pass: process.env.SURREAL_PASS ?? "", + ns: process.env.SURREAL_NS ?? "", + db: process.env.SURREAL_DB ?? "", +} as const; + +// for (let key in CONFIG) { +// if ( +// !CONFIG[key as keyof typeof CONFIG] || +// CONFIG[key as keyof typeof CONFIG] === "" +// ) { +// throw new Error(`Missing configuration for ${key}`); +// } +// } + +let _surreal = + CONFIG.url.length > 0 + ? new Surreal(`http://${CONFIG.url}/rpc`, { + auth: { user: CONFIG.user, pass: CONFIG.pass }, + ns: CONFIG.ns, + db: CONFIG.db, + }) + : undefined; + +export const surreal = _surreal as Surreal; diff --git a/src/lib/server/cookie.functions.ts b/src/lib/server/cookie.functions.ts new file mode 100755 index 0000000..215f4a6 --- /dev/null +++ b/src/lib/server/cookie.functions.ts @@ -0,0 +1,50 @@ +import { redis } from "$lib/server/connectors/redis"; + +export type SessionData = { + username: string; + userType: string; +}; + +export const parseCookieString = (cookieString: string) => { + const cookies: Record = cookieString + .split(";") + .reduce((acc, cookie) => { + const [key, value] = cookie.split("="); + if (!key || !value) { + return acc; + } + return { ...acc, [key.trim()]: decodeURIComponent(value) }; + }, {}); + for (const key in cookies) { + if (!key.length || !cookies[key] || cookies[key] === "undefined") { + delete cookies[key]; + } + } + return cookies; +}; + +export const parseSessionData = (sessionData: string) => { + const splits = sessionData.split("|"); + if (splits.length < 5) return false; + return { username: splits[2], userType: splits[3] } as SessionData; +}; + +export const getParsedSession = async (sId: string) => { + const session = await redis.get(sId); + if (!session) { + return false; + } + const parsed = parseSessionData(session); + if (!parsed) { + return false; + } + return parsed; +}; + +export const isSessionValid = async (sId: string) => { + if (!sId || sId.length === 0 || sId.length < 20) { + return false; + } + const session = await redis.get(sId); + return session && session.length > 1; +}; diff --git a/src/lib/server/db/apidata.db.ts b/src/lib/server/db/apidata.db.ts new file mode 100755 index 0000000..73d929a --- /dev/null +++ b/src/lib/server/db/apidata.db.ts @@ -0,0 +1,212 @@ +import type { BookingEntry } from "$lib/utils/data.types"; +import { chunkArray } from "../array.chunk"; +import { surreal } from "../connectors/surreal.db"; + +const getTableName = (date: string) => { + return `apidata${date.replaceAll("-", "")}`; +}; + +const upsertData = async ( + data: BookingEntry[], + date: string, + tries: number = 0, +): Promise => { + const tableName = getTableName(date); + console.log(`[...] Upserting ${data.length} entries into ${tableName}`); + const alreadyPresentIds = new Set(); + try { + const [alreadyPresent] = await surreal.query<[string[]]>( + `select value id from type::table($tableName) where bookDate = $bookDate`, + { tableName, bookDate: date }, + ); + for (let eId of alreadyPresent.result ?? []) { + alreadyPresentIds.add(eId); + } + } catch (err) { + console.log("Failed to fetch, seeing if can try again"); + if (tries >= 3) { + console.log("Max tries exceeded for initial fetch for upserting data"); + return; + } + return await upsertData(data, date, tries++); + } + const oldEntries = [] as any[]; + const newEntries = [] as BookingEntry[]; + for (let entry of data) { + if (!alreadyPresentIds.has(entry.id)) { + newEntries.push({ + ...entry, + id: `${tableName}:${entry.id}`, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + bookDate: entry.bookDate.split(" ")[0], + requestId: entry.requestId ?? "", + }); + } else { + oldEntries.push({ + distributorId: entry.distributorId, + dealerId: entry.dealerId, + drawId: entry.drawId, + bookDate: entry.bookDate.split(" ")[0], + number: entry.number, + first: entry.first, + second: entry.second, + changedBalance: entry.changedBalance, + sheetName: entry.sheetName, + sheetId: entry.sheetId, + requestId: entry.requestId, + updatedAt: new Date().toISOString(), + }); + } + } + console.log( + `[+] Inserting ${newEntries.length} new entries into ${tableName}`, + ); + + // 5 to 25% of the total data length + let chunkSize = Math.floor( + Math.random() * (data.length * 0.25 - data.length * 0.05) + + data.length * 0.05, + ); + if (chunkSize > 10_000) { + chunkSize = 10_000; + } + + console.log(`Chunk Size : ${chunkSize}`); + + console.log(`[+] Inserting new entries`); + console.time("insertion time"); + const chunks = chunkArray(newEntries, chunkSize).map(async (chunk) => { + await surreal.insert(tableName, chunk); + }); + for (let i = 0; i < chunks.length; i += 2) { + await Promise.all(chunks.slice(i, i + 2)); + } + console.timeEnd("insertion time"); + + console.log( + `[+] Updating ${oldEntries.length} old entries into ${tableName}`, + ); + + const chunks2 = chunkArray(oldEntries, chunkSize).map(async (chunk) => { + await Promise.all( + chunk.map(async (entry) => { + // @ts-ignore + await surreal.update(`${tableName}:${entry.id}`, { + distributorId: entry.distributorId, + dealerId: entry.dealerId, + drawId: entry.drawId, + bookDate: entry.bookDate.split(" ")[0], + number: entry.number, + first: entry.first, + second: entry.second, + changedBalance: entry.changedBalance, + sheetName: entry.sheetName, + sheetId: entry.sheetId, + requestId: entry.requestId, + updatedAt: new Date().toISOString(), + }); + }), + ); + }); + + console.time("update time"); + for (let i = 0; i < chunks2.length; i += 10) { + await Promise.all(chunks2.slice(i, i + 10)); + } + console.timeEnd("update time"); + + console.log( + `[+] Successfully upserted ${data.length} entries into ${tableName}`, + ); +}; + +const getBookingEntriesForDealer = async ( + date: string, + drawId: string, + userId: string, + sorted?: boolean, +) => { + const tableName = getTableName(date); + let query = `select * from type::table($tableName) where bookDate = $date and dealerId = $userId and drawId = $drawId`; + if (sorted) { + query += " order by requestId desc"; + } + const [data] = await surreal.query<[BookingEntry[]]>(query, { + tableName, + date: `${date}`, + userId: parseInt(userId), + drawId: parseInt(drawId), + }); + console.log( + `Found ${JSON.stringify( + data, + )} entries for ${userId}, filters are ${date}, ${drawId} for ${tableName}`, + ); + if (data.status === "OK") { + return data.result ?? []; + } + return []; +}; + +const getBookingEntriesByDraw = async (date: string, drawId: string) => { + const tableName = getTableName(date); + const [data] = await surreal.query<[BookingEntry[]]>( + `select * from type::table($tableName) where bookDate = $date and drawId = $drawId`, + { + tableName, + date: date, + drawId: parseInt(drawId.includes(":") ? drawId.split(":")[1] : drawId), + }, + ); + if (data.status === "OK") { + return data.result ?? []; + } + return []; +}; + +const deleteDataOlderThan2Weeks = async () => { + const [out] = await surreal.query("info for db"); + // @ts-ignore + const tableNames = Object.keys(out.result.tables); + + const twoWeeksAgo = new Date(); + twoWeeksAgo.setDate(twoWeeksAgo.getDate() - 14); + + for (const tableName of tableNames) { + if (tableName.startsWith("apidata")) { + const datePart = tableName.slice(7); + const d = new Date( + parseInt(datePart.slice(0, 4), 10), + parseInt(datePart.slice(4, 6), 10) - 1, // Month is 0-based in JavaScript Date + parseInt(datePart.slice(6, 8), 10), + ); + if (d < twoWeeksAgo) { + console.log(`[...] Deleting ${tableName}`); + await surreal.query("remove table if exists " + tableName); + console.log(`[+] Deleted ${tableName}`); + } + } else if (tableName.startsWith("apipostdata_")) { + const datePart = tableName.slice(12); + const d = new Date( + parseInt(datePart.slice(0, 4), 10), + parseInt(datePart.slice(4, 6), 10) - 1, // Month is 0-based in JavaScript Date + parseInt(datePart.slice(6, 8), 10), + ); + if (d < twoWeeksAgo) { + console.log(`[...] Deleting ${tableName}`); + await surreal.query("remove table if exists " + tableName); + console.log(`[+] Deleted ${tableName}`); + } + } else { + console.log(`Skipping ${tableName}`); + } + } +}; + +export const dbApiData = { + upsertData, + getBookingEntriesForDealer, + getBookingEntriesByDraw, + deleteDataOlderThan2Weeks, +}; diff --git a/src/lib/server/db/apidraw.db.ts b/src/lib/server/db/apidraw.db.ts new file mode 100755 index 0000000..0ae8c5e --- /dev/null +++ b/src/lib/server/db/apidraw.db.ts @@ -0,0 +1,100 @@ +import { constants } from "$lib/utils/constants"; +import type { Draw } from "$lib/utils/data.types"; +import { getDraws } from "../external/api.scraping.helpers"; +import { surreal } from "../connectors/surreal.db"; +import { getSessionFromStore } from "../utils/session.service"; + +const tableName = "apidraw"; + +const _populateDrawsTable = async () => { + const session = await getSessionFromStore(constants.SCRAP_API_SESSION_KEY); + if (!session) { + return; + } + const draws = await getDraws(session?.sessionToken); + if (draws.data.length === 0 || !draws.ok) { + return; + } + await surreal.insert( + tableName, + draws.data.map((e) => { + return { + id: e.id, + drawType: e.drawType, + adminId: e.adminId, + title: e.title, + closeTime: e.closeTime, + filterDuplicatesWhilePosting: false, + abRateF: 0, + abcRateF: 0, + abRateS: 0, + abcRateS: 0, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + }; + }), + ); +}; + +const getAllDraws = async ( + skipOptional?: boolean, + retry: number = 0, +): Promise => { + let query = `select * from apidraw order by closeTime`; + const [out] = await surreal.query<[Draw[]]>(query); + if (out.status === "OK") { + const draws = out.result ?? []; + if (draws.length > 0) { + return draws; + } + await _populateDrawsTable(); + if (retry < 3) { + return getAllDraws(skipOptional, retry + 1); + } + } + return []; +}; + +async function setFilterDuplicatesFlag(drawId: string, flag: boolean) { + const [d] = await surreal.select(drawId); + if (!d || !d.id) { + return; + } + console.log("setFilterDuplicatesFlag :: ", drawId, flag); + await surreal.update(drawId, { + ...d, + filterDuplicatesWhilePosting: flag, + updatedAt: new Date().toISOString(), + } as Draw); +} + +async function updateDrawPresetInfo(draw: Draw) { + const drawId = draw.id; + const [d] = await surreal.select(drawId); + if (!d || !d.id) { + return; + } + await surreal.update(drawId, { + ...d, + filterDuplicatesWhilePosting: draw.filterDuplicatesWhilePosting, + abRateF: draw.abRateF, + abcRateF: draw.abcRateF, + abRateS: draw.abRateS, + abcRateS: draw.abcRateS, + updatedAt: new Date().toISOString(), + } as Draw); +} + +const getDraw = async (drawId: string): Promise => { + const draws = await surreal.select( + drawId.includes("apidraw") ? drawId : `apidraw:${drawId}`, + ); + return draws[0]; +}; + +export const dbDraw = { + getAllDraws, + getDraw, + setFilterDuplicatesFlag, + updateDrawPresetInfo, +}; diff --git a/src/lib/server/db/apipostdata.db.ts b/src/lib/server/db/apipostdata.db.ts new file mode 100755 index 0000000..8319deb --- /dev/null +++ b/src/lib/server/db/apipostdata.db.ts @@ -0,0 +1,96 @@ +import type { PostDataEntry, PostDataHistory } from "$lib/utils/data.types"; +import { surreal } from "../connectors/surreal.db"; + +const getTableName = (date: string) => { + return `apipostdata_${date.replaceAll("-", "")}`; +}; + +const upsertData = async (data: PostDataHistory) => { + const tableName = getTableName(data.bookDate); + const [check] = await surreal.query<[PostDataHistory[]]>( + `select * from type::table($tableName) where bookDate = $bookDate and drawId = $drawId`, + { tableName, bookDate: data.bookDate, drawId: data.drawId }, + ); + console.log(check); + const firstOut = check.result ? check.result[0] : undefined; + if (check.status === "OK" && !!firstOut && !!firstOut.id) { + console.log( + `Adding ${data.data.length} entries to ${firstOut.data.length} existing array`, + ); + firstOut.data.push(...data.data); + console.log(`Now have ${firstOut.data.length} entries in data list`); + console.log(`[...] Updating data row in db now`); + await surreal.update(firstOut.id, { + id: firstOut.id, + data: firstOut.data, + drawId: firstOut.drawId, + bookDate: firstOut.bookDate, + updatedAt: new Date().toISOString(), + }); + + return; + } + await surreal.insert(tableName, data); + console.log( + `[+] Inserted post data in ${tableName} for ${data.bookDate} - ${data.drawId}`, + ); +}; + +const getPostDataByDraw = async (date: string, drawId: string) => { + const tableName = getTableName(date); + const [data] = await surreal.query<[PostDataHistory[]]>( + `select * from type::table($tableName) where bookDate = $date and drawId = $drawId`, + { + tableName, + date: date, + drawId: parseInt(drawId.includes(":") ? drawId.split(":")[1] : drawId), + }, + ); + let out = [] as PostDataEntry[]; + if (data.status === "OK" && data.result.length > 0) { + out = data.result[0].data; + } + return out; +}; + +async function doesPostHistoryDataExist(date: string, drawId: string) { + const tableName = getTableName(date); + const [data] = await surreal.query<[PostDataHistory[]]>( + `select id from type::table($tableName) where bookDate = $date and drawId = $drawId`, + { + tableName, + date: date, + drawId: parseInt(drawId.includes(":") ? drawId.split(":")[1] : drawId), + }, + ); + + if (data.status === "OK") { + return data.result[0]?.id.length > 0; + } + return false; +} + +async function deletePostDataByDraw(date: string, drawId: string) { + const tableName = getTableName(date); + const [data] = await surreal.query<[PostDataHistory[]]>( + `select id from type::table($tableName) where bookDate = $date and drawId = $drawId`, + { + tableName, + date: date, + drawId: parseInt(drawId.includes(":") ? drawId.split(":")[1] : drawId), + }, + ); + + if (data.status === "OK") { + await surreal.delete(tableName); + return true; + } + return false; +} + +export const dbApiPostData = { + upsertData, + getPostDataByDraw, + deletePostDataByDraw, + doesPostHistoryDataExist, +}; diff --git a/src/lib/server/db/apiuser.db.ts b/src/lib/server/db/apiuser.db.ts new file mode 100755 index 0000000..34af12e --- /dev/null +++ b/src/lib/server/db/apiuser.db.ts @@ -0,0 +1,279 @@ +import { + type ApiUser, + type LooseApiUser, + type ApiPostUser, + type ApiPostUserWithParent, + ApiUserTypes, + DEFAULT_RANDOM_DISTRIBUTOR, +} from "$lib/utils/data.types"; +import { surreal } from "../connectors/surreal.db"; + +const getUserById = async (userId: string) => { + const query = `select * from apiuser where id = $id`; + const [rizzult] = await surreal.query<[ApiUser[]]>(query, { id: userId }); + return rizzult.result?.[0]; +}; + +const getAllIdsByUserType = async (userType: number) => { + const query = `select value id from apiuser where userType = $userType`; + const rizzult = (await surreal.query<[string[]]>(query, { userType }))[0]; + return (rizzult.result ?? []).map((e) => { + return e.split(":")[1]; + }); +}; + +async function allUsersOfTypeLimitedInfo(userType: number) { + const rizzult = ( + await surreal.query<[ApiPostUser[]]>( + `select id,userName,userId,postData from apiuser where userType = $userType`, + { userType: userType }, + ) + )[0]; + if (rizzult.status == "OK") { + return rizzult.result ?? []; + } + return []; +} + +async function setPostDataFlagForUsers(users: ApiPostUser[]) { + for (const user of users) { + const [u] = await surreal.select(user.id); + if (!u || !u.id) { + continue; + } + await surreal.update(user.id, { + ...u, + postData: user.postData ?? false, + }); + } +} + +const getUserTypeCount = async (userType: number) => { + const queryBase = `select count() from apiuser where userType = $userType`; + let query = `${queryBase} and disable = 0 group all`; + let disabledQuery = `${queryBase} and disable = 1 group all`; + const enabledRizzult = ( + await surreal.query<[{ count: number }[]]>(query, { userType: userType }) + )[0]; + const count = { enabled: 0, disabled: 0 }; + if (enabledRizzult.status == "OK") { + count.enabled = enabledRizzult.result[0]?.count ?? 0; + } + const disabledRizzult = ( + await surreal.query<[{ count: number }[]]>(disabledQuery, { + userType: userType, + }) + )[0]; + if (disabledRizzult.status == "OK") { + count.disabled = disabledRizzult.result[0]?.count ?? 0; + } + return count; +}; + +const allUsersOfType = async (userType: number) => { + const rizzult = ( + await surreal.query<[ApiUser[]]>( + `select * from apiuser where userType = $userType`, + { userType: userType }, + ) + )[0]; + if (rizzult.status == "OK") { + return rizzult.result ?? []; + } + return []; +}; + +async function updatePostUsersBalances( + payload: { balance: number; id: string }[], +) { + console.log("Updating users balances"); + console.log(payload); + for (const each of payload) { + const [rizzult] = await surreal.query<[ApiUser[]]>( + `update $userId set balance = $balance`, + { userId: each.id, balance: each.balance }, + ); + if (rizzult.status !== "OK") { + console.error("updatePostUsersBalance :: ", rizzult); + } + } + console.log("Users balances updated"); +} + +async function getAllPostUsers() { + const [rizzult] = await surreal.query<[ApiPostUser[]]>( + `select id,userName,userId,postData from apiuser where postData = true`, + ); + if (rizzult.status === "OK") { + return rizzult.result ?? []; + } + return []; +} + +async function getAllPostUsersWithParentUsers() { + const [rizzult] = await surreal.query<[ApiPostUserWithParent[]]>( + `select id,userName,userId,postData,parentDistributor,parentAdmin from apiuser where postData = true`, + ); + if (rizzult.status === "OK") { + return rizzult.result ?? []; + } + return []; +} + +const getAllDistributorsWithTheirChildren = async () => { + const distributorIds = await getAllIdsByUserType(ApiUserTypes.DISTRIBUTOR); + const out = distributorIds.map(async (id) => { + const [rizzult] = await surreal.query<[ApiUser[]]>( + `select *, (select * from apiuser where parentDistributor = $id) as children from apiuser where id = $prefixedId`, + { id, prefixedId: `apiuser:${id}` }, + ); + if (rizzult.status == "OK") { + return rizzult.result[0]; + } + return undefined; + }); + const responses = await Promise.all(out); + return responses; +}; + +const getRandomDistributor = async (): Promise => { + const ignoreList = ["001OP9"]; + const randomUser = await _getRandomUser(ApiUserTypes.DISTRIBUTOR, ignoreList); + if (!randomUser) { + return DEFAULT_RANDOM_DISTRIBUTOR; + } + return randomUser as any as ApiUser; +}; + +const getRandomDealer = async (): Promise => { + const ignoreList = ["rizgnore"]; + return _getRandomUser(ApiUserTypes.DEALER, ignoreList); +}; + +const _getRandomUser = async ( + userType: number, + ignoreList: string[], +): Promise => { + console.log("_getRandomUser :: ", userType); + const rizzult = ( + await surreal.query<[ApiUser[]]>( + `select * from apiuser where disable = 0 and userType = $userType and userId notinside $ignoreList order by rand() limit 1`, + { userType: userType, ignoreList: ignoreList }, + ) + )[0]; + if (rizzult.status == "OK") { + return rizzult.result[0]; + } +}; + +const doesExist = async (userId?: string) => { + console.log("doesExist :: ", userId); + if (userId) { + const [rizzult] = await surreal.query<{ count: number }[]>( + "select count() from apiuser where userId = $userId group all", + { userId: userId }, + ); + if (rizzult.status == "OK") { + return rizzult.result?.count > 0; + } + } + return false; +}; + +const insertMany = async (data: LooseApiUser[], postUsers: ApiPostUser[]) => { + console.log("insertMany :: ", data.length); + await surreal.insert( + "apiuser", + data.map((e) => { + return { + ...e, + postData: !!postUsers.find((u) => u.userId === e.userId), + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + }; + }), + ); +}; + +async function upsertMany( + data: LooseApiUser[], + wipeTable: boolean, + deleteUserType: typeof ApiUserTypes.DISTRIBUTOR | typeof ApiUserTypes.DEALER, +) { + const postUsers = await getAllPostUsers(); + console.log(postUsers); + if (wipeTable) { + console.log("[wipeTable] :: deleting all previous users"); + await surreal.query("delete from apiuser where userType = $userType", { + userType: deleteUserType, + }); + } + console.log("upsertMany :: ", data.length); + const toCreate = [] as LooseApiUser[]; + const out = data.map(async (apiUser) => { + // INFO: if you do want to keep disabled users, remove this check + if (apiUser.disable === 1) { + return; + } + const [u] = await surreal.select(`apiuser:${apiUser.id}`); + if (!u || !u.id) { + toCreate.push(apiUser); + return; + } + let postData = + u.postData ?? !!postUsers.find((pu) => pu.userId === u.userId) ?? false; + const qId = u.id; + await surreal.update(qId, { + id: u.id, + userId: apiUser.userId, + userType: apiUser.userType, + disableBooking: apiUser.disableBooking, + sendVoucher: apiUser.sendVoucher, + voucherGenerated: apiUser.voucherGenerated, + parentAdmin: apiUser.parentAdmin, + parentDistributor: apiUser.parentDistributor, + userName: apiUser.userName, + userCity: apiUser.userCity, + password: apiUser.password, + accessDenied: apiUser.accessDenied, + phoneNumber: apiUser.phoneNumber, + emailAddress: apiUser.emailAddress, + disable: apiUser.disable, + commission: apiUser.commission, + commissionPangora: apiUser.commissionPangora, + allowTitles: apiUser.allowTitles, + specialDealer: apiUser.specialDealer, + allowBalance: apiUser.allowBalance, + balance: apiUser.balance, + profitlossShare: apiUser.profitlossShare, + shareProfitonly: apiUser.shareProfitonly, + allowRemoveold: apiUser.allowRemoveold, + removeDays: apiUser.removeDays, + language: apiUser.language, + postData, + createdAt: u.createdAt, + updatedAt: new Date().toISOString(), + }); + }); + await Promise.allSettled(out); + if (toCreate.length > 0) { + await insertMany(toCreate, postUsers); + } +} + +export const dbApiUser = { + allUsersOfType, + allUsersOfTypeLimitedInfo, + getUserById, + getAllDistributorsWithTheirChildren, + getUserTypeCount, + getAllIdsByUserType, + getAllPostUsers, + getAllPostUsersWithParentUsers, + getRandomDistributor, + getRandomDealer, + doesExist, + upsertMany, + setPostDataFlagForUsers, + updatePostUsersBalances, +}; diff --git a/src/lib/server/db/booking.db.ts b/src/lib/server/db/booking.db.ts new file mode 100755 index 0000000..b5ea1fe --- /dev/null +++ b/src/lib/server/db/booking.db.ts @@ -0,0 +1,4 @@ + + +export const dbBooking = { +}; diff --git a/src/lib/server/db/finalsheet.db.ts b/src/lib/server/db/finalsheet.db.ts new file mode 100755 index 0000000..0470432 --- /dev/null +++ b/src/lib/server/db/finalsheet.db.ts @@ -0,0 +1,40 @@ +import type { FinalSheetData } from "$lib/utils/data.types"; +import { surreal } from "../connectors/surreal.db"; + +const getTableName = (date: string) => { + return `finalsheet${date.replaceAll("-", "")}`; +}; + +const upsertData = async (data: FinalSheetData, date: string) => { + const tableName = getTableName(date); + const [present] = await surreal.query<[FinalSheetData[]]>( + `select id from type::table($tableName) where date = $date and drawId = $drawId`, + { tableName, date: `${date}`, drawId: data.drawId } + ); + if (present) { + // @ts-ignore + await surreal.update(`${tableName}:${data.id}`, { + date: data.date, + drawId: data.drawId, + data: data.data, + totals: data.totals, + // @ts-ignore + createdAt: present?.result[0]?.createdAt ?? new Date().toISOString(), + updatedAt: new Date().toISOString(), + }); + } else { + // @ts-ignore + await surreal.create(`${tableName}:${data.id}`, { + date: data.date, + drawId: data.drawId, + data: data.data, + totals: data.totals, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + }); + } +}; + +export const dbFinalSheet = { + upsertData, +}; diff --git a/src/lib/server/db/presetdata.db.ts b/src/lib/server/db/presetdata.db.ts new file mode 100755 index 0000000..47dde5e --- /dev/null +++ b/src/lib/server/db/presetdata.db.ts @@ -0,0 +1,65 @@ +import type { + ApiPostUser, + PostDataEntry, + PresetDataEntry, +} from "$lib/utils/data.types"; +import { surreal } from "../connectors/surreal.db"; + +const getTableName = (date: string) => { + return `presetdata_${date.replaceAll("-", "")}`; +}; + +const insertData = async (data: PresetDataEntry[]) => { + if (data.length < 1) return; + const tableName = getTableName(data[0].bookDate); + const out = await surreal.insert(tableName, data); + console.log( + `[+] Inserted post data in ${tableName} for ${data[0].bookDate} - ${data[0].drawId}`, + ); + return out; +}; + +const getDataByDraw = async (date: string, drawId: number) => { + const tableName = getTableName(date); + const [data] = await surreal.query<[PresetDataEntry[]]>( + `select * from type::table($tableName) where bookDate = $date and drawId = $drawId`, + { tableName, date, drawId }, + ); + return data.result || ([] as PresetDataEntry[]); +}; + +const getDataGroupedBySheetByDraw = async (date: string, drawId: number) => { + const tableName = getTableName(date); + const [data] = await surreal.query<[PresetDataEntry[]]>( + `select * from type::table($tableName) where bookDate = $date and drawId = $drawId`, + { tableName, date, drawId }, + ); + const out = { + abData: [] as PresetDataEntry[], + abcData: [] as PresetDataEntry[], + all: data.result || ([] as PresetDataEntry[]), + }; + for (const row of data.result ?? []) { + if (row.number.length === 2) { + out.abData.push(row); + } else if (row.number.length === 3) { + out.abcData.push(row); + } + } + return out; +}; + +async function deleteDataByIds(date: string, ids: string[]) { + const tableName = getTableName(date); + await surreal.query<[PresetDataEntry[]]>( + `delete from type::table($tableName) where id in $ids`, + { tableName, ids }, + ); +} + +export const dbPresetData = { + insertData, + getDataGroupedBySheetByDraw, + getDataByDraw, + deleteDataByIds, +}; diff --git a/src/lib/server/db/user.db.ts b/src/lib/server/db/user.db.ts new file mode 100755 index 0000000..8ea842a --- /dev/null +++ b/src/lib/server/db/user.db.ts @@ -0,0 +1,90 @@ +import type { User } from "$lib/utils/data.types"; +import { surreal, type QueryResult } from "../connectors/surreal.db"; + +export const dbUser = { + doesExist: async (username?: string) => { + if (username) { + const [rizzult] = await surreal.query<{ count: number }[]>( + "select count() from user where username = $username group all", + { username: username } + ); + if (rizzult.status == "OK") { + return rizzult.result?.count > 0; + } + } + return false; + }, + create: async (data: { + username: string; + password: string; + userType: string; + association: string; + }) => { + const doesUserAlreadyExist = await dbUser.doesExist(data.username); + console.log("doesUserAlreadyExist :: ", doesUserAlreadyExist); + if (doesUserAlreadyExist) { + return [{ message: "User already exists." }]; + } + const { username, password, association, userType } = data; + const out = await surreal.create(`user:ulid()`, { + createdAt: Date.now().toString(), + updatedAt: Date.now().toString(), + username, + password, + userType, + association, + }); + return out as User[]; + }, + all: async () => { + return await surreal.select("user"); + }, + get: async (d: { + username?: string; + id?: string; + }): Promise => { + if (d.id) { + return (await surreal.select(`user:${d.id}`))[0]; + } + if (d.username) { + const rizzult = ( + await surreal.query<[User[]]>( + `select * from user where username = $username`, + { username: d.username } + ) + )[0]; + if (rizzult.status == "OK") { + return rizzult.result[0]; + } + } + return undefined; + }, + getChildren: async (username?: string) => { + const rizzult = await surreal.query( + `select * from user where association = $username`, + { username: username } + ); + return getParsedUsers(rizzult); + }, + update: async (id: string, data: { association: string }) => { + const [rizzult] = await surreal.update(`user:${id}`, { + updatedAt: Date.now().toString(), + association: data.association, + } as User); + return rizzult; + }, + delete: async (id: string) => { + const out = await surreal.delete(`user:${id}`); + return out[0].id; + }, +}; + +const getParsedUsers = (data: QueryResult[]) => { + const users = [] as User[]; + for (const each of data) { + if (each.status == "OK") { + users.push(each.result); + } + } + return users; +}; diff --git a/src/lib/server/deprecated.fs.hlprz.ts b/src/lib/server/deprecated.fs.hlprz.ts new file mode 100755 index 0000000..2bdbf3a --- /dev/null +++ b/src/lib/server/deprecated.fs.hlprz.ts @@ -0,0 +1,291 @@ +import { + COMMISSION_PERCENTAGE, + LEXICODE_MATHCER_PATTERNS, + LEXICODE_PRIZE_PERCENTAGES, + NUMBERS_IN_FIRST_DRAW, + NUMBERS_IN_SECOND_DRAW, +} from "$lib/utils/constants"; +import type { + BookingEntry, + FinalSheetData, + FinalSheetRow, + LexiCodeCacheObject, + ReducedFinalSheetData, + ServerError, +} from "$lib/utils/data.types"; +import { dbApiData } from "./db/apidata.db"; +import { redis } from "./connectors/redis"; +import { getULID, getUUID } from "$lib/utils"; + +export const getCompiledFinalSheet = async (date: string, drawId: string) => { + const bookingEntries = await dbApiData.getBookingEntriesByDraw(date, drawId); + const finalSheet = { + id: getULID(), + date, + drawId, + data: [], + totals: getDefaultTotals(), + } as FinalSheetData; + const lexiCodeCache = await getLexiCodeCache(); + const { sheetCache, failed } = await getSheetCache(bookingEntries); + if (failed.length > 0) { + console.log(`[-] Failed to find lexicodes for ${failed.length} entries`); + } + console.log("[...] Now compiling the final sheet"); + for (const number of get4DigitGenerator()) { + const fsRow = { + rate: { first: 0, second: 0 }, + prize: { first: 0, second: 0 }, + profit: { first: 0, second: 0 }, + } as FinalSheetRow; + const childNumbers = lexiCodeCache[number]; + let vals = getLexiCodeCacheObject(number); + const sheetCacheKeys = Object.keys(sheetCache); + for (const child of childNumbers) { + const lco = getLexiCodeCacheObject(child.number); + if (sheetCacheKeys.includes(child.number)) { + lco.number = child.number; + // TODO: make this into a loop for first and second + vals.frequency.first += sheetCache[child.number].frequency.first; + vals.rate.first += sheetCache[child.number].rate.first; + vals.prize.first += sheetCache[child.number].prize.first; + lco.frequency.first += sheetCache[child.number].frequency.first; + lco.rate.first += sheetCache[child.number].rate.first; + lco.prize.first += sheetCache[child.number].prize.first; + + vals.frequency.second += sheetCache[child.number].frequency.second; + vals.rate.second += sheetCache[child.number].rate.second; + vals.prize.second += sheetCache[child.number].prize.second; + lco.frequency.second += sheetCache[child.number].frequency.second; + lco.rate.second += sheetCache[child.number].rate.second; + lco.prize.second += sheetCache[child.number].prize.second; + } + // @ts-ignore + fsRow[child.lexiCode] = lco; + } + fsRow.id = getUUID(); + fsRow.number = number; + fsRow.frequency = vals.frequency; + fsRow.rate = { first: vals.rate.first, second: vals.rate.second }; + // TODO: MAYBE: recalculate these + fsRow.prize = { first: vals.prize.first, second: vals.prize.second }; + fsRow.profit = { + first: calculateProfit(vals.rate.first, vals.prize.first), + second: calculateProfit(vals.rate.second, vals.prize.second), + }; + finalSheet.data.push(fsRow); + } + console.log("[+] Final sheet compilation complete"); + return { finalSheet, ok: true, errors: [] as ServerError }; +}; + +const getSheetCache = async (bookingEntries: BookingEntry[]) => { + const sheetCache = {} as Record; + const failed = [] as BookingEntry[]; + console.log("[...] Preparing the FS final sheet cache"); + // INFO: first loop we calculate the vals for each indiv. number of the first and second + for (const entry of bookingEntries) { + const no = entry.number; + const lexiCode = getLexiCode(no); + if (!lexiCode) { + failed.push(entry); + continue; + } + if (sheetCache[no] === undefined) { + sheetCache[no] = getLexiCodeCacheObject(no); + } + sheetCache[no].frequency.first++; + sheetCache[no].rate.first += entry.first; + sheetCache[no].prize.first += calculatePrize( + getRateAfterCommission(sheetCache[no].rate.first), + lexiCode, + "first", + getNoOfDigits(lexiCode), + NUMBERS_IN_FIRST_DRAW + ); + sheetCache[no].frequency.second++; + sheetCache[no].rate.second += entry.second; + sheetCache[no].prize.second += calculatePrize( + getRateAfterCommission(sheetCache[no].rate.second), + lexiCode, + "second", + getNoOfDigits(lexiCode), + NUMBERS_IN_SECOND_DRAW + ); + } + return { sheetCache, failed }; +}; + +const getDefaultTotals = () => { + return { + commission: { first: 0, second: 0 }, + netRate: { first: 0, second: 0 }, + rate: { first: 0, second: 0 }, + prize: { first: 0, second: 0 }, + profit: { first: 0, second: 0 }, + frequency: { first: 0, second: 0 }, + }; +}; + +const getNoOfDigits = (lexiCode: string) => { + const lens = { 1: 10, 2: 100, 3: 1000, 4: 10000 }; + return lens[lexiCode.replaceAll("+", "").length as keyof typeof lens]; +}; + +const getRateAfterCommission = (rate: number) => { + return rate - rate * COMMISSION_PERCENTAGE; +}; + +const getLexiCodeCache = async () => { + type CacheType = Record; + const rKey = "lexicodecache"; + const found = await redis.get(rKey); + if (found) { + return JSON.parse(found) as CacheType; + } + const cache = {} as CacheType; + for (const number of get4DigitGenerator()) { + cache[number] = getAllMatchingChildNumbers(number); + } + await redis.set(rKey, JSON.stringify(cache)); + return cache; +}; + +const getAllMatchingChildNumbers = (parent: string) => { + const out = [] as { number: string; lexiCode: string }[]; + out.push({ number: `${parent[0]}`, lexiCode: "a" }); + out.push({ number: `+${parent[0]}`, lexiCode: "+a" }); + out.push({ number: `++${parent[0]}`, lexiCode: "++a" }); + out.push({ number: `+++${parent[0]}`, lexiCode: "+++a" }); + out.push({ number: `${parent[0]}${parent[1]}`, lexiCode: "ab" }); + out.push({ number: `+${parent[0]}${parent[1]}`, lexiCode: "+ab" }); + out.push({ number: `${parent[0]}+${parent[1]}`, lexiCode: "a+b" }); + out.push({ number: `+${parent[0]}+${parent[1]}`, lexiCode: "+a+b" }); + out.push({ number: `++${parent[0]}${parent[1]}`, lexiCode: "++ab" }); + out.push({ number: `${parent[0]}++${parent[1]}`, lexiCode: "a++b" }); + out.push({ number: `${parent[0]}${parent[1]}${parent[2]}`, lexiCode: "abc" }); + out.push({ + number: `+${parent[0]}${parent[1]}${parent[2]}`, + lexiCode: "+abc", + }); + out.push({ + number: `${parent[0]}+${parent[1]}${parent[2]}`, + lexiCode: "a+bc", + }); + out.push({ + number: `${parent[0]}${parent[1]}+${parent[2]}`, + lexiCode: "ab+c", + }); + out.push({ number: parent, lexiCode: "abcd" }); + return out; +}; + +function* get4DigitGenerator(): Generator { + for (let i = 0; i < 10; i++) { + for (let j = 0; j < 10; j++) { + for (let k = 0; k < 10; k++) { + for (let l = 0; l < 10; l++) { + yield `${i}${j}${k}${l}`; + } + } + } + } +} + +const calculatePrize = ( + amount: number, + lexiCode: string, + type: "first" | "second", + noOfDigits: number, + noOfDrawNumbers: number +) => { + const lexiCodePercentage = + LEXICODE_PRIZE_PERCENTAGES[type][ + lexiCode as keyof typeof LEXICODE_PRIZE_PERCENTAGES.first + ]; + if (amount && lexiCodePercentage > 0 && noOfDrawNumbers > 0) { + return Number( + ( + (amount * noOfDigits * (lexiCodePercentage / 100)) / + noOfDrawNumbers + ).toFixed(2) + ); + } + return 0; +}; + +const calculateProfit = (rate: number, prize: number) => { + return getRateAfterCommission(rate) - prize; +}; + +const getLexiCode = (no: string) => { + for (const [lexicode, pattern] of Object.entries(LEXICODE_MATHCER_PATTERNS)) { + if (pattern.test(no)) { + return lexicode; + } + } + return false; +}; + +const getLexiCodeCacheObject = (no: string) => { + return { + number: no, + rate: { first: 0, second: 0 }, + prize: { first: 0, second: 0 }, + frequency: { first: 0, second: 0 }, + } as LexiCodeCacheObject; +}; + +// const getMatchingParents = (no: string) => { +// const matching = [] as string[]; +// for (const parent of get4DigitGenerator()) { +// if (doesNumberMatch(parent, no)) { +// matching.push(parent); +// } +// } +// return matching; +// }; + +// const doesNumberMatch = (parent: string, child: string) => { +// let allMatch = true; +// for (let i = 0; i < child.length; i++) { +// if (parent[i] !== child[i] && child[i] !== "+") { +// allMatch = false; +// } +// } +// return allMatch; +// }; + +// const getLexiCodeCache = async () => { +// const rKey = "lexicodecache"; +// const keyCount = await redis.keys(rKey); +// if (keyCount.length === 1) { +// return JSON.parse((await redis.get(rKey)) ?? ""); +// } +// const lexicodeCache: Record = {}; +// for (let i = 0; i < 10; i++) { +// lexicodeCache[i.toString()] = getMatchingParents(i.toString()); +// lexicodeCache[`+${i}`] = getMatchingParents(`+${i}`); +// lexicodeCache[`++${i}`] = getMatchingParents(`++${i}`); +// lexicodeCache[`+++${i}`] = getMatchingParents(`+++${i}`); +// for (let j = 0; j < 10; j++) { +// lexicodeCache[`${i}${j}`] = getMatchingParents(`${i}${j}`); +// lexicodeCache[`+${i}${j}`] = getMatchingParents(`+${i}${j}`); +// lexicodeCache[`${i}+${j}`] = getMatchingParents(`${i}+${j}`); +// lexicodeCache[`+${i}+${j}`] = getMatchingParents(`+${i}+${j}`); +// lexicodeCache[`++${i}${j}`] = getMatchingParents(`++${i}${j}`); +// lexicodeCache[`${i}++${j}`] = getMatchingParents(`${i}++${j}`); +// for (let k = 0; k < 10; k++) { +// lexicodeCache[`${i}${j}${k}`] = getMatchingParents(`${i}${j}${k}`); +// lexicodeCache[`+${i}${j}${k}`] = getMatchingParents(`+${i}${j}${k}`); +// lexicodeCache[`${i}+${j}${k}`] = getMatchingParents(`${i}+${j}${k}`); +// lexicodeCache[`${i}${j}+${k}`] = getMatchingParents(`${i}${j}+${k}`); +// for (let l = 0; l < 10; l++) { +// lexicodeCache[`${i}${j}${k}${l}`] = [`${i}${j}${k}${l}`]; +// } +// } +// } +// } +// await redis.set(rKey, JSON.stringify(lexicodeCache)); +// return lexicodeCache; +// }; diff --git a/src/lib/server/external/api.scraping.helpers.ts b/src/lib/server/external/api.scraping.helpers.ts new file mode 100755 index 0000000..597fedc --- /dev/null +++ b/src/lib/server/external/api.scraping.helpers.ts @@ -0,0 +1,316 @@ +import { getRandomUserAgent, getULID, sleep } from "$lib/utils"; +import { constants } from "$lib/utils/constants"; +import type { BookingEntry, Draw, LooseApiUser } from "$lib/utils/data.types"; +import { rng } from "$lib/utils/rng"; + +export const testIfSessionIsValid = async (jwt: string) => { + try { + const res = await fetch( + `${constants.SCRAP_API_URL}/v1/user/get-balance?userId=6339`, + { + headers: { + ...constants.SCRAP_API_BASE_HEADERS, + Authorization: jwt, + "User-Agent": getRandomUserAgent(), + }, + }, + ); + if (res.status !== 200) { + return false; + } + const rj = (await res.json()) as { + code: number; + success: boolean; + message: string; + data: any; + time: string; + }; + return rj.code == 200 && rj.success; + } catch (err) { + console.log(err); + return false; + } +}; + +export const getSessionToken = async (payload: { + userId: string; + password: string; + verifyToken: string; + code: string; + userType: number; +}): Promise<{ ok: boolean; message: string }> => { + console.log("Requesting..."); + const res = await fetch(`${constants.SCRAP_API_URL}/v1/auth/login`, { + method: "POST", + headers: { + ...constants.SCRAP_API_BASE_HEADERS, + "User-Agent": getRandomUserAgent(), + "Content-Type": "application/json", + }, + body: JSON.stringify(payload), + }); + const out = await res.json(); + if (out.code !== 200) { + return { ok: false, message: out.message }; + } + return { ok: true, message: out.data.token }; +}; + +export async function getUsersBalance(userId: number, jwt: string) { + try { + const res = await fetch( + `${constants.SCRAP_API_URL}/v1/user/get-balance?userId=${userId}`, + { + headers: { + ...constants.SCRAP_API_BASE_HEADERS, + Authorization: jwt, + "User-Agent": getRandomUserAgent(), + }, + }, + ); + const rj = (await res.json()) as { + code: number; + success: boolean; + message: string; + data: { allowedBalance: number; balance: number }; + time: string; + }; + if (res.status !== 200 || rj.code !== 200 || !rj.success) { + console.log( + `[!] Error getting balance for ${userId} :: ${JSON.stringify(rj)}`, + ); + return false; + } + return rj.data.balance; + } catch (err) { + console.log(err); + return false; + } +} + +export const getDealers = async (jwt: string, distributor_ids: string[]) => { + try { + // // Create an array of promises for each fetch request + const requests = distributor_ids.map(async (did) => { + await sleep(rng(100, 10000)); + const res = await fetch( + `${constants.SCRAP_API_URL}/v1/user/dealer-list`, + { + method: "POST", + headers: { + ...constants.SCRAP_API_BASE_HEADERS, + "Content-Type": "application/json", + "User-Agent": getRandomUserAgent(), + Authorization: jwt, + }, + body: JSON.stringify({ + page: 1, + pageSize: 999999, + parentDistributor: parseInt(did), + }), + }, + ); + const data = (await res.json()) as { + code: number; + success: boolean; + message: string; + data: { + items: any[]; + total: number; + }; + }; + if (data.code !== 200 || !data.success) { + return { + dealers: [], + ok: false, + code: data.code, + message: data.message, + }; + } + const dealers = data.data.items.map((item) => item.dealer); + return { + dealers, + ok: res.status === 200 && data.success, + code: data.code, + message: data.message, + }; + }); + // // Wait for all promises to resolve + const responses = await Promise.all(requests); + const dealers: LooseApiUser[] = []; + const errors: { message: string }[] = []; + for (const res of responses) { + if (res.code !== 200 || !res.ok) { + errors.push({ message: res.message }); + continue; + } + for (const dealer of res.dealers) { + dealers.push(dealer); + } + } + + // fs.writeFileSync("dealers.json", JSON.stringify(dealers, null, 2)); + + return { dealers, errors }; + } catch (err) { + console.error(err); + return { + dealers: [], + errors: [{ message: "An error occured during fetching dealers" }], + }; + } +}; + +export const getDistributors = async (jwt: string) => { + const res = await fetch( + `${constants.SCRAP_API_URL}/v1/user/distributor-list`, + { + method: "POST", + headers: { + ...constants.SCRAP_API_BASE_HEADERS, + Authorization: jwt, + "Content-Type": "application/json", + "User-Agent": getRandomUserAgent(), + }, + body: JSON.stringify({ + page: 1, + pageSize: 999999, + parentDistributor: 15, + }), + }, + ); + const json = (await res.json()) as { + code: number; + success: boolean; + message: string; + data: { total: number; items: any[] }; + }; + + if (!json.data.items || json.code !== 200 || !json.success) { + return { ok: false, message: json.message, data: [] }; + } + + // fs.writeFileSync( + // "distributors.json", + // JSON.stringify(json.data.items, null, 2), + // ); + + return { + ok: true, + message: "", + data: json.data.items.map((item) => item.distributor), + }; +}; + +export const getDraws = async (jwt: string) => { + const res = await fetch( + `${constants.SCRAP_API_URL}/v1/draw/list-my?userId=15`, + { + method: "GET", + headers: { + ...constants.SCRAP_API_BASE_HEADERS, + Authorization: jwt, + "Content-Type": "application/json", + "User-Agent": getRandomUserAgent(), + }, + }, + ); + type J = { + code: number; + success: boolean; + message: string; + data: { draw: Draw }[]; + }; + let decoded = (await res.json()) as { data: J }; + const json = (decoded.data.success ? decoded.data : decoded) as any as J; + if (json.code !== 200 || !json.success || !json.data) { + return { ok: false, message: json.message, data: [] }; + } + return { + ok: true, + message: "", + data: json.data.map((item) => item.draw), + }; +}; + +export const getData = async ( + jwt: string, + userIds: number[], + drawId: number, + chosenDate: string, +) => { + const res = await fetch(`${constants.SCRAP_API_URL}/v1/book/list2`, { + method: "POST", + headers: { + ...constants.SCRAP_API_BASE_HEADERS, + Authorization: jwt, + "Content-Type": "application/json", + "User-Agent": getRandomUserAgent(), + }, + body: JSON.stringify({ + userType: 3, + userIds, + drawId: drawId, + startDate: chosenDate, + endDate: chosenDate, + beAdmin: false, + containImported: false, + keyword: "", + }), + }); + type J = { + code: number; + success: boolean; + message: string; + data: { book: BookingEntry; user: any }[]; + }; + let decoded = (await res.json()) as { data: J }; + const json = (decoded.data.success ? decoded.data : decoded) as any as J; + if (json.code !== 200 || !json.success || !json.data) { + return { ok: false, message: json.message, data: [] }; + } + return { ok: true, message: "", data: json.data.map((e) => e.book) }; +}; + +export const mockGetUserData = async ( + jwt: string, + userIds: number[], + drawId: number, + chosenDate: string, +) => { + console.log("Rizzzzard of Mogwards!"); + const entries = [] as BookingEntry[]; + + const rng = (min: number, max: number) => { + return Math.floor(Math.random() * (max - min + 1)) + min; + }; + const randomCeil = rng(10_000, 200_000); + + await sleep(rng(100, 1000)); + + for (let i = 0; i < randomCeil; i++) { + const _f = rng(5, 50); + const _s = rng(5, 50); + const f = _f - (_f % 5); + const s = _s - (_s % 5); + + entries.push({ + id: getULID(), + bookDate: chosenDate, + changedBalance: f + s, + first: f, + second: s, + dealerId: userIds[rng(0, userIds.length - 1)], + distributorId: 6339, + drawId: drawId, + number: rng(0, 9999).toString(), + requestId: new Date().getTime().toString(), + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + sheetId: "0", + sheetName: "", + }); + } + + return { ok: true, message: "", data: entries }; +}; diff --git a/src/lib/server/finalsheet.helpers.ts b/src/lib/server/finalsheet.helpers.ts new file mode 100755 index 0000000..b00ba75 --- /dev/null +++ b/src/lib/server/finalsheet.helpers.ts @@ -0,0 +1,270 @@ +import type { + BookingEntry, + FSTotals, + FinalSheetRow, + LexiCodeCacheObject, + ReducedFinalSheetData, + ReducedFinalSheetRow, + ServerError, +} from "$lib/utils/data.types"; +import { dbApiData } from "./db/apidata.db"; +import { redis } from "./connectors/redis"; +import { getDefaultTotals, getULID } from "$lib/utils"; +import { + calculatePrize, + calculateProfit, + get4DigitGenerator, + getAllMatchingChildNumbers, + getCommisionAmt, + getLexiCode, + getLexiCodeCacheObject, + getNoOfDigits, + getNetRate, +} from "$lib/utils/finalsheet.utils"; + +export const getReducedFinalSheet = async (fsData: ReducedFinalSheetData) => { + const bookingEntries = await dbApiData.getBookingEntriesByDraw( + fsData.date, + fsData.drawId + ); + console.log( + `[...] Got ${bookingEntries.length} booking entries for ${fsData.date}, draw ${fsData.drawId}` + ); + const lexiCodeCache = await getLexiCodeCache(); + const { sheetCache, totals, failed } = await getSheetCache(bookingEntries); + const sheetCacheKeys = new Set(); + for (const each of Object.keys(sheetCache)) { + sheetCacheKeys.add(each); + } + if (failed.length > 0) { + console.log(`[-] Failed to find lexicodes for ${failed.length} entries`); + console.log(failed.map((e) => e.number)); + } + fsData.totals = totals; + console.log("[...] Compiling the final sheet"); + // fs.writeFileSync("test.json", JSON.stringify(sheetCache, null, 2)); + let highestRate = { first: 0, second: 0 }; + for (const number of get4DigitGenerator()) { + const fsRow = { + id: getULID(), + number: number, + rate: { first: 0, second: 0 }, + prize: { first: 0, second: 0 }, + profit: { first: 0, second: 0 }, + frequency: { first: 0, second: 0 }, + frequencies: { abcd: { first: 0, second: 0 } }, + } as ReducedFinalSheetRow; + const childNumbers = lexiCodeCache[number]; + let vals = getLexiCodeCacheObject(number); + + for (const child of childNumbers) { + if (!sheetCacheKeys.has(child.number)) { + continue; + } + for (const each of ["first", "second"] as const) { + vals.frequency[each] += sheetCache[child.number].frequency[each]; + vals.rate[each] += sheetCache[child.number].rate[each]; + vals.prize[each] += sheetCache[child.number].prize[each]; + if (child.lexiCode !== "abcd") { + continue; + } + fsRow.frequencies[child.lexiCode][each] = + sheetCache[child.number].frequency[each]; + } + } + + for (const each of ["first", "second"] as const) { + fsRow.frequency[each] = vals.frequency[each]; + fsRow.rate[each] = vals.rate[each]; + fsRow.prize[each] = vals.prize[each]; + fsRow.profit[each] = calculateProfit( + totals.netRate[each], + vals.prize[each] + ); + } + if (fsRow.rate.first > highestRate.first) { + highestRate.first = fsRow.rate.first; + } + if (fsRow.rate.second > highestRate.second) { + highestRate.second = fsRow.rate.second; + } + // console.log(fsRow); + // throw new Error("test"); + fsData.data.push(fsRow); + } + console.log("[+] Reduced Final sheet compilation complete"); + return { ok: true, errors: [] as ServerError }; +}; + +export const getTargetFSRow = async ( + drawId: string, + date: string, + number: string +) => { + const bookingEntries = await dbApiData.getBookingEntriesByDraw(date, drawId); + const lexiCodeCache = await getLexiCodeCache(); + const { sheetCache, totals, failed } = await getSheetCache(bookingEntries); + if (failed.length > 0) { + console.log(`[-] Failed to find lexicodes for ${failed.length} entries`); + console.log(failed.map((e) => e.number)); + } + console.log("[...] Preparing the FS row"); + // fs.writeFileSync("test.json", JSON.stringify(sheetCache, null, 2)); + let highestRate = { first: 0, second: 0 }; + const fsRow = { + id: getULID(), + number: number, + rate: { first: 0, second: 0 }, + prize: { first: 0, second: 0 }, + profit: { first: 0, second: 0 }, + frequency: { first: 0, second: 0 }, + } as FinalSheetRow; + const childNumbers = lexiCodeCache[number]; + let vals = getLexiCodeCacheObject(number); + const sheetCacheKeys = Object.keys(sheetCache); + for (const child of childNumbers) { + if (sheetCacheKeys.includes(child.number)) { + for (const each of ["first", "second"] as const) { + vals.frequency[each] += sheetCache[child.number].frequency[each]; + vals.rate[each] += sheetCache[child.number].rate[each]; + vals.prize[each] += sheetCache[child.number].prize[each]; + } + } + } + for (const each of ["first", "second"] as const) { + fsRow.frequency[each] = vals.frequency[each]; + fsRow.rate[each] = vals.rate[each]; + fsRow.prize[each] = vals.prize[each]; + fsRow.profit[each] = calculateProfit( + totals.netRate[each], + vals.prize[each] + ); + } + if (fsRow.rate.first > highestRate.first) { + highestRate.first = fsRow.rate.first; + } + if (fsRow.rate.second > highestRate.second) { + highestRate.second = fsRow.rate.second; + } + console.log("[+] FS Row prepared"); + return { ok: true, errors: [] as ServerError, data: fsRow }; +}; + +const getSheetCache = async (bookingEntries: BookingEntry[]) => { + const sheetCache = {} as Record; + const totals = getDefaultTotals() as FSTotals; + const failed = [] as BookingEntry[]; + console.log("[...] Preparing the pre-FS cache"); + // INFO: first loop we calculate the vals for each indiv. number of the first and second + for (const entry of bookingEntries) { + const no = entry.number; + const lexiCode = getLexiCode(no); + if (!lexiCode) { + failed.push(entry); + continue; + } + if (sheetCache[no] === undefined) { + sheetCache[no] = getLexiCodeCacheObject(no); + } + for (const each of ["first", "second"] as const) { + if (entry[each] > 0) { + sheetCache[no].frequency[each]++; + } + sheetCache[no].rate[each] += entry[each]; + sheetCache[no].prize[each] = calculatePrize( + sheetCache[no].rate[each], + lexiCode, + each, + getNoOfDigits(lexiCode) + ); + } + } + if (bookingEntries.length > 0) { + for (const value of Object.values(sheetCache)) { + for (const each of ["first", "second"] as const) { + totals.frequency[each] += value.frequency[each]; + totals.prize[each] += value.prize[each]; + totals.rate[each] += value.rate[each]; + } + } + for (const each of ["first", "second"] as const) { + totals.commission[each] = getCommisionAmt(totals.rate[each]); + totals.netRate[each] = getNetRate(totals.rate[each]); + } + } + return { sheetCache, failed, totals }; +}; + +const getLexiCodeCache = async () => { + type CacheType = Record; + const rKey = "lexicodecache"; + const found = await redis.get(rKey); + if (found) { + return JSON.parse(found) as CacheType; + } + const cache = {} as CacheType; + for (const number of get4DigitGenerator()) { + cache[number] = getAllMatchingChildNumbers(number); + } + await redis.setex(rKey, 3600 * 24, JSON.stringify(cache)); + return cache; +}; + +const getCachedReducedFinalSheet = async (date: string, drawId: string) => { + const key = `cfinalsheet:${date}:${drawId}`; + const cached = await redis.get(key); + if (cached) { + return JSON.parse(cached); + } + return null; +}; + +const setCachedReducedFinalSheet = async ( + date: string, + drawId: string, + data: ReducedFinalSheetData +) => { + const key = `cfinalsheet:${date}:${drawId}`; + await redis.setex(key, 3600 * 24, JSON.stringify(data)); +}; + +export const deleteCachedReducedFinalSheet = async ( + date: string, + drawId: string +) => { + await redis.del(`cfinalsheet:${date}:${drawId}`); +}; + +export const getTestBookingData = async (drawId: string, date: string) => { + const numbers = {} as Record>; + for (const each of get4DigitGenerator()) { + const childNumbers = getAllMatchingChildNumbers(each); + for (const child of childNumbers) { + if (numbers[child.lexiCode] === undefined) { + numbers[child.lexiCode] = new Set(); + } + numbers[child.lexiCode].add(child.number); + } + } + const out = [] as BookingEntry[]; + for (const v of Object.values(numbers)) { + for (const child of v) { + const entry = { + id: getULID(), + drawId: Number(drawId.split(":")[1]), + bookDate: date, + date, + number: child, + first: 10, + second: 10, + dealerId: 4677, + sheetId: "test", + requestId: getULID(), + distributorId: 6339, + changedBalance: 0, + } as BookingEntry; + out.push(entry); + } + } + return out; +}; diff --git a/src/lib/server/hashing.ts b/src/lib/server/hashing.ts new file mode 100755 index 0000000..15dc912 --- /dev/null +++ b/src/lib/server/hashing.ts @@ -0,0 +1,11 @@ +import bcrypt from "bcryptjs"; + +const rounds = 10; + +export const hashData = (data: string): string => { + return bcrypt.hashSync(data, rounds); +}; + +export const compareData = (data: string, hash: string): boolean => { + return bcrypt.compareSync(data, hash); +}; diff --git a/src/lib/server/postdata/post.handler.ts b/src/lib/server/postdata/post.handler.ts new file mode 100644 index 0000000..b27c156 --- /dev/null +++ b/src/lib/server/postdata/post.handler.ts @@ -0,0 +1,445 @@ +import { getRandomUserAgent, getULID, sleep } from "$lib/utils"; +import { constants } from "$lib/utils/constants"; +import type { + ApiPostUserWithParent, + APISession, + Draw, + PostDataEntry, + ServerError, +} from "$lib/utils/data.types"; +import Fetch from "node-fetch"; +import { HttpsProxyAgent } from "https-proxy-agent"; + +export type APIRespnose = { + code: number; + success: boolean; + message: string; + data: T; + time: string; +}; + +export function buildMessageString( + i: number, + rows: PostDataEntry[], + distributorId: number, + dealerId: number, + drawId: number, + date: string, +) { + let message = ""; + let jumpSize = Math.floor(Math.random() * 490) + 10; + let total = 0; + let startReqId = new Date().getTime(); + let x = 0; + for (let j = i; j < i + jumpSize; j++) { + if (j >= rows.length) { + break; + } + const row = rows[j]; + const reqId = startReqId + x++; + const no = row.number.trim(); + const f = row.first; + const s = row.second; + const mTotal = f + s; + if (mTotal <= 0) { + continue; + } + total += mTotal; + message += `${reqId},${distributorId},${dealerId},${drawId},${date},${no},${f},${s},${mTotal};`; + } + message = message.slice(0, -1); + return { message, total, jumped: i + jumpSize }; +} + +export async function postDataToApi(payload: { + sessions: Record; + draw: Draw; + data: PostDataEntry[]; + users: ApiPostUserWithParent[]; +}) { + const responses = [] as APIRespnose<[]>[]; + const responsesIds = [] as { requestId: number; bookId: string }[]; + let failedResponses = 0; + let successResponses = 0; + + console.log(`[+] Sending ${payload.data.length} requests...`); + + const dataByUser = {} as Record; + for (const row of payload.data) { + const userId = row.userId ?? ""; + if (userId.length < 1) { + console.log(`[!] User not found for request ${row.userId}`); + return { + ok: false, + detail: "User not found to post data with", + errors: [{ message: "User not found for request" }] as ServerError, + }; + } + if (!dataByUser[userId]) { + dataByUser[userId] = []; + } + dataByUser[userId].push(row); + } + + try { + for (const userId in dataByUser) { + const session = payload.sessions[userId]; + const usr = payload.users.find((u) => u.userId === userId); + if (!usr) { + console.log(`[!] User ${userId} not found for posting to api`); + return { + ok: false, + detail: "User not found to post data with", + errors: [{ message: "User not found for request" }] as ServerError, + }; + } + const distId = usr.parentDistributor ?? 0; + const dealerId = Number(session.userId.split(":")[1]); + const drawId = Number(payload.draw.id.split(":")[1]); + const date = new Date().toISOString().split("T")[0]; + + let i = 0; + while (i < dataByUser[userId].length) { + let tries = 0; + while (tries < 3) { + let { message, total, jumped } = buildMessageString( + i, + dataByUser[userId], + distId, + dealerId, + drawId, + date, + ); + const res = await sendBatchRequest( + session, + dealerId, + payload.draw, + total, + message, + ); + const rj = (await res.json()) as APIRespnose<{ + bookDtos: { bookId: string; requestId: number }[]; + }>; + if (rj.code === 200 && res.status === 200) { + i = jumped; + responsesIds.push( + ...rj.data.bookDtos.map((b) => ({ + requestId: b.requestId as number, + bookId: b.bookId as string, + })), + ); + successResponses++; + break; + } + failedResponses++; + tries++; + } + + if (tries >= 3) { + console.log( + `[!] Failed to send data to api for user ${userId}, deleting all booked entries...`, + ); + console.log(responsesIds); + if (responsesIds.length > 0) { + const out = await deleteAllBookedEntries({ + data: responsesIds, + closeTime: payload.draw.closeTime, + dealerId, + drawId, + session, + }); + console.log(await out.text()); + } + return { + ok: false, + detail: "Failed to post data to API halfway through", + errors: [ + { message: "Failed to post data to API halfway through" }, + ] as ServerError, + }; + } + } + } + + console.log(`[+] Finished sending ${payload.data.length} requests`); + console.log(`[?] Failed responses: ${failedResponses}`); + console.log(`[?] Success responses: ${successResponses}`); + return { + ok: true, + detail: "Successfully sent data to api", + data: responses, + }; + } catch (err) { + console.log(err); + return { + ok: false, + detail: "Failed to send data to api", + }; + } +} + +async function sendBatchRequest( + session: APISession, + dealerId: number, + draw: Draw, + changedBalance: number, + body: string, +) { + return Fetch(`${constants.SCRAP_API_URL}/v1/book/add-multiple`, { + agent: new HttpsProxyAgent(`http://${session.ip}`), + method: "POST", + headers: { + ...constants.SCRAP_API_BASE_HEADERS, + "Content-Type": "application/json;charset=UTF-8", + Authorization: session.sessionToken, + "User-Agent": getRandomUserAgent(), + }, + body: JSON.stringify({ + changedBalance, + closeTime: draw.closeTime, + date: new Date().toISOString().split("T")[0], + dealerId, + drawId: Number(draw.id.split(":")[1]), + insertData: body, + }), + }); +} + +async function mockSendBatchRequest( + session: APISession, + dealerId: number, + draw: Draw, + changedBalance: number, + body: string, +) { + // between 5 to 20 ms + await sleep(Math.floor(Math.random() * 1000) + 50); + if (Math.random() < 0.005) { + return new Response( + JSON.stringify({ + code: 500, + success: false, + message: "Failed", + data: {}, + time: new Date().toISOString(), + }), + { + status: 500, + headers: { "Content-Type": "application/json" }, + statusText: "Failed", + }, + ); + } + return new Response( + JSON.stringify({ + code: 200, + success: true, + message: "Success", + data: { + bookDtos: body.split(";").map((e) => { + return { + bookId: getULID(), + requestId: +e.split(",")[0], + }; + }), + }, + time: new Date().toISOString(), + }), + { + status: 200, + headers: { "Content-Type": "application/json" }, + statusText: "OK", + }, + ); +} + +async function sendRequest( + requestId: number, + session: APISession, + body: PostDataEntry, + dealerId: number, + distributorId: number, + draw: Draw, +) { + return Fetch(`${constants.SCRAP_API_URL}/v1/book/add`, { + agent: new HttpsProxyAgent(`http://${session.ip}`), + method: "POST", + headers: { + ...constants.SCRAP_API_BASE_HEADERS, + "Content-Type": "application/json;charset=UTF-8", + Authorization: session.sessionToken, + "User-Agent": getRandomUserAgent(), + }, + body: JSON.stringify({ + retryIndex: 0, + requestId: requestId, + date: new Date().toISOString().split("T")[0], + drawId: Number(draw.id.split(":")[1]), + closeTime: draw.closeTime, + dealerId: dealerId, + distributorId: distributorId, + number: body.number, + first: body.first, + second: body.second, + changedBalance: body.first + body.second, + }), + }); +} + +async function mockSendRequest( + requestId: number, + session: APISession, + body: PostDataEntry, + dealerId: number, + distributorId: number, + draw: Draw, +) { + // between 5 to 15 ms + await sleep(Math.floor(Math.random() * 10 + 5)); + // // simulate a failed response, 20% of the time + if (Math.random() < 0.05) { + // return a failed response + return new Response( + JSON.stringify({ + code: 500, + success: false, + message: "Failed", + data: {}, + time: new Date().toISOString(), + }), + { + status: 500, + headers: { "Content-Type": "application/json" }, + statusText: "Failed", + }, + ); + } + return new Response( + JSON.stringify({ + code: 200, + success: true, + message: "Success", + data: {}, + time: new Date().toISOString(), + }), + { + status: 200, + headers: { "Content-Type": "application/json" }, + statusText: "OK", + }, + ); +} + +async function deleteAllBookedEntries({ + session, + data, + dealerId, + drawId, + closeTime, +}: { + session: APISession; + data: { bookId: string; requestId: number }[]; + dealerId: number; + drawId: number; + closeTime: string; +}) { + return Fetch(`${constants.SCRAP_API_URL}/v1/book/delete-multiple`, { + agent: new HttpsProxyAgent(`http://${session.ip}`), + method: "POST", + headers: { + ...constants.SCRAP_API_BASE_HEADERS, + "Content-Type": "application/json;charset=UTF-8", + Authorization: session.sessionToken, + "User-Agent": getRandomUserAgent(), + }, + body: JSON.stringify({ + dealerId, + drawId, + closeTime, + bookIds: data.map((e) => e.bookId), + }), + }); +} + +// export async function postDataToApi(payload: { +// sessions: Record; +// draw: Draw; +// data: PostDataEntry[]; +// users: ApiPostUserWithParent[]; +// }) { +// const MAX_CONCURRENT_REQUESTS = 20; +// const responses = [] as APIRespnose<{}>[]; +// const baseReqId = new Date().getTime(); +// const reqIds = Array.from( +// { length: payload.data.length }, +// (_, i) => baseReqId + i, +// ); +// let failedResponses = 0; +// let successResponses = 0; +// console.log(`[+] Sending ${payload.data.length} requests...`); +// // "1723223505822,6339,6352,16,2024-08-09,123,10,10,20;1723223505823,6339,6352,16,2024-08-09,12,10,10,20", +// async function processBatch(batch: PostDataEntry[], indexes: number[]) { +// const promises = batch.map(async (row, idx) => { +// await sleep(Math.floor(Math.random() * 10 + 10)); +// const session = payload.sessions[row.userId ?? ""]; +// const usr = payload.users.find((u) => u.userId === row.userId); +// if (!usr) { +// return null; +// } +// let ok = false, +// tries = 0; +// while (!ok && tries < 3) { +// await sleep(Math.floor(Math.random() * 10 + 10)); +// const res = await mockSendRequest( +// reqIds[indexes[idx]], +// session, +// row, +// Number(session.userId.split(":")[1]), +// usr?.parentDistributor, +// payload.draw, +// ); +// let rj: APIRespnose<{}>; +// try { +// rj = (await res.json()) as APIRespnose<{}>; +// } catch (err) { +// console.log(err); +// tries++; +// continue; +// } +// if (res.status !== 200 || rj.code !== 200) { +// console.log( +// `Failed to send request ${reqIds[indexes[idx]]}, try ${tries}`, +// ); +// tries++; +// continue; +// } +// ok = true; +// successResponses++; +// return rj; +// } +// failedResponses++; +// return null; +// }); +// const results = await Promise.all(promises); +// for (const result of results) { +// if (!result) continue; +// responses.push(result); +// } +// } +// try { +// for (let i = 0; i < payload.data.length; i += MAX_CONCURRENT_REQUESTS) { +// const batch = payload.data.slice(i, i + MAX_CONCURRENT_REQUESTS); +// await processBatch( +// batch, +// batch.map((_, x) => i + x), +// ); +// } +// console.log(`[+] Finished sending ${payload.data.length} requests`); +// console.log(`[?] Failed responses: ${failedResponses}`); +// console.log(`[?] Success responses: ${successResponses}`); +// return responses; +// } catch (err) { +// console.log(err); +// return false; +// } +// } diff --git a/src/lib/server/postdata/postdata.gen.controller.ts b/src/lib/server/postdata/postdata.gen.controller.ts new file mode 100644 index 0000000..1a8fcbd --- /dev/null +++ b/src/lib/server/postdata/postdata.gen.controller.ts @@ -0,0 +1,447 @@ +import { dbApiPostData } from "$lib/server/db/apipostdata.db"; +import { dbApiUser } from "$lib/server/db/apiuser.db"; +import { getReducedFinalSheet } from "$lib/server/finalsheet.helpers"; +import { + adjustRatesIfDuplicatesFound, + pairRatesWithNumbers, + removeNumbersWithRepeatingDigits, + splitRatesIntoSmallerForRowsWithLargerRates, + spreadRatesForNumbersBetweenUsers, +} from "$lib/server/postdata/postdata.gen.helpers"; +import { getAllSessions } from "$lib/server/utils/session.service"; +import { getDefaultTotals, getULID } from "$lib/utils"; +import type { + ApiPostUser, + ApiPostUserWithParent, + PresetDataEntry, + PostDataEntry, + PostDataFilters, + PostDataHistoryFilters, + ReducedFinalSheetData, + ReducedFinalSheetRow, + ServerError, +} from "$lib/utils/data.types"; +import { dbPresetData } from "$lib/server/db/presetdata.db"; +import { getUsersBalance } from "$lib/server/external/api.scraping.helpers"; + +function filterMatching( + data: ReducedFinalSheetRow[], + min: number, + max: number, + sheetType: "first" | "second", +) { + let abNums = new Set(); + let abcNums = new Set(); + + for (const row of data) { + if (row.prize[sheetType] >= min && row.prize[sheetType] <= max) { + abNums.add(`${row.number[0]}${row.number[1]}`); + abcNums.add(`${row.number[0]}${row.number[1]}${row.number[2]}`); + } + } + return { abNums, abcNums }; +} + +export async function updateBalanceOfPostUsers(users: ApiPostUserWithParent[]) { + const sessions = await getAllSessions(); + const balances = [] as { id: string; balance: number }[]; + for (const user of users) { + const session = sessions.find((e) => e.value.userId === user.id); + const jwt = session?.value.sessionToken; + if (!jwt) { + return { + ok: false, + detail: `Session not found for user ${user.userId}`, + }; + } + const out = await getUsersBalance(+user.id.split(":")[1], jwt); + if (!out) { + return { + ok: false, + detail: `Error fetching balance for user ${user.userName}`, + }; + } + balances.push({ id: user.id, balance: out }); + } + await dbApiUser.updatePostUsersBalances(balances); + return { + ok: true, + detail: "", + data: users.map((u) => { + const bal = balances.find((b) => b.id === u.id); + if (!bal) { + console.log(`ERROR: Balance not found for user ${u.userName}`); + } + return { ...u, balance: bal?.balance ?? 0 }; + }), + }; +} + +export async function fetchDataForPosting( + date: string, + input: PostDataFilters, + users: ApiPostUser[], +) { + console.log(`The input ${JSON.stringify(input, null, 2)}`); + const { minPrize, maxPrize } = input; + const draw = input.draw!; + const fsData = { + id: getULID(), + date, + drawId: draw.id, + data: [], + totals: getDefaultTotals(), + } as ReducedFinalSheetData; + if (!draw) { + return { + ok: false, + detail: `Draw for the passed draw ID not found`, + data: [], + users: [], + errors: [ + { message: `Draw for the passed draw ID not found` }, + ] as ServerError, + }; + } + const data = await getReducedFinalSheet(fsData); + if (!data.ok) { + return { + ok: false, + detail: `Error compiling final sheet`, + data: [], + users: [], + errors: data.errors, + }; + } + + console.log("[+] Filtering the fs data to get the numbers"); + const filteredF = filterMatching(fsData.data, minPrize, maxPrize, "first"); + console.log( + `Filtered data: ${filteredF.abNums.size}; ${filteredF.abcNums.size}`, + ); + + // ------------------------------------------ + + let _abNums = new Set(), + _abcNums = new Set(); + for (const each of filteredF.abNums) _abNums.add(each); + for (const each of filteredF.abcNums) _abcNums.add(each); + let abNums = Array.from(_abNums), + abcNums = Array.from(_abcNums); + + if (draw.filterDuplicatesWhilePosting === true) { + console.log(`[+] Removing numbers that have repeating digits`); + console.log(`[=] Original : AB: ${abNums.length}, ABC: ${abcNums.length}`); + abNums = removeNumbersWithRepeatingDigits(abNums); + abcNums = removeNumbersWithRepeatingDigits(abcNums); + } + console.log(`[=] AB: ${abNums.length}, ABC: ${abcNums.length}`); + + console.log(`Fetching preset data`); + const presetData = await dbPresetData.getDataGroupedBySheetByDraw( + date, + +draw.id.split(":")[1], + ); + console.log(`${presetData.all.length} preset entries found`); + + for (let tries = 0; tries < 3; tries++) { + console.log(`[✍️] Try ${tries + 1} of generating the result`); + const out = await generatePostDataArrayFromBaseInfo( + input, + users, + abNums, + abcNums, + presetData, + ); + if (out.ok) { + return out; + } + if (out.detail.includes("Not enough balance")) { + return { + ok: false, + detail: `Users don't have enough balance to post the data, try reducing the rates`, + data: [], + users: [], + }; + } + } + + return { + ok: false, + detail: `Could not generate data, please try adjusting the filters`, + data: [], + }; +} + +export async function generatePostDataArrayFromBaseInfo( + input: PostDataFilters, + users: ApiPostUser[], + abNums: string[], + abcNums: string[], + presetData: { + all: PostDataEntry[]; + abData: PresetDataEntry[]; + abcData: PresetDataEntry[]; + }, +) { + console.log("[+] Spreading the rates for the numbers for all post user"); + const abData = splitRatesIntoSmallerForRowsWithLargerRates( + spreadRatesForNumbersBetweenUsers( + adjustRatesIfDuplicatesFound( + pairRatesWithNumbers(abNums, input.twoDigitRates), + presetData.abData, + ), + users.map((u) => u.userId), + ), + ); + const abcData = splitRatesIntoSmallerForRowsWithLargerRates( + spreadRatesForNumbersBetweenUsers( + adjustRatesIfDuplicatesFound( + pairRatesWithNumbers(abcNums, input.threeDigitRates), + presetData.abcData, + ), + users.map((u) => u.userId), + ), + ); + + // ------------------------------------------ + + console.log(`[+] Adding ${abData.length} ab entries to final list`); + console.log(`[+] Adding ${abcData.length} abc entries to final list`); + + const result = [] as PostDataEntry[]; + const alreadyPresent = new Set(); + for (const each of abData) { + alreadyPresent.add(each.number); + result.push(each); + } + for (const each of abcData) { + alreadyPresent.add(each.number); + result.push(each); + } + + // ------------------------------------------ + + const balanceCounts = {} as Record; + for (const each of result) { + const uid = each.userId ?? ""; + if (balanceCounts[uid] === undefined) { + balanceCounts[uid] = 0; + } + balanceCounts[uid] += each.first + each.second; + } + + // ------------------------------------------ + + console.log( + `[+] Appending up to ${presetData.all.length} entries that are not ab, abc`, + ); + for (const entry of presetData.all) { + if ( + alreadyPresent.has(entry.number) || + (entry.first < 5 && entry.second < 5) + ) { + continue; + } + const randomUserId = users[Math.floor(Math.random() * users.length)].userId; + if (balanceCounts[randomUserId] === undefined) { + balanceCounts[randomUserId] = 0; + } + balanceCounts[randomUserId] += entry.first + entry.second; + result.push({ ...entry, userId: randomUserId }); + } + + // ------------------------------------------ + + const usersTotalbalance = users.reduce((a, b) => a + (b.balance ?? 0), 0); + let totalAmtForPostingData = Object.values(balanceCounts).reduce( + (acc, curr) => acc + curr, + 0, + ); + if (usersTotalbalance < totalAmtForPostingData) { + return { + ok: false, + detail: `Not enough balance to book overall with ${usersTotalbalance} < ${totalAmtForPostingData}`, + data: [], + users: [], + errors: [ + { message: `Not enough balance to book overall` }, + ] as ServerError, + }; + } + + function isDistributionUnbalanced() { + let out = false; + for (const key in balanceCounts) { + if ( + balanceCounts[key] > (users.find((u) => u.userId === key)?.balance ?? 0) + ) { + out = true; + break; + } + } + return out; + } + + for (let tries = 0; tries < 5; tries++) { + console.log( + `Balance counts start : ${JSON.stringify(balanceCounts, null, 2)}`, + ); + + rebalancePostDataListByBalanceOfUsers(balanceCounts, users, result); + + console.log(`Balance counts final : ${JSON.stringify(balanceCounts)}`); + + let totalAmtForPostingDataAfterRebalance = Object.values( + balanceCounts, + ).reduce((acc, curr) => acc + curr, 0); + + console.log( + `Total amount for posting data after rebalance: ${totalAmtForPostingDataAfterRebalance}`, + `Total balance of users: ${JSON.stringify(users.map((u) => ({ un: u.userName, b: u.balance })))}`, + ); + + if (!isDistributionUnbalanced()) { + console.log(`[+] Distribution is balanced`); + break; + } + console.log(`[!] Rebalancing again`); + } + + if (isDistributionUnbalanced()) { + return { + ok: false, + detail: `Please regenerate dataset as the some users have not enough balance to book their entries`, + data: [], + users: [], + }; + } + + // ------------------------------------------ + + console.log(`[+] Shuffling ${result.length} entries for posting`); + shuffleArray(result); + + return { + ok: true, + detail: `Fetched the data successfully`, + data: result, + users, + errors: undefined, + }; +} + +function shuffleArray(array: T[]): T[] { + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [array[i], array[j]] = [array[j], array[i]]; + } + return array; +} + +export function rebalancePostDataListByBalanceOfUsers( + balanceCounts: Record, + users: ApiPostUser[], + result: PostDataEntry[], +) { + console.log( + `[+] Checking if the users have enough balance to book their assigned data`, + ); + + for (const user of users) { + const usersBalance = user.balance ?? 0; + const dueForUser = balanceCounts[user.userId] ?? 0; + if (usersBalance === 0) { + console.log(`\n[!] ${user.userName} has no balance\n`); + continue; + } + if (usersBalance >= dueForUser) { + console.log( + `[✅] ${user.userName} can book the data of ${usersBalance} > ${dueForUser} `, + ); + continue; + } + console.log( + `[!❎!] ${user.userName} can't book it all ${usersBalance} < ${dueForUser}`, + ); + + const difference = dueForUser - usersBalance; + let differenceLeft = Number(difference); // make a copy + const entriesToMove = result + .filter((r) => { + if (r.userId === user.userId && differenceLeft > 0) { + differenceLeft -= r.first + r.second; + return true; + } + }) + .map((r) => r.id); + console.log(`Have to move ${entriesToMove.length} entries to other users`); + + // find a user who has enough balance + + const userWithEnoughBalance = users.find((u) => { + return ( + (u.balance ?? 0) - balanceCounts[u.userId] >= difference && + u.userId !== user.userId + ); + }); + if (!userWithEnoughBalance) { + return { + ok: false, + detail: `No user found with enough balance to cover balance shortage of ${difference} for ${user.userName}`, + data: [], + }; + } + console.log( + `Dude has enough balance to take on this other user's expenses ': ${JSON.stringify(userWithEnoughBalance)}`, + ); + + for (let i = 0; i < result.length; i++) { + if (!entriesToMove.includes(result[i].id)) { + continue; + } + const entry = result[i]; + let amountMoved = 0; + if (entry.userId !== user.userId) { + continue; + } + entry.userId = userWithEnoughBalance.userId; + balanceCounts[userWithEnoughBalance.userId] += entry.first + entry.second; + balanceCounts[user.userId] -= entry.first + entry.second; + amountMoved += entry.first + entry.second; + if (amountMoved >= difference) { + // don't move more than the difference' + break; + } + } + console.log( + `[+] Moved ${entriesToMove.length} entries to ${userWithEnoughBalance.userName}`, + ); + } +} + +export async function fetchPostDataHistory(input: PostDataHistoryFilters) { + const { draw, date } = input; + console.log(`Fetching post data from HISTORY for draw: ${date} - ${draw.id}`); + const found = await dbApiPostData.getPostDataByDraw(date, draw.id); + if (!found) { + return { data: [], users: [], ok: false, detail: "Data not found" }; + } + console.log( + `Data found for the passed draw: ${date} - ${draw.id}, returning that`, + ); + const users = await dbApiUser.getAllPostUsers(); + const uniqueUserIds = [] as string[]; + for (const each of found) { + if (!each.userId || uniqueUserIds.includes(each.userId)) { + continue; + } + uniqueUserIds.push(each.userId); + } + return { + data: found, + users: users.filter((u) => uniqueUserIds.includes(u.userId)), + ok: true, + detail: "Data found", + }; +} diff --git a/src/lib/server/postdata/postdata.gen.helpers.ts b/src/lib/server/postdata/postdata.gen.helpers.ts new file mode 100644 index 0000000..fb910d1 --- /dev/null +++ b/src/lib/server/postdata/postdata.gen.helpers.ts @@ -0,0 +1,213 @@ +import { getULID } from "$lib/utils"; + +import type { + PostDataEntry, + FSPair, + PresetDataEntry, +} from "$lib/utils/data.types"; + +function splitRatesRelativelyEvenly( + totalRate: number, + parts: number, +): number[] { + if (totalRate < 5) { + return Array.from({ length: parts }, () => 0); + } + if (totalRate === 5) { + return Array.from({ length: parts }, (_, i) => (i === 0 ? 5 : 0)); + } + if (totalRate % 5 !== 0) { + throw new Error("Total rate must be a multiple of 5"); + } + const splits: number[] = []; + let remainingRate = totalRate; + // Distribute the rate using a weighted random approach + for (let i = 0; i < parts; i++) { + if (i === parts - 1) { + splits.push(remainingRate); + } else { + const minRate = 5; // Minimum rate for each part + const maxRate = Math.min( + remainingRate - (parts - i - 1) * minRate, + remainingRate * 0.6, + ); + const rate = + Math.floor((Math.random() * (maxRate - minRate + 1)) / 5) * 5 + minRate; + splits.push(rate); + remainingRate -= rate; + } + } + // Shuffle the array + for (let i = splits.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [splits[i], splits[j]] = [splits[j], splits[i]]; + } + // Occasionally allow for extreme distributions, but ensure at least one non-zero value + if (Math.random() < 0.05) { + // 5% chance + const extremeIndex = Math.floor(Math.random() * parts); + splits.fill(0); + splits[extremeIndex] = totalRate; + } + if (splits.reduce((a, b) => a + b, 0) !== totalRate) { + throw new Error("Splitting error"); + } + return splits; +} + +export function pairRatesWithNumbers(numbers: string[], rates: FSPair) { + const out = []; + for (let i = 0; i < numbers.length; i++) { + out.push({ + id: getULID(), + number: numbers[i].toString(), + first: rates.first, + second: rates.second, + createdAt: new Date().toISOString(), + }); + } + return out; +} + +export function adjustRatesIfDuplicatesFound( + original: PostDataEntry[], + newRows: PresetDataEntry[], +) { + const originalNumbers = original.map((e) => e.number); + const newNumbers = newRows.map((e) => e.number); + const duplicates = originalNumbers.filter((n) => newNumbers.includes(n)); + if (duplicates.length === 0) { + return original; + } + const out = [] as PostDataEntry[]; + for (const entry of original) { + if (!duplicates.includes(entry.number)) { + out.push(entry); + continue; + } + let first = entry.first; + let second = entry.second; + // now add rates from newRows + const newRow = newRows.find((e) => e.number === entry.number); + if (newRow) { + first += newRow.first; + second += newRow.second; + } + out.push({ ...entry, first, second }); + } + return out; +} + +export function spreadRatesForNumbersBetweenUsers( + originalData: PostDataEntry[], + userIds: string[], +) { + const dataWithSplitRates = [] as { first: number[]; second: number[] }[]; + for (const entry of originalData) { + const { first, second } = entry; + if (first % 5 !== 0 || second % 5 !== 0) { + throw new Error("Rates must be multiples of 5"); + } + const fRates = splitRatesRelativelyEvenly(first, userIds.length); + const sRates = splitRatesRelativelyEvenly(second, userIds.length); + dataWithSplitRates.push({ first: fRates, second: sRates }); + } + const out = [] as PostDataEntry[]; + for (let uIdx = 0; uIdx < userIds.length; uIdx++) { + let rIdx = 0; + for (const entry of originalData) { + let f = dataWithSplitRates[rIdx].first[uIdx] ?? 0; + let s = dataWithSplitRates[rIdx].second[uIdx] ?? 0; + if (f > 0 || s > 0) { + out.push({ + ...entry, + first: f, + second: s, + userId: userIds[Math.floor(Math.random() * userIds.length)], + }); + } + rIdx++; + } + } + return out; +} + +export function splitRatesIntoSmallerForRowsWithLargerRates( + data: PostDataEntry[], +) { + const out = [] as PostDataEntry[]; + + function getRNBtw1And6(n: number) { + const quotient = n / 5; + return Math.floor(((Math.random() * quotient) % 6) + 1); + } + + for (const entry of data) { + if (entry.first < 5 && entry.second < 5) { + continue; + } else if (entry.first === 5 && entry.second === 5) { + out.push(entry); + continue; + } + + const firstSplit = splitRatesRelativelyEvenly( + entry.first, + getRNBtw1And6(entry.first), + ); + const secondSplit = splitRatesRelativelyEvenly( + entry.second, + getRNBtw1And6(entry.second), + ); + + const maxLength = Math.max(firstSplit.length, secondSplit.length); + + const firstPadded = firstSplit.concat( + Array(maxLength - firstSplit.length).fill(0), + ); + const secondPadded = secondSplit.concat( + Array(maxLength - secondSplit.length).fill(0), + ); + + // shuffle the two + for (let i = firstPadded.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [firstPadded[i], firstPadded[j]] = [firstPadded[j], firstPadded[i]]; + const k = Math.floor(Math.random() * (i + 1)); + [secondPadded[i], secondPadded[k]] = [secondPadded[k], secondPadded[i]]; + } + + for (let i = 0; i < maxLength; i++) { + const f = firstPadded[i]; + const s = secondPadded[i]; + if (f < 5 && s < 5) { + continue; + } + out.push({ ...entry, first: f, second: s }); + } + } + + // verify that all original rates are preserved, and that the sum of the new rates is equal to the sum of the original rates + const originalSum = data.reduce( + (acc, curr) => acc + curr.first + curr.second, + 0, + ); + const newSum = out.reduce((acc, curr) => acc + curr.first + curr.second, 0); + if (originalSum !== newSum) { + console.log( + `[---] Original and new sums are not matching at all (${originalSum} !== ${newSum})`, + ); + throw new Error("Sum of rates is not equal"); + } + + return out; +} + +export function removeNumbersWithRepeatingDigits(nos: string[]): string[] { + const out = new Set(); + for (const no of nos) { + if (new Set(no).size === no.length) { + out.add(no); + } + } + return Array.from(out); +} diff --git a/src/lib/server/session.helpers.ts b/src/lib/server/session.helpers.ts new file mode 100755 index 0000000..c0db485 --- /dev/null +++ b/src/lib/server/session.helpers.ts @@ -0,0 +1,103 @@ +import { redis } from "./connectors/redis"; +import { getUUID } from "$lib/utils"; +import type { Session } from "$lib/utils/data.types"; + +export const defaultTTL = 60 * 60 * 6; + +export const generateSession = async ( + username: string, + userType: string, + ip: string, + userAgent: string, + ttl?: number, +) => { + ttl = ttl || defaultTTL; + const sId = getUUID(); + await deleteMatchingSessions(username, ip, userAgent); + await redis.setex( + sId, + ttl, + ip + "|" + userAgent + "|" + username + "|" + userType + "|" + sId, + ); + await redis.sadd("session:" + username, sId); + return sId; +}; + +export const getSession = async (sId: string) => { + const session = await redis.get(sId); + if (!session) return null; + return parseSession(session); +}; + +export const getSessions = async (username: string) => { + const sIds = await redis.smembers("session:" + username); + if (!sIds) return null; + const _sessions = await redis.mget(...sIds); + const sessions = []; + for (const session of _sessions) { + if (!session) continue; + sessions.push(parseSession(session)); + } +}; + +export const isSessionValid = async ( + sId: string, + ip: string, + userAgent: string, +) => { + const s = await getSession(sId); + if (!s) return false; + if (s.ip !== ip && s.userAgent === userAgent) return false; + if (s.userAgent !== userAgent && s.ip === ip) return false; + if (s.userAgent !== userAgent && s.ip !== ip) return false; + return true; +}; + +export const isAlreadyLoggedIn = async ( + username: string, + ip: string, + userAgent: string, +) => { + const sIds = await redis.smembers("session:" + username); + if (!sIds) return false; + for (const sId of sIds) { + if (await isSessionValid(sId, ip, userAgent)) return true; + } + return false; +}; + +export const deleteSession = async (sId: string) => { + const session = await getSession(sId); + if (!session) return false; + await redis.del(sId); + await redis.srem("session:" + session.username, sId); + return true; +}; + +export const deleteMatchingSessions = async ( + username: string, + ip: string, + userAgent: string, +) => { + const sIds = await redis.smembers("session:" + username); + if (!sIds) return false; + for (const sId of sIds) { + if (await isSessionValid(sId, ip, userAgent)) { + await deleteSession(sId); + } + } + return true; +}; + +export const deleteAllSessions = async (username: string) => { + const sIds = await redis.smembers("session:" + username); + if (!sIds) return false; + await redis.del(...sIds); + await redis.del("session:" + username); + return true; +}; + +const parseSession = (session: string) => { + const [ip, userAgent, username, userType, sId] = session.split("|"); + return { sId, ip, userAgent, username, userType } as Session; +}; diff --git a/src/lib/server/test.booking.helpers.ts b/src/lib/server/test.booking.helpers.ts new file mode 100755 index 0000000..e69de29 diff --git a/src/lib/server/utils/session.service.ts b/src/lib/server/utils/session.service.ts new file mode 100644 index 0000000..1c0f55c --- /dev/null +++ b/src/lib/server/utils/session.service.ts @@ -0,0 +1,63 @@ +import { pickRandomIP } from "$lib/utils"; +import { constants } from "$lib/utils/constants"; +import type { APISession } from "$lib/utils/data.types"; +import { redis } from "../connectors/redis"; +import { testIfSessionIsValid } from "../external/api.scraping.helpers"; + +export async function getSessionFromStore(sid: string) { + const out = await redis.get(sid); + if (out === null) { + return; + } + return JSON.parse(out) as APISession; +} + +export async function setSessionToRedis(sessionKey: string, userId: string) { + let key = constants.SCRAP_API_SESSION_KEY; + if (userId) { + key = `apisession:${userId}`; + } + console.log("Setting session to redis", key, sessionKey); + const session: APISession = { + ip: pickRandomIP(), + sessionToken: sessionKey, + userId, + }; + await redis.setex(key, 86400, JSON.stringify(session)); +} + +export async function isSessionValidInStore(userId?: string) { + let key = constants.SCRAP_API_SESSION_KEY; + if (userId) { + key = `apisession:${userId}`; + } + try { + const value = JSON.parse((await redis.get(key)) ?? "") as APISession | null; + if (value === null) { + return { valid: false }; + } + return await testIfSessionIsValid(value.sessionToken); + } catch (err) { + return false; + } +} + +export async function removeSessionFromStore(userId?: string) { + try { + let key = constants.SCRAP_API_SESSION_KEY; + if (userId) { + key = `apisession:${userId}`; + } + await redis.del(key); + } catch (err) {} +} + +export async function getAllSessions() { + const keys = await redis.keys("apisession:*"); + const sessions = []; + for (const key of keys) { + const value = JSON.parse((await redis.get(key)) ?? "{}") as APISession; + sessions.push({ key, value }); + } + return sessions; +} diff --git a/src/lib/stores/booking.state.ts b/src/lib/stores/booking.state.ts new file mode 100755 index 0000000..05958c3 --- /dev/null +++ b/src/lib/stores/booking.state.ts @@ -0,0 +1,75 @@ +import type { Draw, BookingEntry } from "$lib/utils/data.types"; +import { writable } from "svelte/store"; + +export type SyncState = { + data: BookingEntry[]; + isSyncing: boolean; + lastSynced: string; +}; + +export const syncState = writable({ + data: [], + isSyncing: false, + lastSynced: new Date().toLocaleString(), +}); + +export function setSyncState(state: SyncState) { + syncState.update((old) => { + return { ...old, ...state }; + }); + setSyncStateToLocalStorage(state); +} + +export function removeEntriesFromSyncState(ids: string[]) { + syncState.update((old) => { + return { + isSyncing: false, + lastSynced: new Date().toISOString(), + data: old.data.filter((entry) => !ids.includes(entry.id)), + }; + }); +} + +export function setSyncStateToLocalStorage(state: SyncState) { + window.localStorage.setItem("syncstate", JSON.stringify(state)); +} + +export function getSyncStateFromLocalStorage() { + const out = JSON.parse( + // @ts-ignore + window.localStorage.getItem("syncstate") || null + ) as SyncState | null; + return out; +} + +export const bookingPanelData = writable([]); + +export const selectedEntriesMap = writable({} as Record); + +export const bookingPanelState = writable({ + chosenDraw: {} as Draw, + chosenScheme: "", + isPermutationModeSelected: false, + keepRatesPostBookingSubmit: false, +}); + +type SetBookingPanelStatePayload = { + chosenDraw?: Draw; + chosenScheme?: string; + isPermutationModeSelected?: boolean; + keepRatesPostBookingSubmit?: boolean; +}; + +export const setBookingPanelState = (state: SetBookingPanelStatePayload) => { + bookingPanelState.update((older) => { + return { ...older, ...state }; + }); +}; + +export const resetSchemeStatus = () => { + bookingPanelState.update((state) => ({ + ...state, + chosenScheme: "", + isPermutationModeSelected: false, + })); +}; diff --git a/src/lib/trpc/client.ts b/src/lib/trpc/client.ts new file mode 100755 index 0000000..fc4395e --- /dev/null +++ b/src/lib/trpc/client.ts @@ -0,0 +1,12 @@ +import type { Router } from "$lib/trpc/router"; +import { createTRPCClient, type TRPCClientInit } from "trpc-sveltekit"; + +let browserClient: ReturnType>; + +export function trpc(init?: TRPCClientInit) { + const isBrowser = typeof window !== "undefined"; + if (isBrowser && browserClient) return browserClient; + const client = createTRPCClient({ init }); + if (isBrowser) browserClient = client; + return client; +} diff --git a/src/lib/trpc/context.ts b/src/lib/trpc/context.ts new file mode 100755 index 0000000..fbca428 --- /dev/null +++ b/src/lib/trpc/context.ts @@ -0,0 +1,17 @@ +import { getSession } from "$lib/server/session.helpers"; +import { constants } from "$lib/utils/constants"; +import type { RequestEvent } from "@sveltejs/kit"; +import type { inferAsyncReturnType } from "@trpc/server"; + +// we're not using the event parameter is this example, +// hence the eslint-disable rule +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export async function createContext(event: RequestEvent) { + return { + session: await getSession( + event.cookies.get(constants.SESSION_KEY_NAME) ?? "" + ), + }; +} + +export type Context = inferAsyncReturnType; diff --git a/src/lib/trpc/router.ts b/src/lib/trpc/router.ts new file mode 100755 index 0000000..360988d --- /dev/null +++ b/src/lib/trpc/router.ts @@ -0,0 +1,22 @@ +import { apiAuthRouter } from "./routers/apiauth.router"; +import { apiDataRouter } from "./routers/apidata.router"; +import { apiUserRouter } from "./routers/apiuser.router"; +import { bookingRouter } from "./routers/booking.router"; +import { drawRouter } from "./routers/draws.router"; +import { presetDataRouter } from "./routers/presetdata.router"; +import { postDataApiRouter } from "./routers/postdata.router"; +import { sessionRouter } from "./routers/session.router"; +import { createTRPCRouter } from "./t"; + +export const router = createTRPCRouter({ + session: sessionRouter, + apiAuth: apiAuthRouter, + apiData: apiDataRouter, + apiUser: apiUserRouter, + draw: drawRouter, + presetData: presetDataRouter, + postData: postDataApiRouter, + booking: bookingRouter, +}); + +export type Router = typeof router; diff --git a/src/lib/trpc/routers/apiauth.router.ts b/src/lib/trpc/routers/apiauth.router.ts new file mode 100755 index 0000000..3b35021 --- /dev/null +++ b/src/lib/trpc/routers/apiauth.router.ts @@ -0,0 +1,102 @@ +import { getSessionToken } from "$lib/server/external/api.scraping.helpers"; +import { TRPCError } from "@trpc/server"; +import { createTRPCRouter, protectedProcedure } from "../t"; +import { constants } from "$lib/utils/constants"; +import { getUUID } from "$lib/utils"; +import { z } from "zod"; +import { dbApiUser } from "$lib/server/db/apiuser.db"; +import type { ServerError } from "$lib/utils/data.types"; +import { + isSessionValidInStore, + removeSessionFromStore, + setSessionToRedis, +} from "$lib/server/utils/session.service"; + +export const apiAuthRouter = createTRPCRouter({ + getCaptcha: protectedProcedure.mutation(async () => { + try { + const uuid = getUUID(); + const res = await fetch( + `${constants.SCRAP_API_URL}/verify/image?uuid=${uuid}`, + { + headers: { + ...constants.SCRAP_API_BASE_HEADERS, + Accept: + "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", + }, + }, + ); + const bloob = await res.blob(); + const imageBuffer = Buffer.from(await bloob.arrayBuffer()); + const base64String = imageBuffer.toString("base64"); + return { id: uuid, image: base64String }; + } catch (err) { + console.log(err); + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "Error getting captcha image.", + }); + } + }), + + getNewSession: protectedProcedure + .input( + z.object({ + captchaId: z.string().min(1), + captchaAnswer: z.string().min(1), + userId: z.string().optional(), + }), + ) + .mutation(async ({ input }) => { + const { captchaId, captchaAnswer } = input; + let { userId, userType, password } = + await dbApiUser.getRandomDistributor(); + if (input.userId) { + let _user = await dbApiUser.getUserById(input.userId); + if (!_user) { + return { + success: false, + errors: [{ message: "User not found." }], + }; + } + userId = _user.userId; + userType = _user.userType; + password = _user.password; + } + const token = await getSessionToken({ + code: captchaAnswer, + verifyToken: captchaId, + userId: userId, + userType: userType, + password: password, + }); + console.log("[=] Token Response :: ", JSON.stringify(token, null, 2)); + if (!token.ok) { + return { + success: false, + errors: [{ message: token.message }], + }; + } + await setSessionToRedis(token.message, input.userId ?? ""); + return { success: true, errors: [] as ServerError }; + }), + + isApiSessionValid: protectedProcedure + .input( + z.object({ + checkingUserSession: z.boolean(), + userId: z.string().optional(), + }), + ) + .query(async ({ input }) => { + return { valid: await isSessionValidInStore(input.userId) }; + }), + + logoutUser: protectedProcedure + .input(z.object({ userId: z.string().optional() })) + .mutation(async ({ input }) => { + const { userId } = input; + await removeSessionFromStore(userId); + return { success: true, errors: [] as ServerError }; + }), +}); diff --git a/src/lib/trpc/routers/apidata.router.ts b/src/lib/trpc/routers/apidata.router.ts new file mode 100755 index 0000000..cc9a5f7 --- /dev/null +++ b/src/lib/trpc/routers/apidata.router.ts @@ -0,0 +1,187 @@ +import { redis } from "$lib/server/connectors/redis"; +import { dbApiData } from "$lib/server/db/apidata.db"; +import { dbDraw } from "$lib/server/db/apidraw.db"; +import { dbApiUser } from "$lib/server/db/apiuser.db"; +import { getData } from "$lib/server/external/api.scraping.helpers"; +import { getReducedFinalSheet } from "$lib/server/finalsheet.helpers"; +import { getDefaultTotals, getULID } from "$lib/utils"; +import { constants } from "$lib/utils/constants"; +import { + ApiUserTypes, + type APISession, + type ReducedFinalSheetData, + type ServerError, +} from "$lib/utils/data.types"; +import { z } from "zod"; +import { createTRPCRouter, protectedProcedure } from "../t"; + +const lastFetched = { + get: async () => { + const out = await redis.get(constants.LAST_FETCHED_KEY); + if (out === null) { + return "Not fetched yet"; + } + return out; + }, + set: async () => { + await redis.set(constants.LAST_FETCHED_KEY, new Date().toISOString()); + }, +}; + +export const apiDataRouter = createTRPCRouter({ + getDealersAndDraws: protectedProcedure.query(async () => { + const draws = await dbDraw.getAllDraws(true); + const dealers = await dbApiUser.allUsersOfType(ApiUserTypes.DEALER); + const lf = await lastFetched.get(); + return { users: dealers, draws, lastFetched: lf }; + }), + + refetchData: protectedProcedure + .input( + z.object({ + userIds: z.array(z.string()), + drawId: z.string(), + targetDate: z.string(), + }), + ) + .mutation(async ({ input }) => { + const { userIds, targetDate, drawId } = input; + if (userIds.length < 1) { + return { + detail: "No users selected", + success: false, + errors: [ + { message: "No users selected to refetch data for" }, + ] as ServerError, + }; + } + const sess = JSON.parse( + (await redis.get(constants.SCRAP_API_SESSION_KEY)) ?? "", + ) as APISession; + if (sess === null) { + return { + detail: "API Session expired", + success: false, + errors: [ + { + message: + "API Session expired, get a new api session and try again", + }, + ] as ServerError, + }; + } + const userIdsInt = userIds.map((x) => parseInt(x.split(":")[1])); + const out = await getData( + sess.sessionToken, + userIdsInt, + parseInt(drawId.split(":")[1]), + targetDate, + ); + if (!out.ok) { + return { + success: false, + detail: "Error fetching data", + errors: [{ message: out.message }] as ServerError, + }; + } + const dataCount = out.data.length; + await dbApiData.upsertData(out.data, targetDate); + return { + detail: `Scraped ${dataCount} entries for ${userIds.length} users`, + success: true, + errors: [] as ServerError, + }; + }), + + getDataByFilters: protectedProcedure + .input( + z.object({ date: z.string(), drawId: z.string(), userId: z.string() }), + ) + .mutation(async ({ input }) => { + const { date, drawId, userId } = input; + const data = await dbApiData.getBookingEntriesForDealer( + date, + drawId.split(":")[1], + userId.split(":")[1], + true, + ); + return { data }; + }), + + getReducedFinalSheet: protectedProcedure + .input(z.object({ date: z.string(), drawId: z.string() })) + .mutation(async ({ input }) => { + const { date, drawId } = input; + const draw = await dbDraw.getDraw(drawId); + const fsData = { + id: getULID(), + date, + drawId, + data: [], + totals: getDefaultTotals(), + } as ReducedFinalSheetData; + if (!draw) { + return { + ok: false, + detail: `Draw for the passed draw ID not found`, + data: fsData, + errors: [ + { message: `Draw for the passed draw ID not found` }, + ] as ServerError, + }; + } + console.log("Fetching data"); + const data = await getReducedFinalSheet(fsData); + console.log(data); + if (!data.ok) { + return { + ok: false, + detail: `Error compiling final sheet`, + data: fsData, + errors: data.errors, + }; + } + return { + ok: true, + detail: `Final sheet for ${date}, draw ${draw.title} has been compiled`, + data: fsData, + errors: [] as ServerError, + }; + }), + + getFinalSheetRow: protectedProcedure + .input( + z.object({ date: z.string(), drawId: z.string(), number: z.string() }), + ) + .mutation(async ({ input }) => { + return { + ok: true, + data: {}, + errors: [] as ServerError, + }; + }), + + delDataOlderThan2Weeks: protectedProcedure.mutation(async () => { + await dbApiData.deleteDataOlderThan2Weeks(); + return { ok: true, detail: "Data older than 2 weeks has been deleted" }; + }), + + postTestBooking: protectedProcedure + .input(z.object({ drawId: z.string(), date: z.string() })) + .mutation(async () => { + return { + ok: true, + detail: "API not live", + errors: [] as ServerError, + }; + // console.log("GENERATING TEST DATA :: ", drawId, date); + // const testData = await getTestBookingData(drawId, date); + // // console.log(testData); + // await dbApiData.upsertData(testData, date); + // return { + // ok: true, + // detail: "Test booking committed", + // errors: [] as ServerError, + // }; + }), +}); diff --git a/src/lib/trpc/routers/apiuser.router.ts b/src/lib/trpc/routers/apiuser.router.ts new file mode 100644 index 0000000..a6622ab --- /dev/null +++ b/src/lib/trpc/routers/apiuser.router.ts @@ -0,0 +1,37 @@ +import { createTRPCRouter, protectedProcedure } from "../t"; +import { ApiUserTypes, zApiPostUser } from "$lib/utils/data.types"; +import { dbApiUser } from "$lib/server/db/apiuser.db"; +import { z } from "zod"; + +export const apiUserRouter = createTRPCRouter({ + getAllDistributors: protectedProcedure.query(async () => { + return await dbApiUser.allUsersOfType(ApiUserTypes.DISTRIBUTOR); + }), + getAllDealers: protectedProcedure.query(async () => { + return await dbApiUser.allUsersOfType(ApiUserTypes.DEALER); + }), + getAllDistributorsCount: protectedProcedure.query(async () => { + return await dbApiUser.getUserTypeCount(ApiUserTypes.DISTRIBUTOR); + }), + getAllDealersCount: protectedProcedure.query(async () => { + return await dbApiUser.getUserTypeCount(ApiUserTypes.DEALER); + }), + getDistributorsWithTheirChildren: protectedProcedure.query(async () => { + const users = await dbApiUser.getAllDistributorsWithTheirChildren(); + return { users }; + }), + + getAllDealersPostUserFormat: protectedProcedure.query(async () => { + return await dbApiUser.allUsersOfTypeLimitedInfo(ApiUserTypes.DEALER); + }), + + getAllPostUsers: protectedProcedure.query(async () => { + return await dbApiUser.getAllPostUsers(); + }), + + setPostDataFlagForUser: protectedProcedure + .input(z.object({ users: z.array(zApiPostUser) })) + .mutation(async ({ input }) => { + await dbApiUser.setPostDataFlagForUsers(input.users); + }), +}); diff --git a/src/lib/trpc/routers/booking.router.ts b/src/lib/trpc/routers/booking.router.ts new file mode 100755 index 0000000..f4844e7 --- /dev/null +++ b/src/lib/trpc/routers/booking.router.ts @@ -0,0 +1,72 @@ +import { z } from "zod"; +import { createTRPCRouter, protectedProcedure } from "../t"; +import { dbDraw } from "$lib/server/db/apidraw.db"; +import { DEFAULT_TZ } from "$lib/utils/constants"; +import { + zBookingEntry, + type BookingEntry, + type ServerError, +} from "$lib/utils/data.types"; +import { surreal } from "$lib/server/connectors/surreal.db"; +import { parseToDateString } from "$lib/utils/datetime.helper.utils"; + +function getTodaysTableName() { + const today = parseToDateString(new Date()); + return `booking${today.replaceAll("-", "")}`; +} + +export const bookingRouter = createTRPCRouter({ + getPanelData: protectedProcedure.query(async () => { + const draws = await dbDraw.getAllDraws(true); + const timeInDrawsTz = new Date().toLocaleString("en-US", { + timeZone: DEFAULT_TZ, + }); + return { draws, timeInDrawsTz: timeInDrawsTz }; + }), + + getBookingData: protectedProcedure + .input(z.object({ drawId: z.string() })) + .mutation(async ({ input }) => { + const { drawId } = input; + const date = parseToDateString(new Date()); + const tn = getTodaysTableName(); + const did = parseInt(drawId.split(":")[1]); + const [out] = await surreal.query<[BookingEntry[]]>( + `select * from type::table($table) where drawId = $drawId and bookDate = $bookDate order by requestId desc`, + { table: tn, drawId: did, bookDate: date } + ); + return { data: out.result ?? [], errors: [] as ServerError }; + }), + + syncBooking: protectedProcedure + .input(z.object({ data: z.array(zBookingEntry) })) + .mutation(async ({ input }) => { + const tableName = getTodaysTableName(); + const syncedEntriesIds = [] as string[]; + if (input.data.length > 0) { + await surreal.insert( + tableName, + input.data.map((e) => { + syncedEntriesIds.push(`${e.id}`); + return { + ...e, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + }; + }) + ); + } + return { detail: "Add Booking api donezo", syncedEntriesIds }; + }), + + deleteBooking: protectedProcedure + .input(z.object({ bookingIds: z.array(z.string()) })) + .mutation(async ({ input }) => { + await Promise.all( + input.bookingIds.map(async (id) => { + await surreal.delete(id); + }) + ); + return { detail: `Deleted ${input.bookingIds.length} Entries` }; + }), +}); diff --git a/src/lib/trpc/routers/draws.router.ts b/src/lib/trpc/routers/draws.router.ts new file mode 100755 index 0000000..f52d8e4 --- /dev/null +++ b/src/lib/trpc/routers/draws.router.ts @@ -0,0 +1,30 @@ +import { createTRPCRouter, protectedProcedure } from "../t"; +import { dbDraw } from "$lib/server/db/apidraw.db"; +import { z } from "zod"; +import { zDraw } from "$lib/utils/data.types"; + +export const drawRouter = createTRPCRouter({ + getAllDraws: protectedProcedure.query(async () => { + return await dbDraw.getAllDraws(true); + }), + + getCurrentTime: protectedProcedure.query(async () => { + const now = new Date(); + const timezone = "Asia/Karachi"; + const nowKarachi = new Date( + now.toLocaleString("en-US", { timeZone: timezone }), + ); + console.log(nowKarachi.toLocaleString()); + return { now: nowKarachi }; + }), + + savePresetInfoForDraws: protectedProcedure + .input(z.object({ draws: z.array(zDraw) })) + .mutation(async ({ input }) => { + console.log("savePresetInfoForDraws", input); + for (const draw of input.draws) { + await dbDraw.updateDrawPresetInfo(draw); + } + return { success: true }; + }), +}); diff --git a/src/lib/trpc/routers/postdata.router.ts b/src/lib/trpc/routers/postdata.router.ts new file mode 100644 index 0000000..eedc9fd --- /dev/null +++ b/src/lib/trpc/routers/postdata.router.ts @@ -0,0 +1,212 @@ +import { dbApiPostData } from "$lib/server/db/apipostdata.db"; +import { dbApiUser } from "$lib/server/db/apiuser.db"; +import { postDataToApi } from "$lib/server/postdata/post.handler"; +import { getAllSessions } from "$lib/server/utils/session.service"; +import { getULID } from "$lib/utils"; +import { + type APISession, + type ServerError, + zPostDataEntry, + zPostDataFilters, + zPostDataHistoryFilters, +} from "$lib/utils/data.types"; +import { createTRPCRouter, protectedProcedure } from "../t"; +import { z } from "zod"; +import { + fetchDataForPosting, + fetchPostDataHistory, + updateBalanceOfPostUsers, +} from "$lib/server/postdata/postdata.gen.controller"; +import { redis } from "$lib/server/connectors/redis"; +import { constants } from "$lib/utils/constants"; + +async function hasPostSession() { + const out = await redis.get(constants.POST_SESSION_KEY); + if (out === null) { + await redis.set(constants.POST_SESSION_KEY, "1"); + return false; + } + return out === "1"; +} + +async function removePostSession() { + await redis.del(constants.POST_SESSION_KEY); +} + +export const postDataApiRouter = createTRPCRouter({ + fetchPostDataHistory: protectedProcedure + .input(zPostDataHistoryFilters) + .mutation(async ({ input }) => { + return await fetchPostDataHistory(input); + }), + + hasPosted: protectedProcedure + .input(zPostDataHistoryFilters) + .query(async ({ input }) => { + return { + hasPosted: await dbApiPostData.doesPostHistoryDataExist( + input.date, + input.draw?.id ?? "", + ), + }; + }), + + getPostDataForPreview: protectedProcedure + .input(zPostDataFilters) + .query(async ({ input }) => { + const date = input.date; + if (!input.draw) { + return { + ok: false, + detail: "Draw is required", + data: [], + errors: undefined, + }; + } + + console.log("[+] Fetching the users with updated balances"); + const balOut = await updateBalanceOfPostUsers( + await dbApiUser.getAllPostUsersWithParentUsers(), + ); + if (!balOut.ok || !balOut.data) { + return { ok: false, detail: balOut.detail, data: [], users: [] }; + } + const users = balOut.data; + console.log(`[=] ${users.length} users found`); + console.log(users); + + const result = await fetchDataForPosting(date, input, users); + console.log("result.data.length = ", result.data.length); + return result; + }), + + post: protectedProcedure + .input( + z.object({ + yes: zPostDataFilters, + data: z.array(zPostDataEntry), + }), + ) + .mutation(async ({ input }) => { + if (await hasPostSession()) { + return { + ok: false, + detail: + "Already posting data, please wait for the current session to finish", + errors: [ + { + message: + "Already posting data, please wait for the current session to finish", + }, + ] as ServerError, + }; + } + const date = input.yes.date; + const draw = input.yes.draw; + if (!draw) { + await removePostSession(); + return { + ok: false, + detail: "Draw is required", + errors: [{ message: "Draw is required" }] as ServerError, + }; + } + const drawId = draw.id; + + console.log("[+] Fetching the users"); + const users = await dbApiUser.getAllPostUsersWithParentUsers(); + console.log(users); + const balOut = await updateBalanceOfPostUsers(users); + if (!balOut.ok || !balOut.data) { + await removePostSession(); + return { ok: false, detail: balOut.detail, data: [], users: [] }; + } + console.log(`[=] ${users} users found`); + console.log(users); + + console.log("[+] Preparing the sessions for posting"); + const sessions = await getAllSessions(); + const userSessions = {} as Record; + for (const each of sessions) { + const targetUser = users.find( + (u) => each.key.includes(u.id) || each.value.userId === u.userId, + ); + if (!targetUser) continue; + userSessions[targetUser?.userId ?? ""] = each.value; + } + + if (Object.keys(userSessions).length !== users.length) { + await removePostSession(); + return { + ok: false, + detail: `Some users don't have a session to post data with`, + errors: [ + { message: "Some users don't have a session to post data with" }, + ], + }; + } + + console.log(userSessions, sessions); + + let data = input.data; + if (input.data.length < 1) { + console.log("No data found from preview, generating a list"); + const _out = await fetchDataForPosting(date, input.yes, balOut.data); + if (!_out.ok) { + await removePostSession(); + return _out; + } + data = _out.data; + } + + if (data.length < 1) { + await removePostSession(); + return { + ok: false, + detail: "No data found to post for the selected date and draw", + errors: [ + { message: "No data found to post for the selected date and draw" }, + ], + }; + } + + console.log(`[+] Posting ${input.data.length} entries to the API`); + + console.time("Time taken to post data to the API"); + const res = await postDataToApi({ + sessions: userSessions, + data, + users: users, + draw: draw, + }); + console.timeEnd("Time taken to post data to the API"); + + if (!res.ok) { + await removePostSession(); + return { ok: false, detail: res.detail }; + } + + console.log(`[+] Data posted to the API successfully`); + + await dbApiPostData.upsertData({ + id: getULID(), + drawId: +drawId.split(":")[1], + bookDate: date, + data, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + }); + + // Update the balance of the users after posting to the API + await updateBalanceOfPostUsers(users); + + console.log("[+] Data saved to the database"); + + await removePostSession(); + return { + ok: true, + detail: "Data successfully posted to API", + errors: undefined, + }; + }), +}); diff --git a/src/lib/trpc/routers/presetdata.router.ts b/src/lib/trpc/routers/presetdata.router.ts new file mode 100644 index 0000000..fedc871 --- /dev/null +++ b/src/lib/trpc/routers/presetdata.router.ts @@ -0,0 +1,35 @@ +import { dbPresetData } from "$lib/server/db/presetdata.db"; +import { zDDFilters, zPresetDataEntry } from "$lib/utils/data.types"; +import { z } from "zod"; +import { createTRPCRouter, protectedProcedure } from "../t"; + +export const presetDataRouter = createTRPCRouter({ + getAll: protectedProcedure.input(zDDFilters).mutation(async ({ input }) => { + const { draw, date } = input; + if (!draw) { + return { ok: false, detail: "Draw is required to fetch data", data: [] }; + } + return { + data: await dbPresetData.getDataByDraw(date, +draw.id.split(":")[1]), + ok: true, + detail: "Data found", + }; + }), + + insert: protectedProcedure + .input(z.array(zPresetDataEntry)) + .mutation(async ({ input }) => { + return { + ok: true, + detail: "Data inserted", + data: await dbPresetData.insertData(input), + }; + }), + + delete: protectedProcedure + .input(z.object({ date: z.string(), ids: z.array(z.string()) })) + .mutation(async ({ input }) => { + await dbPresetData.deleteDataByIds(input.date, input.ids); + return { ok: true, detail: "Data deleted" }; + }), +}); diff --git a/src/lib/trpc/routers/session.router.ts b/src/lib/trpc/routers/session.router.ts new file mode 100755 index 0000000..7825148 --- /dev/null +++ b/src/lib/trpc/routers/session.router.ts @@ -0,0 +1,13 @@ +import type { SessionData } from "$lib/utils/data.types"; +import { createTRPCRouter, protectedProcedure } from "../t"; + +export const sessionRouter = createTRPCRouter({ + getSession: protectedProcedure.query(async ({ ctx }) => { + return { + user: { + username: ctx.session.username, + userType: ctx.session.userType, + } as SessionData + } + }), +}); diff --git a/src/lib/trpc/t.ts b/src/lib/trpc/t.ts new file mode 100755 index 0000000..05bed68 --- /dev/null +++ b/src/lib/trpc/t.ts @@ -0,0 +1,29 @@ +import type { Context } from "$lib/trpc/context"; +import { TRPCError, initTRPC } from "@trpc/server"; +import { ZodError } from "zod"; + +export const t = initTRPC.context().create({ + errorFormatter({ shape, error }) { + return { + ...shape, + data: { + ...shape.data, + zodError: + error.cause instanceof ZodError ? error.cause.flatten() : null, + }, + }; + }, +}); + +export const createTRPCRouter = t.router; + +export const publicProcedure = t.procedure; + +const enforceUserIsAuthed = t.middleware(({ ctx, next }) => { + if (!ctx.session || !ctx.session.username) { + throw new TRPCError({ code: "UNAUTHORIZED" }); + } + return next({ ctx: { session: { ...ctx.session } } }); +}); + +export const protectedProcedure = t.procedure.use(enforceUserIsAuthed); diff --git a/src/lib/trpc/trpc.ts b/src/lib/trpc/trpc.ts new file mode 100755 index 0000000..a256880 --- /dev/null +++ b/src/lib/trpc/trpc.ts @@ -0,0 +1,19 @@ +// src/lib/trpc.ts +import type { Router } from "./router"; +import { createTRPCProxyClient, httpBatchLink } from "@trpc/client"; + +import type { QueryClient } from "@tanstack/svelte-query"; +import { svelteQueryWrapper } from "trpc-svelte-query-adapter"; + +const client = createTRPCProxyClient({ + links: [httpBatchLink({ url: "/trpc" })], +}); + +export function trpc(queryClient?: QueryClient) { + return svelteQueryWrapper({ + client, + queryClient, + }); +} + +export type TRPC = ReturnType; diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100755 index 0000000..2623cf6 --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,188 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; +import { cubicOut } from "svelte/easing"; +import type { TransitionConfig } from "svelte/transition"; +import type { Draw, ServerError } from "./utils/data.types"; +import { rng } from "./utils/rng"; +import { ulid } from "ulid"; +import { v4 } from "uuid"; +import { parseISO } from "date-fns"; +import { PROXIES } from "./utils/constants"; + +export function hasDrawBeenClosed( + date: string, + draw: Draw | undefined, + now: Date = new Date(), +) { + let hasTimePassed = false; + + const chosenDate = new Date(parseISO(date)); + const today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); + + let _ct = draw?.closeTime?.split(" ")[1] ?? ""; + const closeTime = new Date(parseISO(`${date}T${_ct}`)); + + if (today > chosenDate || now > closeTime) { + hasTimePassed = true; + } else { + hasTimePassed = false; + } + + console.log("==============="); + console.log(now); + console.log(closeTime); + console.log(`Has time passed : ${hasTimePassed}`); + + return hasTimePassed; +} + +export const parseToErrorList = (errors: ServerError | Array) => { + if (Array.isArray(errors)) { + return errors; + } + return [errors]; +}; + +export const parseToSelectList = ( + arr: string[], +): { label: string; value: string; id: number }[] => { + return arr.map((item, index) => { + return { label: item, value: item, id: index }; + }); +}; + +export const randomString = (length: number) => { + const chars = + "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + let result = ""; + for (let i = length; i > 0; --i) result += chars[rng(0, chars.length - 1)]; + return result; +}; + +export function pickRandomIP() { + return PROXIES[rng(0, PROXIES.length - 1)]; +} + +export const getUUID = () => { + return v4(); +}; + +export const getULID = () => { + return ulid(); +}; + +function getRandomVersion() { + const majorVersion = rng(1, 10); + const minorVersion = rng(0, 10); + const patchVersion = rng(0, 10); + return `${majorVersion}.${minorVersion}.${patchVersion}`; +} + +export const getRandomUserAgent = () => { + const browsers = ["Chrome", "Firefox", "Safari", "Opera", "Edge"]; + const operatingSystems = [ + "Windows NT 10.0", + "Windows NT 6.3", + "Macintosh; Intel Mac OS X 10_15_6", + "Macintosh; Intel Mac OS X 10_14_6", + "X11; Ubuntu; Linux x86_64", + "X11; Fedora; Linux x86_64", + "X11; Linux x86_64", + "Android 10", + "Android 9", + "Android 8.1", + "Android 8.0", + "iPhone; CPU iPhone OS 14_0 like Mac OS X", + "iPhone; CPU iPhone OS 13_7 like Mac OS X", + "iPhone; CPU iPhone OS 12_4_8 like Mac OS X", + ]; + const randomBrowser = browsers[Math.floor(Math.random() * browsers.length)]; + const randomOS = + operatingSystems[Math.floor(Math.random() * operatingSystems.length)]; + const userAgent = `${randomBrowser}/${getRandomVersion()} (${randomOS})`; + return userAgent; +}; + +export const sleep = (ms: number) => { + return new Promise((resolve) => setTimeout(resolve, ms)); +}; + +export const getParsedObject = (data: any) => { + const yeye: Record = {}; + for (const each of data.data.data) { + const un = each.user.userName; + if (!Object.keys(yeye).includes(un)) { + yeye[each.user.userName] = []; + } + yeye[each.user.userName].push(each.book); + } + return yeye; +}; + +export const getDefaultTotals = () => { + return { + commission: { first: 0, second: 0 }, + netRate: { first: 0, second: 0 }, + rate: { first: 0, second: 0 }, + prize: { first: 0, second: 0 }, + frequency: { first: 0, second: 0 }, + }; +}; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + +type FlyAndScaleParams = { + y?: number; + x?: number; + start?: number; + duration?: number; +}; + +export const flyAndScale = ( + node: Element, + params: FlyAndScaleParams = { y: -8, x: 0, start: 0.95, duration: 150 }, +): TransitionConfig => { + const style = getComputedStyle(node); + const transform = style.transform === "none" ? "" : style.transform; + + const scaleConversion = ( + valueA: number, + scaleA: [number, number], + scaleB: [number, number], + ) => { + const [minA, maxA] = scaleA; + const [minB, maxB] = scaleB; + + const percentage = (valueA - minA) / (maxA - minA); + const valueB = percentage * (maxB - minB) + minB; + + return valueB; + }; + + const styleToString = ( + style: Record, + ): string => { + return Object.keys(style).reduce((str, key) => { + if (style[key] === undefined) return str; + return str + `${key}:${style[key]};`; + }, ""); + }; + + return { + duration: params.duration ?? 200, + delay: 0, + css: (t) => { + const y = scaleConversion(t, [0, 1], [params.y ?? 5, 0]); + const x = scaleConversion(t, [0, 1], [params.x ?? 0, 0]); + const scale = scaleConversion(t, [0, 1], [params.start ?? 0.95, 1]); + + return styleToString({ + transform: `${transform} translate3d(${x}px, ${y}px, 0) scale(${scale})`, + opacity: t, + }); + }, + easing: cubicOut, + }; +}; diff --git a/src/lib/utils/booking/booking-field-controller.ts b/src/lib/utils/booking/booking-field-controller.ts new file mode 100755 index 0000000..e69de29 diff --git a/src/lib/utils/booking/booking.sync.ts b/src/lib/utils/booking/booking.sync.ts new file mode 100755 index 0000000..c126fc5 --- /dev/null +++ b/src/lib/utils/booking/booking.sync.ts @@ -0,0 +1,105 @@ +import type { + BookingEntry, + BookingInputValues, + ServerError, +} from "../data.types"; +import { getAllMatchingChildNumbersObject } from "../finalsheet.utils"; +import { permutations } from "../permutations"; +import { getULID } from ".."; +import { parseToDateString } from "../datetime.helper.utils"; + +export function getParsedBookingEntries( + values: BookingInputValues, + chosenLexiCodes: string[], + isPossibleCombinationMode: boolean, + drawId: number +) { + const MAX_NO_LEN = 4; + const inputNumbers = values.number.split("."); + const out = [] as BookingEntry[]; + const today = new Date(); + // INFO: these 2 IDs would be modified during the algorithm run anyways, so this is okay + const commonInfo = { + distributorId: 0, + dealerId: 0, + drawId, + changedBalance: 0, + bookDate: parseToDateString(today), + }; + if (chosenLexiCodes.length > 0) { + for (const number of inputNumbers) { + let __numbers = new Set(); + __numbers.add(number); + if (isPossibleCombinationMode) { + __numbers = findAllNumberPossibleCombinations(number, MAX_NO_LEN); + } + for (const each of __numbers) { + const children = getAllMatchingChildNumbersObject(each); + for (const lc of chosenLexiCodes) { + const no = children[lc as keyof typeof children]; + const id = getULID(); + out.push({ + id, + number: no, + first: parseInt(values.first[lc]), + second: parseInt(values.second[lc]), + requestId: id, + ...commonInfo, + }); + } + } + } + } else { + for (const number of inputNumbers) { + const id = getULID(); + out.push({ + id, + number, + first: parseInt(values.default.first), + second: parseInt(values.default.second), + requestId: id, + ...commonInfo, + }); + } + } + return out; +} + +function findAllNumberPossibleCombinations(nombor: string, maxLength: number) { + const out = new Set(); + for (const each_perm of permutations(nombor.split(""), maxLength)) { + out.add(each_perm.join("")); + } + return out; +} + +export function ensureInputIsValid( + values: BookingInputValues, + chosenLexiCodes: string[] +) { + const errors = [] as ServerError; + const rates = [ + ...Object.values(values.default), + ...Object.values(values.first), + ...Object.values(values.second), + ]; + for (const each of rates) { + if (each.length < 1) { + continue; + } + if (parseInt(each) % 5 !== 0) { + errors.push({ message: `${each} rate must be a multiple of 5` }); + } + } + for (const lexiCode of chosenLexiCodes) { + const lexiCodeMinLen = lexiCode.replaceAll("+", "").length; + for (const number of values.number.split(".")) { + if (number.length < lexiCodeMinLen) { + errors.push({ + message: `${number} must be at least ${lexiCodeMinLen} digits to book ${lexiCode}`, + }); + } + } + } + return errors; +} diff --git a/src/lib/utils/booking/data.entry.helpers.ts b/src/lib/utils/booking/data.entry.helpers.ts new file mode 100755 index 0000000..a8e4fb0 --- /dev/null +++ b/src/lib/utils/booking/data.entry.helpers.ts @@ -0,0 +1,35 @@ +export const parseNumberInput = ( + input: string, + maxlen: number, + isPermutationMode: boolean +): string => { + let _s = input.replaceAll("x", "+").replace(/[^0-9\.\+]/, ""); + if (isPermutationMode) { + _s = _s.replaceAll("+", ""); + } + const splits = _s.split("."); + let out = ""; + for (let i = 0; i < splits.length; i++) { + const part = splits[i]; + out += part.substring(0, maxlen) + "."; + } + return out.replace(/\.{2,}/g, ".").substring(0, out.length - 1); +}; + +export const parseRate = (rate: string): string => { + if (rate === "") { + return ""; + } + const max = 10_000; + const r = parseFloat(rate.replace(/[^015]/, "")); + if (isNaN(r)) { + return ""; + } + if (r > max) { + return max.toString(); + } + if (r % 5 !== 0 && r !== 1) { + return (r - (r % 5)).toString(); + } + return r.toString(); +}; diff --git a/src/lib/utils/constants.ts b/src/lib/utils/constants.ts new file mode 100755 index 0000000..489c250 --- /dev/null +++ b/src/lib/utils/constants.ts @@ -0,0 +1,213 @@ +export const constants = { + SESSION_KEY_NAME: "SID", + SESSION_EXPIRE_TIME_MS: 6 * 60 * 60 * 1000, + POST_SESSION_KEY: "postsession", + LAST_FETCHED_KEY: "LAST_FETCHED", + SCRAP_API_URL: "https://ritmuglobal.com:8443/lottery", + SCRAP_API_SESSION_KEY: "SRAJWT", + SCRAP_API_BASE_HEADERS: { + Host: "ritmuglobal.com:8443", + "Sec-Ch-Ua": '"Not/A)Brand";v="8", "Chromium";v="126"', + "Sec-Ch-Ua-Mobile": "?0", + "Sec-Ch-Ua-Platform": '"Windows"', + "Sec-Fetch-Site": "cross-site", + "Sec-Fetch-Mode": "no-cors", + "Sec-Fetch-Dest": "image", + "Accept-Encoding": "gzip, deflate", + "Accept-Language": "en-US,en;q=0.9", + "Access-Control-Allow-Origin": "*", + Accept: "application/json, text/plain, */*", + Origin: "https://www.ritmuglobal.com", + Referer: "https://www.ritmuglobal.com/", + Priority: "u=1, i", + }, +}; + +const baseIp = "45.137.23.193"; +const proxyUsername = "f8n2yeqrjhcy"; +const proxyPassword = "2f309nqecdyjhgykubvcnhe"; + +export const PROXIES = [ + `${proxyUsername}:${proxyPassword}@${baseIp}:11420`, + `${proxyUsername}:${proxyPassword}@${baseIp}:11421`, + `${proxyUsername}:${proxyPassword}@${baseIp}:11422`, +]; + +export const LS_SYNCSTATE_KEY = "syncstate"; + +export const COLOR_TRANSITION = "transition-colors duration-100 ease-in-out"; + +export const DEFAULT_TZ = "Asia/Karachi"; + +// 20% commission +export const COMMISSION_PERCENTAGE = 0.2; + +export const NUMBERS_IN_FIRST_DRAW = 1; +export const NUMBERS_IN_SECOND_DRAW = 3; + +export const LEXICODES = [ + "a", + "+a", + "++a", + "+++a", + "ab", + "+ab", + "a+b", + "+a+b", + "++ab", + "a++b", + "abc", + "+abc", + "a+bc", + "ab+c", + "abcd", +]; + +export const LEXICODES_SORTED_FOR_INPUT = [ + "+++a", + "++a", + "+a", + "a", + "a++b", + "+a+b", + "++ab", + "a+b", + "+ab", + "ab", + "ab+c", + "a+bc", + "+abc", + "abc", + "abcd", +].reverse(); + +export const MAX_RATES = { + "1": 10_000, + "2": 5000, + "3": 2000, + "4": 1000, +}; + +export const LEXICODE_PRIZE_PERCENTAGES = { + first: { + a: 80, + "+a": 80, + "++a": 80, + "+++a": 80, + ab: 80, + "+ab": 80, + "a+b": 80, + "++ab": 80, + "+a+b": 80, + "a++b": 80, + abc: 80, + "+abc": 80, + "a+bc": 80, + "ab+c": 80, + abcd: 60, + }, + second: { + a: 26.66, + "+a": 26.66, + "++a": 26.66, + "+++a": 26.66, + ab: 26.66, + "+ab": 26.66, + "a+b": 26.66, + "++ab": 26.66, + "+a+b": 26.66, + "a++b": 26.66, + abc: 26.66, + "+abc": 26.66, + "a+bc": 26.66, + "ab+c": 26.66, + abcd: 20, + }, +} as const; + +export const LEXICODE_MATHCER_PATTERNS = { + a: /^\d{1}((\+|x){0}|(\+|x){1,3}?)$/, + "+a": /^(\+|x)\d{1}((\+|x){0}|(\+|x){1,2}?)$/, + "++a": /^(\+|x){2}\d{1}(\+|x)?$/, + "+++a": /^(\+|x){3}\d{1}$/, + ab: /^\d{2}((\+|x){0}|(\+|x){1,2}?)$/, + "+ab": /^(\+|x)\d{2}((\+|x){0}|(\+|x){1}?)?$/, + "a+b": /^\d{1}(\+|x){1}\d{1}((\+|x){0}|(\+|x){1}?)?$/, + "++ab": /^(\+|x){2}\d{2}$/, + "+a+b": /^(\+|x){1}\d{1}(\+|x){1}\d{1}$/, + "a++b": /^\d{1}(\+|x){2}\d{1}$/, + abc: /^\d{3}(\+|x)?$/, + "+abc": /^(\+|x){1}\d{3}$/, + "a+bc": /^\d{1}(\+|x){1}\d{2}$/, + "ab+c": /^\d{2}(\+|x){1}\d{1}$/, + abcd: /^\d{4}$/, +} as const; + +export const SCHEMES = { + normal: { + "1 digit": [ + "a.+a", + "a.++a", + "a.+++a", + "+a.++a", + "+a.+++a", + "++a.+++a", + "a.+a.++a.+++a", + ], + "2 digit": ["ab.+ab", "ab.++ab", "+ab.++ab", "ab.+ab.++ab"], + "3 digit": [ + "abc.ab", + "abc.++ab", + "abc.+abc", + "abc.+ab.++ab", + "abc.+abc.ab.++ab", + ], + "4 digit": [ + "abcd.ab", + "abcd.+ab", + "abcd.++ab", + "abcd.ab.+ab", + "abcd.ab.++ab", + "abcd.+ab.++ab", + "abcd.abc", + "abcd.+abc", + "abcd.abc.ab", + "abcd.abc.+ab", + "abcd.+abc.ab", + "abcd.+abc.+ab", + "abcd.abc.+abc.ab.+ab.++ab", + ], + }, + permutations: { + default: [ + "ab", + "+ab", + "++ab", + "a+b", + "+a+b", + "a++b", + "abc", + "+abc", + "a+bc", + "ab+c", + "abcd", + ], + "2 digit": ["ab.+ab", "ab.++ab", "+ab.++ab", "ab.+ab.++ab"], + "3 digit": ["abc.ab", "abc.++ab", "abc.+abc", "abc.+abc.ab.++ab"], + "4 digit": [ + "abcd.ab", + "abcd.+ab", + "abcd.++ab", + "abcd.ab.+ab", + "abcd.+ab.++ab", + "abcd.ab.+ab.++ab", + "abcd.abc", + "abcd.+abc", + "abcd.abc.ab", + "abcd.abc.+ab", + "abcd.+abc.ab", + "abcd.+abc.+ab", + "abcd.abc.+abc.ab.+ab.++ab", + ], + }, +}; diff --git a/src/lib/utils/data.types.ts b/src/lib/utils/data.types.ts new file mode 100755 index 0000000..ba6886f --- /dev/null +++ b/src/lib/utils/data.types.ts @@ -0,0 +1,382 @@ +import { z } from "zod"; + +export type Session = { + sId: string; + ip: string; + userAgent: string; + username: string; + userType: string; +}; + +export type APISession = { + ip: string; + sessionToken: string; + userId: string; +}; + +export const zAuthPayload = z.object({ + username: z.string().min(4).max(64), + password: z.string().min(8).max(64), +}); + +export const zUser = z.object({ + id: z.string().length(16), + createdAt: z.string(), + updatedAt: z.string(), + username: z.string().min(4).max(64), + password: z.string().min(8).max(64), + userType: z.string().min(4).max(5), + association: z.string(), +}); + +export const zLooseUser = z.object({ + id: z.string().length(16).optional(), + createdAt: z.string().optional(), + updatedAt: z.string().optional(), + username: z.string().min(4).max(64), + password: z.string().min(8).max(64), + userType: z.string().min(4).max(5), + association: z.string(), +}); + +export const zApiUser = z.object({ + id: z.string().length(16), + userType: z.number(), + disableBooking: z.string().nullable().optional(), + sendVoucher: z.string().nullable().optional(), + voucherGenerated: z.string().nullable().optional(), + parentAdmin: z.number(), + parentDistributor: z.number(), + userName: z.string(), + userCity: z.string().nullable().optional(), + userId: z.string(), + password: z.string(), + accessDenied: z.number(), + phoneNumber: z.string(), + emailAddress: z.string(), + disable: z.number(), + commission: z.number(), + commissionPangora: z.number(), + allowTitles: z.string(), + specialDealer: z.number(), + allowBalance: z.number(), + balance: z.number(), + profitlossShare: z.number(), + shareProfitonly: z.number(), + allowRemoveold: z.number(), + removeDays: z.number().nullable().optional(), + language: z.number(), + postData: z.boolean().nullable().optional(), + createdAt: z.string().nullable(), + updatedAt: z.string().nullable(), +}); + +export const zApiPostUser = z.object({ + id: z.string(), + userName: z.string(), + userId: z.string(), + postData: z.boolean(), + balance: z.number().optional(), +}); + +export const zLooseApiUser = z.object({ + id: z.string().length(16).optional(), + userType: z.number().optional(), + disableBooking: z.string().nullable().optional(), + sendVoucher: z.string().nullable().optional(), + voucherGenerated: z.string().nullable().optional(), + parentAdmin: z.number(), + parentDistributor: z.number(), + userName: z.string(), + userCity: z.string().nullable().optional(), + userId: z.string().optional(), + password: z.string(), + accessDenied: z.number(), + phoneNumber: z.string(), + emailAddress: z.string(), + disable: z.number(), + commission: z.number(), + commissionPangora: z.number(), + allowTitles: z.string(), + specialDealer: z.number(), + allowBalance: z.number(), + balance: z.number(), + profitlossShare: z.number(), + shareProfitonly: z.number(), + allowRemoveold: z.number(), + removeDays: z.number().nullable().optional(), + language: z.number().optional(), + postData: z.boolean().nullable().optional(), + createdAt: z.string().nullable().optional(), + updatedAt: z.string().nullable().optional(), +}); + +export const zDraw = z.object({ + id: z.string(), + title: z.string(), + closeTime: z.string(), + filterDuplicatesWhilePosting: z.boolean(), + drawType: z.number(), + adminId: z.number(), + abRateF: z.coerce.number(), + abRateS: z.coerce.number(), + abcRateF: z.coerce.number(), + abcRateS: z.coerce.number(), + createdAt: z.string().nullable().optional(), + updatedAt: z.string().nullable().optional(), +}); + +export type Draw = z.infer; + +export const zBookingEntry = z.object({ + id: z.string(), + distributorId: z.number(), + dealerId: z.number(), + drawId: z.number(), + bookDate: z.string(), + number: z.string(), + first: z.number(), + second: z.number(), + changedBalance: z.number(), + sheetName: z.string().nullable().optional(), + sheetId: z.string().nullable().optional(), + requestId: z.string(), + createdAt: z.string().nullable().optional(), + updatedAt: z.string().nullable().optional(), +}); + +export type BookingEntry = z.infer; + +export const zPostDataEntry = z.object({ + id: z.string(), + requestId: z.string().nullable().optional(), + number: z.string(), + first: z.number(), + second: z.number(), + userId: z.string().nullable().optional(), + createdAt: z.string().nullable().optional(), + updatedAt: z.string().nullable().optional(), +}); + +export type PostDataEntry = z.infer; + +const zPostDataHistory = z.object({ + id: z.string(), + data: z.array(zPostDataEntry), + drawId: z.number(), + bookDate: z.string(), + createdAt: z.string().nullable().optional(), + updatedAt: z.string().nullable().optional(), +}); + +export type PostDataHistory = z.infer; + +export const zPresetDataEntry = z.object({ + id: z.string(), + drawId: z.number(), + bookDate: z.string(), + number: z.string(), + first: z.number(), + second: z.number(), + createdAt: z.string().nullable().optional(), + dealerId: z.number().optional().nullable(), +}); + +export type PresetDataEntry = z.infer; + +export const fsPair = z.object({ + first: z.number(), + second: z.number(), +}); + +export const zLexiCodeCacheObject = z.object({ + number: z.string(), + rate: fsPair, + prize: fsPair, + frequency: fsPair, +}); + +export const reducedFinalSheetRow = z.object({ + id: z.string(), + number: z.string(), + frequency: fsPair, + frequencies: z.object({ + // a: fsPair, + // ab: fsPair, + // abc: fsPair, + // "+abc": fsPair, + // "a+bc": fsPair, + // "ab+c": fsPair, + abcd: fsPair, + }), + rate: fsPair, + prize: fsPair, + profit: fsPair, +}); + +export const zfinalSheetRow = z.object({ + id: z.string(), + number: z.string(), + frequency: fsPair, + rate: fsPair, + prize: fsPair, + profit: fsPair, + + a: zLexiCodeCacheObject, + xa: zLexiCodeCacheObject, + xxa: zLexiCodeCacheObject, + xxxa: zLexiCodeCacheObject, + ab: zLexiCodeCacheObject, + xab: zLexiCodeCacheObject, + axb: zLexiCodeCacheObject, + xaxb: zLexiCodeCacheObject, + xxab: zLexiCodeCacheObject, + axxb: zLexiCodeCacheObject, + abc: zLexiCodeCacheObject, + xabc: zLexiCodeCacheObject, + axbc: zLexiCodeCacheObject, + abxc: zLexiCodeCacheObject, + abcd: zLexiCodeCacheObject, +}); + +export type ServerError = Array<{ + message: string; + value?: string; + meta?: any; +}>; + +export const UserTypes = { ADMIN: "ADMIN", USER: "USER" }; + +export const ApiUserTypes = { ADMIN: 1, DISTRIBUTOR: 2, DEALER: 3 }; + +export type User = z.infer; + +export type LooseUser = z.infer; + +export type ApiUser = z.infer; + +export type ApiPostUser = z.infer; + +export type ApiPostUserWithParent = ApiPostUser & { + parentAdmin: number; + parentDistributor: number; +}; + +export type LooseApiUser = z.infer; + +export type LexiCodeCacheObject = z.infer; + +export type SimpleLexiCodeObject = { number: string; lexiCode: string }; + +export type FinalSheetRow = z.infer; + +export type ReducedFinalSheetRow = z.infer; + +export type FSPair = z.infer; + +export type FSTotals = { + rate: FSPair; + prize: FSPair; + commission: FSPair; + netRate: FSPair; + frequency: FSPair; +}; + +export type ReducedFinalSheetData = { + id: string; + date: string; + drawId: string; + data: Array; + totals: FSTotals; + createdAt?: string; + updatedAt?: string; +}; + +export type FinalSheetData = { + id: string; + date: string; + drawId: string; + data: Array; + totals: FSTotals; + createdAt?: string; + updatedAt?: string; +}; + +export type AuthPayload = z.infer; + +export type SessionData = { + username: string; + userType: string; +}; + +export type BookingInputValues = { + number: string; + default: { first: string; second: string }; + first: Record; + second: Record; +}; + +export const zPostDataHistoryFilters = z.object({ + date: z.string(), + draw: zDraw, +}); + +export type PostDataHistoryFilters = z.infer; + +export const zDDFilters = z.object({ + date: z.string(), + draw: zDraw.optional(), +}); + +export type DDFilters = z.infer; + +export const zDDUserFilters = z.object({ + date: z.string(), + draw: zDraw.optional(), + user: zApiUser.optional(), +}); + +export type DDUserFilters = z.infer; + +export const zPostDataFilters = z.object({ + date: z.string(), + draw: zDraw.optional().nullable(), + minPrize: z.coerce.number(), + maxPrize: z.coerce.number(), + twoDigitRates: fsPair, + threeDigitRates: fsPair, + customData: z.string(), +}); + +export type PostDataFilters = z.infer; + +export const DEFAULT_RANDOM_DISTRIBUTOR = { + id: "apiuser:6339", + userType: 2, + disableBooking: null, + sendVoucher: null, + voucherGenerated: null, + parentAdmin: 15, + parentDistributor: 0, + userName: "Baba Sagar", + userCity: "Shikar pur", + userId: "317XY3", + password: "405613", + accessDenied: 0, + phoneNumber: "", + emailAddress: "", + disable: 0, + commission: 20.0, + commissionPangora: 20.0, + allowTitles: ",7,8,9,10,11,12,13,14,15,16,30,31,32,", + specialDealer: 0, + allowBalance: 1, + balance: 30094.905, + profitlossShare: 50.0, + shareProfitonly: 0, + allowRemoveold: 0, + removeDays: 30, + language: 0, + createdAt: new Date().toString(), + updatedAt: new Date().toString(), +} as unknown as ApiUser; diff --git a/src/lib/utils/datetime.helper.utils.ts b/src/lib/utils/datetime.helper.utils.ts new file mode 100755 index 0000000..ca3db60 --- /dev/null +++ b/src/lib/utils/datetime.helper.utils.ts @@ -0,0 +1,59 @@ +import dayjs from "dayjs"; +import timezone from "dayjs/plugin/timezone"; +import utc from "dayjs/plugin/utc"; +import duration from "dayjs/plugin/duration"; +import { DEFAULT_TZ } from "./constants"; + +dayjs.extend(timezone); +dayjs.extend(utc); +dayjs.extend(duration); + +export function calculateTimeRemaining( + closingTime: string, + returnClosed: boolean, + timezone: string = DEFAULT_TZ +): string { + const currentDate = dayjs().tz(timezone).format("YYYY-MM-DD"); + const adjustedClosingTime = `${currentDate} ${closingTime.split(" ")[1]}`; + const closingDateTime = dayjs.tz( + adjustedClosingTime, + "YYYY-MM-DD HH:mm:ss", + timezone + ); + const currentDateTime = dayjs().tz(timezone); + + const isValid = closingDateTime.isValid(); + const isBefore = closingDateTime.isBefore(currentDateTime); + const isSame = closingDateTime.isSame(currentDateTime); + + if (!isValid || isBefore || isSame) { + return returnClosed ? "closed" : "00:00:00"; + } + + const diffDuration = dayjs.duration(closingDateTime.diff(currentDateTime)); + const formattedTime = dayjs + .utc(diffDuration.asMilliseconds()) + .format("HH:mm:ss"); + + return formattedTime; +} + +export function isDrawClosed( + closingTime: string, + timezone: string = DEFAULT_TZ +): boolean { + const out = calculateTimeRemaining(closingTime, true, timezone); + return out === "closed"; +} + +export function parseToDateString(date: Date): string { + return dayjs(date).format("YYYY-MM-DD"); +} + +// export const getCurrentDateInTimeZone(timeZone: string): string { +// const now = dayjs().utc(); +// const localDateTime = now.tz(timeZone); +// const formattedDate = localDateTime.format('YYYY-MM-DD'); +// +// return formattedDate; +// } diff --git a/src/lib/utils/entry.parser.ts b/src/lib/utils/entry.parser.ts new file mode 100644 index 0000000..eef47f9 --- /dev/null +++ b/src/lib/utils/entry.parser.ts @@ -0,0 +1,42 @@ +import { getULID } from "$lib/utils"; +import type { PostDataEntry } from "./data.types"; + +export function parseEntriesFromMessage(message: string): PostDataEntry[] { + const out = [] as PostDataEntry[]; + const lines = message.split("\n"); + for (let line of lines) { + line = line.trim().toLowerCase(); + if (line.length < 1 || (!line.includes("f") && !line.includes("s"))) { + continue; + } + let [numsStr, ratesStr] = line.split("f"); + if (!ratesStr || ratesStr === "") { + [numsStr, ratesStr] = line.split("s"); + if (!ratesStr || ratesStr === "") { + continue; + } + } + let fRate = 0; + let sRate = 0; + if (ratesStr.includes("s")) { + const [fPart, sPart] = ratesStr.split("s"); + fRate = Number(fPart); + sRate = Number(sPart); + } else { + fRate = Number(ratesStr); + } + const nums = numsStr.split("."); + for (const num of nums) { + if (num.length < 1 || num.match(/[^0-9]/i) || num.length > 4) { + continue; + } + out.push({ + id: getULID(), + number: num, + first: fRate, + second: sRate, + }); + } + } + return out; +} diff --git a/src/lib/utils/finalsheet.utils.ts b/src/lib/utils/finalsheet.utils.ts new file mode 100755 index 0000000..19fb2d6 --- /dev/null +++ b/src/lib/utils/finalsheet.utils.ts @@ -0,0 +1,237 @@ +import { + COMMISSION_PERCENTAGE, + LEXICODE_MATHCER_PATTERNS, + LEXICODE_PRIZE_PERCENTAGES, +} from "./constants"; +import type { LexiCodeCacheObject, SimpleLexiCodeObject } from "./data.types"; + +export const round2D = (num: number) => { + return Number(num.toFixed(2)); +}; + +export const getNoOfDigits = (lexiCode: string) => { + const lens = { 1: 10, 2: 100, 3: 1000, 4: 10000 }; + return lens[lexiCode.split("+").join("").length as keyof typeof lens]; +}; + +export const getNetRate = (rate: number) => { + return round2D(rate - rate * COMMISSION_PERCENTAGE); +}; + +export const getCommisionAmt = (rate: number) => { + return round2D(rate * COMMISSION_PERCENTAGE); +}; + +export const getAllMatchingChildNumbers = (parent: string) => { + const out = [] as SimpleLexiCodeObject[]; + out.push({ number: `${parent[0]}`, lexiCode: "a" }); + out.push({ + number: getMatchingChild(parent, "+a"), + lexiCode: "+a", + }); + out.push({ + number: getMatchingChild(parent, "++a"), + lexiCode: "++a", + }); + out.push({ + number: getMatchingChild(parent, "+++a"), + + lexiCode: "+++a", + }); + out.push({ + number: `${parent[0]}${parent[1]}`, + lexiCode: "ab", + }); + out.push({ + number: getMatchingChild(parent, "+ab"), + lexiCode: "+ab", + }); + out.push({ + number: getMatchingChild(parent, "a+b"), + + lexiCode: "a+b", + }); + out.push({ + number: getMatchingChild(parent, "+a+b"), + lexiCode: "+a+b", + }); + out.push({ + number: getMatchingChild(parent, "++ab"), + lexiCode: "++ab", + }); + out.push({ + number: getMatchingChild(parent, "a++b"), + lexiCode: "a++b", + }); + out.push({ + number: `${parent[0]}${parent[1]}${parent[2]}`, + lexiCode: "abc", + }); + out.push({ + number: getMatchingChild(parent, "+abc"), + lexiCode: "+abc", + }); + out.push({ + number: getMatchingChild(parent, "a+bc"), + lexiCode: "a+bc", + }); + out.push({ + number: getMatchingChild(parent, "ab+c"), + lexiCode: "ab+c", + }); + out.push({ number: parent, lexiCode: "abcd" }); + return out; +}; + +export const getAllMatchingChildNumbersObject = (parent: string) => { + return { + a: `${parent[0]}`, + "+a": getMatchingChild(parent, "+a"), + "++a": getMatchingChild(parent, "++a"), + "+++a": getMatchingChild(parent, "+++a"), + ab: `${parent[0]}${parent[1]}`, + "+ab": getMatchingChild(parent, "+ab"), + "a+b": getMatchingChild(parent, "a+b"), + "+a+b": getMatchingChild(parent, "+a+b"), + "++ab": getMatchingChild(parent, "++ab"), + "a++b": getMatchingChild(parent, "a++b"), + abc: `${parent[0]}${parent[1]}${parent[2]}`, + "+abc": getMatchingChild(parent, "+abc"), + "a+bc": getMatchingChild(parent, "a+bc"), + "ab+c": getMatchingChild(parent, "ab+c"), + abcd: parent, + }; +}; + +function getMatchingChild(n: string, lexiCode: string): string { + const lopn = n.length; + if (lexiCode === "a") { + return `${n[0]}`; + } else if (lexiCode === "+a") { + if (lopn === 1) { + return `+${n[n.length - 1]}`; + } else { + return `+${n[1]}`; + } + } else if (lexiCode === "++a") { + if (lopn === 1 || lopn === 2) { + return `++${n[n.length - 1]}`; + } else { + return `++${n[2]}`; + } + } else if (lexiCode === "+++a") { + if (lopn === 1 || lopn === 2 || lopn === 3) { + return `+++${n[n.length - 1]}`; + } else { + return `+++${n[3]}`; + } + } else if (lexiCode === "ab") { + return `${n[0]}${n[1]}`; + } else if (lexiCode === "+ab") { + if (lopn === 2) { + return `+${n[0]}${n[1]}`; + } else { + return `+${n[1]}${n[2]}`; + } + } else if (lexiCode === "a+b") { + if (lopn === 2) { + return `${n[0]}+${n[1]}`; + } else { + return `${n[0]}+${n[2]}`; + } + } else if (lexiCode === "++ab") { + if (lopn === 2 || lopn === 3) { + return `++${n[n.length - 2]}${n[n.length - 1]}`; + } else { + return `++${n[2]}${n[3]}`; + } + } else if (lexiCode === "+a+b") { + if (lopn === 2) { + return `+${n[0]}+${n[1]}`; + } else if (lopn === 3) { + return `+${n[1]}+${n[2]}`; + } else { + return `+${n[1]}+${n[3]}`; + } + } else if (lexiCode === "a++b") { + if (lopn < 4) { + return `${n[0]}++${n[n.length - 1]}`; + } else { + return `${n[0]}++${n[3]}`; + } + } else if (lexiCode === "abc") { + return `${n[0]}${n[1]}${n[2]}`; + } else if (lexiCode === "+abc") { + if (lopn === 3) { + return `+${n[0]}${n[1]}${n[2]}`; + } else { + return `+${n[1]}${n[2]}${n[3]}`; + } + } else if (lexiCode === "a+bc") { + if (lopn === 3) { + return `${n[0]}+${n[1]}${n[2]}`; + } else { + return `${n[0]}+${n[2]}${n[3]}`; + } + } else if (lexiCode === "ab+c") { + if (lopn === 3) { + return `${n[0]}${n[1]}+${n[2]}`; + } else { + return `${n[0]}${n[1]}+${n[3]}`; + } + } else if (lexiCode === "abcd") { + return n; + } + throw new Error("Invalid lexi code passed"); +} + +export function* get4DigitGenerator(): Generator { + for (let i = 0; i < 10; i++) { + for (let j = 0; j < 10; j++) { + for (let k = 0; k < 10; k++) { + for (let l = 0; l < 10; l++) { + yield `${i}${j}${k}${l}`; + } + } + } + } +} + +export const calculatePrize = ( + amount: number, + lexiCode: string, + type: "first" | "second", + noOfDigits: number +) => { + // @ts-ignore + const lexiCodePercentage = LEXICODE_PRIZE_PERCENTAGES[type][lexiCode]; + if (amount && lexiCodePercentage > 0) { + return parseInt( + (amount * noOfDigits * (lexiCodePercentage / 100)).toFixed(2) + ); + } + return 0; +}; + +export const calculateProfit = (netRate: number, prize: number) => { + return netRate - prize; +}; + +export const getLexiCode = (no: string) => { + for (const [lexicode, pattern] of Object.entries(LEXICODE_MATHCER_PATTERNS)) { + if (no.match(pattern)?.length) { + return lexicode; + } + } + console.log("No lexi code found for ", no); + return false; +}; + +export const getLexiCodeCacheObject = (no: string) => { + return { + number: no, + rate: { first: 0, second: 0 }, + prize: { first: 0, second: 0 }, + frequency: { first: 0, second: 0 }, + } as LexiCodeCacheObject; +}; diff --git a/src/lib/utils/permutations.ts b/src/lib/utils/permutations.ts new file mode 100755 index 0000000..cb35333 --- /dev/null +++ b/src/lib/utils/permutations.ts @@ -0,0 +1,52 @@ +export function permutations(array: string[], r: number) { + let n = array.length; + if (r === undefined) { + r = n; + } + if (r > n) { + return []; + } + let indices = []; + for (let i = 0; i < n; i++) { + indices.push(i); + } + let cycles = []; + for (let i = n; i > n - r; i--) { + cycles.push(i); + } + let results = []; + let res = []; + for (let k = 0; k < r; k++) { + res.push(array[indices[k]]); + } + results.push(res); + let broken = false; + while (n > 0) { + for (let i = r - 1; i >= 0; i--) { + cycles[i]--; + if (cycles[i] === 0) { + indices = indices + .slice(0, i) + .concat(indices.slice(i + 1).concat(indices.slice(i, i + 1))); + cycles[i] = n - i; + broken = false; + } else { + let j = cycles[i]; + let x = indices[i]; + indices[i] = indices[n - j]; + indices[n - j] = x; + let res = []; + for (let k = 0; k < r; k++) { + res.push(array[indices[k]]); + } + results.push(res); + broken = true; + break; + } + } + if (broken === false) { + break; + } + } + return results; +} diff --git a/src/lib/utils/rng.ts b/src/lib/utils/rng.ts new file mode 100755 index 0000000..9652884 --- /dev/null +++ b/src/lib/utils/rng.ts @@ -0,0 +1,3 @@ +export const rng = (min: number, max: number) => { + return Math.floor(Math.random() * (max - min + 1)) + min; +}; diff --git a/src/routes/+error.svelte b/src/routes/+error.svelte new file mode 100755 index 0000000..57db9df --- /dev/null +++ b/src/routes/+error.svelte @@ -0,0 +1,22 @@ + + +
+
+
{$page.status}
+
+
+ {$page.error?.message ?? "An error occured"} +
+
+ + +

Back to homepage

+
+
diff --git a/src/routes/+layout.server.ts b/src/routes/+layout.server.ts new file mode 100755 index 0000000..caf57b1 --- /dev/null +++ b/src/routes/+layout.server.ts @@ -0,0 +1,5 @@ +import type { LayoutServerLoad } from "./$types"; + +export const load = (async ({ locals, url }) => { + return { user: locals.user }; +}) satisfies LayoutServerLoad; diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte new file mode 100755 index 0000000..33599cd --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,25 @@ + + + +
+ + + + + +
diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts new file mode 100755 index 0000000..794a885 --- /dev/null +++ b/src/routes/+page.server.ts @@ -0,0 +1,14 @@ +import { redirect } from "@sveltejs/kit"; +import type { PageServerLoad } from "./$types"; +import { UserTypes } from "$lib/utils/data.types"; + +export const load = (async ({ url, locals }) => { + const user = locals.user; + const isAdmin = user?.userType === UserTypes.ADMIN; + const isUser = user?.userType === UserTypes.USER; + if (isAdmin) { + throw redirect(302, "/admin"); + } else if (isUser) { + throw redirect(302, "/user"); + } +}) satisfies PageServerLoad; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte new file mode 100755 index 0000000..ebcde45 --- /dev/null +++ b/src/routes/+page.svelte @@ -0,0 +1,6 @@ + + +
+

Home Page

+
diff --git a/src/routes/admin/+layout.svelte b/src/routes/admin/+layout.svelte new file mode 100755 index 0000000..26b10b7 --- /dev/null +++ b/src/routes/admin/+layout.svelte @@ -0,0 +1,8 @@ + + + + diff --git a/src/routes/admin/+page.svelte b/src/routes/admin/+page.svelte new file mode 100755 index 0000000..e6768c8 --- /dev/null +++ b/src/routes/admin/+page.svelte @@ -0,0 +1,130 @@ + + +
+
+
+ + <Button + text={"Toggle filters"} + intent={"primaryInverted"} + disabled={isLoading} + onClick={() => (showFilters = !showFilters)} + /> + </div> + <Line /> + {#if isLoading} + <CenteredSpinner /> + {:else if $filtersQ.data} + <DataFetchingFilters + bind:showFilters + draws={$filtersQ.data.draws} + fetchDataFn={fetchFinalSheet} + fetchingFinalSheet={$finalSheetM.isLoading} + /> + {/if} + {#if $finalSheetM.isLoading} + <CenteredSpinner /> + {:else if rowCount > 0 && $finalSheetM?.data && $finalSheetM.data?.data} + <FSInfo {totals} /> + <FsTable + {api} + {rowCount} + data={$finalSheetM.data.data.data ?? []} + /> + {:else} + <span class="w-full grid place-items-center py-24"> + <Title size={"h4"} text={"No data found for chosen filters"} /> + </span> + {/if} + </div> +</section> diff --git a/src/routes/admin/admin-navbar.svelte b/src/routes/admin/admin-navbar.svelte new file mode 100755 index 0000000..5655828 --- /dev/null +++ b/src/routes/admin/admin-navbar.svelte @@ -0,0 +1,79 @@ +<script lang="ts"> + import IconSignOut from "~icons/ph/sign-out"; + import { page } from "$app/stores"; + + import type { SessionData } from "$lib/utils/data.types"; + import LinkButton from "$lib/components/atoms/link-button.svelte"; + import clsx from "clsx"; + import { goto } from "$app/navigation"; + + export let user: SessionData | undefined; + + const prefix = "/admin"; + const links = [ + { + label: "Final Sheet", + href: prefix, + }, + { + label: "API Controls", + href: prefix + "/api-controls", + }, + { + label: "Post Config", + href: prefix + "/post-data-config", + }, + { + label: "Preset Data", + href: prefix + "/post-data-panel", + }, + { + label: "Post History", + href: prefix + "/post-data-history", + }, + // { + // label: "User Data", + // href: prefix + "/user-data", + // }, + ]; + + const logOut = async () => { + await fetch("/api/auth/logout", { method: "POST" }); + goto("/auth/signin"); + }; +</script> + +<nav class="flex w-full flex-col max-w-screen shadow-sm mb-8"> + <section + class="flex w-full justify-between items-center p-4 md:p-6 lg:px-8 pb-4 md:pb-4 lg:pb-4" + > + <div class="flex items-center gap-2"> + <img + src="/favicon.png" + class="w-8 h-8 text-sky-500 md:w-10 md:h-10 lg:w-12 lg:h-12" + alt="Icon" + /> + <span class="capitalize text-md md:text-lg lg:text-xl font-medium" + >{user ? user.username : "User"}</span + > + </div> + <LinkButton iconleft={IconSignOut} text={"Logout"} onClick={logOut} /> + </section> + + <section class="max-w-screen overflow-x-auto flex md:px-8"> + {#each links as link} + <a href={link.href}> + <div + class={clsx( + "p-2 font-medium px-4 rounded-t-md w-32 text-center border-b hover:border-sky-400 hover:text-sky-500 hover:bg-sky-100 cursor-pointer duration-150 transition-colors text-sm lg:text-md", + $page.url.pathname.endsWith(link.href) + ? "border-sky-500 bg-sky-50 text-sky-700" + : "border-transparent", + )} + > + {link.label} + </div> + </a> + {/each} + </section> +</nav> diff --git a/src/routes/admin/api-controls/+page.server.ts b/src/routes/admin/api-controls/+page.server.ts new file mode 100755 index 0000000..810ae3f --- /dev/null +++ b/src/routes/admin/api-controls/+page.server.ts @@ -0,0 +1,55 @@ +import { fail } from "@sveltejs/kit"; +import type { Actions } from "../../$types"; +import { ApiUserTypes, type ServerError } from "$lib/utils/data.types"; +import { + getDealers, + getDistributors, +} from "$lib/server/external/api.scraping.helpers"; +import { dbApiUser } from "$lib/server/db/apiuser.db"; +import { constants } from "$lib/utils/constants"; +import fs from "fs"; +import { getSessionFromStore } from "$lib/server/utils/session.service"; + +export const actions = { + refetchDistributors: async () => { + const sess = await getSessionFromStore(constants.SCRAP_API_SESSION_KEY); + if (!sess) { + return fail(400, { + success: false, + errors: [{ message: "No api session found" }], + }); + } + const done = await getDistributors(sess.sessionToken); + console.log(`[+] ${done.data.length} distributors found`); + fs.writeFileSync("distributors.json", JSON.stringify(done.data, null, 2)); + if (!done.ok) { + return fail(400, { + success: false, + errors: [{ message: done.message }], + }); + } + await dbApiUser.upsertMany(done.data, true, ApiUserTypes.DISTRIBUTOR); + return { success: true, errors: [] as ServerError }; + }, + + refetchDealers: async () => { + const sess = await getSessionFromStore(constants.SCRAP_API_SESSION_KEY); + if (!sess) { + return fail(400, { + success: false, + errors: [{ message: "No api session found" }], + }); + } + const distributor_ids = await dbApiUser.getAllIdsByUserType( + ApiUserTypes.DISTRIBUTOR, + ); + const done = await getDealers(sess.sessionToken, distributor_ids); + console.log(`[+] ${done.dealers.length} dealers found`); + fs.writeFileSync("dealers.json", JSON.stringify(done.dealers, null, 2)); + if (done.errors.length > 0) { + return fail(400, { success: false, errors: done.errors }); + } + await dbApiUser.upsertMany(done.dealers, true, ApiUserTypes.DEALER); + return { success: true, errors: [] as ServerError }; + }, +} satisfies Actions; diff --git a/src/routes/admin/api-controls/+page.svelte b/src/routes/admin/api-controls/+page.svelte new file mode 100755 index 0000000..cf1f45f --- /dev/null +++ b/src/routes/admin/api-controls/+page.svelte @@ -0,0 +1,47 @@ +<script lang="ts"> + import Line from "$lib/components/atoms/line.svelte"; + import Title from "$lib/components/atoms/title.svelte"; + import { trpc } from "$lib/trpc/trpc"; + import FetchLatestData from "./fetch-latest-data.svelte"; + import RefetchDealers from "./refetch-dealers.svelte"; + import RefetchDistributors from "./refetch-distributors.svelte"; + import SessionVerifier from "./session-verifier.svelte"; + import { Button } from "$lib/components/ui/button"; + import toast from "svelte-french-toast"; + + const api = trpc(); + + let delDataM = api.apiData.delDataOlderThan2Weeks.createMutation({ + onSuccess: () => { + toast("Data deleted"); + }, + onError: (err) => { + toast.error(err.message); + }, + }); + + function delData() { + toast("Deleting data..."); + $delDataM.mutateAsync(); + } +</script> + +<section class="w-full grid place-items-center p-8"> + <div + class="w-full flex flex-col gap-4 max-w-3xl p-6 lg:p-8 rounded-lg shadow-sm border" + > + <Title text={"API controls"} size={"h1"} /> + <Line /> + <SessionVerifier {api} /> + <RefetchDistributors {api} /> + <RefetchDealers {api} /> + <FetchLatestData {api} /> + + <Line cls="my-2" /> + <div> + <Button variant="destructive" on:click={delData}> + Delete all data older than 2 weeks + </Button> + </div> + </div> +</section> diff --git a/src/routes/admin/api-controls/fetch-latest-data.svelte b/src/routes/admin/api-controls/fetch-latest-data.svelte new file mode 100755 index 0000000..b99812a --- /dev/null +++ b/src/routes/admin/api-controls/fetch-latest-data.svelte @@ -0,0 +1,153 @@ +<script lang="ts"> + import Button from "$lib/components/atoms/button.svelte"; + import Switch from "$lib/components/atoms/switch.svelte"; + import Title from "$lib/components/atoms/title.svelte"; + import type { trpc } from "$lib/trpc/trpc"; + import toast from "svelte-french-toast"; + import clsx from "clsx"; + import Input from "$lib/components/atoms/input.svelte"; + import Pill from "$lib/components/atoms/pill.svelte"; + import Select from "$lib/components/atoms/select.svelte"; + + export let api: ReturnType<typeof trpc>; + + let chosenDate = new Date().toISOString().split("T")[0]; + let chosenDraw = ""; + let chosenDealers = new Set(); + let userListQuery = ""; + + const addOrDelDealer = (item: any) => { + if (chosenDealers.has(item.id)) { + chosenDealers.delete(item.id); + } else { + chosenDealers.add(item.id); + } + chosenDealers = chosenDealers; + }; + + let filtersQ = api.apiData.getDealersAndDraws.createQuery(undefined, { + refetchInterval: 1000 * 60 * 30, + refetchOnWindowFocus: false, + retry: 3, + onSuccess: (d) => { + if (d.draws.length > 0) { + chosenDraw = d.draws[0].id; + } + return d; + }, + }); + $: isLoading = $filtersQ.isLoading || $filtersQ.isFetching; + + let refetchDataM = api.apiData.refetchData.createMutation({ + onSuccess: (o) => { + if (!o.success) { + for (const each of o.errors) { + toast.error(each.message); + } + } else { + toast.success(o.detail, { duration: 1000 * 10 }); + } + }, + onError: (e) => { + toast.error(e.message); + }, + }); + $: refetching = $refetchDataM.isLoading; + + const refetchDataaaaaaaaa = async () => { + toast( + "Refetching data. This may take a 1 or 2 mins, so please wait and do not refresh the page", + { icon: "ⓘ", duration: 1000 * 10 }, + ); + await $refetchDataM.mutateAsync({ + userIds: Array.from(chosenDealers) as string[], + drawId: chosenDraw, + targetDate: chosenDate, + }); + }; +</script> + +<Title text={"Fetch Data"} size={"h2"} /> + +{#if isLoading} + <div class="w-max"> + <Pill theme={"slate"} text={"Querying info..."} /> + </div> +{:else if $filtersQ.data} + <Title size={"h4"} text={"Date & Draw"} /> + <section class="flex flex-col md:flex-row gap-4 w-full"> + <Input + bind:value={chosenDate} + label={"Date"} + inputType={"date"} + placeholder={"Date"} + /> + <Select + fullWidth + label={"Draw"} + options={$filtersQ.data.draws.map((e) => { + return { label: e.title, value: e.id, id: e.id }; + })} + onSelect={(e) => { + // @ts-ignore + chosenDraw = e.target.value; + }} + /> + </section> + <Title size={"h4"} text={"Dealers"} /> + <section class="flex flex-col gap-4"> + <Input + bind:value={userListQuery} + placeholder={"Search dealers . . ."} + /> + <div + class="p-2 rounded-lg w-full border shadow-sm h-80 overflow-y-auto flex flex-col gap-1" + > + {#each $filtersQ.data.users as user} + <!-- svelte-ignore a11y-no-static-element-interactions --> + {#if user && (userListQuery === "" || user.userName + .toLowerCase() + .includes(userListQuery.toLowerCase()) || user.userId + .toLowerCase() + .includes(userListQuery.toLowerCase()))} + <div + class={clsx( + "rounded-md hover:bg-sky-200 text-sky-800 font-medium p-2 cursor-pointer transition-colors duration-100 border capitalize", + chosenDealers.has(user.id) + ? "bg-sky-300 border-sky-600" + : "bg-sky-50 border-sky-200", + )} + on:click={() => addOrDelDealer(user)} + on:touchend={() => addOrDelDealer(user)} + on:keypress={() => {}} + > + {user?.userName} - {user?.userId} + </div> + {/if} + {/each} + </div> + {#if $filtersQ.data && $filtersQ.data.users.length > 0} + <Switch + label={"Select all dealers"} + onChange={(v) => { + if (v && $filtersQ.data) { + for (const each of $filtersQ.data.users) { + if (!each) continue; + chosenDealers.add(each.id); + } + } else { + chosenDealers.clear(); + } + chosenDealers = chosenDealers; + }} + /> + {/if} + </section> + + <Button + text={refetching ? "Fetching data..." : "Fetch data"} + intent={refetching ? "ghost" : "primary"} + disabled={refetching} + onClick={refetchDataaaaaaaaa} + /> +{/if} diff --git a/src/routes/admin/api-controls/refetch-dealers.svelte b/src/routes/admin/api-controls/refetch-dealers.svelte new file mode 100755 index 0000000..fe40044 --- /dev/null +++ b/src/routes/admin/api-controls/refetch-dealers.svelte @@ -0,0 +1,65 @@ +<script lang="ts"> + import Button from "$lib/components/atoms/button.svelte"; + import Pill from "$lib/components/atoms/pill.svelte"; + import Title from "$lib/components/atoms/title.svelte"; + import type { trpc } from "$lib/trpc/trpc"; + import toast from "svelte-french-toast"; + import type { SubmitFunction } from "./$types"; + import { enhance } from "$app/forms"; + + export let api: ReturnType<typeof trpc>; + + let dQ = api.apiUser.getAllDealersCount.createQuery(undefined, { + refetchOnWindowFocus: false, + refetchInterval: false, + retry: 3, + }); + $: isLoading = $dQ.isLoading || $dQ.isFetching; + + let refetching = false; + const formInterceptor: SubmitFunction = async () => { + refetching = true; + toast("Fetching dealers, it may take around 1 minute so please wait...", { + icon: "ⓘ", + duration: 1000 * 5, + }); + return async ({ update, result }) => { + refetching = false; + if (result.type === "failure") { + if (result.data && result.data.errors.length > 0) { + for (const each of result.data.errors) { + toast.error(each.message); + } + } + } + const isSuccess = result.type === "success"; + await update({ reset: isSuccess }); + if (isSuccess) { + toast.success("Successfuly refetched dealers"); + $dQ.refetch(); + } + }; + }; +</script> + +<Title text={"Dealers"} size={"h2"} /> + +<div class="flex w-full justify-between items-center"> + {#if isLoading} + <Pill text={"Querying..."} theme={"slate"} /> + {:else if $dQ.data} + <Pill text={`${$dQ.data.enabled} enabled`} theme={"green"} /> + {/if} + <form + method="post" + action={"/admin/api-controls/?/refetchDealers"} + use:enhance={formInterceptor} + > + <Button + disabled={refetching} + text={refetching ? "Refetching..." : "Refetch"} + intent={refetching ? "ghost" : "primary"} + otherOptions={{ type: "submit" }} + /> + </form> +</div> diff --git a/src/routes/admin/api-controls/refetch-distributors.svelte b/src/routes/admin/api-controls/refetch-distributors.svelte new file mode 100755 index 0000000..cea8562 --- /dev/null +++ b/src/routes/admin/api-controls/refetch-distributors.svelte @@ -0,0 +1,61 @@ +<script lang="ts"> + import Button from "$lib/components/atoms/button.svelte"; + import Pill from "$lib/components/atoms/pill.svelte"; + import Title from "$lib/components/atoms/title.svelte"; + import type { trpc } from "$lib/trpc/trpc"; + import toast from "svelte-french-toast"; + import type { SubmitFunction } from "./$types"; + import { enhance } from "$app/forms"; + + export let api: ReturnType<typeof trpc>; + + let dQ = api.apiUser.getAllDistributorsCount.createQuery(undefined, { + refetchOnWindowFocus: false, + refetchInterval: false, + retry: 3, + }); + $: isLoading = $dQ.isLoading || $dQ.isFetching; + + let refetching = false; + const formInterceptor: SubmitFunction = async () => { + refetching = true; + return async ({ update, result }) => { + refetching = false; + if (result.type === "failure") { + if (result.data && result.data.errors.length > 0) { + for (const each of result.data.errors) { + toast.error(each.message); + } + } + } + const isSuccess = result.type === "success"; + await update({ reset: isSuccess }); + if (isSuccess) { + toast.success("Successfuly refetched distributors"); + $dQ.refetch(); + } + }; + }; +</script> + +<Title text={"Distributors"} size={"h2"} /> + +<div class="flex w-full justify-between items-center"> + {#if isLoading} + <Pill text={"Querying..."} theme={"slate"} /> + {:else if $dQ.data} + <Pill text={`${$dQ.data.enabled} enabled`} theme={"green"} /> + {/if} + <form + method="post" + action={"/admin/api-controls/?/refetchDistributors"} + use:enhance={formInterceptor} + > + <Button + disabled={refetching} + text={refetching ? "Refetching..." : "Refetch"} + intent={refetching ? "ghost" : "primary"} + otherOptions={{ type: "submit" }} + /> + </form> +</div> diff --git a/src/routes/admin/api-controls/session-verifier.svelte b/src/routes/admin/api-controls/session-verifier.svelte new file mode 100755 index 0000000..7cb0678 --- /dev/null +++ b/src/routes/admin/api-controls/session-verifier.svelte @@ -0,0 +1,66 @@ +<script lang="ts"> + import Button from "$lib/components/atoms/button.svelte"; + import Pill from "$lib/components/atoms/pill.svelte"; + import Title from "$lib/components/atoms/title.svelte"; + import type { trpc } from "$lib/trpc/trpc"; + import { CheckIcon } from "lucide-svelte"; + import SetNewSessionForm from "./set-new-session-form.svelte"; + + export let api: ReturnType<typeof trpc>; + let sOk = api.apiAuth.isApiSessionValid.createQuery( + { checkingUserSession: false }, + { refetchOnWindowFocus: false, refetchInterval: false, retry: 0 }, + ); + $: isLoading = $sOk.isLoading || $sOk.isFetching; + $: isApiSessionValid = !isLoading && $sOk.data?.valid === true; + + const onSuccessfulLogin = () => { + $sOk.refetch(); + }; + + let logoutUserM = api.apiAuth.logoutUser.createMutation({ + onSuccess: (d) => { + $sOk.refetch(); + }, + }); + + function logoutUser() { + $logoutUserM.mutateAsync({ userId: undefined }); + } + + function checkSession() { + $sOk.refetch(); + } +</script> + +<Title text={"Session"} size={"h2"} /> + +<div class="flex w-full items-center justify-between gap-2"> + {#if isLoading} + <Pill text={"Verifying..."} theme={"slate"} /> + {:else if isApiSessionValid} + <div class="items-center flex flex-row gap-2 w-full justify-between"> + <div + class="flex items-center gap-2 px-4 p-2 rounded-full bg-emerald-50 text-emerald-500 justify-center w-max" + > + Active + <CheckIcon class="w-6 h-auto" /> + </div> + + <div class="flex items-center gap-2"> + <Button + intent="primaryInverted" + onClick={() => checkSession()} + text={"Check"} + /> + <Button onClick={() => logoutUser()} text={"Logout"} /> + </div> + </div> + {:else} + <Pill text={"invalid"} theme={"rose"} /> + {/if} +</div> + +{#if !isLoading && !isApiSessionValid} + <SetNewSessionForm {api} {onSuccessfulLogin} /> +{/if} diff --git a/src/routes/admin/api-controls/set-new-session-form.svelte b/src/routes/admin/api-controls/set-new-session-form.svelte new file mode 100755 index 0000000..bfb0145 --- /dev/null +++ b/src/routes/admin/api-controls/set-new-session-form.svelte @@ -0,0 +1,110 @@ +<script lang="ts"> + import Button from "$lib/components/atoms/button.svelte"; + import Input from "$lib/components/atoms/input.svelte"; + import Title from "$lib/components/atoms/title.svelte"; + import type { TRPC } from "$lib/trpc/trpc"; + import toast from "svelte-french-toast"; + import { onMount } from "svelte"; + + export let api: TRPC; + export let onSuccessfulLogin: () => void; + + let signingIn = false; + let captchaAnswer = ""; + + let getNewSessionM = api.apiAuth.getNewSession.createMutation({ + onSuccess: (o) => { + signingIn = false; + if (!o.success) { + for (const each of o.errors) { + toast.error(each.message); + } + return; + } + toast.success("Successfully authenticated", { + duration: 1000 * 10, + }); + onSuccessfulLogin(); + }, + onError: (e) => { + console.log(e); + signingIn = false; + toast.error( + "An error occured while authenticating, please try again later", + ); + }, + }); + + let captchaImage = ""; + let captchaId = ""; + + let captchaM = api.apiAuth.getCaptcha.createMutation({ + onSuccess: (d) => { + captchaId = d.id; + captchaImage = d.image; + }, + onError: (e) => { + toast.error( + "An error occured while loading captcha, please try again later", + ); + }, + }); + + $: fetchingCaptcha = $captchaM.isLoading; + + const onFormSubmit = async () => { + if (captchaAnswer.length !== 4) { + toast.error("Captcha answer must be 4 characters long"); + return; + } + if ($captchaM.data?.id) { + signingIn = true; + $getNewSessionM.mutateAsync({ + captchaId, + captchaAnswer, + }); + } else { + toast.error("Captcha not loaded, refresh and try again"); + } + }; + + onMount(() => { + $captchaM.mutateAsync(); + }); +</script> + +<form + class="flex flex-col gap-4 w-full" + on:submit|preventDefault={onFormSubmit} +> + <Title size={"h3"} text={"Login and get new session"} /> + <div class="gap-2 flex items-center"> + {#if !fetchingCaptcha} + <img + class="w-64 h-16 rounded-md" + src={`data:image/jpeg;base64,${captchaImage}`} + alt={"Captcha"} + /> + {:else} + <div class="w-64 h-16 rounded-md bg-gray-200 animate-pulse"></div> + {/if} + <input hidden name="captchaId" value={captchaId} /> + <Input + bind:value={captchaAnswer} + name={"captchaAnswer"} + placeholder={"Captcha Answer"} + otherInputOptions={{ + required: true, + minLength: 4, + maxLength: 4, + }} + /> + </div> + <Button + disabled={signingIn} + text={signingIn ? "Logging in..." : "Login"} + intent={signingIn ? "ghost" : "primary"} + fullwidth={"yes"} + otherOptions={{ type: "submit" }} + /> +</form> diff --git a/src/routes/admin/copy-counts.ls.ts b/src/routes/admin/copy-counts.ls.ts new file mode 100755 index 0000000..7728998 --- /dev/null +++ b/src/routes/admin/copy-counts.ls.ts @@ -0,0 +1,19 @@ +export type CopyCounts = Record<string, number>; + +const LS_KEY = "copy-counts"; + +export function getCopyCountsFromLS(): CopyCounts { + const copyCount = localStorage.getItem(LS_KEY); + if (copyCount === "undefined") { + localStorage.removeItem(LS_KEY); + return {}; + } + return !!copyCount ? JSON.parse(copyCount) : {}; +} + +export function setCopyCountsToLS(copyCount: CopyCounts) { + if (!copyCount) { + return; + } + localStorage.setItem(LS_KEY, JSON.stringify(copyCount)); +} diff --git a/src/routes/admin/data-fetching-filters.svelte b/src/routes/admin/data-fetching-filters.svelte new file mode 100755 index 0000000..0957479 --- /dev/null +++ b/src/routes/admin/data-fetching-filters.svelte @@ -0,0 +1,97 @@ +<script lang="ts"> + import Button from "$lib/components/atoms/button.svelte"; + import Input from "$lib/components/atoms/input.svelte"; + import Line from "$lib/components/atoms/line.svelte"; + import Pill from "$lib/components/atoms/pill.svelte"; + import Select from "$lib/components/atoms/select.svelte"; + import type { Draw } from "$lib/utils/data.types"; + import toast from "svelte-french-toast"; + import { onMount } from "svelte"; + import { filters } from "./fs.stores"; + + export let fetchDataFn: () => Promise<void>; + export let showFilters: boolean; + export let draws: Draw[] = []; + export let fetchingFinalSheet: boolean = false; + + $: drawsCount = draws.length; + onMount(() => { + filters.update((f) => ({ ...f, draw: draws[0] })); + }); +</script> + +{#if drawsCount > 0 && showFilters} + <section class="flex flex-col md:flex-row gap-4 w-full"> + <Input + bind:value={$filters.date} + label={"Date"} + inputType={"date"} + placeholder={"Date"} + /> + <Select + fullWidth + label={"Draw"} + options={draws.map((e) => { + return { label: e.title, value: e.id, id: e.id }; + })} + onSelect={(e) => { + if (drawsCount > 0) { + filters.update((f) => ({ + ...f, + // @ts-ignore + draw: draws.find((d) => d.id === e.target.value), + })); + } + }} + /> + </section> + <div class="flex justify-end w-full"> + <Button + text={"Apply filters"} + disabled={fetchingFinalSheet} + onClick={async () => { + if ( + $filters.date.length < 1 || + !$filters.draw || + !$filters.draw.id + ) { + toast.error("Select all filters properly to fetch data"); + return; + } + showFilters = false; + toast("Fetching data for selected filters"); + await fetchDataFn(); + }} + /> + </div> +{:else if !showFilters} + <div + class="flex flex-col md:flex-row gap-4 items-center justify-between w-full" + > + <div class="flex w-full gap-2 flex-wrap"> + <Pill text={"Data Filters:"} theme={"sky"} /> + <Pill text={$filters.date} theme={"slate"} /> + <Pill text={$filters.draw?.title} theme={"slate"} /> + </div> + + <Button + text={fetchingFinalSheet ? "Fetching" : "Refetch"} + intent={fetchingFinalSheet ? "ghost" : "primaryInverted"} + disabled={fetchingFinalSheet} + onClick={async () => { + if ( + $filters.date.length < 1 || + !$filters.draw || + !$filters.draw.id + ) { + toast.error("Select all filters properly to fetch data"); + return; + } + showFilters = false; + toast("Fetching data for selected filters"); + await fetchDataFn(); + }} + /> + </div> +{/if} +<Line /> diff --git a/src/routes/admin/fs-info.svelte b/src/routes/admin/fs-info.svelte new file mode 100755 index 0000000..0106be9 --- /dev/null +++ b/src/routes/admin/fs-info.svelte @@ -0,0 +1,36 @@ +<script lang="ts"> + import Button from "$lib/components/atoms/button.svelte"; + import Line from "$lib/components/atoms/line.svelte"; + import Pill from "$lib/components/atoms/pill.svelte"; + import type { FSTotals } from "$lib/utils/data.types"; + + let showFSControls: boolean; + export let totals: FSTotals; +</script> + +{#if showFSControls} + <div class="flex flex-col w-full gap-2"> + <div class="flex justify-end"> + <Button + text={"Apply & close"} + onClick={() => { + showFSControls = !showFSControls; + }} + /> + </div> + </div> +{:else if !showFSControls} + <div class="w-full items-center flex justify-between"> + <div class="flex w-full gap-2 flex-wrap"> + <Pill text={"Totals :"} theme={"sky"} /> + <Pill text={`F rate : ${totals.rate.first}`} theme={"slate"} /> + <Pill text={`F comm : ${totals.commission.first}`} theme={"slate"} /> + <Pill text={`F net : ${totals.netRate.first}`} theme={"slate"} /> + + <Pill text={`S rate : ${totals.rate.second}`} theme={"slate"} /> + <Pill text={`S comm : ${totals.commission.second}`} theme={"slate"} /> + <Pill text={`S net : ${totals.netRate.second}`} theme={"slate"} /> + </div> + </div> +{/if} +<Line /> diff --git a/src/routes/admin/fs-modal.svelte b/src/routes/admin/fs-modal.svelte new file mode 100755 index 0000000..1d4cae6 --- /dev/null +++ b/src/routes/admin/fs-modal.svelte @@ -0,0 +1,591 @@ +<script lang="ts"> + import Input from "$lib/components/atoms/input.svelte"; + import clsx from "clsx"; + import { createDialog } from "@melt-ui/svelte"; + import IconButton from "$lib/components/atoms/icon-button.svelte"; + import IconX from "~icons/bi/x"; + import Title from "$lib/components/atoms/title.svelte"; + import { Button } from "$lib/components/ui/button"; + import Line from "$lib/components/atoms/line.svelte"; + import Pill from "$lib/components/atoms/pill.svelte"; + import Switch from "$lib/components/atoms/switch.svelte"; + import IconPhClipboardTextLight from "~icons/ph/clipboard-text-light"; + import toast from "svelte-french-toast"; + import type { CopyCounts } from "./copy-counts.ls"; + import { filters } from "./fs.stores"; + import { nowDT, postdata } from "./stores"; + import type { TRPC } from "$lib/trpc/trpc"; + import { hasDrawBeenClosed } from "$lib/utils"; + import PostDataSummarySection from "./post-data-summary-section.svelte"; + import * as AlertDialog from "$lib/components/ui/alert-dialog/index"; + + export let api: TRPC; + export let controllerState: Record<string, any>; + export let onControllerStateApply: (state: Record<string, any>) => void; + export let copyCounts: CopyCounts; + const trackingLexiCodeNumbersKeys = ["ab", "abc"]; + export let isChangingControllerState: boolean; + let previewData = false; + + let hasAlreadyPostedQ = api.postData.hasPosted.createQuery( + { date: $filters.date, draw: $filters.draw! }, + { refetchOnWindowFocus: false, retry: 3 }, + ); + $: hasAlreadyPosted = $hasAlreadyPostedQ.data + ? $hasAlreadyPostedQ.data.hasPosted + : false; + + // $: hasTimePassed = hasDrawBeenClosed($filters.date, $filters.draw!, $nowDT); + $: hasTimePassed = false; + + let postUsersQ = api.apiUser.getAllPostUsers.createQuery(undefined, { + refetchOnWindowFocus: false, + }); + $: postUsers = + !$postUsersQ.isLoading && !!$postUsersQ.data ? $postUsersQ.data : []; + + let postDataM = api.postData.post.createMutation({ + onSuccess: (d) => { + console.log(d); + if (!d.ok) { + if (!!d.detail && d.detail.length > 0) { + toast.error(d.detail); + return; + } + // @ts-ignore + for (const each of d.errors) { + toast.error(each.message); + } + return; + } + $hasAlreadyPostedQ.refetch(); + toast.success("Data posted successfully"); + }, + onError: (e) => { + console.error(e); + toast.error("Error posting data"); + }, + }); + + $: posting = $postDataM.isLoading; + + function beginPostingData( + e: SubmitEvent & { currentTarget: EventTarget & HTMLFormElement }, + ) { + // @ts-ignore + const fd = new FormData(e.target); + const data = {} as Record<string, any>; + for (const [key, value] of fd.entries()) data[key] = value; + toast("Starting to post data, please wait..."); + $postDataM.mutateAsync({ + yes: { + customData: "", + date: $filters.date, + draw: $filters.draw, + minPrize: +controllerState.minPrize, + maxPrize: +controllerState.maxPrize, + twoDigitRates: { + first: $filters.draw?.abRateF ?? 0, + second: $filters.draw?.abRateS ?? 0, + }, + threeDigitRates: { + first: $filters.draw?.abcRateF ?? 0, + second: $filters.draw?.abcRateS ?? 0, + }, + }, + data: $postdata, + }); + } + + function triggerPostForm() { + const form = document.getElementById("post-data-form"); + if (form) { + form.dispatchEvent(new Event("submit")); + } + } + + let refreshingPayload = false; + let payloadForPostingData = { + date: $filters.date, + draw: $filters.draw, + minPrize: +controllerState.minPrize, + maxPrize: +controllerState.maxPrize, + }; + + function startPreviewingData() { + reRenderPreviewPostData(); + previewData = true; + } + + function reRenderPreviewPostData() { + refreshingPayload = true; + console.log($filters.draw); + payloadForPostingData = { + date: $filters.date, + draw: $filters.draw, + minPrize: +controllerState.minPrize, + maxPrize: +controllerState.maxPrize, + }; + + console.log(`The posting payload :: `, payloadForPostingData); + setTimeout(() => { + refreshingPayload = false; + }, 100); + } + + const getParsedMessageFromMatchingNumbers = ( + lexiCode: string | null, + _copyCount: number = 1, + ) => { + let out = ""; + if (lexiCode) { + // @ts-ignore + for (const each of controllerState[lexiCode]) { + out += `${each}.`; + } + } else { + for (const lc of ["abc", "+abc", "a+bc", "ab+c"]) { + // @ts-ignore + for (const each of controllerState[lc]) { + out += `${each}.`; + } + } + } + if (_copyCount > 1) { + let out2 = ""; + for (let i = 0; i < _copyCount; i++) { + out2 += out; + } + out = out2; + } + // remove the last dot + return out.substring(0, out.length - 1); + }; + + const doesControllerStateValueHaveValidSize = (key: string): boolean => { + // @ts-ignore + const item = controllerState[key]; + if (item.size === undefined) return false; + return item.size > 0; + }; + + const getSize = (key: string) => { + // @ts-ignore + const item = controllerState[key]; + return item.size ?? 0; + }; + + function getSizeRemovingNumbersWithRepeatingDigits(key: string) { + // @ts-ignore + const item = controllerState[key]; + const out = new Set<string>(); + for (const each of item) { + if (each.length === new Set(each).size) { + out.add(each); + } + } + return out.size; + } + + const getIterator = (key: string) => { + // @ts-ignore + const item = controllerState[key]; + return item as Set<string>; + }; + + const { + trigger, + portal, + overlay, + content, + close: closeModal, + open: modalVisible, + } = createDialog(); +</script> + +<div> + <button {...$trigger} use:trigger> + <Button>Open Controller</Button> + </button> + <div use:portal> + {#if $modalVisible} + <div {...$overlay} class="fixed inset-0 z-20 bg-black/50" /> + <div + class={clsx( + "fixed left-[50%] top-[50%] z-30 max-h-[90vh] w-[90vw] max-w-5xl translate-x-[-50%] translate-y-[-50%] rounded-md bg-white p-8 shadow-lg overflow-y-auto", + )} + {...$content} + use:content + id="fs-controller-modal" + > + <div class="flex flex-col gap-4 w-full"> + <div class="flex gap-4 justify-between w-full"> + <Title size={"h2"} text={"Filter rows"} /> + <button {...$closeModal} use:closeModal> + <IconButton + icon={IconX} + color={"gray"} + size={"6"} + /> + </button> + </div> + + <div class="flex gap-4 justify-between"> + <Input + label={"Min Prize"} + inputType={"number"} + bind:value={controllerState.minPrize} + onInput={(e) => { + // @ts-ignore + const val = e.target.value; + controllerState.minPrize = val; + }} + /> + <Input + label={"Max Prize"} + inputType={"number"} + bind:value={controllerState.maxPrize} + onInput={(e) => { + // @ts-ignore + const val = e.target.value; + controllerState.maxPrize = val; + }} + /> + </div> + <Switch + label={"Filter rows where abcd type-numbers are not booked"} + checked={controllerState.filterOnlyRowsWithNo4DigitsBooked} + onChange={(v) => { + controllerState.filterOnlyRowsWithNo4DigitsBooked = + v; + }} + /> + + <div + class="flex flex-col sm:flex-row gap-2 justify-end w-full" + > + <Button on:click={onControllerStateApply}> + Apply changes + </Button> + <button {...$closeModal} use:closeModal> + <Button + variant={"primaryInverted"} + on:click={onControllerStateApply} + > + Apply changes & close + </Button> + </button> + </div> + + {#if (controllerState.minPrize > 0 || controllerState.maxPrize > 0) && !isChangingControllerState} + <form + on:submit|preventDefault={beginPostingData} + class="flex flex-col gap-6 w-full" + id="post-data-form" + > + <div class="w-full h-0.5 border-t-2"></div> + <Title + size={"h3"} + text={`Post Data (${new Date($filters.date).toDateString()} - ${$filters.draw?.title})`} + /> + + <div class="flex flex-col md:flex-row gap-6"> + <div + class="flex gap-4 w-full flex-col md:flex-row" + > + <Input + label={"2 Digit rate (F)"} + name="abRateF" + inputType={"number"} + padding="sm" + otherInputOptions={{ min: 0 }} + value={$filters.draw?.abRateF} + onInput={(e) => { + filters.update((f) => { + // @ts-ignore + f.draw.abRateF = + // @ts-ignore + +e.target.value; + return f; + }); + }} + /> + <Input + label={"2 Digit rate (S)"} + name="abRateS" + inputType={"number"} + padding="sm" + otherInputOptions={{ min: 0 }} + value={$filters.draw?.abRateS} + onInput={(e) => { + filters.update((f) => { + // @ts-ignore + f.draw.abRateS = + // @ts-ignore + +e.target.value; + return f; + }); + }} + /> + </div> + + <div + class="flex gap-4 w-full flex-col md:flex-row" + > + <Input + label={"3 Digit rate (F)"} + name="abcRateF" + inputType={"number"} + otherInputOptions={{ min: 0 }} + value={$filters.draw?.abcRateF} + padding="sm" + onInput={(e) => { + filters.update((f) => { + // @ts-ignore + f.draw.abcRateF = + // @ts-ignore + +e.target.value; + return f; + }); + }} + /> + <Input + value={$filters.draw?.abcRateS} + name="abcRateS" + label={"3 Digit rate (S)"} + inputType={"number"} + padding="sm" + otherInputOptions={{ min: 0 }} + onInput={(e) => { + filters.update((f) => { + // @ts-ignore + f.draw.abcRateS = + // @ts-ignore + +e.target.value; + return f; + }); + }} + /> + </div> + </div> + + <Switch + label={"While posting data, filter numbers with repeating digits"} + checked={$filters.draw + ?.filterDuplicatesWhilePosting} + onChange={(checked) => { + filters.update((f) => { + // @ts-ignore + f.draw.filterDuplicatesWhilePosting = + checked; + return f; + }); + }} + /> + + <div + class="flex gap-2 items-center flex-col md:flex-row flex-wrap" + > + <div class="w-max"> + <Pill + text={`ABC | All - (${getSize("abc")}) | Non-repeating - (${getSizeRemovingNumbersWithRepeatingDigits("abc")})`} + theme={"darkSky"} + /> + </div> + + <div class="w-max"> + <Pill + text={`AB | All - (${getSize("ab")}) | Non-repeating - (${getSizeRemovingNumbersWithRepeatingDigits("ab")})`} + theme={"darkSky"} + /> + </div> + <div class="w-max"> + <Pill + text={`Can post data for ${postUsers.length} users`} + theme={"slate"} + /> + </div> + + {#if hasAlreadyPosted} + <div class="w-max"> + <Pill + text={`Already posted for this draw`} + theme={"green"} + /> + </div> + {/if} + </div> + + <div + class="flex gap-8 items-center justify-between" + > + {#if !hasAlreadyPosted || posting} + <Button + disabled={!!hasTimePassed || posting} + type="submit" + > + {hasTimePassed + ? "Time has passed for this draw" + : posting + ? "Posting data..." + : "Begin posting data for draw"} + </Button> + {:else} + <AlertDialog.Root> + <AlertDialog.Trigger type="button"> + <Button + disabled={!!hasTimePassed || + posting} + type="button" + > + Post data for draw + </Button> + </AlertDialog.Trigger> + <AlertDialog.Content> + <AlertDialog.Header> + <AlertDialog.Title> + Post data again + </AlertDialog.Title> + <AlertDialog.Description> + Are you sure you want to + post data again for this + draw? This will post more + entries on top of the + existing ones. + </AlertDialog.Description> + </AlertDialog.Header> + <AlertDialog.Footer> + <AlertDialog.Cancel + type="button" + > + No, cancel + </AlertDialog.Cancel> + <AlertDialog.Action + on:click={triggerPostForm} + > + Yes, start posting data + </AlertDialog.Action> + </AlertDialog.Footer> + </AlertDialog.Content> + </AlertDialog.Root> + {/if} + + {#if previewData} + <Button + variant={"secondary"} + on:click={reRenderPreviewPostData} + > + Regenerate Preview Data + </Button> + {:else} + <Button + variant={"primaryInverted"} + on:click={startPreviewingData} + > + Preview data + </Button> + {/if} + </div> + </form> + + {#if !refreshingPayload && previewData} + <div class="w-full h-0.5 border-t-2"></div> + <Title size={"h3"} text={`Data Summary Preview`} /> + <PostDataSummarySection + {api} + bind:payload={payloadForPostingData} + /> + {/if} + {/if} + + {#if controllerState.matchingNumbers.size > 0 && !isChangingControllerState} + <Line /> + <Title size={"h3"} text={"Matching numbers"} /> + <div class="w-full max-h-[40vh] overflow-y-auto p-2"> + {#each ["abc", ...trackingLexiCodeNumbersKeys.filter((e) => e !== "abc")] as key} + {#if doesControllerStateValueHaveValidSize(key)} + <div + class="w-full flex flex-col gap-4 my-2" + > + <Title + size={"h4"} + text={`${key.toUpperCase()} | All - (${getSize(key)}) | Non-repeating - (${getSizeRemovingNumbersWithRepeatingDigits(key)})`} + /> + <div class="flex flex-wrap gap-2"> + {#each getIterator(key) as item} + <Pill + smallerText + text={item} + theme={"slate"} + /> + {/each} + </div> + <Line /> + </div> + {/if} + {/each} + </div> + <Line /> + {#each [null, "ab", "abc"] as lc} + <div + class="w-full flex gap-4 items-center justify-between" + > + <Title + size={"h3"} + text={(lc !== null + ? lc.toUpperCase() + : "") + + " Message" + + (!lc + ? "" + : ` | (${getSize(lc)}) | (${getSizeRemovingNumbersWithRepeatingDigits(lc)})`)} + /> + <div class="w-full max-w-xs"> + <Input + value={copyCounts + ? (copyCounts[lc ?? "message"] ?? + "") + : ""} + label={"Copy count"} + placeholder={`For ${lc ?? ""} message`} + onInput={(e) => { + // @ts-ignore + const val = e.target.value; + const key = lc ?? "message"; + copyCounts[key] = val; + }} + /> + </div> + </div> + <div class="relative"> + <textarea + class="w-full h-48 p-2 outline-none bg-sky-50 border-2 border-sky-500 text-sky-600 rounded-md" + value={getParsedMessageFromMatchingNumbers( + lc, + )} + /> + <button + class="absolute top-2 right-5 p-2 rounded-md border bg-emerald-100 text-emerald-600 border-emerald-600 cursor-pointer shadow-md transition-colors duration-100 hover:bg-emerald-200" + aria-label="Copy to clipboard" + on:click={() => { + navigator.clipboard.writeText( + getParsedMessageFromMatchingNumbers( + lc, + copyCounts[lc ?? "message"], + ), + ); + toast.success( + "Message copied to clipboard", + ); + }} + > + <IconPhClipboardTextLight /> + </button> + </div> + {/each} + {/if} + </div> + </div> + {/if} + </div> +</div> diff --git a/src/routes/admin/fs-table.svelte b/src/routes/admin/fs-table.svelte new file mode 100755 index 0000000..8602521 --- /dev/null +++ b/src/routes/admin/fs-table.svelte @@ -0,0 +1,426 @@ +<script lang="ts"> + import Input from "$lib/components/atoms/input.svelte"; + import type { ReducedFinalSheetRow } from "$lib/utils/data.types"; + import { fsTableOptions } from "./fs.stores"; + import { + flexRender, + createColumnHelper, + createSvelteTable, + type SortDirection, + } from "@tanstack/svelte-table"; + import Pagination from "$lib/components/atoms/pagination.svelte"; + import Select from "$lib/components/atoms/select.svelte"; + import clsx from "clsx"; + import CenteredSpinner from "$lib/components/molecules/centered-spinner.svelte"; + import { getAllMatchingChildNumbersObject } from "$lib/utils/finalsheet.utils"; + import { + setCopyCountsToLS, + getCopyCountsFromLS, + type CopyCounts, + } from "./copy-counts.ls"; + import FsModal from "./fs-modal.svelte"; + import type { TRPC } from "$lib/trpc/trpc"; + + export let api: TRPC; + export let rowCount: number; + export let data: ReducedFinalSheetRow[]; + let copyCounts: CopyCounts = {}; + let copyCountsUpdaterTimeout: NodeJS.Timeout; + $: { + copyCountsUpdaterTimeout = setTimeout(() => { + setCopyCountsToLS(copyCounts); + }, 1000); + } + // export let fetchFSRow: (num: string) => Promise<void>; + let affectingRowVisibility = false; + type MatchingNumbers = Set<string>; + const trackingLexiCodeNumbersKeys = [ + "a", + "ab", + "abc", + "+abc", + "a+bc", + "ab+c", + ]; + let isChangingControllerState = false; + let controllerState = { + minPrize: 0, + maxPrize: 0, + filterOnlyRowsWithNo4DigitsBooked: false, + matchingNumbers: new Set() as MatchingNumbers, + a: new Set() as MatchingNumbers, + ab: new Set() as MatchingNumbers, + abc: new Set() as MatchingNumbers, + "+abc": new Set() as MatchingNumbers, + "a+bc": new Set() as MatchingNumbers, + "ab+c": new Set() as MatchingNumbers, + }; + let sheetType: "first" | "second" = "first"; + let updatingPaginationState = false; + let originalRowCount = 0; + const minPageSize = 100; + + let pagination = { pageSize: minPageSize, pageIndex: 0 }; + let globalFilter = ""; + + const getParsedMessageFromMatchingNumbers = ( + lexiCode: string | null, + _copyCount: number = 1, + ) => { + let out = ""; + if (lexiCode) { + // @ts-ignore + for (const each of controllerState[lexiCode]) { + out += `${each}.`; + } + } else { + for (const lc of ["abc", "+abc", "a+bc", "ab+c"]) { + // @ts-ignore + for (const each of controllerState[lc]) { + out += `${each}.`; + } + } + } + if (_copyCount > 1) { + let out2 = ""; + for (let i = 0; i < _copyCount; i++) { + out2 += out; + } + out = out2; + } + // remove the last dot + return out.substring(0, out.length - 1); + }; + + const onControllerStateApply = () => { + affectingRowVisibility = true; + updatingPaginationState = true; + isChangingControllerState = true; + let matching = [] as ReducedFinalSheetRow[]; + const min = Number(controllerState.minPrize); + const max = Number(controllerState.maxPrize); + controllerState.matchingNumbers.clear(); + controllerState.a.clear(); + controllerState.ab.clear(); + controllerState.abc.clear(); + controllerState["+abc"].clear(); + controllerState["a+bc"].clear(); + controllerState["ab+c"].clear(); + if (!isNaN(min) && !isNaN(max)) { + for (const row of data) { + if ( + min < 0 || + max < 0 || + (row.prize[sheetType] >= min && row.prize[sheetType] <= max) + ) { + if ( + controllerState.filterOnlyRowsWithNo4DigitsBooked && + row.frequencies.abcd[sheetType] > 0 + ) { + continue; + } + matching.push(row); + controllerState.matchingNumbers.add(row.number); + const found = getAllMatchingChildNumbersObject(row.number); + for (const lexiCode of trackingLexiCodeNumbersKeys) { + // @ts-ignore + // if (row.frequencies[lexiCode][sheetType] > 0) { + // @ts-ignore + controllerState[lexiCode].add(found[lexiCode]); + // } + } + } + } + } else { + matching = controllerState.filterOnlyRowsWithNo4DigitsBooked + ? data.filter((r) => r.frequencies.abcd[sheetType] === 0) + : data; + } + rowCount = matching.length; + fsTableOptions.update((old) => ({ + ...old, + data: matching, + state: { + ...old.state, + // @ts-ignore + pagination: { ...old.state?.pagination, pageIndex: 0 }, + }, + })); + controllerState = controllerState; + setTimeout(() => { + updatingPaginationState = false; + affectingRowVisibility = false; + isChangingControllerState = false; + }, 100); + }; + + const getSortingSymbol = (isSorted: boolean | SortDirection) => { + return isSorted === "asc" ? "▲" : isSorted === "desc" ? "▼" : ""; + }; + + const setCurrentPage = (page: number) => { + fsTableOptions.update((state) => ({ + ...state, + state: { + ...state.state, + pagination: { + pageIndex: page, + pageSize: state.state?.pagination?.pageSize ?? minPageSize, + }, + }, + })); + }; + + const setPaginationPageSize = (size: number) => { + updatingPaginationState = true; + setCurrentPage(0); + fsTableOptions.update((state) => ({ + ...state, + state: { + ...state.state, + pagination: { + pageSize: size, + pageIndex: state.state?.pagination?.pageIndex ?? 0, + }, + }, + })); + setTimeout(() => { + updatingPaginationState = false; + }, 100); + }; + + const setGlobalFilter = (filter: string) => { + setPaginationPageSize($table.getState().pagination.pageSize); + globalFilter = filter; + fsTableOptions.update((p) => { + return { ...p, state: { ...p.state } }; + }); + rowCount = $table.getFilteredRowModel().rows.length; + }; + + const colHelper = createColumnHelper<ReducedFinalSheetRow>(); + const columns = [ + colHelper.display({ + id: "number", + cell: (info) => info.row.original.number, + header: "No", + // @ts-ignore + accessorFn: (r) => r.number.toString(), + }), + colHelper.display({ + id: "frequency", + cell: (info) => info.row.original.frequency[sheetType], + header: "Booked Qt.", + // @ts-ignore + accessorFn: (r) => r.frequency[sheetType].toString(), + }), + + colHelper.display({ + id: "rate", + cell: (info) => info.row.original.rate[sheetType], + header: "Rate", + // @ts-ignore + accessorFn: (r) => r.rate[sheetType].toString(), + }), + colHelper.display({ + id: "prize", + cell: (info) => info.row.original.prize[sheetType], + header: "Prize", + // @ts-ignore + accessorFn: (r) => r.prize[sheetType].toString(), + }), + colHelper.display({ + id: "profit", + cell: (info) => info.row.original.profit[sheetType], + header: "Profit", + // @ts-ignore + accessorFn: (r) => r.profit[sheetType].toString(), + sortingFn: (a, b) => { + return a.original.profit[sheetType] < + b.original.profit[sheetType] + ? -1 + : 1; + }, + }), + ]; + + const table = createSvelteTable(fsTableOptions); + + const typeAnnotateComponent = (a: any) => { + return a as any; + }; + + let searchTimeOut: NodeJS.Timeout; + const handleEntrySearch = (e: any) => { + clearTimeout(searchTimeOut); + searchTimeOut = setTimeout(() => { + fsTableOptions.update((opts: any) => { + return { + ...opts, + state: { + ...opts.state, + columnFilters: [ + { id: "number", value: e.target.value }, + ], + }, + }; + }); + }, 300); + }; + + onMount(() => { + fsTableOptions.update((p: any) => { + return { + ...p, + columns, + state: { + ...p.state, + pagination, + columnFilters: [], + }, + }; + }); + originalRowCount = rowCount; + copyCounts = getCopyCountsFromLS(); + }); +</script> + +<!-- INFO: The modal --> +<FsModal + {api} + bind:controllerState + bind:copyCounts + bind:isChangingControllerState + {onControllerStateApply} +/> + +<!-- INFO: The table itself --> +<div class="w-full text-black"> + <div class="my-2 flex w-full justify-between items-center"> + <div + class="flex justify-between flex-col w-full md:flex-row md:max-w-xs gap-2" + > + <Select + fullWidth + label={"Row count"} + options={[100, 250, 500, 1000].map((n) => { + return { + id: n.toString(), + label: n.toString(), + value: n.toString(), + }; + })} + onSelect={(e) => { + // @ts-ignore + const chosen = Number(e.target.value); + setPaginationPageSize(chosen); + }} + /> + <Select + fullWidth + label={"Sheet Type"} + options={[ + { label: "First", value: "first", id: 1 }, + { label: "Second", value: "second", id: 2 }, + ]} + onSelect={(e) => { + affectingRowVisibility = true; + // @ts-ignore + const chosen = e.target.value; + sheetType = chosen; + setTimeout(() => { + affectingRowVisibility = false; + }, 100); + }} + /> + </div> + <div class="flex justify-end max-w-xs"> + <Input + placeholder={"Search"} + fieldWidth={"full"} + onInput={handleEntrySearch} + /> + </div> + </div> + + {#if affectingRowVisibility} + <CenteredSpinner /> + {:else} + <div class="w-full overflow-y-auto h-[35.7rem]"> + <table class="w-full"> + <thead> + {#each $table.getHeaderGroups() as headerGroup} + <tr> + {#each headerGroup.headers as header} + <th + class="p-2 px-4 border sticky top-0 bg-sky-50 text-sky-700" + colSpan={header.colSpan} + > + {#if !header.isPlaceholder} + <button + class={clsx( + "flex outline-none justify-center items-center gap-1 w-full h-full", + )} + disabled={!header.column.getCanSort()} + on:click={header.column.getToggleSortingHandler()} + > + <svelte:component + this={typeAnnotateComponent( + flexRender( + header.column.columnDef + .header, + header.getContext(), + ), + )} + /> + <span + >{getSortingSymbol( + header.column.getIsSorted(), + )}</span + > + </button> + {/if} + </th> + {/each} + </tr> + {/each} + </thead> + <tbody> + {#each $table.getRowModel().rows as row} + <tr + class="cursor-pointer hover:bg-slate-50 transition-colors duration-100" + on:click={() => { + // fetchFSRow(row.original.number); + }} + > + {#each row.getVisibleCells() as cell} + <td class="p-1 px-4 border text-center"> + <svelte:component + this={typeAnnotateComponent( + flexRender( + cell.column.columnDef.cell, + cell.getContext(), + ), + )} + /> + </td> + {/each} + </tr> + {/each} + </tbody> + </table> + </div> + {/if} + + {#if !updatingPaginationState} + <div class="w-full py-2"> + <Pagination + count={rowCount} + page={$table.getState().pagination.pageIndex + 1} + perPage={$table.getState().pagination.pageSize} + siblingCount={1} + setPage={setCurrentPage} + /> + </div> + {/if} +</div> diff --git a/src/routes/admin/fs.stores.ts b/src/routes/admin/fs.stores.ts new file mode 100755 index 0000000..9bee476 --- /dev/null +++ b/src/routes/admin/fs.stores.ts @@ -0,0 +1,28 @@ +import { writable } from "svelte/store"; +import type { Draw, ReducedFinalSheetRow } from "$lib/utils/data.types"; +import { + type TableOptions, + getCoreRowModel, + getFilteredRowModel, + getPaginationRowModel, + getSortedRowModel, +} from "@tanstack/svelte-table"; + +export const fsTableOptions = writable<TableOptions<ReducedFinalSheetRow>>({ + data: [], + columns: [], + getCoreRowModel: getCoreRowModel(), + getSortedRowModel: getSortedRowModel(), + getFilteredRowModel: getFilteredRowModel(), + getPaginationRowModel: getPaginationRowModel(), + enableGlobalFilter: false, +}); + +export const setFSTableData = (data: ReducedFinalSheetRow[]) => { + fsTableOptions.update((state) => ({ ...state, data })); +}; + +export const filters = writable<{ date: string; draw: Draw | undefined }>({ + date: new Date().toISOString().split("T")[0], + draw: undefined, +}); diff --git a/src/routes/admin/post-data-config/+page.svelte b/src/routes/admin/post-data-config/+page.svelte new file mode 100644 index 0000000..0eaf32b --- /dev/null +++ b/src/routes/admin/post-data-config/+page.svelte @@ -0,0 +1,97 @@ +<script lang="ts"> + import { trpc } from "$lib/trpc/trpc"; + import toast from "svelte-french-toast"; + import DataFetchConfig from "./data-fetch-config.svelte"; + import type { Draw } from "$lib/utils/data.types"; + import Loader from "$lib/components/molecules/loader.svelte"; + import AddPostUserModal from "./add-post-user-modal.svelte"; + import PostUserControls from "./post-user-controls.svelte"; + import Title from "$lib/components/atoms/title.svelte"; + + const api = trpc(); + + let drawsQ = api.draw.getAllDraws.createQuery(undefined, { + refetchOnWindowFocus: false, + retry: 3, + }); + $: isLoading = $drawsQ.isLoading || $drawsQ.isFetching; + + let updateDrawFilterM = api.draw.savePresetInfoForDraws.createMutation({ + onSuccess: (d) => { + console.log(d); + toast("Saved successfully."); + }, + onError: (e) => { + console.error(e); + toast( + "An error occurred while fetching data. Try again after a page refresh.", + ); + }, + }); + + function updateDrawFilter(draws: Draw[]) { + $updateDrawFilterM.mutateAsync({ draws }); + } + + let dealersQ = api.apiUser.getAllDealersPostUserFormat.createQuery( + undefined, + { + refetchOnWindowFocus: false, + retry: 3, + }, + ); + $: dealersloading = $dealersQ.isLoading || $dealersQ.isFetching; + + function refreshUserList() { + $dealersQ.refetch(); + } +</script> + +<div class="w-full grid place-items-center p-4"> + {#if isLoading} + <div class="w-full h-[80vh] grid place-items-center"> + <Loader color="sky" /> + </div> + {:else} + <div class="w-full flex flex-col gap-4 max-w-8xl p-2 sm:p-4"> + <div class="flex flex-col-reverse lg:grid gap-8 lg:grid-cols-3"> + <!-- the draw presets list/grid --> + <div class="col-span-2"> + <DataFetchConfig + draws={$drawsQ.data} + fetching={false} + {updateDrawFilter} + /> + </div> + + <!-- the user list --> + <div class="col-span-1 w-full flex flex-col gap-8"> + <div + class="flex gap-4 flex-row justify-between items-center w-full" + > + <Title text="Users" size="h2" /> + {#if !dealersloading && !!$dealersQ.data} + <AddPostUserModal + users={$dealersQ.data ?? []} + {api} + {refreshUserList} + /> + {/if} + </div> + + {#if dealersloading} + <div class="w-full h-[80vh] grid place-items-center"> + <Loader color="sky" /> + </div> + {:else} + {#each $dealersQ.data ?? [] as user} + {#if user.postData} + <PostUserControls {api} {user} /> + {/if} + {/each} + {/if} + </div> + </div> + </div> + {/if} +</div> diff --git a/src/routes/admin/post-data-config/add-post-user-modal.svelte b/src/routes/admin/post-data-config/add-post-user-modal.svelte new file mode 100644 index 0000000..0e675cf --- /dev/null +++ b/src/routes/admin/post-data-config/add-post-user-modal.svelte @@ -0,0 +1,102 @@ +<script lang="ts"> + import Button from "$lib/components/atoms/button.svelte"; + import * as Dialog from "$lib/components/ui/dialog"; + import { buttonVariants } from "$lib/components/ui/button"; + import type { ApiPostUser } from "$lib/utils/data.types"; + import clsx from "clsx"; + import Input from "$lib/components/atoms/input.svelte"; + import Title from "$lib/components/atoms/title.svelte"; + import type { TRPC } from "$lib/trpc/trpc"; + import toast from "svelte-french-toast"; + import { cn } from "$lib/utils"; + + export let api: TRPC; + export let refreshUserList: () => void; + export let users: ApiPostUser[]; + + let query = ""; + let changedUsersIds: Set<string> = new Set(); + + let saveChangesM = api.apiUser.setPostDataFlagForUser.createMutation({ + onSuccess: () => { + toast.success("Changes saved successfully"); + changedUsersIds = new Set(); + refreshUserList(); + }, + onError: (error) => { + toast.error(error.message); + }, + }); + + $: renderUsers = users.filter((u) => { + if (query === "") return true; + return ( + u.userName.toLowerCase().includes(query) || + u.userId.toLowerCase().includes(query) + ); + }); + + function onSave() { + const usersToPostData = users.filter((u) => + changedUsersIds.has(u.userId), + ); + console.log(usersToPostData); + if (usersToPostData.length < 1) { + return; + } + $saveChangesM.mutateAsync({ users: usersToPostData }); + } +</script> + +<Dialog.Root> + <Dialog.Trigger class={cn(buttonVariants(), "w-max")}> + Manager Users + </Dialog.Trigger> + <Dialog.Content class="sm:max-w-[425px]"> + <Dialog.Header> + <Title text="Select Users" size="h3" /> + <Dialog.Description> + Select the user with whom you want to post data with + </Dialog.Description> + </Dialog.Header> + + <Input placeholder="Search User" bind:value={query} /> + + <div class="grid gap-2 overflow-y-auto max-h-72 border rounded-md p-2"> + {#each renderUsers as user} + <button + class={clsx( + "rounded-md hover:bg-sky-200 text-sky-800 font-medium px-2 py-1 cursor-pointer transition-colors duration-100 border capitalize", + user.postData + ? "bg-sky-300 border-sky-600" + : "bg-sky-50 border-sky-200", + )} + on:click={() => { + user.postData = !user.postData; + if ( + !changedUsersIds.has(user.userId) || + user.postData + ) { + changedUsersIds.add(user.userId); + } else if ( + !!user.postData && + changedUsersIds.has(user.userId) + ) { + changedUsersIds.delete(user.userId); + } + }} + > + {user?.userName} - {user?.userId} + </button> + {/each} + </div> + <Dialog.Footer> + <Button + otherOptions={{ type: "submit" }} + text="Save" + intent="primary" + onClick={onSave} + /> + </Dialog.Footer> + </Dialog.Content> +</Dialog.Root> diff --git a/src/routes/admin/post-data-config/data-fetch-config.svelte b/src/routes/admin/post-data-config/data-fetch-config.svelte new file mode 100644 index 0000000..9adf7cf --- /dev/null +++ b/src/routes/admin/post-data-config/data-fetch-config.svelte @@ -0,0 +1,86 @@ +<script lang="ts"> + import { Button } from "$lib/components/ui/button"; + import { Input } from "$lib/components/ui/input"; + import { Label } from "$lib/components/ui/label"; + import Title from "$lib/components/atoms/title.svelte"; + import type { Draw } from "$lib/utils/data.types"; + import Switch from "$lib/components/atoms/switch.svelte"; + import { filters } from "./stores"; + + export let updateDrawFilter: (draws: Draw[]) => void; + export let draws: Draw[] = []; + export let fetching: boolean = false; + + function saveDrawFilterChanges() { + console.log(draws); + updateDrawFilter(draws); + } + + onMount(() => { + filters.update((d) => ({ ...d, draw: draws[0] })); + }); +</script> + +<div class="flex flex-col w-full gap-8"> + <div class="flex justify-between items-center gap-4 flex-row"> + <Title text="Draw Presets" size="h2" /> + + <Button disabled={fetching} on:click={() => saveDrawFilterChanges()}> + Save all changes + </Button> + </div> + + <div + class="w-full flex flex-col gap-4 lg:grid md:grid-cols-2 2xl:grid-cols-3" + > + {#each draws as draw} + <div class="w-full flex flex-col gap-4 p-4 rounded-md border"> + <Title text={draw.title} size="h4" /> + + <div class="flex gap-4 w-full flex-col md:flex-row"> + <div class="w-full space-y-2"> + <Label>2 Digit rate (F)</Label> + <Input + bind:value={draw.abRateF} + type={"number"} + min={0} + /> + </div> + <div class="w-full space-y-2"> + <Label>2 Digit rate (S)</Label> + <Input + bind:value={draw.abRateS} + type={"number"} + min={0} + /> + </div> + </div> + + <div class="flex gap-4 w-full flex-col md:flex-row"> + <div class="w-full space-y-2"> + <Label>3 Digit rate (F)</Label> + <Input + bind:value={draw.abcRateF} + type={"number"} + min={0} + /> + </div> + <div class="w-full space-y-2"> + <Label>3 Digit rate (S)</Label> + <Input + bind:value={draw.abcRateS} + type={"number"} + min={0} + /> + </div> + </div> + + <Switch + label={"Remove numbers that have repeating digits"} + bind:checked={draw.filterDuplicatesWhilePosting} + /> + <div class="w-full my-4"></div> + </div> + {/each} + </div> +</div> diff --git a/src/routes/admin/post-data-config/post-user-controls.svelte b/src/routes/admin/post-data-config/post-user-controls.svelte new file mode 100644 index 0000000..b00c1dd --- /dev/null +++ b/src/routes/admin/post-data-config/post-user-controls.svelte @@ -0,0 +1,23 @@ +<script lang="ts"> + import Title from "$lib/components/atoms/title.svelte"; + import type { TRPC } from "$lib/trpc/trpc"; + import type { ApiPostUser } from "$lib/utils/data.types"; + import { UserIcon } from "lucide-svelte"; + import SessionVerifier from "./session-verifier.svelte"; + + export let user: ApiPostUser; + export let api: TRPC; +</script> + +<div + class="flex flex-col gap-4 p-4 py-6 md:p-6 items-center w-full border-2 rounded-lg" +> + <div + class="grid place-items-center p-4 rounded-full bg-indigo-50 text-indigo-600 w-max" + > + <UserIcon class="w-8 h-auto" /> + </div> + <Title text={`${user.userName} - ${user.userId}`} size={"h3"} /> + + <SessionVerifier {api} {user} /> +</div> diff --git a/src/routes/admin/post-data-config/session-verifier.svelte b/src/routes/admin/post-data-config/session-verifier.svelte new file mode 100755 index 0000000..6f382ca --- /dev/null +++ b/src/routes/admin/post-data-config/session-verifier.svelte @@ -0,0 +1,72 @@ +<script lang="ts"> + import Pill from "$lib/components/atoms/pill.svelte"; + import type { trpc } from "$lib/trpc/trpc"; + import { CheckIcon, LogOutIcon } from "lucide-svelte"; + import SetNewSessionForm from "./set-new-session-form.svelte"; + import type { ApiPostUser } from "$lib/utils/data.types"; + import { Button } from "$lib/components/ui/button"; + + export let user: ApiPostUser; + export let api: ReturnType<typeof trpc>; + let sOk = api.apiAuth.isApiSessionValid.createQuery( + { checkingUserSession: true, userId: user.id }, + { refetchOnWindowFocus: false, refetchInterval: false, retry: 0 }, + ); + $: isLoading = $sOk.isLoading || $sOk.isFetching; + $: isApiSessionValid = !isLoading && $sOk.data?.valid === true; + + let logoutUserM = api.apiAuth.logoutUser.createMutation({ + onSuccess: () => { + $sOk.refetch(); + }, + }); + + const onSuccessfulLogin = () => { + $sOk.refetch(); + }; + + function logoutUser() { + $logoutUserM.mutateAsync({ userId: user.id }); + } + function checkSession() { + $sOk.refetch(); + } +</script> + +<div class="flex items-center justify-between gap-2"> + {#if isLoading} + <Pill text={"Verifying..."} theme={"slate"} /> + {:else if isApiSessionValid} + <div class="flex flex-col gap-2 items-center"> + <div + class="flex items-center gap-2 px-4 p-2 rounded-full bg-emerald-50 text-emerald-500 w-max justify-center" + > + Active + <CheckIcon class="w-6 h-auto" /> + </div> + <div class="items-center flex flex-row gap-2 w-full"> + <div class="flex items-center gap-2"> + <Button + variant="primaryInverted" + on:click={() => checkSession()} + > + Check + </Button> + + <Button + variant="secondary" + on:click={() => logoutUser()} + class="flex items-center gap-2" + > + Logout + <LogOutIcon class="w-4 h-auto" /> + </Button> + </div> + </div> + </div> + {:else if !isLoading && !isApiSessionValid} + <SetNewSessionForm {user} {api} {onSuccessfulLogin} /> + {:else} + <Pill text={"invalid"} theme={"rose"} /> + {/if} +</div> diff --git a/src/routes/admin/post-data-config/set-new-session-form.svelte b/src/routes/admin/post-data-config/set-new-session-form.svelte new file mode 100755 index 0000000..7b058f3 --- /dev/null +++ b/src/routes/admin/post-data-config/set-new-session-form.svelte @@ -0,0 +1,110 @@ +<script lang="ts"> + import Button from "$lib/components/atoms/button.svelte"; + import Input from "$lib/components/atoms/input.svelte"; + import type { TRPC } from "$lib/trpc/trpc"; + import type { ApiPostUser } from "$lib/utils/data.types"; + import toast from "svelte-french-toast"; + import { onMount } from "svelte"; + + export let api: TRPC; + export let user: ApiPostUser; + export let onSuccessfulLogin: () => void; + + let signingIn = false; + let captchaAnswer = ""; + + let getNewSessionM = api.apiAuth.getNewSession.createMutation({ + onSuccess: (o) => { + signingIn = false; + if (!o.success) { + for (const each of o.errors) { + toast.error(each.message); + } + return; + } + toast.success("Successfully authenticated", { + duration: 1000 * 10, + }); + onSuccessfulLogin(); + }, + onError: (e) => { + console.log(e); + signingIn = false; + toast.error( + "An error occured while authenticating, please try again later", + ); + }, + }); + + let captchaImage = ""; + let captchaId = ""; + + let captchaQ = api.apiAuth.getCaptcha.createMutation({ + onSuccess: (d) => { + captchaId = d.id; + captchaImage = d.image; + }, + onError: (e) => { + toast.error( + "An error occured while loading captcha, please try again later", + ); + }, + }); + + $: fetchingCaptcha = $captchaQ.isLoading; + + const onFormSubmit = async () => { + if (captchaAnswer.length !== 4) { + toast.error("Captcha answer must be 4 characters long"); + return; + } + if ($captchaQ.data?.id) { + signingIn = true; + $getNewSessionM.mutateAsync({ + captchaId: $captchaQ.data?.id, + captchaAnswer, + userId: user.id, + }); + } else { + toast.error("Captcha not loaded, refresh and try again"); + } + }; + + onMount(() => { + $captchaQ.mutateAsync(); + }); +</script> + +<form + class="flex flex-col gap-4 w-full" + on:submit|preventDefault={onFormSubmit} +> + {#if !fetchingCaptcha} + <img + class="w-64 h-16 rounded-md" + src={`data:image/jpeg;base64,${captchaImage}`} + alt={"Captcha"} + /> + {:else} + <div class="w-64 h-16 rounded-md bg-gray-200 animate-pulse"></div> + {/if} + <div class="gap-2 flex items-center"> + <input hidden name="captchaId" value={captchaId} /> + <Input + bind:value={captchaAnswer} + name={"captchaAnswer"} + placeholder={"Captcha Answer"} + otherInputOptions={{ + required: true, + minLength: 4, + maxLength: 4, + }} + /> + <Button + disabled={signingIn} + text={signingIn ? "Logging in..." : "Login"} + intent={signingIn ? "ghost" : "primary"} + otherOptions={{ type: "submit" }} + /> + </div> +</form> diff --git a/src/routes/admin/post-data-config/stores.ts b/src/routes/admin/post-data-config/stores.ts new file mode 100644 index 0000000..bed5201 --- /dev/null +++ b/src/routes/admin/post-data-config/stores.ts @@ -0,0 +1,43 @@ +import type { + PostDataEntry, + PostDataHistoryFilters, +} from "$lib/utils/data.types"; +import { writable } from "svelte/store"; +import { + type TableOptions, + getCoreRowModel, + getFilteredRowModel, + getPaginationRowModel, + getSortedRowModel, +} from "@tanstack/svelte-table"; + +export const filters = writable<PostDataHistoryFilters>({ + date: new Date().toISOString().split("T")[0], + draw: { + id: "", + title: "", + closeTime: "", + filterDuplicatesWhilePosting: false, + drawType: 0, + adminId: 0, + abRateF: 0, + abRateS: 0, + abcRateF: 0, + abcRateS: 0, + }, +}); + +export const postDataTableOptions = writable<TableOptions<PostDataEntry>>({ + data: [], + columns: [], + getCoreRowModel: getCoreRowModel(), + getSortedRowModel: getSortedRowModel(), + getFilteredRowModel: getFilteredRowModel(), + getPaginationRowModel: getPaginationRowModel(), + enableGlobalFilter: true, + // globalFilterFn: fuzzyFilter, +}); + +export const setPostDataTableData = (data: PostDataEntry[]) => { + postDataTableOptions.update((state) => ({ ...state, data: data.reverse() })); +}; diff --git a/src/routes/admin/post-data-history/+page.svelte b/src/routes/admin/post-data-history/+page.svelte new file mode 100644 index 0000000..4f9c617 --- /dev/null +++ b/src/routes/admin/post-data-history/+page.svelte @@ -0,0 +1,177 @@ +<script lang="ts"> + import { trpc } from "$lib/trpc/trpc"; + import toast from "svelte-french-toast"; + import type { ApiPostUser, PostDataEntry } from "$lib/utils/data.types"; + import { setPostDataTableData, postDataTableOptions } from "./stores"; + import Title from "$lib/components/atoms/title.svelte"; + import Select from "$lib/components/atoms/select.svelte"; + import PostDataView from "./post-data-view.svelte"; + import { Button } from "$lib/components/ui/button"; + import CenteredSpinner from "$lib/components/molecules/centered-spinner.svelte"; + import DataFetchingFilters from "./data-fetching-filters.svelte"; + import { filters } from "./stores"; + import Pill from "$lib/components/atoms/pill.svelte"; + + const api = trpc(); + + let showFilters = false; + let affectingRowVisibility = false; + let chosenUser: ApiPostUser | undefined = undefined; + let usersSelect = [] as { label: string; value: string }[]; + let postdata = { + data: [] as PostDataEntry[], + users: [] as ApiPostUser[], + posted: false, + }; + let chosenData = [] as PostDataEntry[]; + + let drawsQ = api.draw.getAllDraws.createQuery(undefined, { + refetchOnWindowFocus: false, + retry: 3, + }); + $: drawsLoading = $drawsQ.isLoading || $drawsQ.isFetching; + + function setChosenUser(e: any) { + affectingRowVisibility = true; + const chosen = e.target.value; + chosenUser = postdata.users.find((u) => u.userName === chosen); + setChosenData(); + setTimeout(() => { + affectingRowVisibility = false; + }, 200); + } + + function setChosenData() { + console.log(chosenUser, postdata.data.slice(0, 10)); + chosenData = postdata.data.filter( + (d) => d.userId === chosenUser?.userId, + ); + setPostDataTableData(chosenData); + } + + let fetchPostDataHistoryM = + api.postData.fetchPostDataHistory.createMutation({ + onSuccess: (d) => { + console.log(d); + if (d.data) { + postdata.data = d.data; + postdata.users = d.users; + usersSelect = d.users.map((u) => ({ + label: `${u.userName} - ${u.userId}`, + value: u.userName, + })); + chosenUser = d.users[0]; + } else if (!d.ok) { + toast.error(d.detail); + postdata = { data: [], users: [], posted: false }; + return; + } + toast("Data fetched successfully."); + setChosenData(); + }, + onError: (e) => { + console.log(e); + toast( + "An error occurred while fetching data. Try again after a page refresh.", + ); + }, + }); + + $: overallTotals = { + f: postdata.data.reduce((a, b) => a + b.first, 0), + s: postdata.data.reduce((a, b) => a + b.second, 0), + }; + + $: totals = { + f: chosenData.reduce((a, b) => a + b.first, 0), + s: chosenData.reduce((a, b) => a + b.second, 0), + }; + + const fetchHistory = async () => { + $fetchPostDataHistoryM.mutateAsync({ + date: $filters.date, + draw: $filters.draw!, + }); + }; +</script> + +<section class="w-full grid place-items-center p-8"> + <div + class="w-full flex flex-col gap-4 max-w-8xl p-6 lg:p-8 rounded-lg shadow-sm border" + > + <div + class="flex flex-col md:flex-row gap-4 justify-between w-full items-center" + > + <Title text={"Posted Data History"} size={"h1"} /> + <Button + variant={"primaryInverted"} + disabled={drawsLoading} + on:click={() => { + showFilters = !showFilters; + }} + > + Toggle filters + </Button> + </div> + + {#if drawsLoading} + <CenteredSpinner /> + {:else} + <DataFetchingFilters + bind:showFilters + draws={$drawsQ.data} + fetchDataFn={fetchHistory} + /> + {/if} + + {#if drawsLoading} + <CenteredSpinner /> + {:else} + <div class="flex gap-4 items-center flex-col md:flex-row"> + {#if chosenData.length > 0 && !$fetchPostDataHistoryM.isLoading} + <div class="w-full sm:max-w-64"> + <Select + fullWidth + label={"User's Data"} + options={usersSelect} + onSelect={setChosenUser} + /> + </div> + {/if} + </div> + + {#if $fetchPostDataHistoryM.isLoading} + <CenteredSpinner /> + {:else if chosenData.length > 0 && !affectingRowVisibility} + <PostDataView rowCount={chosenData.length} {chosenUser} /> + + <div class="flex w-full gap-2 flex-wrap"> + <Pill text={"Overall totals :"} theme={"sky"} /> + <Pill + text={`F rate : ${overallTotals.f}`} + theme={"slate"} + /> + <Pill + text={`S rate : ${overallTotals.s}`} + theme={"slate"} + /> + </div> + + <div class="flex w-full gap-2 flex-wrap"> + <Pill + text={`Totals for ${chosenUser?.userName} :`} + theme={"sky"} + /> + <Pill text={`F rate : ${totals.f}`} theme={"slate"} /> + <Pill text={`S rate : ${totals.s}`} theme={"slate"} /> + </div> + {:else} + <div class="flex justify-center items-center h-64"> + <p class="text-gray-500 text-lg"> + No history found for the selected date and draw. + </p> + </div> + {/if} + {/if} + </div> +</section> diff --git a/src/routes/admin/post-data-history/data-fetch-config.svelte b/src/routes/admin/post-data-history/data-fetch-config.svelte new file mode 100644 index 0000000..d3ec5b0 --- /dev/null +++ b/src/routes/admin/post-data-history/data-fetch-config.svelte @@ -0,0 +1,104 @@ +<script lang="ts"> + import Button from "$lib/components/atoms/button.svelte"; + import { Input } from "$lib/components/ui/input"; + import { Label } from "$lib/components/ui/label"; + import Title from "$lib/components/atoms/title.svelte"; + import { + zPostDataHistoryFilters, + type PostDataHistoryFilters, + type Draw, + } from "$lib/utils/data.types"; + import toast from "svelte-french-toast"; + import Switch from "$lib/components/atoms/switch.svelte"; + import { filters } from "./stores"; + + export let fetchDataFn: (filters: PostDataHistoryFilters) => Promise<void>; + export let updateDrawFilter: (draws: Draw[]) => void; + export let showFilters: boolean; + export let draws: Draw[] = []; + export let fetching: boolean = false; + + function saveDrawFilterChanges() { + console.log(draws); + updateDrawFilter(draws); + } + + function fetchOrGenerate() { + const _filters = { + date: $filters.date, + draw: $filters.draw, + } as PostDataHistoryFilters; + const parsed = zPostDataHistoryFilters.safeParse(_filters); + if (!parsed.success) { + toast.error("Please fill all the fields properly."); + return; + } + showFilters = false; + fetchDataFn(parsed.data); + } + + onMount(() => { + filters.update((d) => ({ ...d, draw: draws[0] })); + }); +</script> + +<div class="flex flex-col w-full gap-8 rounded-lg shadow-sm border p-8"> + <Title text="Draw Presets" size="h2" /> + + <div class="w-full flex flex-col gap-4 lg:grid xs:grid-cols-2"> + {#each draws as draw} + <div class="w-full flex flex-col gap-4"> + <Title text={draw.title} size="h4" /> + + <div class="flex gap-4 w-full flex-col md:flex-row"> + <div class="w-full space-y-2"> + <Label>2 Digit rate (F)</Label> + <Input + bind:value={draw.abRateF} + type={"number"} + min={0} + /> + </div> + <div class="w-full space-y-2"> + <Label>2 Digit rate (S)</Label> + <Input + bind:value={draw.abRateS} + type={"number"} + min={0} + /> + </div> + </div> + + <div class="flex gap-4 w-full flex-col md:flex-row"> + <div class="w-full space-y-2"> + <Label>3 Digit rate (F)</Label> + <Input + bind:value={draw.abcRateF} + type={"number"} + min={0} + /> + </div> + <div class="w-full space-y-2"> + <Label>3 Digit rate (S)</Label> + <Input + bind:value={draw.abcRateS} + type={"number"} + min={0} + /> + </div> + </div> + + <Switch + label={"Filter numbers with repeating digits"} + bind:checked={draw.filterDuplicatesWhilePosting} + /> + <div class="w-full my-4"></div> + </div> + {/each} + </div> + <Button + text={"Save changes"} + disabled={fetching} + onClick={() => saveDrawFilterChanges()} + /> +</div> diff --git a/src/routes/admin/post-data-history/data-fetching-filters.svelte b/src/routes/admin/post-data-history/data-fetching-filters.svelte new file mode 100755 index 0000000..650a790 --- /dev/null +++ b/src/routes/admin/post-data-history/data-fetching-filters.svelte @@ -0,0 +1,100 @@ +<script lang="ts"> + import { Button } from "$lib/components/ui/button"; + import Input from "$lib/components/atoms/input.svelte"; + import Line from "$lib/components/atoms/line.svelte"; + import Pill from "$lib/components/atoms/pill.svelte"; + import Select from "$lib/components/atoms/select.svelte"; + import type { Draw } from "$lib/utils/data.types"; + import toast from "svelte-french-toast"; + import { onMount } from "svelte"; + import { filters } from "./stores"; + + export let fetchDataFn: () => Promise<void>; + export let showFilters: boolean; + export let draws: Draw[] = []; + export let fetchingData: boolean = false; + + $: drawsCount = draws.length; + onMount(() => { + filters.update((f) => ({ ...f, draw: draws[0] })); + }); +</script> + +{#if drawsCount > 0 && showFilters} + <section class="flex flex-col md:flex-row gap-4 w-full"> + <Input + bind:value={$filters.date} + label={"Date"} + inputType={"date"} + placeholder={"Date"} + /> + <Select + defaultChosen={$filters.draw?.id} + fullWidth + label={"Draw"} + options={draws.map((e) => { + return { label: e.title, value: e.id, id: e.id }; + })} + onSelect={(e) => { + if (drawsCount > 0) { + filters.update((f) => ({ + ...f, + // @ts-ignore + draw: draws.find((d) => d.id === e.target.value), + })); + } + }} + /> + </section> + <div class="flex justify-end w-full"> + <Button + disabled={fetchingData} + on:click={async () => { + if ( + $filters.date.length < 1 || + !$filters.draw || + !$filters.draw.id + ) { + toast.error("Select all filters properly to fetch data"); + return; + } + showFilters = false; + toast("Fetching data for selected filters"); + await fetchDataFn(); + }} + > + Apply filters + </Button> + </div> +{:else if !showFilters} + <div + class="flex flex-col md:flex-row gap-4 items-center justify-between w-full" + > + <div class="flex w-full gap-2 flex-wrap"> + <Pill text={"Data Filters:"} theme={"sky"} /> + <Pill text={$filters.date} theme={"slate"} /> + <Pill text={$filters.draw?.title} theme={"slate"} /> + </div> + + <Button + variant={fetchingData ? "ghost" : "default"} + disabled={fetchingData} + on:click={async () => { + if ( + $filters.date.length < 1 || + !$filters.draw || + !$filters.draw.id + ) { + toast.error("Select all filters properly to fetch data"); + return; + } + showFilters = false; + toast("Fetching data for selected filters"); + await fetchDataFn(); + }} + > + {fetchingData ? "Fetching" : "Fetch data"} + </Button> + </div> +{/if} +<Line /> diff --git a/src/routes/admin/post-data-history/post-data-view.svelte b/src/routes/admin/post-data-history/post-data-view.svelte new file mode 100644 index 0000000..c46a95f --- /dev/null +++ b/src/routes/admin/post-data-history/post-data-view.svelte @@ -0,0 +1,233 @@ +<script lang="ts"> + import type { ApiPostUser, PostDataEntry } from "$lib/utils/data.types"; + import { + createColumnHelper, + createSvelteTable, + flexRender, + type SortDirection, + } from "@tanstack/svelte-table"; + import { postDataTableOptions } from "./stores"; + import Select from "$lib/components/atoms/select.svelte"; + import Input from "$lib/components/atoms/input.svelte"; + import { clsx } from "clsx"; + import Pagination from "$lib/components/atoms/pagination.svelte"; + + export let chosenUser: ApiPostUser | undefined = undefined; + + const minPageSize = 100; + + export let rowCount: number; + let updatingPaginationState = false; + let pagination = { pageSize: minPageSize, pageIndex: 0 }; + + const getSortingSymbol = (isSorted: boolean | SortDirection) => { + return isSorted === "asc" ? "▲" : isSorted === "desc" ? "▼" : ""; + }; + + const setCurrentPage = (page: number) => { + postDataTableOptions.update((state) => ({ + ...state, + state: { + ...state.state, + pagination: { + pageIndex: page, + pageSize: state.state?.pagination?.pageSize ?? minPageSize, + }, + }, + })); + }; + const setPaginationPageSize = (size: number) => { + updatingPaginationState = true; + setCurrentPage(0); + postDataTableOptions.update((state) => ({ + ...state, + state: { + ...state.state, + pagination: { + pageSize: size, + pageIndex: state.state?.pagination?.pageIndex ?? 0, + }, + }, + })); + setTimeout(() => { + updatingPaginationState = false; + }, 100); + }; + const colHelper = createColumnHelper<PostDataEntry>(); + const columns = [ + colHelper.display({ + id: "number", + cell: (info) => info.row.original.number, + header: "No", + // @ts-ignore + accessorFn: (r) => r.number.toString(), + }), + colHelper.display({ + id: "first", + cell: (info) => info.row.original.first, + header: "First", + // @ts-ignore + accessorFn: (r) => r.first.toString(), + }), + colHelper.display({ + id: "second", + cell: (info) => info.row.original.second, + header: "Second", + // @ts-ignore + accessorFn: (r) => r.second.toString(), + }), + colHelper.display({ + id: "user", + cell: (info) => chosenUser?.userName ?? "", + header: "User", + // @ts-ignore + accessorFn: (r) => chosenUser?.userName ?? "", + }), + ]; + + let searchTimeOut: NodeJS.Timeout; + const handleEntrySearch = (e: any) => { + clearTimeout(searchTimeOut); + searchTimeOut = setTimeout(() => { + postDataTableOptions.update((opts: any) => { + return { + ...opts, + state: { + ...opts.state, + columnFilters: [ + { id: "number", value: e.target.value }, + ], + }, + }; + }); + }, 300); + }; + + const typeAnnotateComponent = (a: any) => { + return a as any; + }; + + const table = createSvelteTable(postDataTableOptions); + + onMount(() => { + postDataTableOptions.update((p) => { + return { + ...p, + columns, + state: { ...p.state, pagination }, + }; + }); + setPaginationPageSize(minPageSize); + }); +</script> + +<!-- INFO: The table itself --> +<div class="w-full text-black"> + <div class="my-2 flex w-full justify-between items-center gap-4"> + <div class="flex justify-end md:max-w-xs w-full"> + <Input + label={"Search"} + placeholder={"Lookup numbers"} + fieldWidth={"full"} + onInput={handleEntrySearch} + /> + </div> + <div + class="flex justify-between flex-col w-full md:flex-row md:max-w-xs gap-2" + > + <Select + fullWidth + label={"Row count"} + options={[100, 250, 500, 1000].map((n) => { + return { + id: n.toString(), + label: n.toString(), + value: n.toString(), + }; + })} + onSelect={(e) => { + // @ts-ignore + const chosen = Number(e.target.value); + setPaginationPageSize(chosen); + }} + /> + </div> + </div> + + <div class="w-full overflow-y-auto h-[69vh]"> + <table class="w-full"> + <thead> + {#each $table.getHeaderGroups() as headerGroup} + <tr> + {#each headerGroup.headers as header} + <th + class="p-2 px-4 border sticky top-0 bg-sky-50 text-sky-700" + colSpan={header.colSpan} + > + {#if !header.isPlaceholder} + <button + class={clsx( + "flex outline-none justify-center items-center gap-1 w-full h-full", + )} + disabled={!header.column.getCanSort()} + on:click={header.column.getToggleSortingHandler()} + > + <svelte:component + this={typeAnnotateComponent( + flexRender( + header.column.columnDef + .header, + header.getContext(), + ), + )} + /> + <span + >{getSortingSymbol( + header.column.getIsSorted(), + )}</span + > + </button> + {/if} + </th> + {/each} + </tr> + {/each} + </thead> + <tbody> + {#each $table.getRowModel().rows as row} + <tr + class="cursor-pointer hover:bg-slate-50 transition-colors duration-100" + on:click={() => { + // fetchFSRow(row.original.number); + }} + > + {#each row.getVisibleCells() as cell} + <td class="p-1 px-4 border text-center"> + <svelte:component + this={typeAnnotateComponent( + flexRender( + cell.column.columnDef.cell, + cell.getContext(), + ), + )} + /> + </td> + {/each} + </tr> + {/each} + </tbody> + </table> + </div> + + {#if !updatingPaginationState} + <div class="w-full py-2"> + <Pagination + count={rowCount} + page={$table.getState().pagination.pageIndex + 1} + perPage={$table.getState().pagination.pageSize} + siblingCount={1} + setPage={setCurrentPage} + /> + </div> + {/if} +</div> diff --git a/src/routes/admin/post-data-history/stores.ts b/src/routes/admin/post-data-history/stores.ts new file mode 100644 index 0000000..d91e402 --- /dev/null +++ b/src/routes/admin/post-data-history/stores.ts @@ -0,0 +1,29 @@ +import type { Draw, PostDataEntry } from "$lib/utils/data.types"; +import { writable } from "svelte/store"; +import { + type TableOptions, + getCoreRowModel, + getFilteredRowModel, + getPaginationRowModel, + getSortedRowModel, +} from "@tanstack/svelte-table"; + +export const filters = writable<{ date: string; draw: Draw | undefined }>({ + date: new Date().toISOString().split("T")[0], + draw: undefined, +}); + +export const postDataTableOptions = writable<TableOptions<PostDataEntry>>({ + data: [], + columns: [], + getCoreRowModel: getCoreRowModel(), + getSortedRowModel: getSortedRowModel(), + getFilteredRowModel: getFilteredRowModel(), + getPaginationRowModel: getPaginationRowModel(), + enableGlobalFilter: true, + // globalFilterFn: fuzzyFilter, +}); + +export const setPostDataTableData = (data: PostDataEntry[]) => { + postDataTableOptions.update((state) => ({ ...state, data })); +}; diff --git a/src/routes/admin/post-data-panel/+page.svelte b/src/routes/admin/post-data-panel/+page.svelte new file mode 100644 index 0000000..1079a02 --- /dev/null +++ b/src/routes/admin/post-data-panel/+page.svelte @@ -0,0 +1,125 @@ +<script lang="ts"> + import { trpc } from "$lib/trpc/trpc"; + import toast from "svelte-french-toast"; + import Title from "$lib/components/atoms/title.svelte"; + import PresetDataView from "./preset-data-view.svelte"; + import CenteredSpinner from "$lib/components/molecules/centered-spinner.svelte"; + import DataFetchingFilters from "./data-fetching-filters.svelte"; + import { + checkMap, + filters, + setPresetDataTableData, + presetDataTableOptions, + } from "./stores"; + import DataEntryInputSection from "./data-entry-input-section.svelte"; + import { onMount } from "svelte"; + import { hasDrawBeenClosed } from "$lib/utils"; + import { nowDT } from "../stores"; + + const api = trpc(); + + let affectingRowVisibility = false; + + let drawsQ = api.draw.getAllDraws.createQuery(undefined, { + refetchOnWindowFocus: false, + retry: 3, + }); + $: drawsLoading = $drawsQ.isLoading || $drawsQ.isFetching; + + let fetchPresetDataM = api.presetData.getAll.createMutation({ + onSuccess: (out) => { + affectingRowVisibility = true; + console.log(out); + if (out.data && out.ok) { + setPresetDataTableData(out.data); + } else { + toast.error(out.detail); + } + setTimeout(() => { + affectingRowVisibility = false; + }, 200); + }, + onError: (e) => { + console.log(e); + toast( + "An error occurred while fetching data. Try again after a page refresh.", + ); + }, + }); + + let deletePresetDataM = api.presetData.delete.createMutation({ + onSuccess: (d) => { + console.log(d); + toast.success("Data deleted successfully"); + $fetchPresetDataM.mutateAsync({ + date: $filters.date, + draw: $filters.draw, + }); + }, + onError: (e) => { + console.log(e); + toast.error("An error occurred while deleting data"); + }, + }); + + function deleteSelectedEntries() { + const ids = [] as string[]; + + for (const each in $checkMap) { + if (!$checkMap[each]) continue; + const found = $presetDataTableOptions.data.find( + (e) => e.id === each, + ); + if (found) { + ids.push(found.id); + } + } + $deletePresetDataM.mutateAsync({ date: $filters.date, ids }); + } + + let hasTimePassed = false; + + onMount(() => { + filters.subscribe((val) => { + if (val.date && val.draw) { + $fetchPresetDataM.mutateAsync({ + date: val.date, + draw: val.draw, + }); + } + + hasTimePassed = hasDrawBeenClosed(val.date, val.draw, $nowDT); + }); + }); +</script> + +<section class="w-full grid place-items-center p-8"> + <div + class="w-full flex flex-col gap-4 max-w-6xl p-6 lg:p-8 rounded-lg shadow-sm border" + > + <div + class="flex flex-col md:flex-row gap-4 justify-between w-full items-center" + > + <Title text={"Preset Data"} size={"h1"} /> + </div> + + {#if !drawsLoading} + <DataFetchingFilters draws={$drawsQ.data} /> + {/if} + + {#if drawsLoading || $fetchPresetDataM.isLoading} + <CenteredSpinner /> + {:else if !affectingRowVisibility} + <PresetDataView {deleteSelectedEntries} /> + {#if !hasTimePassed} + <DataEntryInputSection {api} /> + {/if} + {:else} + <div class="flex justify-center items-center h-64"> + <p class="text-gray-500 text-lg"> + No preset data found for the chosen date, draw and user + </p> + </div> + {/if} + </div> +</section> diff --git a/src/routes/admin/post-data-panel/data-entry-input-section.svelte b/src/routes/admin/post-data-panel/data-entry-input-section.svelte new file mode 100644 index 0000000..547ed33 --- /dev/null +++ b/src/routes/admin/post-data-panel/data-entry-input-section.svelte @@ -0,0 +1,73 @@ +<script lang="ts"> + import { Button } from "$lib/components/ui/button"; + import { Textarea } from "$lib/components/ui/textarea"; + import type { TRPC } from "$lib/trpc/trpc"; + import type { PresetDataEntry } from "$lib/utils/data.types"; + import { parseEntriesFromMessage } from "$lib/utils/entry.parser"; + import toast from "svelte-french-toast"; + import { filters, setPresetDataTableData } from "./stores"; + import Switch from "$lib/components/atoms/switch.svelte"; + import { Input } from "$lib/components/ui/input"; + + export let api: TRPC; + let postingData = [] as PresetDataEntry[]; + let isPosting = false; + let isSingleEntry = false; + + const insertDataM = api.presetData.insert.createMutation({ + onSuccess: (d) => { + console.log(d); + if (!d.ok) { + return toast.error(d.detail); + } + setPresetDataTableData(d.data ?? [], true); + message = ""; + isPosting = false; + }, + onError: (e) => { + console.log(e); + }, + }); + + let message = ""; + + function handleSubmit() { + const parsed = parseEntriesFromMessage(message); + if (message.length < 1 || parsed.length < 1) { + return toast.error("Please enter some data to upload."); + } + postingData = parsed.map((r) => ({ + ...r, + drawId: +$filters.draw!.id.split(":")[1], + bookDate: $filters.date, + })); + isPosting = true; + $insertDataM.mutateAsync(postingData); + } +</script> + +<!-- <Switch bind:checked={isSingleEntry} label={"Single entry mode"} /> --> + +<!-- {#if isSingleEntry} + <div class="flex items-center gap-4 justify-center"> + <Input placeholder={"No"} class="max-w-32" /> + <Input placeholder={"F"} class="max-w-32" /> + <Input placeholder={"S"} class="max-w-32" /> + </div> +{:else} --> +<Textarea + name="customData" + bind:value={message} + on:input={(e) => { + // @ts-ignore + message = e.target.value.replace(/[^0-9+.fs\n]/g, ""); + }} +></Textarea> +<Button + disabled={isPosting} + variant={"primaryInverted"} + on:click={handleSubmit} +> + {isPosting ? "Submitting..." : "Submit Data"} +</Button> +<!-- {/if} --> diff --git a/src/routes/admin/post-data-panel/data-fetch-config.svelte b/src/routes/admin/post-data-panel/data-fetch-config.svelte new file mode 100644 index 0000000..d3ec5b0 --- /dev/null +++ b/src/routes/admin/post-data-panel/data-fetch-config.svelte @@ -0,0 +1,104 @@ +<script lang="ts"> + import Button from "$lib/components/atoms/button.svelte"; + import { Input } from "$lib/components/ui/input"; + import { Label } from "$lib/components/ui/label"; + import Title from "$lib/components/atoms/title.svelte"; + import { + zPostDataHistoryFilters, + type PostDataHistoryFilters, + type Draw, + } from "$lib/utils/data.types"; + import toast from "svelte-french-toast"; + import Switch from "$lib/components/atoms/switch.svelte"; + import { filters } from "./stores"; + + export let fetchDataFn: (filters: PostDataHistoryFilters) => Promise<void>; + export let updateDrawFilter: (draws: Draw[]) => void; + export let showFilters: boolean; + export let draws: Draw[] = []; + export let fetching: boolean = false; + + function saveDrawFilterChanges() { + console.log(draws); + updateDrawFilter(draws); + } + + function fetchOrGenerate() { + const _filters = { + date: $filters.date, + draw: $filters.draw, + } as PostDataHistoryFilters; + const parsed = zPostDataHistoryFilters.safeParse(_filters); + if (!parsed.success) { + toast.error("Please fill all the fields properly."); + return; + } + showFilters = false; + fetchDataFn(parsed.data); + } + + onMount(() => { + filters.update((d) => ({ ...d, draw: draws[0] })); + }); +</script> + +<div class="flex flex-col w-full gap-8 rounded-lg shadow-sm border p-8"> + <Title text="Draw Presets" size="h2" /> + + <div class="w-full flex flex-col gap-4 lg:grid xs:grid-cols-2"> + {#each draws as draw} + <div class="w-full flex flex-col gap-4"> + <Title text={draw.title} size="h4" /> + + <div class="flex gap-4 w-full flex-col md:flex-row"> + <div class="w-full space-y-2"> + <Label>2 Digit rate (F)</Label> + <Input + bind:value={draw.abRateF} + type={"number"} + min={0} + /> + </div> + <div class="w-full space-y-2"> + <Label>2 Digit rate (S)</Label> + <Input + bind:value={draw.abRateS} + type={"number"} + min={0} + /> + </div> + </div> + + <div class="flex gap-4 w-full flex-col md:flex-row"> + <div class="w-full space-y-2"> + <Label>3 Digit rate (F)</Label> + <Input + bind:value={draw.abcRateF} + type={"number"} + min={0} + /> + </div> + <div class="w-full space-y-2"> + <Label>3 Digit rate (S)</Label> + <Input + bind:value={draw.abcRateS} + type={"number"} + min={0} + /> + </div> + </div> + + <Switch + label={"Filter numbers with repeating digits"} + bind:checked={draw.filterDuplicatesWhilePosting} + /> + <div class="w-full my-4"></div> + </div> + {/each} + </div> + <Button + text={"Save changes"} + disabled={fetching} + onClick={() => saveDrawFilterChanges()} + /> +</div> diff --git a/src/routes/admin/post-data-panel/data-fetching-filters.svelte b/src/routes/admin/post-data-panel/data-fetching-filters.svelte new file mode 100755 index 0000000..fb56b9b --- /dev/null +++ b/src/routes/admin/post-data-panel/data-fetching-filters.svelte @@ -0,0 +1,39 @@ +<script lang="ts"> + import Input from "$lib/components/atoms/input.svelte"; + import Select from "$lib/components/atoms/select.svelte"; + import type { Draw } from "$lib/utils/data.types"; + import { onMount } from "svelte"; + import { filters } from "./stores"; + + export let draws: Draw[] = []; + + onMount(() => { + filters.update((f) => ({ ...f, draw: draws[0] })); + }); +</script> + +<section class="flex flex-col md:flex-row gap-4 w-full"> + <Input + bind:value={$filters.date} + label={"Date"} + inputType={"date"} + placeholder={"Date"} + /> + <Select + defaultChosen={$filters.draw?.id} + fullWidth + label={"Draw"} + options={draws.map((e) => { + return { label: e.title, value: e.id, id: e.id }; + })} + onSelect={(e) => { + if (draws.length > 0) { + filters.update((f) => ({ + ...f, + // @ts-ignore + draw: draws.find((d) => d.id === e.target.value), + })); + } + }} + /> +</section> diff --git a/src/routes/admin/post-data-panel/preset-data-view.svelte b/src/routes/admin/post-data-panel/preset-data-view.svelte new file mode 100644 index 0000000..7b6fcf9 --- /dev/null +++ b/src/routes/admin/post-data-panel/preset-data-view.svelte @@ -0,0 +1,302 @@ +<script lang="ts"> + import type { PresetDataEntry } from "$lib/utils/data.types"; + import { + createColumnHelper, + createSvelteTable, + flexRender, + type SortDirection, + } from "@tanstack/svelte-table"; + import { presetDataTableOptions } from "./stores"; + import Select from "$lib/components/atoms/select.svelte"; + import Input from "$lib/components/atoms/input.svelte"; + import { clsx } from "clsx"; + import Pagination from "$lib/components/atoms/pagination.svelte"; + import Checkbox from "$lib/components/ui/checkbox/checkbox.svelte"; + import { checkMap } from "./stores"; + import { Button } from "$lib/components/ui/button"; + import * as AlertDialog from "$lib/components/ui/alert-dialog/index"; + + const minPageSize = 100; + + export let rowCount: number = 0; + export let deleteSelectedEntries: () => void; + let updatingPaginationState = false; + let pagination = { pageSize: minPageSize, pageIndex: 0 }; + let globalFilter = ""; + + const getSortingSymbol = (isSorted: boolean | SortDirection) => { + return isSorted === "asc" ? "▲" : isSorted === "desc" ? "▼" : ""; + }; + + const setCurrentPage = (page: number) => { + presetDataTableOptions.update((state) => ({ + ...state, + state: { + ...state.state, + pagination: { + pageIndex: page, + pageSize: state.state?.pagination?.pageSize ?? minPageSize, + }, + }, + })); + }; + + const setPaginationPageSize = (size: number) => { + updatingPaginationState = true; + setCurrentPage(0); + presetDataTableOptions.update((state) => ({ + ...state, + state: { + ...state.state, + pagination: { + pageSize: size, + pageIndex: state.state?.pagination?.pageIndex ?? 0, + }, + }, + })); + setTimeout(() => { + updatingPaginationState = false; + }, 100); + }; + + const setGlobalFilter = (filter: string) => { + setPaginationPageSize($table.getState().pagination.pageSize); + globalFilter = filter; + presetDataTableOptions.update((p) => { + return { ...p, state: { ...p.state, globalFilter: filter } }; + }); + rowCount = $table.getFilteredRowModel().rows.length; + }; + const colHelper = createColumnHelper<PresetDataEntry>(); + const columns = [ + colHelper.display({ + id: "number", + cell: (info) => info.row.original.number, + header: "No", + // @ts-ignore + accessorFn: (r) => r.number.toString(), + }), + colHelper.display({ + id: "first", + cell: (info) => info.row.original.first, + header: "First", + // @ts-ignore + accessorFn: (r) => r.first.toString(), + }), + colHelper.display({ + id: "second", + cell: (info) => info.row.original.second, + header: "Second", + // @ts-ignore + accessorFn: (r) => r.second.toString(), + }), + ]; + + let searchTimeOut: NodeJS.Timeout; + const handleEntrySearch = (e: any) => { + clearTimeout(searchTimeOut); + searchTimeOut = setTimeout(() => { + setGlobalFilter(e.target.value); + }, 300); + }; + + const typeAnnotateComponent = (a: any) => { + return a as any; + }; + + const table = createSvelteTable(presetDataTableOptions); + + onMount(() => { + presetDataTableOptions.update((p) => { + return { + ...p, + columns, + state: { ...p.state, globalFilter, pagination }, + }; + }); + setPaginationPageSize(minPageSize); + presetDataTableOptions.subscribe((opts) => { + rowCount = opts.data.length; + }); + }); + + $: chosenForDeletion = Object.values($checkMap).filter((v) => v).length; +</script> + +<!-- INFO: The table itself --> +<div class="w-full text-black"> + <div class="my-2 flex w-full justify-between items-center gap-4"> + <div class="flex items-end gap-2"> + <div class="flex justify-end md:max-w-xs w-full"> + <Input + label={"Search"} + placeholder={"Type anything"} + fieldWidth={"full"} + onInput={handleEntrySearch} + /> + </div> + + {#if chosenForDeletion > 0} + <AlertDialog.Root> + <AlertDialog.Trigger> + <Button + disabled={chosenForDeletion === 0} + variant="destructiveInverted" + > + Delete Selected ({chosenForDeletion}) + </Button> + </AlertDialog.Trigger> + <AlertDialog.Content> + <AlertDialog.Header> + <AlertDialog.Title> + Deleting {chosenForDeletion} entries + </AlertDialog.Title> + <AlertDialog.Description> + This action cannot be undone. This will + permanently delete the selected entries. + </AlertDialog.Description> + </AlertDialog.Header> + <AlertDialog.Footer> + <AlertDialog.Cancel + >Cancel & Go back</AlertDialog.Cancel + > + <AlertDialog.Action + on:click={() => { + deleteSelectedEntries(); + }} + > + Confirm & Delete + </AlertDialog.Action> + </AlertDialog.Footer> + </AlertDialog.Content> + </AlertDialog.Root> + {/if} + </div> + <div + class="flex justify-between flex-col w-full md:flex-row md:max-w-xs gap-2" + > + <Select + fullWidth + label={"Row count"} + options={[100, 250, 500, 1000].map((n) => { + return { + id: n.toString(), + label: n.toString(), + value: n.toString(), + }; + })} + onSelect={(e) => { + // @ts-ignore + const chosen = Number(e.target.value); + setPaginationPageSize(chosen); + }} + /> + </div> + </div> + + <div class="w-full overflow-y-auto h-[69vh] border"> + <table class="w-full"> + <thead> + {#each $table.getHeaderGroups() as headerGroup} + <tr> + <th + class="p-2 px-4 border sticky top-0 bg-sky-50 text-sky-700 w-20" + > + <div> + <Checkbox + checked={Object.values($checkMap).reduce( + (acc, curr) => acc && curr, + true, + )} + onCheckedChange={(checked) => { + console.log(checked); + checkMap.update((ob) => { + const nO = {}; + for (const key in ob) { + // @ts-ignore + nO[key] = checked; + } + return nO; + }); + }} + /> + </div> + </th> + {#each headerGroup.headers as header} + <th + class="p-2 px-4 border sticky top-0 bg-sky-50 text-sky-700" + colspan={header.colSpan} + > + {#if !header.isPlaceholder} + <button + class={clsx( + "flex outline-none justify-center items-center gap-1 w-full h-full", + )} + disabled={!header.column.getCanSort()} + on:click={header.column.getToggleSortingHandler()} + > + <svelte:component + this={typeAnnotateComponent( + flexRender( + header.column.columnDef + .header, + header.getContext(), + ), + )} + /> + <span + >{getSortingSymbol( + header.column.getIsSorted(), + )}</span + > + </button> + {/if} + </th> + {/each} + </tr> + {/each} + </thead> + <tbody> + {#each $table.getRowModel().rows as row} + <tr + class="cursor-pointer hover:bg-slate-50 transition-colors duration-100" + > + <td + class="p-1 px-4 border border-t-0 border-r-0 text-center grid place-items-center h-full w-20" + > + <div> + <Checkbox + bind:checked={$checkMap[row.original.id]} + /> + </div> + </td> + {#each row.getVisibleCells() as cell} + <td class="p-1 px-4 border text-center"> + <svelte:component + this={typeAnnotateComponent( + flexRender( + cell.column.columnDef.cell, + cell.getContext(), + ), + )} + /> + </td> + {/each} + </tr> + {/each} + </tbody> + </table> + </div> + + {#if !updatingPaginationState && rowCount > 0} + <div class="w-full py-2"> + <Pagination + count={rowCount} + page={$table.getState().pagination.pageIndex + 1} + perPage={$table.getState().pagination.pageSize} + siblingCount={1} + setPage={setCurrentPage} + /> + </div> + {/if} +</div> diff --git a/src/routes/admin/post-data-panel/stores.ts b/src/routes/admin/post-data-panel/stores.ts new file mode 100644 index 0000000..ae2e2e3 --- /dev/null +++ b/src/routes/admin/post-data-panel/stores.ts @@ -0,0 +1,45 @@ +import type { DDFilters, PresetDataEntry } from "$lib/utils/data.types"; +import { writable } from "svelte/store"; +import { + type TableOptions, + getCoreRowModel, + getFilteredRowModel, + getPaginationRowModel, + getSortedRowModel, +} from "@tanstack/svelte-table"; + +export const filters = writable<DDFilters>({ + date: new Date().toISOString().split("T")[0], + draw: undefined, +}); + +export const checkMap = writable<Record<string, boolean>>({}); + +export const presetDataTableOptions = writable<TableOptions<PresetDataEntry>>({ + data: [], + columns: [], + getCoreRowModel: getCoreRowModel(), + getSortedRowModel: getSortedRowModel(), + getFilteredRowModel: getFilteredRowModel(), + getPaginationRowModel: getPaginationRowModel(), + enableGlobalFilter: true, +}); + +export const setPresetDataTableData = ( + data: PresetDataEntry[], + extend: boolean = false, +) => { + checkMap.update((state) => { + const map = {} as Record<string, boolean>; + for (const each of data) { + map[each.id] = false; + } + return map; + }); + presetDataTableOptions.update((state) => { + return { + ...state, + data: extend ? [...state.data, ...data].reverse() : data.reverse(), + }; + }); +}; diff --git a/src/routes/admin/post-data-preview-table.svelte b/src/routes/admin/post-data-preview-table.svelte new file mode 100644 index 0000000..1ce2491 --- /dev/null +++ b/src/routes/admin/post-data-preview-table.svelte @@ -0,0 +1,248 @@ +<script lang="ts"> + import type { PostDataEntry } from "$lib/utils/data.types"; + import { + createColumnHelper, + createSvelteTable, + flexRender, + type SortDirection, + } from "@tanstack/svelte-table"; + import { postDataTableOptions } from "./stores"; + import Select from "$lib/components/atoms/select.svelte"; + import Input from "$lib/components/atoms/input.svelte"; + import { clsx } from "clsx"; + import Pagination from "$lib/components/atoms/pagination.svelte"; + import Pill from "$lib/components/atoms/pill.svelte"; + + const minPageSize = 100; + + export let rowCount: number; + let updatingPaginationState = false; + let pagination = { pageSize: minPageSize, pageIndex: 0 }; + let searchQuery = ""; + + const getSortingSymbol = (isSorted: boolean | SortDirection) => { + return isSorted === "asc" ? "▲" : isSorted === "desc" ? "▼" : ""; + }; + + const setCurrentPage = (page: number) => { + postDataTableOptions.update((state) => ({ + ...state, + state: { + ...state.state, + pagination: { + pageIndex: page, + pageSize: state.state?.pagination?.pageSize ?? minPageSize, + }, + }, + })); + }; + const setPaginationPageSize = (size: number) => { + updatingPaginationState = true; + setCurrentPage(0); + postDataTableOptions.update((state) => ({ + ...state, + state: { + ...state.state, + pagination: { + pageSize: size, + pageIndex: state.state?.pagination?.pageIndex ?? 0, + }, + }, + })); + setTimeout(() => { + updatingPaginationState = false; + }, 100); + }; + + const colHelper = createColumnHelper<PostDataEntry>(); + const columns = [ + colHelper.display({ + id: "number", + cell: (info) => info.row.original.number, + header: "No", + // @ts-ignore + accessorFn: (r) => r.number.toString(), + }), + colHelper.display({ + id: "first", + cell: (info) => info.row.original.first, + header: "First", + // @ts-ignore + accessorFn: (r) => r.first.toString(), + }), + colHelper.display({ + id: "second", + cell: (info) => info.row.original.second, + header: "Second", + // @ts-ignore + accessorFn: (r) => r.second.toString(), + }), + ]; + + let searchTimeOut: NodeJS.Timeout; + const handleEntrySearch = (e: any) => { + clearTimeout(searchTimeOut); + searchTimeOut = setTimeout(() => { + const value = e.target.value; + searchQuery = value; + postDataTableOptions.update((opts: any) => { + return { + ...opts, + state: { + ...opts.state, + columnFilters: [{ id: "number", value }], + }, + }; + }); + }, 300); + }; + + const typeAnnotateComponent = (a: any) => { + return a as any; + }; + + const table = createSvelteTable(postDataTableOptions); + + onMount(() => { + postDataTableOptions.update((p) => { + return { + ...p, + columns, + state: { ...p.state, pagination }, + }; + }); + setPaginationPageSize(minPageSize); + }); +</script> + +<!-- INFO: The table itself --> +<div class="w-full text-black"> + <div class="my-2 flex w-full justify-between items-center gap-4"> + <div class="flex justify-end md:max-w-xs w-full"> + <Input + label={"Search"} + placeholder={"Type anything"} + fieldWidth={"full"} + onInput={handleEntrySearch} + /> + </div> + <div + class="flex justify-between flex-col w-full md:flex-row md:max-w-xs gap-2" + > + <Select + fullWidth + label={"Row count"} + options={[100, 250, 500, 1000].map((n) => { + return { + id: n.toString(), + label: n.toString(), + value: n.toString(), + }; + })} + onSelect={(e) => { + // @ts-ignore + const chosen = Number(e.target.value); + setPaginationPageSize(chosen); + }} + /> + </div> + </div> + + <div class="w-full overflow-y-auto h-[69vh]"> + <table class="w-full"> + <thead> + {#each $table.getHeaderGroups() as headerGroup} + <tr> + {#each headerGroup.headers as header} + <th + class="p-2 px-4 border sticky top-0 bg-sky-50 text-sky-700" + colSpan={header.colSpan} + > + {#if !header.isPlaceholder} + <button + class={clsx( + "flex outline-none justify-center items-center gap-1 w-full h-full", + )} + disabled={!header.column.getCanSort()} + on:click={header.column.getToggleSortingHandler()} + > + <svelte:component + this={typeAnnotateComponent( + flexRender( + header.column.columnDef + .header, + header.getContext(), + ), + )} + /> + <span + >{getSortingSymbol( + header.column.getIsSorted(), + )}</span + > + </button> + {/if} + </th> + {/each} + </tr> + {/each} + </thead> + <tbody> + {#each $table.getRowModel().rows as row} + <tr + class="cursor-pointer hover:bg-slate-50 transition-colors duration-100" + on:click={() => { + // fetchFSRow(row.original.number); + }} + > + {#each row.getVisibleCells() as cell} + <td class="p-1 px-4 border text-center"> + <svelte:component + this={typeAnnotateComponent( + flexRender( + cell.column.columnDef.cell, + cell.getContext(), + ), + )} + /> + </td> + {/each} + </tr> + {/each} + </tbody> + </table> + </div> + + {#if !updatingPaginationState} + <div class="w-full py-2"> + <Pagination + count={rowCount} + page={$table.getState().pagination.pageIndex + 1} + perPage={$table.getState().pagination.pageSize} + siblingCount={1} + setPage={setCurrentPage} + /> + </div> + {/if} + + {#if searchQuery.length > 0} + <div class="flex w-full gap-2 flex-wrap"> + <Pill text={"Search Total :"} theme={"sky"} /> + <Pill + text={"F : " + + $table + .getRowModel() + .rows.reduce((a, b) => a + b.original.first, 0)} + theme={"slate"} + /> + + <Pill + text={"S : " + + $table + .getRowModel() + .rows.reduce((a, b) => a + b.original.second, 0)} + theme={"slate"} + /> + </div> + {/if} +</div> diff --git a/src/routes/admin/post-data-summary-section.svelte b/src/routes/admin/post-data-summary-section.svelte new file mode 100644 index 0000000..9336785 --- /dev/null +++ b/src/routes/admin/post-data-summary-section.svelte @@ -0,0 +1,88 @@ +<script lang="ts"> + import CenteredSpinner from "$lib/components/molecules/centered-spinner.svelte"; + import type { TRPC } from "$lib/trpc/trpc"; + import type { Draw } from "$lib/utils/data.types"; + import toast from "svelte-french-toast"; + import PostDataPreviewTable from "./post-data-preview-table.svelte"; + import { setPostDataTableData } from "./stores"; + import Pill from "$lib/components/atoms/pill.svelte"; + import { postdata } from "./stores"; + + export let api: TRPC; + export let payload: { + date: string; + draw: Draw | undefined; + minPrize: number; + maxPrize: number; + }; + + console.log(payload); + + let affectingRowVisibility = false; + + let fetchPostDataQ = api.postData.getPostDataForPreview.createQuery( + { + date: payload.date, + draw: payload.draw, + minPrize: payload.minPrize, + maxPrize: payload.maxPrize, + twoDigitRates: { + first: payload.draw?.abRateF ?? 0, + second: payload.draw?.abRateS ?? 0, + }, + threeDigitRates: { + first: payload.draw?.abcRateF ?? 0, + second: payload.draw?.abcRateS ?? 0, + }, + customData: "", + }, + { + refetchOnWindowFocus: false, + onSuccess: (d) => { + if (!d.ok) { + toast.error(d.detail); + postdata.set([]); + return; + } + postdata.set(d.data); + affectingRowVisibility = false; + toast("Data fetched successfully."); + }, + onError: (e) => { + console.error(e); + toast( + "An error occurred while fetching data. Try again after a page refresh.", + ); + }, + }, + ); + + $: isLoading = $fetchPostDataQ.isLoading || $fetchPostDataQ.isFetching; + + postdata.subscribe((d) => { + setPostDataTableData(d); + }); + + $: totals = { + f: $postdata.reduce((acc, d) => acc + d.first, 0), + s: $postdata.reduce((acc, d) => acc + d.second, 0), + }; +</script> + +{#if isLoading} + <CenteredSpinner /> +{:else if $postdata.length > 0 && !affectingRowVisibility} + <PostDataPreviewTable rowCount={$postdata.length} /> + + <div class="flex w-full gap-2 flex-wrap"> + <Pill text={"Totals :"} theme={"sky"} /> + <Pill text={`F rate : ${totals.f}`} theme={"slate"} /> + <Pill text={`S rate : ${totals.s}`} theme={"slate"} /> + </div> +{:else} + <div class="flex justify-center items-center h-64"> + <p class="text-gray-500 text-lg"> + No data generated for posting from the given filters + </p> + </div> +{/if} diff --git a/src/routes/admin/stores.ts b/src/routes/admin/stores.ts new file mode 100644 index 0000000..aadbaa3 --- /dev/null +++ b/src/routes/admin/stores.ts @@ -0,0 +1,32 @@ +import type { Draw, PostDataEntry } from "$lib/utils/data.types"; +import { writable } from "svelte/store"; +import { + type TableOptions, + getCoreRowModel, + getFilteredRowModel, + getPaginationRowModel, + getSortedRowModel, +} from "@tanstack/svelte-table"; + +export const nowDT = writable<Date>(new Date()); + +export const filters = writable<{ date: string; draw: Draw | undefined }>({ + date: new Date().toISOString().split("T")[0], + draw: undefined, +}); + +export const postdata = writable<PostDataEntry[]>([]); + +export const postDataTableOptions = writable<TableOptions<PostDataEntry>>({ + data: [], + columns: [], + getCoreRowModel: getCoreRowModel(), + getSortedRowModel: getSortedRowModel(), + getFilteredRowModel: getFilteredRowModel(), + getPaginationRowModel: getPaginationRowModel(), + enableGlobalFilter: false, +}); + +export const setPostDataTableData = (data: PostDataEntry[]) => { + postDataTableOptions.update((state) => ({ ...state, data })); +}; diff --git a/src/routes/admin/user-data/+page.svelte b/src/routes/admin/user-data/+page.svelte new file mode 100755 index 0000000..181e4c9 --- /dev/null +++ b/src/routes/admin/user-data/+page.svelte @@ -0,0 +1,294 @@ +<script lang="ts"> + import Button from "$lib/components/atoms/button.svelte"; + import Input from "$lib/components/atoms/input.svelte"; + import Line from "$lib/components/atoms/line.svelte"; + import Pill from "$lib/components/atoms/pill.svelte"; + import Select from "$lib/components/atoms/select.svelte"; + import Title from "$lib/components/atoms/title.svelte"; + import { trpc } from "$lib/trpc/trpc"; + import type { ApiUser, BookingEntry, Draw } from "$lib/utils/data.types"; + import clsx from "clsx"; + import toast from "svelte-french-toast"; + import { + createColumnHelper, + createSvelteTable, + getCoreRowModel, + type TableOptions, + flexRender, + getFilteredRowModel, + type FilterFn, + } from "@tanstack/svelte-table"; + import { writable } from "svelte/store"; + import { rankItem } from "@tanstack/match-sorter-utils"; + + const api = trpc(); + + let chosenDate = new Date().toISOString().split("T")[0]; + let chosenDraw = {} as Draw; + let chosenDealer = {} as ApiUser; + let userListQuery = ""; + let showFiltersList = false; + let previousDataCount = 0; + + let globalFilter = ""; + const fuzzyFilter: FilterFn<any> = (row, columnId, value, addMeta) => { + const itemRank = rankItem(row.getValue(columnId), value); + addMeta({ itemRank }); + return itemRank.passed; + }; + const setGlobalFilter = (filter: string) => { + console.log(filter); + globalFilter = filter; + options.update((p) => { + return { + ...p, + state: { ...p.state, globalFilter: filter }, + }; + }); + }; + const colHelper = createColumnHelper<BookingEntry>(); + const options = writable<TableOptions<BookingEntry>>({ + data: [], + columns: [ + colHelper.display({ + id: "number", + cell: (info) => info.row.original.number, + header: "No", + // @ts-ignore + accessorFn: (r) => r.number.toString(), + }), + colHelper.display({ + id: "first", + cell: (info) => info.row.original.first, + header: "F", + // @ts-ignore + accessorFn: (r) => r.first.toString(), + }), + colHelper.display({ + id: "second", + cell: (info) => info.row.original.second, + header: "S", + // @ts-ignore + accessorFn: (r) => r.second.toString(), + }), + ], + getCoreRowModel: getCoreRowModel(), + getFilteredRowModel: getFilteredRowModel(), + enableGlobalFilter: true, + state: { globalFilter }, + onGlobalFilterChange: setGlobalFilter, + }); + const table = createSvelteTable(options); + + let filtersQ = api.apiData.getDealersAndDraws.createQuery(undefined, { + refetchOnWindowFocus: false, + retry: 3, + onSuccess: (d) => { + if (d.draws.length > 0) { + chosenDraw = d.draws[0]; + } + return d; + }, + }); + + $: isLoading = $filtersQ.isLoading || $filtersQ.isFetching; + + let fetchDataM = api.apiData.getDataByFilters.createMutation({ + onSuccess: (data) => { + toast("Found " + data.data.length + " entries"); + previousDataCount = data.data.length; + options.update((p) => { + return { + ...p, + data: data.data, + }; + }); + }, + onError: (err) => { + console.log(err); + toast.error("An error occured while fetching data"); + }, + }); + + const typeAnnotateComponent = (a: any) => { + return a as any; + }; + + let timer: NodeJS.Timeout; + const handleEntrySearch = (e: any) => { + clearTimeout(timer); + timer = setTimeout(() => { + setGlobalFilter(e.target.value); + }, 300); + }; +</script> + +<section class="w-full grid place-items-center p-8"> + <div + class="w-full flex flex-col gap-4 max-w-6xl p-6 lg:p-8 rounded-lg shadow-sm border" + > + <div class="flex justify-between w-full items-center"> + <Title text={"User Data"} size={"h1"} /> + <Button + text={"Toggle filters"} + intent={"ghost"} + onClick={() => { + showFiltersList = !showFiltersList; + }} + /> + </div> + <Line /> + {#if isLoading} + <div class="w-max"> + <Pill theme={"slate"} text={"Fetching draws & users"} /> + </div> + {:else if $filtersQ.data && showFiltersList} + <section class="flex flex-col md:flex-row gap-4 w-full"> + <Input + bind:value={chosenDate} + label={"Date"} + inputType={"date"} + placeholder={"Date"} + /> + <Select + fullWidth + label={"Draw"} + options={$filtersQ.data.draws.map((e) => { + return { label: e.title, value: e.id, id: e.id }; + })} + onSelect={(e) => { + if ($filtersQ.data) { + // @ts-ignore + chosenDraw = $filtersQ.data.draws.find( + // @ts-ignore + (d) => d.id === e.target.value + ); + } + }} + /> + </section> + <div class="flex flex-col w-full gap-2"> + <Input + bind:value={userListQuery} + placeholder={"Search dealers . . ."} + /> + <div + class="p-2 rounded-lg w-full border shadow-sm h-80 overflow-y-auto flex flex-col gap-1" + > + {#each $filtersQ.data.users as user} + <!-- svelte-ignore a11y-no-static-element-interactions --> + {#if user && (userListQuery === "" || user.userName + .toLowerCase() + .includes(userListQuery.toLowerCase()) || user.userId + .toLowerCase() + .includes(userListQuery.toLowerCase()))} + <div + class={clsx( + "rounded-md hover:bg-sky-200 text-sky-800 font-medium p-2 cursor-pointer transition-colors duration-100 border capitalize", + chosenDealer.id === user.id + ? "bg-sky-300 border-sky-600" + : "bg-sky-50 border-sky-200" + )} + on:click={() => (chosenDealer = user)} + on:touchend={() => (chosenDealer = user)} + on:keypress={() => {}} + > + {user?.userName} - {user?.userId} + </div> + {/if} + {/each} + </div> + <div class="flex justify-end"> + <Button + text={"Apply filters"} + onClick={async () => { + if (!chosenDate || !chosenDraw.id || !chosenDealer.id) { + toast.error("Select all filters properly to fetch data"); + return; + } + showFiltersList = false; + toast("Fetching data for selected filters"); + await $fetchDataM.mutateAsync({ + drawId: chosenDraw.id ?? "", + date: chosenDate, + userId: chosenDealer.id ?? "", + }); + }} + /> + </div> + </div> + {:else if !showFiltersList} + <div class="flex w-full gap-2 flex-wrap"> + <Pill text={"Filters:"} theme={"slate"} /> + <Pill text={chosenDate} theme={"sky"} /> + <Pill text={chosenDraw.title} theme={"sky"} /> + <Pill + text={chosenDealer.id + ? `${chosenDealer.userName} - ${chosenDealer.userId}` + : "No dealer selected"} + theme={"sky"} + /> + </div> + {/if} + <Line /> + + {#if previousDataCount > 0} + <div class="w-full text-black"> + <div class="flex justify-end"> + <Input placeholder={"Search"} onInput={handleEntrySearch} /> + </div> + <div class="my-2 w-full" /> + <div class="w-full overflow-y-auto h-96 border"> + <table class="w-full"> + <thead> + {#each $table.getHeaderGroups() as headerGroup} + <tr> + {#each headerGroup.headers as header} + <th + class="p-1 px-4 border sticky top-0 bg-sky-50 text-sky-700" + colSpan={header.colSpan} + > + {#if !header.isPlaceholder} + <svelte:component + this={typeAnnotateComponent( + flexRender( + header.column.columnDef.header, + header.getContext() + ) + )} + /> + {/if} + </th> + {/each} + </tr> + {/each} + </thead> + <tbody> + {#each $table.getRowModel().rows as row} + <tr> + {#each row.getVisibleCells() as cell} + <td class="p-1 px-4 border text-center"> + <svelte:component + this={typeAnnotateComponent( + flexRender( + cell.column.columnDef.cell, + cell.getContext() + ) + )} + /> + </td> + {/each} + </tr> + {/each} + </tbody> + </table> + </div> + <div>{$table.getRowModel().rows.length} Rows</div> + </div> + {:else} + <span class="w-full text-center py-24"> + <Title size={"h4"} text={"No data found for chosen filters"} /> + </span> + {/if} + </div> +</section> diff --git a/src/routes/admin/users/+page.svelte b/src/routes/admin/users/+page.svelte new file mode 100755 index 0000000..17154b2 --- /dev/null +++ b/src/routes/admin/users/+page.svelte @@ -0,0 +1,7 @@ +<script lang="ts"> + import { trpc } from "$lib/trpc/trpc"; + + const api = trpc(); +</script> + +<span>show the users list here</span> diff --git a/src/routes/api/auth/logout/+server.ts b/src/routes/api/auth/logout/+server.ts new file mode 100755 index 0000000..4c795e2 --- /dev/null +++ b/src/routes/api/auth/logout/+server.ts @@ -0,0 +1,17 @@ +import { deleteSession } from "$lib/server/session.helpers"; +import { constants } from "$lib/utils/constants"; +import type { RequestHandler } from "@sveltejs/kit"; + +export const POST = (async ({ cookies }) => { + const sidKey = constants.SESSION_KEY_NAME; + const sid = cookies.get(sidKey); + if (sid) { + await deleteSession(sid); + } + return new Response(null, { + status: 200, + headers: { + "set-cookie": `${sidKey}=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT`, + }, + }); +}) satisfies RequestHandler; diff --git a/src/routes/api/auth/signin/+server.ts b/src/routes/api/auth/signin/+server.ts new file mode 100755 index 0000000..a011bc1 --- /dev/null +++ b/src/routes/api/auth/signin/+server.ts @@ -0,0 +1,117 @@ +import type { RequestHandler } from "@sveltejs/kit"; +import type { ServerError } from "$lib/utils/data.types"; +import { constants } from "$lib/utils/constants"; +import { dbUser } from "$lib/server/db/user.db"; +import { compareData } from "$lib/server/hashing"; +import { generateSession } from "$lib/server/session.helpers"; +import { redis } from "$lib/server/connectors/redis"; +import { z } from "zod"; + +const COOLDOWN = 60 * 1; + +const cooldownStatus = async ( + username: string, + ip: string, + userAgent: string +) => { + const key = `cooldown:${username}:${ip}:${userAgent}`; + const res = await redis.get(key); + return res === null ? 0 : parseInt(res); +}; + +const add1ToCooldown = async ( + username: string, + ip: string, + userAgent: string +) => { + const key = `cooldown:${username}:${ip}:${userAgent}`; + if (await redis.exists(key)) { + await redis.incr(key); + } else { + await redis.setex(key, COOLDOWN, 1); + } +}; + +export const POST = (async ({ cookies, request }) => { + const jay = await request.json(); + const payloadSchema = z.object({ + username: z.string().min(4), + password: z.string().min(4), + }); + const result = payloadSchema.safeParse(jay); + if (!result.success) { + return new Response( + JSON.stringify({ + success: false, + errors: result.error.flatten().formErrors.map((e) => { + return { message: e }; + }), + }), + { headers: { "content-type": "application/json" }, status: 401 } + ); + } + const other = { + ip: request.headers.get("x-forwarded-for") || "", + userAgent: request.headers.get("user-agent") || "", + }; + const cooldown = await cooldownStatus( + result.data.username, + other.ip, + other.userAgent + ); + if (cooldown >= 5) { + return new Response( + JSON.stringify({ + success: false, + errors: [ + { + message: "Too many attempts, try again later", + meta: { duration: 1000 * COOLDOWN }, + }, + ], + }), + { headers: { "content-type": "application/json" }, status: 401 } + ); + } + const user = await dbUser.get({ username: result.data.username }); + if (!user || !compareData(result.data.password, user.password)) { + await add1ToCooldown(result.data.username, other.ip, other.userAgent); + return new Response( + JSON.stringify({ + success: false, + errors: [{ message: "Invalid username or password" }], + }), + { headers: { "content-type": "application/json" }, status: 401 } + ); + } + const sid = await generateSession( + user.username, + user.userType, + other.ip, + other.userAgent + ); + if (!sid) { + return new Response( + JSON.stringify({ + success: false, + errors: [{ message: "Invalid username or password" }], + }), + { headers: { "content-type": "application/json" }, status: 401 } + ); + } + cookies.set(constants.SESSION_KEY_NAME, sid, { + path: "/", + expires: new Date(Date.now() + constants.SESSION_EXPIRE_TIME_MS), + httpOnly: true, + secure: true, + }); + + return new Response( + JSON.stringify({ success: true, errors: [] as ServerError }), + { + headers: { + "content-type": "application/json", + }, + } + ); +}) satisfies RequestHandler; diff --git a/src/routes/api/auth/verify/+server.ts b/src/routes/api/auth/verify/+server.ts new file mode 100755 index 0000000..825b519 --- /dev/null +++ b/src/routes/api/auth/verify/+server.ts @@ -0,0 +1,16 @@ +import { constants } from "$lib/utils/constants"; +import type { RequestHandler } from "@sveltejs/kit"; + +export const GET = (async ({ cookies }) => { + const sidKey = constants.SESSION_KEY_NAME; + const sid = cookies.get(sidKey); + let status = 200; + let headers = {}; + if (!sid) { + status = 401; + headers = { + "set-cookie": `${sidKey}=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT`, + }; + } + return new Response(null, { status, headers }); +}) satisfies RequestHandler; diff --git a/src/routes/api/debug/user/+server.ts b/src/routes/api/debug/user/+server.ts new file mode 100755 index 0000000..b5be99f --- /dev/null +++ b/src/routes/api/debug/user/+server.ts @@ -0,0 +1,59 @@ +import { dbUser } from "$lib/server/db/user.db"; +import { hashData } from "$lib/server/hashing"; +import { zLooseUser } from "$lib/utils/data.types"; +import type { RequestHandler } from "@sveltejs/kit"; +import { z } from "zod"; + +export const POST = (async ({ request }) => { + if (request.headers.get("x-debug-key") !== process.env.DEBUG_KEY) { + return new Response("Unauthorized", { status: 401 }); + } + const jsonBody = await request.json(); + const schema = z.object({ operation: z.string(), data: z.array(zLooseUser) }); + const parsed = await schema.safeParseAsync(jsonBody); + if (!parsed.success) { + return new Response(JSON.stringify(parsed.error), { + status: 400, + headers: { "content-type": "application/json" }, + }); + } + const data = parsed.data; + console.log(data); + let payload: any = {}; + if (data.operation === "create") { + for (const user of data.data) { + const pwdHash = hashData(user.password); + payload[user.username] = await dbUser.create({ + password: pwdHash, + userType: user.userType, + username: user.username, + association: user.association, + }); + } + } else if (data.operation === "all") { + payload = await dbUser.all(); + } else if (data.operation === "read") { + for (const user of data.data) { + const un = user.username; + payload[un] = await dbUser.get({ username: un }); + } + } else if (data.operation === "update") { + // for (const user of data.data) { + // const un = user.username; + // payload[un] = await dbUser.update({ + // username: un, + // password: hashData(user.password), + // userType: user.userType, + // association: user.association, + // }); + // } + payload = { message: "NYI." }; + } else if (data.operation === "delete") { + payload = { message: "NYI" }; + } + + return new Response(JSON.stringify(payload), { + status: 200, + headers: { "content-type": "application/json" }, + }); +}) satisfies RequestHandler; diff --git a/src/routes/auth/signin/+page.svelte b/src/routes/auth/signin/+page.svelte new file mode 100755 index 0000000..b04a0f7 --- /dev/null +++ b/src/routes/auth/signin/+page.svelte @@ -0,0 +1,13 @@ +<script lang="ts"> + import clsx from "clsx"; + + import Signinform from "./signinform.svelte"; +</script> + +<section + class={clsx( + "grid place-items-center bg-[url('/images/signin-bg.svg')] bg-no-repeat bg-cover w-screen h-screen" + )} +> + <Signinform /> +</section> diff --git a/src/routes/auth/signin/signinform.svelte b/src/routes/auth/signin/signinform.svelte new file mode 100755 index 0000000..e6ff601 --- /dev/null +++ b/src/routes/auth/signin/signinform.svelte @@ -0,0 +1,162 @@ +<script lang="ts"> + import Button from "$lib/components/atoms/button.svelte"; + import Input from "$lib/components/atoms/input.svelte"; + import toast from "svelte-french-toast"; + import Title from "$lib/components/atoms/title.svelte"; + import { goto } from "$app/navigation"; + import type { EventHandler } from "@melt-ui/svelte/internal/helpers"; + + let loginDisabled = false; + let signingIn = false; + + const errors = { + username: { + error: false, + message: "", + validator: (value: string) => { + if (value.length < 4) { + return "Username must be at least 4 characters long"; + } + if (value.length > 64) { + return "Username must be at most 64 characters long"; + } + return ""; + }, + }, + password: { + error: false, + message: "", + validator: (value: string) => { + if (value.length < 6) { + return "Password must be at least 6 characters long"; + } + if (value.length > 128) { + return "Password must be at most 128 characters long"; + } + return ""; + }, + }, + pin: { + error: false, + message: "", + validator: (value: string) => { + if (value.length !== 6) { + return "Pin must be 6 characters long"; + } + return ""; + }, + }, + }; + + const setCooldown = (meta: any) => { + try { + loginDisabled = true; + window.localStorage.setItem("cooldown", JSON.stringify(meta.duration)); + setTimeout(() => { + loginDisabled = false; + window.localStorage.removeItem("cooldown"); + }, meta.duration); + } catch (err) {} + }; + + const ensureCooldown = () => { + try { + if (window) { + const cooldown = JSON.parse( + window.localStorage.getItem("cooldown") ?? "" + ); + if (cooldown) { + loginDisabled = true; + toast.error("Too many attempts, try again in 1 minute"); + setTimeout(() => { + loginDisabled = false; + window.localStorage.removeItem("cooldown"); + }, cooldown); + } + } + } catch (err) {} + }; + + const signInHandler: EventHandler = async (e) => { + signingIn = true; + const formData = new FormData(e.target as HTMLFormElement); + const json = Object.fromEntries(formData.entries()); + const res = await fetch("/api/auth/signin", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(json), + }); + signingIn = false; + if (res.status === 200) { + toast.success("Successfully signed in"); + goto("/"); + } else { + const rJ = await res.json(); + if (rJ.errors.length > 0) { + for (const each of rJ.errors) { + toast.error(each.message); + if (each.message.includes("Too many attempts")) { + setCooldown(each.meta); + } + } + } + } + }; + + onMount(() => { + ensureCooldown(); + }); +</script> + +<form + class="z-10 flex w-full max-w-sm flex-col backdrop-blur-lg justify-center gap-3 rounded-md border-gray-400 bg-white bg-opacity-80 p-8 md:p-12 py-16 shadow-lg" + on:submit|preventDefault={signInHandler} +> + <Title text={"Sign In"} size={"h2"} /> + <small class="text-gray-500"> Enter your credentials to get started </small> + + <Input + name={"username"} + label={"Username"} + placeholder={"Username"} + intent={"primary"} + fieldWidth={"full"} + bordered={"yes"} + otherInputOptions={{ minLength: 4, maxLength: 64, required: true }} + isError={errors.username.error} + bottomLabel={errors.username.message} + onInput={(e) => { + // @ts-ignore + const value = e.target.value; + const message = errors.username.validator(value); + errors.username.error = message.length > 0; + errors.username.message = message; + }} + /> + <Input + name={"password"} + fieldWidth={"full"} + label={"Password"} + placeholder={"Password"} + inputType={"password"} + intent={"primary"} + bordered={"yes"} + otherInputOptions={{ minLength: 6, maxLength: 128, required: true }} + isError={errors.password.error} + bottomLabel={errors.password.message} + onInput={(e) => { + // @ts-ignore + const value = e.target.value; + const message = errors.password.validator(value); + errors.password.error = message.length > 0; + errors.password.message = message; + }} + /> + <div class="my-1 w-full" /> + <Button + disabled={signingIn || loginDisabled} + text={signingIn ? "Validating..." : "Sign In"} + intent={signingIn ? "ghost" : "primary"} + fullwidth={"yes"} + /> +</form> diff --git a/src/routes/user/+layout.svelte b/src/routes/user/+layout.svelte new file mode 100755 index 0000000..4fa864c --- /dev/null +++ b/src/routes/user/+layout.svelte @@ -0,0 +1 @@ +<slot /> diff --git a/src/routes/user/+page.svelte b/src/routes/user/+page.svelte new file mode 100755 index 0000000..cc50468 --- /dev/null +++ b/src/routes/user/+page.svelte @@ -0,0 +1,208 @@ +<script lang="ts"> + import { + bookingPanelData, + bookingPanelState, + removeEntriesFromSyncState, + selectedEntriesMap, + syncState, + type SyncState, + } from "$lib/stores/booking.state"; + import { trpc } from "$lib/trpc/trpc"; + import { SCHEMES } from "$lib/utils/constants"; + + import DataEntryView from "./components/data-entry-view.svelte"; + import SchemesSection from "./components/schemes-section.svelte"; + import UserNavbar from "./user-navbar.svelte"; + import CenteredSpinner from "$lib/components/molecules/centered-spinner.svelte"; + import DataEntrySection from "./components/data-entry-section.svelte"; + import toast from "svelte-french-toast"; + + const api = trpc(); + + let fetchingData = false; + let previousDrawId = ""; + + let bookingDataQ = api.booking.getBookingData.createMutation({ + retry: 3, + onSuccess: (data) => { + fetchingData = false; + selectedEntriesMap.update((_) => { + const out = {} as Record<string, boolean>; + for (const each of data.data) { + out[each.id] = false; + } + return out; + }); + bookingPanelData.update((_) => { + return data.data; + }); + }, + onError: (err) => { + fetchingData = false; + console.log(err); + }, + }); + + let sessionQ = api.session.getSession.createQuery(); + + let syncbookingM = api.booking.syncBooking.createMutation({ + retry: 3, + retryDelay: 1000 * 1, + }); + let deleteBookingM = api.booking.deleteBooking.createMutation({ + retry: 3, + retryDelay: 1000 * 1, + }); + + bookingPanelState.subscribe((state) => { + const newId = state.chosenDraw.id; + if (newId && newId !== previousDrawId) { + previousDrawId = newId; + triggerDataFetch(); + } + }); + + let [defaultIntervalDuration, intervalDuration] = [1000 * 3, 1000 * 3]; + let syncInterval: NodeJS.Timeout; + + async function triggerDataFetch() { + fetchingData = true; + if ($syncState.data.length > 0) { + await performSync(); + } + setTimeout(() => { + $bookingDataQ.mutate({ drawId: previousDrawId }); + }, 100); + selectedEntriesMap.update((_) => ({})); + bookingPanelData.update((_) => []); + } + + async function deleteSelectedEntries() { + const chosen = [] as string[]; + for (const [key, value] of Object.entries($selectedEntriesMap)) { + if (value) { + chosen.push(key); + } + } + if (chosen.length < 1) { + return; + } + fetchingData = true; + const out = await $deleteBookingM.mutateAsync({ bookingIds: chosen }); + if (out.detail) { + toast(out.detail); + bookingPanelData.update((old) => { + const nd = old.filter((e) => { + return !chosen.includes(e.id); + }); + selectedEntriesMap.update((_) => { + const o = {} as Record<string, boolean>; + for (const each of nd) { + o[each.id] = false; + } + return o; + }); + return nd; + }); + } + setTimeout(() => { + fetchingData = false; + }, 100); + } + + async function performSync() { + return new Promise(function (resolve, reject) { + $syncbookingM + .mutateAsync({ data: $syncState.data }) + .then((out) => { + removeEntriesFromSyncState(out.syncedEntriesIds); + resolve(null); + }) + .catch((err) => { + reject(err); + }); + }); + } + + function setupSync() { + async function syncFn() { + clearInterval(syncInterval); + if ($syncState.data.length > 0) { + toast.promise( + performSync(), + { + loading: "Syncing", + success: "Data synced", + error: "Could not sync, please refresh", + }, + { position: "top-right" } + ); + } + intervalDuration *= 2; + syncInterval = setInterval(syncFn, intervalDuration); + } + if (syncInterval) { + clearInterval(syncInterval); + } + intervalDuration = defaultIntervalDuration; + syncInterval = setInterval(syncFn, defaultIntervalDuration); + } + + onMount(() => { + setupSync(); + try { + const data = JSON.parse( + window.localStorage.getItem("syncstate") ?? "" + ) as SyncState; + if (!data || data.data.length < 1) { + return; + } + syncState.update((old) => { + return { ...old, ...data }; + }); + } catch (e) {} + }); + + onDestroy(() => { + if (syncInterval) { + clearInterval(syncInterval); + } + }); +</script> + +<UserNavbar + username={$sessionQ.data ? $sessionQ.data.user.username : ". . ."} + {api} +/> + +{#if fetchingData} + <section + class="fixed left-0 top-0 w-screen h-screen grid place-items-center bg-sky-800 bg-opacity-20 z-50" + > + <CenteredSpinner /> + </section> +{/if} + +<section class="w-full grid place-items-center p-8"> + <div class="grid grid-cols-4 h-[80vh] gap-4 w-full"> + <SchemesSection + title={"Combination Schemes"} + schemes={SCHEMES.permutations} + isPermutationMode={true} + highLightIfPermutationMode={true} + /> + <div class="col-span-2"> + <DataEntryView + on:refreshData={() => triggerDataFetch()} + on:deleteSelectedEntries={deleteSelectedEntries} + /> + </div> + <SchemesSection + title={"Game Schemes"} + schemes={SCHEMES.permutations} + isPermutationMode={false} + highLightIfPermutationMode={false} + /> + </div> +</section> +<DataEntrySection on:refreshSync={setupSync} /> diff --git a/src/routes/user/components/data-entry-input-field.svelte b/src/routes/user/components/data-entry-input-field.svelte new file mode 100755 index 0000000..dffdf27 --- /dev/null +++ b/src/routes/user/components/data-entry-input-field.svelte @@ -0,0 +1,41 @@ +<script lang="ts"> + import clsx from "clsx"; + import { getUUID } from "$lib/utils"; + import { COLOR_TRANSITION } from "$lib/utils/constants"; + + export let name: string; + export let placeholder: string; + export let value: string; + export let disabled: boolean = false; + export let otherInputOptions: Record<string, string | number | boolean> = {}; + export let maxlength: number = 10; + export let onInput: (v: string) => void = (_) => {}; + export let onKeyPress = (_: KeyboardEvent) => {}; + export let width = "w-24"; + export let bindNode: HTMLInputElement; + + const _onInput = (e: Event) => { + const target = e.target as HTMLInputElement; + onInput(target.value); + }; + const inputId = getUUID(); +</script> + +<input + id={inputId} + {name} + {placeholder} + {maxlength} + bind:this={bindNode} + bind:value + on:keypress={onKeyPress} + on:input={_onInput} + autocomplete="off" + disabled={disabled ?? false} + class={clsx( + COLOR_TRANSITION, + width, + "outline-none p-1 px-2 disabled:cursor-not-allowed cursor-text bg-slate-50 hover:bg-sky-50 active:bg-sky-50 focus:bg-sky-50 focus:placeholder:text-sky-400 focus:text-sky-700 border-2 border-slate-400 rounded-md hover:border-sky-500 focus:border-sky-600 font-mono tracking-wide" + )} + {...otherInputOptions} +/> diff --git a/src/routes/user/components/data-entry-section.svelte b/src/routes/user/components/data-entry-section.svelte new file mode 100755 index 0000000..317d101 --- /dev/null +++ b/src/routes/user/components/data-entry-section.svelte @@ -0,0 +1,384 @@ +<script lang="ts"> + import Line from "$lib/components/atoms/line.svelte"; + import Switch from "$lib/components/atoms/switch.svelte"; + import { + bookingPanelData, + bookingPanelState, + resetSchemeStatus, + setBookingPanelState, + syncState, + } from "$lib/stores/booking.state"; + import clsx from "clsx"; + import IconJamChevronsCircleDownRight from "~icons/jam/chevrons-circle-down-right"; + import DataEntryInputField from "./data-entry-input-field.svelte"; + import LinkButton from "$lib/components/atoms/link-button.svelte"; + import { isDrawClosed } from "$lib/utils/datetime.helper.utils"; + import { + parseNumberInput, + parseRate, + } from "$lib/utils/booking/data.entry.helpers"; + import { LEXICODES_SORTED_FOR_INPUT } from "$lib/utils/constants"; + import type { BookingInputValues } from "$lib/utils/data.types"; + import { + ensureInputIsValid, + getParsedBookingEntries, + } from "$lib/utils/booking/booking.sync"; + import toast from "svelte-french-toast"; + + const dispatcher = createEventDispatcher(); + + let isExpanded = false; + const dataDomFields = { + number: undefined as unknown as HTMLInputElement, + default: { + first: undefined as unknown as HTMLInputElement, + second: undefined as unknown as HTMLInputElement, + }, + first: {} as Record<string, HTMLInputElement>, + second: {} as Record<string, HTMLInputElement>, + }; + const values = { + number: "", + default: { first: "", second: "" }, + first: {} as Record<string, string>, + second: {} as Record<string, string>, + } as BookingInputValues; + + function resetInputFieldValues() { + values.number = ""; + if (!$bookingPanelState.keepRatesPostBookingSubmit) { + values.default.first = ""; + values.default.second = ""; + for (const lc of LEXICODES_SORTED_FOR_INPUT) { + values.first[lc] = ""; + values.second[lc] = ""; + } + } + dataDomFields.number.focus(); + } + + for (const lc of LEXICODES_SORTED_FOR_INPUT) { + values.first[lc] = ""; + values.second[lc] = ""; + } + + $: totalBooking = $bookingPanelData.reduce( + (a, b) => a + b.first + b.second, + 0 + ); + let inputFieldWidth = 6; + $: maxSingleNoLen = $bookingPanelState.isPermutationModeSelected ? 8 : 4; + $: idc = $bookingPanelState.chosenDraw.id + ? isDrawClosed($bookingPanelState.chosenDraw.closeTime) + : false; + $: chosenLexiCodes = $bookingPanelState.chosenScheme + .split(".") + .filter((e) => e.length > 0); + $: shouldFlex = chosenLexiCodes.length > 3 || inputFieldWidth > 30; + + // to reset the rates on scheme change + bookingPanelState.subscribe((state) => { + if (chosenLexiCodes && state.chosenScheme !== chosenLexiCodes.join(".")) { + for (const lc of LEXICODES_SORTED_FOR_INPUT) { + values.first[lc] = ""; + values.second[lc] = ""; + } + } + }); + + function focusOnNumberInput() { + setTimeout(() => { + dataDomFields.number.focus(); + }, 250); + } + + function focusOnNextValidField() { + function isEmpty(el: HTMLInputElement) { + return el.value.length === 0; + } + const focusedElId = (window.document.activeElement as HTMLInputElement).id; + const keepRates = $bookingPanelState.keepRatesPostBookingSubmit; + if (isEmpty(dataDomFields.number)) { + dataDomFields.number.focus(); + return false; + } + let lastVisibleElId = dataDomFields.number.id; + if (chosenLexiCodes.length === 0) { + if (isEmpty(dataDomFields.default.first)) { + dataDomFields.default.first.focus(); + return false; + } + lastVisibleElId = dataDomFields.default.first.id; + let is2ndEmpty = isEmpty(dataDomFields.default.second); + if ( + is2ndEmpty || + (!is2ndEmpty && + focusedElId !== dataDomFields.default.second.id && + !keepRates) + ) { + dataDomFields.default.second.focus(); + return false; + } + lastVisibleElId = dataDomFields.default.second.id; + } + + for (const each of ["first", "second"] as const) { + for (const lc of chosenLexiCodes) { + let isVisible = dataDomFields[each][lc].checkVisibility(); + if (!isVisible) { + continue; + } + lastVisibleElId = dataDomFields[each][lc].id; + if (isEmpty(dataDomFields[each][lc])) { + dataDomFields[each][lc].focus(); + return false; + } + } + } + if ($bookingPanelState.keepRatesPostBookingSubmit) { + return true; + } + // NOW this part handles focusing on the "next" field to get to the last field + const _nodes = [dataDomFields.number]; + for (const each of ["first", "second"] as const) { + for (const lc of chosenLexiCodes) { + _nodes.push(dataDomFields[each][lc]); + } + } + const upper = _nodes.length - 1; + for (let i = 1; i <= upper; i++) { + const el = _nodes[i]; + if (!el?.checkVisibility()) { + continue; + } + // means we're focused on the last field, so skip + if (i === _nodes.length - 1 && focusedElId === el.id) { + break; + } + const prevEl = _nodes[i - 1]; + if (focusedElId === prevEl.id) { + el.focus(); + break; + } + } + return true && focusedElId === lastVisibleElId; + } + + function book() { + const chosenLexiCodes = $bookingPanelState.chosenScheme + .split(".") + .filter((e) => e.length > 0); + const errors = ensureInputIsValid(values, chosenLexiCodes); + if (errors.length > 0) { + for (const err of errors) { + toast.error(err.message); + } + return; + } + const data = getParsedBookingEntries( + values, + chosenLexiCodes, + $bookingPanelState.isPermutationModeSelected, + parseInt($bookingPanelState.chosenDraw.id.split(":")[1]) + ); + bookingPanelData.update((old) => { + old.unshift(...data); + return old; + }); + syncState.update((old) => { + old.data.push(...data); + return old; + }); + resetInputFieldValues(); + } + + function handleKeyPress(e: KeyboardEvent, inputType?: "no" | "rate") { + if (e.key === "Enter") { + const allPopulated = focusOnNextValidField(); + // remove the ending dot if any on enter + if ( + dataDomFields.number.value[dataDomFields.number.value.length - 1] === + "." + ) { + dataDomFields.number.value = dataDomFields.number.value.substring( + 0, + dataDomFields.number.value.length - 1 + ); + } + if (allPopulated) { + dispatcher("refreshSync"); + book(); + } + } + if (inputType === "no") { + // resize the input to be able to fit the number + const el = e.target as HTMLInputElement; + const len = el.value.length; + inputFieldWidth = parseFloat((len * 0.8).toFixed(2)); + el.style.width = `clamp(6rem, ${inputFieldWidth}rem, 75vw)`; + } + } + + onMount(() => { + window.addEventListener("keypress", (e) => { + try { + if (e.key === "d") { + isExpanded = false; + focusOnNumberInput(); + } else if (e.key === "u") { + isExpanded = true; + focusOnNumberInput(); + } + } catch (e) { + console.log(e); + } + }); + }); +</script> + +<section + class={clsx( + "fixed bottom-0 w-full z-50 transition-transform", + isExpanded ? "" : shouldFlex ? "translate-y-[86%]" : "translate-y-[78%]" + )} +> + <button + class="rounded-t-lg w-12 p-1 grid place-items-center bg-sky-100 text-sky-500 ml-4 hover:bg-sky-500 hover:text-sky-50 transition-colors duration-100 cursor-pointer" + on:click={() => { + isExpanded = !isExpanded; + }} + > + <IconJamChevronsCircleDownRight + class={clsx( + "w-8 h-8 transition-transform", + isExpanded ? "" : "rotate-[270deg]" + )} + /> + </button> + <div + class="rounded-t-xl w-full p-4 border-t border-x border-sky-500 bg-white flex flex-col gap-4" + > + <div + class={clsx( + "flex w-full gap-2 items-start", + shouldFlex ? "flex-col" : "flex-row" + )} + > + <div class="flex gap-2 items-start flex-wrap"> + <span class="w-5">No</span> + <DataEntryInputField + bind:bindNode={dataDomFields.number} + width={"w-24"} + name={"number"} + disabled={idc} + bind:value={values.number} + placeholder={"No"} + maxlength={10_000} + onKeyPress={(e) => handleKeyPress(e, "no")} + onInput={(v) => { + const parsed = parseNumberInput( + v, + maxSingleNoLen, + $bookingPanelState.isPermutationModeSelected + ); + values.number = parsed; + }} + /> + </div> + <div class="flex gap-2 items-start flex-wrap"> + <span class="w-5">F</span> + {#if chosenLexiCodes.length > 0} + {#each LEXICODES_SORTED_FOR_INPUT as lc} + {#if chosenLexiCodes.find((e) => e.toLowerCase() === lc.toLowerCase())} + <DataEntryInputField + name={lc} + disabled={idc} + bind:bindNode={dataDomFields.first[lc]} + bind:value={values.first[lc]} + placeholder={`${lc.toUpperCase()}`} + onKeyPress={(e) => handleKeyPress(e)} + onInput={(v) => { + values.first[lc] = parseRate(v); + }} + /> + {/if} + {/each} + {:else} + <DataEntryInputField + name={"F"} + bind:bindNode={dataDomFields.default.first} + bind:value={values.default.first} + disabled={idc} + placeholder={`F`} + onKeyPress={(e) => handleKeyPress(e)} + onInput={(v) => { + values.default.first = parseRate(v); + }} + /> + {/if} + </div> + <div class="flex gap-2 items-start flex-wrap"> + <span class="w-5">S</span> + {#if chosenLexiCodes.length > 0} + {#each LEXICODES_SORTED_FOR_INPUT as lc} + {#if chosenLexiCodes.find((e) => e.toLowerCase() === lc.toLowerCase())} + <DataEntryInputField + name={lc} + bind:bindNode={dataDomFields.second[lc]} + bind:value={values.second[lc]} + disabled={idc} + placeholder={`${lc.toUpperCase()}`} + onKeyPress={(e) => handleKeyPress(e)} + onInput={(v) => { + values.second[lc] = parseRate(v); + }} + /> + {/if} + {/each} + {:else} + <DataEntryInputField + name={"S"} + bind:value={values.default.second} + bind:bindNode={dataDomFields.default.second} + disabled={idc} + placeholder={`S`} + onKeyPress={(e) => handleKeyPress(e)} + onInput={(v) => { + values.default.second = parseRate(v); + }} + /> + {/if} + </div> + </div> + + <Line /> + <div class="w-full flex justify-between"> + <div class="flex items-center gap-2 text-sm"> + <p class="font-semibold tracking-wide text-sky-700"> + Total Booking : {totalBooking} + </p> + | + <p class="font-semibold tracking-wide text-sky-700"> + Entries : {$bookingPanelData.length} + </p> + </div> + <div class="flex gap-2 items-center"> + <LinkButton + text={"Reset Scheme"} + onClick={() => { + values.number = ""; + values.default.first = ""; + values.default.second = ""; + resetSchemeStatus(); + }} + /> + <Switch + label={"Keep rates"} + onChange={(v) => { + setBookingPanelState({ keepRatesPostBookingSubmit: v }); + }} + /> + </div> + </div> + </div> +</section> diff --git a/src/routes/user/components/data-entry-view.svelte b/src/routes/user/components/data-entry-view.svelte new file mode 100755 index 0000000..ce755d3 --- /dev/null +++ b/src/routes/user/components/data-entry-view.svelte @@ -0,0 +1,145 @@ +<script lang="ts"> + // @ts-ignore + import VirtualList from "@sveltejs/svelte-virtual-list"; + import Button from "$lib/components/atoms/button.svelte"; + import Checkbox from "$lib/components/atoms/checkbox.svelte"; + import Input from "$lib/components/atoms/input.svelte"; + import CenteredSpinner from "$lib/components/molecules/centered-spinner.svelte"; + import { + bookingPanelData, + selectedEntriesMap, + } from "$lib/stores/booking.state"; + import clsx from "clsx"; + + const dispatcher = createEventDispatcher(); + + let affectingRowVisibility = false; + let globalFilter = ""; + const setGlobalFilter = (filter: string) => { + globalFilter = filter; + }; + + const columns = [ + { id: "number", header: "No" }, + { id: "first", header: "F" }, + { id: "second", header: "S" }, + ]; + + let timer: NodeJS.Timeout; + const handleEntrySearch = (e: any) => { + clearTimeout(timer); + timer = setTimeout(() => { + setGlobalFilter(e.target.value); + start = 0; + end = 20; + }, 300); + }; + + let baseTableHeaderStyle = + "p-1 px-4 sticky top-0 bg-sky-50 text-sky-700 text-end"; + let baseTableBodyCellStyle = "p-1 px-4 border text-end"; + let start: number | undefined, end: number | undefined; +</script> + +<section class="w-full flex flex-col relative"> + <div + class="my-2 flex w-full justify-between items-end gap-2 flex-col md:flex-row" + > + <div class="flex justify-end w-full md:max-w-xs"> + <Input + placeholder={"Search"} + fieldWidth={"full"} + onInput={handleEntrySearch} + /> + </div> + <div class="flex justify-between w-full md:max-w-xs gap-2"> + <Button + fullwidth={"yes"} + intent={"dangerInverted"} + text={"Delete"} + onClick={() => dispatcher("deleteSelectedEntries")} + /> + <Button + fullwidth={"yes"} + intent={"primaryInverted"} + text={"Refresh"} + onClick={() => dispatcher("refreshData")} + /> + </div> + </div> + {#if affectingRowVisibility} + <CenteredSpinner /> + {:else} + <tr + class="cursor-pointer bg-sky-50 border-t border-b border-sky-500 transition-colors duration-100 grid grid-cols-7 w-full pr-4" + > + <th class={clsx(baseTableHeaderStyle, "col-span-1 justify-center flex")}> + <Checkbox + checked={"indeterminate"} + onChange={(v) => { + selectedEntriesMap.update((old) => { + for (const key of Object.keys(old)) { + old[key] = v === "indeterminate" ? false : v; + } + return old; + }); + }} + /> + </th> + {#each columns as col} + <th class={clsx(baseTableHeaderStyle, "col-span-2")}> + {col.header} + </th> + {/each} + </tr> + {#if $bookingPanelData.length > 0} + <div class="h-[72vh]"> + <VirtualList bind:end bind:start items={$bookingPanelData} let:item> + <tr + class="cursor-pointer hover:bg-slate-50 transition-colors duration-100 grid grid-cols-7 w-full" + > + <td + class={clsx( + baseTableBodyCellStyle, + "col-span-1 justify-center flex" + )} + > + {#if $selectedEntriesMap[item.id]} + <Checkbox + bind:checked={$selectedEntriesMap[item.id]} + onChange={(v) => { + $selectedEntriesMap[item.id] = + typeof v === "boolean" ? v : false; + }} + /> + {:else} + <Checkbox + bind:checked={$selectedEntriesMap[item.id]} + onChange={(v) => { + $selectedEntriesMap[item.id] = + typeof v === "boolean" ? v : false; + }} + /> + {/if} + </td> + <td class={clsx(baseTableBodyCellStyle, "col-span-2")}> + {item.number} + </td> + <td class={clsx(baseTableBodyCellStyle, "col-span-2")}> + {item.first} + </td> + <td class={clsx(baseTableBodyCellStyle, "col-span-2")}> + {item.second} + </td> + </tr> + </VirtualList> + </div> + {:else} + <span + class="w-full grid place-items-center pt-32 text-sky-400 tracking-wider font-bold text-xl" + > + <p>No data found</p> + </span> + {/if} + {/if} +</section> diff --git a/src/routes/user/components/draw-select.svelte b/src/routes/user/components/draw-select.svelte new file mode 100755 index 0000000..a95e4a6 --- /dev/null +++ b/src/routes/user/components/draw-select.svelte @@ -0,0 +1,55 @@ +<script lang="ts"> + import clsx from "clsx"; + import { randomString } from "$lib/utils"; + import type { Draw } from "$lib/utils/data.types"; + import { calculateTimeRemaining } from "$lib/utils/datetime.helper.utils"; + import { setBookingPanelState } from "$lib/stores/booking.state"; + + type DrawOption = Draw & { timeRemaining?: string | undefined }; + + export let componentId: string = randomString(10); + export let draws: DrawOption[]; + export let fullWidth: boolean = false; + export let monoFont: boolean = false; + + const updateChosenDraw = (e: Event) => { + const id = (e.target as HTMLSelectElement).value; + const draw = draws.find((draw) => draw.id === id); + if (draw) { + setBookingPanelState({ chosenDraw: draw }); + } + }; + + setBookingPanelState({ chosenDraw: draws[0] }); + + onMount(() => { + const tickingInterval = setInterval(() => { + for (let i = 0; i < draws.length; i++) { + draws[i].timeRemaining = calculateTimeRemaining( + draws[i].closeTime, + true + ); + } + draws = draws; + }, 1000); + return () => clearInterval(tickingInterval); + }); +</script> + +<div class={clsx("relative flex flex-col gap-1", fullWidth && "w-full")}> + <select + id={componentId} + on:change={updateChosenDraw} + class={clsx( + "rounded-md relative cursor-pointer border text-left border-gray-300 outline-none p-2 transition-colors duration-200 bg-slate-50 hover:bg-slate-50 hover:border-black focus:border-sky-500 focus:bg-sky-50 focus:placeholder:text-sky-400 focus:text-sky-700", + fullWidth ? "w-full" : "w-max", + monoFont ? "font-mono" : "" + )} + > + {#each draws as option} + <option class={"bg-white text-black"} value={option.id} + >{option.timeRemaining} - {option.title}</option + > + {/each} + </select> +</div> diff --git a/src/routes/user/components/live-clock.svelte b/src/routes/user/components/live-clock.svelte new file mode 100755 index 0000000..8ac0e53 --- /dev/null +++ b/src/routes/user/components/live-clock.svelte @@ -0,0 +1,44 @@ +<script lang="ts"> + import IcBaselineAccessTime from "~icons/ic/baseline-access-time"; + export let startingTime: Date | undefined = undefined; + export let label: string; + + $: _time = startingTime; + $: getTimings = () => { + return [ + _time ? _time.getFullYear().toString().slice(0, 2) : "----", + _time ? (_time.getMonth() + 1).toString().padStart(2, "0") : "--", + _time ? _time.getDate().toString().padStart(2, "0") : "--", + _time ? _time.getHours().toString().padStart(2, "0") : "--", + _time ? _time.getMinutes().toString().padStart(2, "0") : "--", + _time ? _time.getSeconds().toString().padStart(2, "0") : "--", + ]; + }; + $: [years, months, days, hours, minutes, seconds] = getTimings(); + + onMount(() => { + const clockTerval = setInterval(() => { + if (!_time) return; + _time = new Date(new Date(_time).getTime() + 1000); + }, 1000); + return () => clearInterval(clockTerval); + }); +</script> + +<div + class="p-2 px-4 border shadow-sm border-sky-400 rounded-md bg-sky-50 text-sky-800 items-center font-mono flex gap-2" +> + <span>{label}</span> + <span>-</span> + <span>{years}</span> + <span>/</span> + <span>{months}</span> + <span>/</span> + <span>{days}</span> + <IcBaselineAccessTime class="w-5 h-5 mb-0.5" /> + <span>{hours}</span> + <span>:</span> + <span>{minutes}</span> + <span>:</span> + <span>{seconds}</span> +</div> diff --git a/src/routes/user/components/schemes-section.svelte b/src/routes/user/components/schemes-section.svelte new file mode 100755 index 0000000..7cf76ff --- /dev/null +++ b/src/routes/user/components/schemes-section.svelte @@ -0,0 +1,90 @@ +<script lang="ts"> + import IconTablerSquareRoundedChevronDown from "~icons/tabler/square-rounded-chevron-down"; + import Title from "$lib/components/atoms/title.svelte"; + import { COLOR_TRANSITION } from "$lib/utils/constants"; + import { + bookingPanelState, + setBookingPanelState, + } from "$lib/stores/booking.state"; + import clsx from "clsx"; + + export let title: string; + export let isPermutationMode: boolean; + export let schemes: Record<string, string[]>; + export let highLightIfPermutationMode: boolean; + + $: chosenScheme = $bookingPanelState.chosenScheme; + $: isPermutationModeSelected = $bookingPanelState.isPermutationModeSelected; + + const subSectionVisibility = {} as Record<string, boolean>; + for (const each of Object.keys(schemes)) { + subSectionVisibility[each] = false; + } +</script> + +<section + class="flex gap-4 p-4 rounded-lg shadow-sm border w-full flex-col h-full overflow-y-auto" +> + <Title text={title} size={"h4"} /> + {#each Object.entries(schemes) as [subTitle, schemesList]} + <div class="flex flex-col w-full"> + <button + class={clsx( + "w-full p-2 rounded-t-md bg-slate-100 text-slate-800 capitalize flex justify-between items-center hover:bg-slate-200 cursor-pointer", + COLOR_TRANSITION + )} + on:click={() => { + for (const each of Object.keys(subSectionVisibility)) { + if (each === subTitle) continue; + subSectionVisibility[each] = false; + } + subSectionVisibility[subTitle] = !subSectionVisibility[subTitle]; + }} + > + {#if !isPermutationMode} + {subTitle} + {/if} + <IconTablerSquareRoundedChevronDown + class={clsx( + "w-5 h-5", + subSectionVisibility[subTitle] ? "rotate-180" : "" + )} + /> + {#if isPermutationMode} + {subTitle} + {/if} + </button> + + <div + class={clsx( + "w-full pt-2 flex flex-col gap-2 cursor-pointer", + COLOR_TRANSITION, + subSectionVisibility[subTitle] ? "block" : "hidden" + )} + > + {#each schemesList as scheme} + <button + class={clsx( + "w-full p-2 rounded-md cursor-pointer font-mono outline-1 outline-sky-500 uppercase text-sm tracking-wide", + COLOR_TRANSITION, + isPermutationMode ? "text-end" : "text-start", + chosenScheme === scheme && + ((isPermutationModeSelected && highLightIfPermutationMode) || + (!isPermutationModeSelected && !highLightIfPermutationMode)) + ? "bg-sky-500 text-white hover:bg-sky-600" + : "bg-sky-50 text-sky-500 hover:bg-sky-100" + )} + on:click={() => { + setBookingPanelState({ + chosenScheme: scheme, + isPermutationModeSelected: isPermutationMode, + }); + }} + > + {scheme} + </button> + {/each} + </div> + </div> + {/each} +</section> diff --git a/src/routes/user/page.types.ts b/src/routes/user/page.types.ts new file mode 100755 index 0000000..e69de29 diff --git a/src/routes/user/user-navbar.svelte b/src/routes/user/user-navbar.svelte new file mode 100755 index 0000000..4d23e6c --- /dev/null +++ b/src/routes/user/user-navbar.svelte @@ -0,0 +1,57 @@ +<script lang="ts"> + import IconSignOut from "~icons/ph/sign-out"; + import { goto } from "$app/navigation"; + import LinkButton from "$lib/components/atoms/link-button.svelte"; + import type { trpc } from "$lib/trpc/trpc"; + + import DrawSelect from "./components/draw-select.svelte"; + import LiveClock from "./components/live-clock.svelte"; + + export let username: string = ""; + export let api: ReturnType<typeof trpc>; + + let myLocalTime: Date | undefined = undefined; + + let panelData = api.booking.getPanelData.createQuery(undefined, { + refetchOnWindowFocus: false, + refetchInterval: false, + }); + + $: draws = $panelData.data ? $panelData.data.draws : []; + + const logOut = async () => { + await fetch("/api/auth/logout", { method: "POST" }); + goto("/auth/signin"); + }; + + onMount(() => { + // parse the user's local time as an iso time string, in their local time zone + myLocalTime = new Date( + new Date().toLocaleString("en-US", { + timeZone: "Asia/Karachi", + timeZoneName: "short", + }) + ); + }); +</script> + +<nav class="flex w-full flex-col max-w-screen shadow-sm"> + <section class="flex w-full justify-between items-center p-4 md:px-8 pb-4"> + <div class="flex items-center gap-2"> + <span class="capitalize text-md md:text-lg lg:text-xl font-medium" + >{username}</span + > + </div> + <div class="w-full max-w-sm"> + {#if draws.length > 0} + <DrawSelect monoFont fullWidth {draws} /> + {/if} + </div> + {#if myLocalTime} + <LiveClock label={"L"} startingTime={myLocalTime} /> + {:else} + <LiveClock label={"L"} /> + {/if} + <LinkButton iconleft={IconSignOut} text={"Logout"} onClick={logOut} /> + </section> +</nav> diff --git a/static/favicon.png b/static/favicon.png new file mode 100755 index 0000000000000000000000000000000000000000..d083070fc002c89836c3feea275ddfd294f1b1fd GIT binary patch literal 3117 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 Hu0mjfjiD1s literal 0 HcmV?d00001 diff --git a/static/fonts/InterV.ttf b/static/fonts/InterV.ttf new file mode 100755 index 0000000000000000000000000000000000000000..ec3164efa8fe938310f74b6156d3ad33ccb2fef6 GIT binary patch literal 803384 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 ?ho`o1r~bR7X>%5UEUNOd`5YX%mSiDeYFGzD`EQ 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%0Dq6U{pGSTfs98Msn(h=U&e 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%0DT&Wh@IO|A|;!G95D0#OWmq$qIMQoNTay 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�XnqX8% zqzOihdblr7qA$NjUw(r5CC?S|R5Pbey#gxW<Vn`+fBJB-+0cv!T#KPBo^7-CZKcY_ zXu56w)XCS~{W~yQQ6<d=OW}j_rm$|&rIit`3_nxu2r5XBk2NdEg^i;FLHU)`goo1D zM{9E<&WYD5ymAApcF#r3VH;l@#Yq!_Lte11T_^iK{^(GvVMSSeOH2FdwBo07VZ{tb z1-G$vaV6KDZa>)4Shm8@^yxQefc#uq1+@;ff?IRN?WLs>r~QCJsMM$orIbHt%5_3H z=v7-4cdJ$snwq{i$4RkkEB??aq!#~ndHFAI%ghRq?X5gPFweT{mrIxACxyD}E7!m9 z+CK*w)|ShqYii#8{3=YOC}5#S3vS8>03xL^n{+&CLI(VS5Il}_P}d<+G^9u={<9;a zA^H5-kniN_-fr@JvX0jxX}`uG3=f_`px_tXgMz3_vBxRr;0p{L^jZIzVPrzkqPV-r zlM}L_XrYUDYv6Mjlu#00;3Qsv^I|H`fs5p!Eo5+I(Vstg3~o^YX0(FOvtr3Gc$x=> zIW4-2!4aZOQRpwS6R7<~=s9+V0_V_QUQqjcKE#E&>M{P|lB}O9OOVwK9XwZ-0fNm1 zLm(uapXdCH3xv2pc%@M`3yOe!5YSW#XrlTMDJW>T?fEsY9{A|*jZG~_KC63U_iIl* z^}E6Z|B1%6o>ec@|MS!Hw>;%gN}}WA;}Z?snZCf6Z*9$it`!<#Dz>s!G_)S}BHBB2 zXibhXQEmexS{3zupi#NEvvpE=KB?T$-T{eT564OdB2}WcWr!=92b;+oM7+`7V!O0f za<3?I;Al`<2vt+Ky$)Ua+c2h*DHV_iiRfeO*F#(T8vBzD5x3n}7d)1W8=!h17UKZ> ztMFve<U@bKeJBOaIA)k=u_R8kA|;0EID@s>D8|%x^bX;_iL)0tJKK8TV|%Ehegg$R zLKCYvwCj9=KYn>OBTCuCJz<6~;c}Fw81slM=Bzq5`y(tX(2i-0?5pkB%A<hk<yWoQ z)e$hJKls$+PyHm78IyB=R`#>`c4M%6?;m#lVPC(?HRq1|=!L*G7o(yfZvLlp8YIR) zJx&$uQH+<=HR0FOKn`xkuf&(<dwu=Kj-Qo-{aydqml!qlO}Dpiz}GhfKOEU;GPE3M z`RLPse)84epar!iVok;X#hA;M0ZAjnF#~S1xUVdZgLF1<g2|}5Dx-WWG;#7O5JxwY zR}zh!HWUiVX8ZVPQ;dlZ$%q6ISZL_<H(z#qc?u7yO_-cCd7L}8kAeq#dISXQjt=%i zS2Fzcxask@fgBoPC|ZFRpD=y326U5dP38(1uEU)DB0%9<K;g}RLgEt13naa%qob+Q z-&o`KS6BNxYZ`%8>f5|^TfE*)o4jpX>Z%(XtDD=a*0#5=UEAKgwhBDyQzBv>yk3j7 zuTP5h_E|0eW=})^lXOd+&ZSwl<sc%Q%@$S#+Oo2N^Ol3hEiMNB;0iN{RMc=8_$Er6 zfm{kTII@XbwhT@-Tv;CJk(;<Ye8XnM<(16^Y*Yc7Iz)YQb7rQuBQ*^SYifr#yq89M zX=8i%pN9S?S=!ruz8b;OP-VAQHCTii2(IOsbJ3S7&Y2ee?KE%$RjksCx@VW43+FgU zZzREmq-cCIa+MSC#$FJKPO!!3e;V4u$y9rdeCZ^Z;z6zhY7H~&QB}4J{{!B_C1H=Z zJ(!<YF+V@T{A6Q(ZpHlQS{KaGb~nI@?LqKyD-8emdjJ0YN8{t2l<tRG4fGPVlOMfd zoN1{2P~mMeEoSCF*8A#8xO#jYAAi%LMT_PZQ8t^u!VI%ryEtp&H!KAXbi1O`W@5o- zF8!};NWKgC=bFBROAVHo&a<ax;~$#m+zwX?TJdclFKM8je~;{a0C$*IP?yB8vt|#B zaJWL`zifKWq1<Jtp7)zyW#XnYrTBW6`?<PTcfEhscHOlI-f69^g{twlFslDn`7PWt z;Q{@K^1Ja>yK6hPY~NY8zhf{t&)RpS^T_+PwVrul`w`r@XM*iqs(W$Qt{s2>M75*v zE~+gvqhMbA5I=pUEb5joFUr1NUp)_aqX?*t{8);VUveSTYyV|rZ*kP`S#i4U`s||R z%SD4`=9L;@*1h*!;|Al&J4+tQW)ky2aqwRSS0Z}oy}Fm?QdCm%jz7Hq=H7NW`G)*^ z?!G6##EGxF@3=9Eo%&?&o3H<22a&@k4KLNb=VhiV3;rvcZh;#;ggC%hn?cVpB`QAN z=s!9zG%P0f_M8X|o;p2bm^5|j6uZG@M;waXmSp7z2LmU1dPT$V&_Ivhm=GUDs*m@O zZOxORkBR1GPEYCuOTsv06B+D2b`1Fm`k1fpXwR{41~{|9G|m*8V8Iy%)TuGV#p+jY zP)&}{107T_MMSA)7fF{UJL3H87rjhKx+KB{^D%T8Wvv>NDdO2$*nOCRZ$||{6OwdE zt2M*%@x%Bcn3q<ocOv<gGzz#LZx}l8iS>zy4QLbuRil8Y-5xNQVVwfxdiA=uaNT>j zj<~5uaNW(gj(KtsuUQh2Ebh~Ic7HMK(Vy$>ZQfC})kCg8YrqT@!5J+bt{jgT-VDKo zaH_$((}}VFDgJRACc56^gu_1h1KX9m4KLTd7XX6>i<+`PgecY1)gOTP6za;xFC{7t zPCVouHyV=~Hwo@`Ma2jAZrQTs(^-#Xlcx!LS^LO!ZJU}Q(IN&!SmKy7RGA&7mm1f; z{;Of6lk$L^S`e(H5+)G6&8&hevPrDC0NU>+QVK`np3gzgU5UFkV9~TgZMX(^yr&ee z`8d2Cba#(RcRxZQrott;SY2WNg*LWTUz#=m8&(vCwOK@|tM~V{4<Y&1*{;^Qz&Q7~ zo(})v4<HOTZ3$VR%le@C%^XlZYKW3Po|@Q^O|c}(e9hMO_@^QiRP$7Py9<eLBwbOF zBi`SNgmG%rj<CJoo{k><g~7y&){Z_^qvF&PNG7oq+`}fs#;d-Fh|{eGHV8lUF6NHE zJw3Z9BO^uU@1QvN`VRlN4Cy^rR$wRy3ZxMjH*&ngJ8&MFJ0$4g4T(t!(XqjE2;3Vn zj-Q-lOEjMMpFfAAQ3m-WoQHkqLb{2N0O9940zWGb2}cBCA<qsDh1^U-Gz=L_wBXB- zPlDJps@+X|9~_HyLDWGH%5YH|4I(L;#(gzPdXsJ-aMs62q&ycOp|=0DY|z4-;vER` z7J!I_4<7G8pH=9*5zsjc&`G{7RFRZqIYht8m1we3#J_2?QAWNM;4+F}RLtN!sBJl{ zq_`Y%oj6VqtPX^M2qcq*0x6l9DH2<ejnVv!RYVs|{H#4?+MI$VPgp=!z=wfkRfC)T z3ijBqM5c2Kx|Z777U@pa8um88klNeo-utQ_Lp_4z+Bo!(wMj3ITeD{E3zaXdU9)E8 z%2g{@uCJ_IFJYO(yI>tc;qcJIt2C(76oh}`g(o9DFg+RRfxqL)Zn^ZyfS`9M@rw03 zpA0j8;mMvcjXl}VpD=j~9gqR&!7v!d0iDMM!HA(Z{(n5$h7If1MILQ6pur;wlwoLe z?D5p6y9c8}Uf;yekcNf4zMaZ_@_u<gVhJDBelTMOZj*y)djL)eGYmU-y}Yq<!}hJn z`LjR`88U&!%)qny#L1V>Vkk5)I3ifDNeiBnjpI=&jLh3Uu(vN5@-=VPnd8&*mqNfZ zm-$;iIn;jWn9rB~c=_YY$_N?K>|zYQ5-muqVAfG|*f$+r?d>L0Q~(vpq#yt1sRqU% zPWcQALAgVrIuwGShu<72(7n?37@mj75)IQL;*F4#2YI@{@@b(c=LL<1kBr%7fCI*B zcon#MIIIOn;L^-AtGBD;M%IB_FmBgj+-76ktb~n&4z?lc*E!eS;JD+i8{-F2G7$)1 z8{44$g>&+mV<)A!qN1hckHA5BdHK?!qT8>xxOvO0J0zWX{Yziyj{{ZSs7z57a?itc z&Z6-0hw{5hqEI=m?7peUl0*@Ai;*SCgUDoH>}A-YLr-$MzjAY3wGQP8=|_Zi!Ov7f z@e!6v>IfUDN4ElBeux!C?L%yDm0tQ0JcFp+g&?_w&~n|4rFkFpRN-THz%`Kw1FW3T zdKDnnP<a+wGEZDzU+*{l@J#CerWgLyr-$AA@ZfRjrSNJ=$GBXFak&EHG6Ca4)&=d3 zn{Jx-zzQcx3tTdn%>KeZpx+^710IljhX+c}26o4eP=Mu+3J`q@pc7kyH|2%8Pbq@a z#9?KcQli<~&(g%0*4DkSJ-yr7dJ^dSq;#7qiDyQLV5Yh^UsbA=Df8j<0b6l`g>n(Z z0vci^P<7&4;zFUJv%#~Fp%kq_3-50+;vf8TJi*;~g4-f1Vj7+R@Gl=mA8yuf>|eNW z&z?6n&I2`kRPn&eC<}djO1rvZ^}31*@b&tpgS*!Me&bqjn=25V{Wz$`bTMUUC<eYg zF+)SW$ko@ob?>LJT*1jG*&I9EyLa#2+LxbQ_uMO3Audp{BkY+e1qmOt*ssVaDE*zO z?B}Iri*L`&%(*o`1oxbfVPa~UEgGw&3ag|WhMI0MR)>Mmq?!=(fGmPA02}Rg9GN@~ z#-~)N^gk^YRcU)(Rb6;tvr`33b_~7nBCP|(x|tB^#X;al<MdJubd0Dvs1YaOXOP`4 zcwS}-s@>}~0v|d%G<3#)a^R$&PE(hTn@|`F2OaPpqk(cmXraLXLthhymoaYWQhS1f z>?<a4L#ZzC*<`j+U+TJ}d<(Id9h;qJQFaY@GEg<lE3e_9vO*$2_(CGSg_XIru%C6* zS+uFXy3|x3yA{j}sbLcVC-j{^wvSu|60CtNel^k-A(yZ`sDn>GzEQ89IKLm^7k`Fd zq$=y_fM`^#Wvqle>nW_s#avNOl;mb*RaO0SI*x9REW9<^;#3UKbcqC`%4kGy=r9*L zK}bWE%u3DRVDk>A@?Q}*wa56a?+;1@^w-N@A?CFh`P6=jy(M74muh?`K74K-R{AXY zD8k8)f}=0fZT`yp)h3oIYLT}TS%Sh#sY3f`X=&jNwp-PO)r?6zp<+H8JBvmC7P42| zN1cH(gOI@ABc$=~>fV0#NBoD}NjkvB_`?$p^KB3ITcxc?%Nr$9vNM4fV|4KNlmi3D zIuCdC4-9#TM~;E*O=paaLP9d~{F6{@8Vc$J*eVi`#}1)MmMJM$!LBd^E}s!^&nq#m z(=o0SFs>$ytHG{%RwxTNe;qU!{F+@`kg8Pf0d4tI42Sm-;25AfMQRSfe+?*lIv%nQ z-UAJ=CI`hRQW}I`5+N@Ejc}xZZS`Av)*wS$8qmpsfah5rMmj`0!lX{~oQVFUpg&~W zh(>>+G0#zZTW2QEayGWXj_A_ZyPK0m){QBxLK<UVT?Zs_I6#4FuSJTRG;p{4^0Y>{ zC$JR~3(Ny~v@rpn%Yi3s(lh!#U8qY3i!C+<gVkaPA~q$Q>w|JHPsVSPUY;^>nef}$ zV3dK*Ilk0^G`H#LR>{z{b>l|&#*JIMq+C>{tdJ|<)L8^y&a|{mk|8ZEGqXH1Gb2sP zgIT#m_29@-KTDJp)R#x0P+BGa01^n|Wq`14u;497Yt`o`4$g@_T#G)W;rSEQJ`ltD zqOSB>%zS$3Tm(Qjx!3~^wvV4WH8C4ZH^gVj($feB`1g9EAQ42x?u(60j*XofD>>1P z6nKxrK*Dd@v}qoKVoI=^0=!tN<nvZ5vM(}nB%xJqNuLcj;~%77g;4XW3@PZB&u1}6 zg#g9#DhW5R^VlX1n_3S5wN3@s7LZtScWsq6nTLn^di&20Gjn__;|FB547e$56A!^A z9;H{27JW!D1|v8Cqd^bcrDuqWhk)kU6o!Pk_ApOGBQX^tK|B#E$3ofz{e!hjZJbaB zXL~NqmV<Rf(Gr_AvvfKH>TG8F^`Tm*I0Rw0npQ-34Nd@q*|60WV<a*%>gFp3c?B9= zg^**XSa}i-f%TO6qFA{}4!M|Jj0$C<lki{*0i~>t=n*~IlAAF)Sr`;Aung&&JMqg^ zgsd?{<6vr_HV(>DauuK!k~Z-{-_XkFp+R^FfY`xHAS6{p3kq(3E<g%IjRZ$`gkgll zX!H0<wn^j7Q5xWQDKZw6S7ywfpsrGkg?8Serw$*UMGlF*$nGZCw%BYi1f<&#!>}9= z;p9!G=4^zZSIJd0w}K@Fh(P4*7D#`c=sHPi9ctH+cn097A7GT2)kvU-5*+v=lK|G_ zrPSe~th`>rY^#;LO(HA2XnhZeVM&=hTD}KJCf<zZkF18Vdp<kiZK;3t&-+q-VE&{9 znYb1MDU`X8wTsL6krScB+tH!zY?X0gx|c!k6x4xJ%m$+Qg6%XeE-r{Y+|&A5==;Sv zn2#2Ag88uQ8^m#eHp=q*dRrhPH4(HYF*O5n$U2xK--I~Z2#rx4L|97U)~E*4bhA^q z;h&LS>uJuQcSAYh8D}s-44s%r9xW`?=MCtG;W4eqEBTQS;)Kqg@r*-VT@>;?dp=}P z4CDB-A(H`@2hY2?^TF^F(>VQif1{}oe^<J=O~94puB3YWAgUBwaLm0hzI5HC)Yrvt zQVr#5>`cMs{`TZUZ@~E)J8bO0Q@U{8{JGq0rHu=)xw4rR0Q}g>mB7tR#<*YntyCN# zNScUWi^Z(O;=kPR;XEZ)9#Hl|B|ig<=0oyk`AuN_N>MLZArF=c@EJEq1_Lvjd<MH2 zj@9eoCr2WJ(cI8rHn*6o8XBsk1sGw1Dq0Rrc(<skbgB%lnm^;&q4xGe(mEFx2#DGs z^9KSKYLs7tex*kGMOH}aSDw5{E?1mbq4lu$mO>J`i9a~Z9P$#8&#>Da%%!v2Gps2o z<eI$+gmXFOxCZQg1yJZ(zR-*wZV`>%%uGM&Ra;s*&_hyUYyuq6XFJDKB`lNHMGXx2 z*`R*_(RZG8M%d4gJ3AB%1cK-;t$_vT-_7XX^%ytGr%U<nopKkr(WelWlg;&ZXR9=3 zxv*jD)>k$V=etC?L%AB`IYYTpF@XU!i-{OZ@F4KK9Xu1CGWX|YDbuE<&zYPIcY-u; z#)|YjJW^DufdZbaDXDijF>lnKRAtgyF%cuZ-fV6N1RCGjSNo?eTUuK`Y4INQN_R)b zyhR=PPK<q%IuA#Id<G$K1;JmM*)Zz^)PuQ@HYY;VG9ukDGFG2qJnByKBcMt`NLmHw zU=a)kG>Yc}LDT^Q<0qQQMjIINpMgA%7r0+35*1&HQTZ`Og**djjZd}HsPxPGXiSu; z{DI9CB+gKFq5B}(EI?r851<ph23(&J-}7-K1ENhnu=3qNS!K$TfVx#;at6VikYP=q z48OCyMZYb7>=%wS2MqghXTIz_;+M$&z0?lW-yoFcXD<KEtq`#45u8~I(zqG`uvyLi zwh4J<mlWUqv&Tp!@8SRJ`+$cwG1*J-YW6~ti&srG5XWmZjeAh|y1oIrj1Q#;03%}% z3>E`pXJVrmJ8CB(&SE^#2C(M~k1WoJ=Crid(2UZKWRsvvGU#A}9f1*p(?+3)fE;2N zHz;=e{xi}J&@ob5f{+m<)9{8^*z6bzQ)7rv`>`$}84+V}$9Rk{dDG}HzNDqpnrb>a z*=|vU4FL{NWYKnJ;mHsSi9|b+ro7zglvaxfN1{)kPg)(u;uhR%67Cg^dqv@1QMgwW z-OJS3QA76=khr(85e{0orQpo+kuAE?rQTRTe*fjmJ$kygtG?bPJtM+}A1s^)8z7Jt ziznhMl8j$T!mnJ4Ul0yZSGT)1WkGfrpe5s*-sYy3eV#SDJKsd+mDE&=(b~NG57pI@ zu^?^ggrt<T3072IVpVydWQ)O`ry^D=4YtCcD9eGg*BN!@=%{ETkEGf<?6tRj{L#m4 zZ6AHq)*e}{Q_zcVW4SSd^iq;(1+Nb7(3f{4SH%gNm<Ne?Duj$=@Xi0z{unKBF>$dv zZFIcxJNrXkQ8AIR*V!ZUc=z4Ax>&NfTDx_t-3GvPab`0Dz}A7S>S61o)j&>+ce%)H z7uH#);4W81#x@=^NH|gpfNI^>Mak1=hofeJX>J#drF~~U|7S4&hD2YfL~^N)x0XBD zvzoH962QuOSV)RcAY;R}%F4RKuwhUorUh6fHPA_X0)D~=&fr4`E7cHJ)=>mNXqb<U z*2(ci6qPkbq)9jhI2|46>yaX`YD4c*BE5@4??^)zlbrm$`~~yYY<PLwD_dC)xOaWx zc)`tcrWlVFX&-xifn4D23icQv<M{}*xin|K_%b9BS>;NX%?E$;H>^nTIQVR28@OMW zO3y{h3a@4*<v`$QcjO#WlS0P{#1@elwdjwQhEQ$Lu%bT>c0lqtkn}Sw%X-2qgP>(v zq~~KaQLj2+r8gi8YY8<MR*2EqIXoJWGiSwmjpP9~{+b)?NKQ|lw4f&HN-?J975((S zg1jF;=uDMZNuG*}_F^!JW!}%WW4{CgYT^x1dIPx*nXqRt#m2>&OmT7GD8kg{yLyxx zVL)rZ@7D?$aqv%-(4$~ztVg+ErJP6zbg%L=rBGM1@57cB<`9i3c?*9`Jt}sl{D&UJ z3dZOtV|;v!F7`WnL_7yUu)z-Zb-OAjs>T-HR9VG0XEElV3k+Nhj10zrX)GBT79bvt zDHsGA!nfUyZ<Uh%9CuoRJ7r@=vH>R)*Q0Gcb%i5;Ep!H^=k~S+iSY~arw?qO3wHds z+KRkcCtBXih5aO4{~|^C75^UdAX1<5gFYm@)Y9_K=kA!Z-1N5d$WkC!W@KcP<)}Ek zian#bp>6udWaTQAguLrczt=zsF}Aaf(Z4CoMLvF$Y0BJ!pJgM7{B~qUY1nUd!VBOd zAab=qVf`eardkYJAYRcxW0)dohlb65oe?Erdh6;|<&dc#?N^#czj>Z2ok{tsYs0O8 z9Lh#O6$FyhmZdzR*=U%tC~Ri)n3g(`jIX4mWL~miqq-(<!gAu)GOl8(Z{VC3npQY} z#Kc&v@D?$d;aVLZZ<{$Q%^t^FqtBhdVvHY;cbr>`)aOj2K{P&$W%`x8PRo1rc6$<> zk9C|IRalT0i%jcsaA2Sh**w2FD+@6b?f5bBTdN4KgX{6gq+_3onMuUVm@zZsX02Ma zs(tG9w=62U(`x(vtXXV7`Ux>!=XxD%icZc2-ChLzLG4$hGO8hV9WCa5^T=ln4IjPI z++0%wcf@Q`V}U`t)-zAld4yG?+hC01s;h6qE%U<oOSOOzB!}BQ%2K!^_xAP=!Zaw$ zFdX(AJ>HKfq~Yf@X=&CdkIp_B^4KIR>J_Q*^*uZV=|0JWlsGkdio`%|&F0OUKk1n` z(=JSzIeo^QTNd1UGkZ&P3Hx@m9_)AXgTn~xT@I@On&5h&`Y&Hd%nFr4!q4w2yz5%q zRcYxNGt36#srL5I6aa)vbn$+_Zj~YLb~xQH%C}wN;a%%Jchb^>E;0<KSA%8|>l1#E zTcF)70=)iK+LT~o15DOgtg*}#JPQ*K%uNWT7KEr1eE~PqB2ao{=nPy5+30G72I3V5 zxb|#PpYKwQ%^02yXFqw^=-Sbg@0fw%fKViC2~Eg*1ms)$=ua{e;4>FiPd#hAH_BW8 z#(^&ppH(X2NutsWjT@?j{?<+d_9VWkY6FqVJUj*{iBiV9*46^UcKZB$yu}h{;1Qws zoXZ#(@D2C{IT#WwV|hl2TZzWVUy_AY#Sz&6{R1-GPLVLwmCborG3Vul6*#k64P=84 zDo{j^441&w44&?AH;nKsa7M!XG0>8WJd3t>*~7c*HcHyN5AE60mk1rD$iqA#Y0WG% z6PFU6>`?v4U<Q<))*6uhDIjBm+#Dctg)PZ9;m$wAok_buQQ@R#0kMU?_$e|Y34sal z#LW%k{_v-+V+1sTp%j{-@6?Fa(E8p0QV3nx^cYJ@elq{Yf>7^~&dyvA&T3?#d=BLj zwrKONLkd6uO${#fcXxF4^>u#{5Dk9s=h*z>vjB*G4=7tLTf;9cSw0_%(47#^i3_-J zFlX$b^wM~PppQaIzY$7s6dXbB?Z7Ew$x-A$L6HLlPK<4=bm>EI*N1vx*d5tAe{SVV zDir+@&;KT#pQ;j-;rSQf`5j7u(B1t&!aLbuk<yhr_1h^G>%ST{6(CW;ePKUmd@cYW zlOt^$qAO1!a3cYnM*-EM8?4*pnh(Th3O6|j_`hGfap#^vJiU@Gs)%C=zsClnViQb* zzfUTilR9GpFm~eAshO5Q$TDHdj47;rM@44pk11}UN^Q>>i&N+1UfHw<?0T~&o2vlF zP|24RmH!&2tbom88-_02_OX62;~Cro2(}EjUvV3_HtrbLiuN|Q8?jzhxPeP;Z!nbJ zLH6Y3I2LX$Y(EG^W*UU0T9UdDKnv7Qu^vs@70!Z;B$G(qRB;os3JOv|wByX?Yp%cM z`$Zz#=Y%VGm=OGi9TW|w9~RsN)G)`4{0-!zNM7O#p-+BTDIdS?ug94%y?Din6~)s9 z*0*<4<@4*;ug-xd$<Gipo#%=dY}vSWt_}ZetgEBv?w4RO*};@&zQ^-@efsoFgzd*0 zjXKZ;tsbE|8kqxF=%(E;T^KML<84!?rX<A}jj_D{)VZO+c|nr2rw@I};KadOVgyOh z#xmq_(JJ!cza8us`B<aIt>>cPf`J4eZipt5Xt3L-Oo%h%C)^3BNTAmvON<UsBY@UK z8T2MmHw4>L@5!KO;Ekr3aprN+8g!COxDw<VH~PxB)r<@4R*4%UoyFzcSUtEgxs8HV zA`F=doA={flC|%^*|Pwf-vexN^I}o-jN6YS7tgBm(ZZfJmE8yubYsm&`248G32zs| zwt32vu+uG5=VF;)w;yXlc`cQPGrZVz%zo(s4IMzS^5x2X6OGnS-gx%eXW#gwZ``<X zeMjHlwr$({M@InFBhsYQ#~)Aide4uWmXnh+ZQOb9rQ6c|T&9}3FcV?tl#VZnn+D&B zsp>nCi@`BE9*g5wUVdC!$s3XLi68P0A@5vd%QLCl=j$FiJJ8?T-P`lcK;YcaStRPl zcK^WXbGT#}DpX!)&`YFx!t4v4NyZs7j3;}(?mOAnbG-NKua2FBbIpn4J;#rEyO1}* zV2CjQGX&2dcW?CAW`y(o2}b&!OGcXNnal_7`4Ul)l;`tHY(L8b6d^i92Pb1=a_}Q) zkw2QtcCZ5+A1`SFfp=gi{e_y^AVc|uuJRoi?=L&V<4_JrBG~~_B(kC8MiN|t&gj-a z=3Y|+UapXuPOLcq-VcHJS&D&c?T`e&e?sP65y8=LSLOuBI~Nb==|CFvp3?mgT;2k{ zJOBk>J6t>Iy&pD~x76c%ar~2S9S>5HN4SWJ-!TgnlLk)qc6S}_>inwLcWU4yQX*ix zyZ891!-o!c;gbJ03l)>5PE1Tru_xJWi3t;@PP8UZjch~svR?KhF_Ec`a9xx~p$v0C z6$71scB<4gm(wwy?vWXtbq9OycY>gu<LuDnbm&UrKiIOT&6y2{79<?uLM3pn;Zss9 zWTt=&B5_}Bg>SpYvo*OS2YB&ga9W#r+t=G2%0rrp9aC^{3!(xW*w&~kf|YRHLm+1m ztA+5^VlX~yAgHgp6DHMP;sDf~uyQ$|#ZsMYprxTO5yJ(;LF*-k1N{Uf*GZXVHMwJ= zCMH9opJI&yUXLqvFpsXZv@Ab=d8t%_-n^@t3tI7AkH>l$qSMRx{`PTF&TS&o66+y8 zoQ2dSAL2j-l{Jj}y<K<SH+W7To1B_rHxC}`=sJ34*qDTxeS?Rgq9QewBmh$x1UE?J zDE!LwaE3O)mzs4Ag8LoBhhz^S+n54p(;yOGjct#>xN8Q}j3^1P6pTY0^6$eq$<DDw zn5A6I5=kv7n579YR)wt)z;|I^TiWM1GReTZNSib;kaRl|@a@7x?BM6b&T$~Wh&pFn ziiLbMH@U`l)zloh5`jKf3N<xCQBmjmPSn}yxlL|B^TRX|jZvp&fEx6q+(4|ip{n+; zSO$NsMVXbQAS)4rMt0bs;ezGD9vX)^hz)%MKl^?bkL`GN0vQrcWRydpmYSNGfyroq zTpjj{{2R8R4OiQr|J`xU4%@Sx8cZHu`j)EgIzBKsgj~kfq{OJf0dH6L>A|ytjz8Ob zsK?ibjGR8$eIV~+65PBn78MzV(9g(Aa$P}oYo47y7d&^KU9zoO#emoiQgxWGzY~B! zxQcX*-@^=CNmRj>d>a%dsIq}J4*derR@-Z=i%a0Lgv?A+$Ax6V)g7ixX;NilW989C z6x3~0O=Y@c@2O@p(g#IJ+*%+r$^ey5nbUNh7vF1o?|Jt;tcY9T43dCwp?sx;hnqnT zieFFyiUieF5YE0HcwS~)SOuo2iBmA@@Y2UBFabLS!0|NU^V^XAe^~+K?*V{cH)${! z8e$_SeWyaq5T9t)tJ@0Gj<+W05pW8}|HvTg$3jna(j>ub7J|@;D5G$jfs8S>JrW!l z#+?be!}^8-jBO#tmU3-mU~I3z*gDmz4zgw#RN)*#RaKkWS<W6)SeP1Ug8NHTAhpmm z08<-hkX(s?<C-HZ49Q<%`zv8O$i?&=fG}vX9FlI68_@z-b8!)gC=Q0l({dv@{TXWN zn?N_3>fsE(jH_;#izG(vWVM<Uf#iM_lE+_!<V>qI6XW{72Vxi~0J_^I@uQ~(PRqPL zA#t2e-R5|Kwp+V<+rA5GnQpZ!2~N%i4O6`;*d^QWtuRR2!f<*Y#*!kr$GDd;O|3&M z88uZe0ubuhN*>aMgRPA5kH^M%|KE`>`0xAn%_S|D1e42`4bNsnSVS{C+wdg_$i)L1 zI)HTi+^SXh1UW5*zY=mlqur>KYTYnmx~nL&SUAq@F@4oO;0olPnoCTOlvH1TBs2j= z-U*>2IQ8N-Yi;%1528OFzCo$n_1tW@fYLjKn}lO@+=k;feCs$gbZDN-=-U`8Q!#1x z>pORB-Mn?nww<+q-u-&bjxE^UvGY%VuGq4r;=74x)7z+gwy$B|-ugG*ZhCu9V^d^% z|K2_OF8h%SL{!Dj1i!a`Ys_87E1_7qlKl$`{(n)r)CYNN<-z;hp^T>lF>vu1uf!^` z-0a!X1cyWG{fo=x`iocVxNKXQ&h6d}@1g(oNKa~MIc2^EYv3C5DfkCn+_oU#0Fc`P z-;a+WseX+~_p0x9_75DR<K+Kw^z!47YAF46#$}^$ai~jwR$NqAP`L0%#fu&+{n-OW z3$a~P{F4W7TDb70?;h&?@9f#v+_bl;anD=t?0=_W-~PyUb7Mo(Wj}IZsKfA08vdym z>nrTAAlhLGyR1SrQdx5b_|WAe!Zx2zuY3tA22zdEd%c*40$hXxE3j@W6hF3V!TBv^ z>1zHbCmcx_yst=o!dx1`>lGX<5?G<3swPnJcsP{X6q1sd)w+`Qyj~IK!N+K&L@9vU zBA+T$kayrr^fUoICF|4_U^Q0k#IJ{QIacV4X94NVYH3j`o6^Gjx&f5{)P<*czTxZ3 z*4eM%raeV%w<*8UJ^Ri(?>xJ9ty<byihb*?u8|}N2T3DcZ_z@6uE7L8fWc1Pq*B!; zPxQv;H*VgxZR_@`&A&$?!xgAPicbu*#=ujufKUZ0L9L)<WLw}>P3>j2mU|L<%ncB6 zSHU0<(QlDmo%CB|6Pk>tBG0(F#85{$9JL)V@psgs>ZYo5Vs04dr*gY?;Zw-U(suqO z;xMiGOQ$wV;yj+Pa_T{F<P+7Ft2`*IeB+HbR!VW++FI`mFYG%qJZ;*v;UoKAkTj)E zXX$e<#CbMt@@#!+>yB4n-T9}Q9ot@pP%`!m&}3|dzJ3E}!t&*L7-%qYVD+fIitVS_ z^0B8d;VH)9DM(jj0u;sCAy=wQlwht*T2n2w<h9rs>m$DoD~RhBp(Iq&j;HPng*t0O zp&IEKrZ)`@nS`Ms0oyKU)Bg`=Ujq<TnYR6$GiQDn1{iR}5eY{nLnEUiGou=CL{v;N za?RApsNB{qw{=_B*KE$5!M|8DGt;6Ljf{#44a<y-id@#r%*fElCLD2u5l0-yaTsR4 z>pln4+I_$G{l0l%e$Je8=A7rbpZmFgubTytEQ=6AMdL)M2s|Xe);R49Y;Z9&Y^sR9 z(hiFlm&qN3n!i|FsXP=K@6Ruy^)MfOOtQvE%6mER#N!rC=X*#=*?v-U<=o{<4;}o* zqZxh^!U}H~s_*{pOUfg!WR>`VVo~$Xlqv5R472(Wn1uzFaN8?=5DwgP-%|lDM~p@t zzCd9rYTZg3^p|=Je+9RUTfAs0$qQh*%Q*rLYU1n&+4KX<qmp}c!JV*E%;T<xWb9{0 zq2(ynkDcHeVd$Cps7z<&tcV#$HoK7F@nkd-US^4GhsccH$M0bU`8Wn*9NHnkm6hu) z`Y0|!i-bU^|Nf&Z2T|rkc6L5k=%iHE_5pcG_w3(ax2}(Zgo+k6^8P+EHn*sdCMxVD zFd)`s9BALYZO4v1&4<6)`{9mvD5&zqH+SsVUb}tAJKJ~e*uG=Oj`!r}9msjZ0|slz zB4wB_RKvtUwHbJ>JQ>+UI=|Zu3sif68LohOF)Y;#05nd;i)5qd4X%W=N4|OTuIVkm z8EI}EL#adsOA<rE+4^EA<Rc(CVniAKmFy2fsbJZXlkLWT1^$urfs{O_a(?ny{0)2G zg}tYN8m3|I0WC*eXZebC?}0~AI)u%5c+b-lU>my*nrjXWrO+YNo&&oou(Ge){MKGM zPBeCqc^k@5%T>+PtAEM}nx+$|9q5Hs4w&WIR9$VeA<Yy65$y1!#`6*90PC=xfMC1z zn)r)H;m>L68agrm_f&4|V_74@acblQXvfc*1kX27kJ4(9p;pSQ^rO5k)H0FTF)J0O z_jlEe0z>V#dtj(jG>gY{`(R<NseyUNp*ao9lsPrQNyCi%`t)aO8s2bjc<F;ye`L_u zNkzrCW)3qMO+KG6s`!sf9w{Cj?rwPpjO;0LMI?(X&cW$o@SA##gL5A%<9yvH0W<(i zPT-vx@mG&d5c~m^-|G$Qd6m&JDm~{qy+7!Wj~9TxEF{H*80v9r39GiNLuBV1T=0U( z2Lk}8O&wk)*RS)P7I~!GIx~XiVKG6o<(7;Q$vPJ4bhRCCJs*P;F`tjA;!W{`1VlDy z)JUl9I~iz9<j(@!g&#I919h`;sVIhrbPUy{=pCXWHAY#DQC4G=?L4wQ`)DXio^U&| zw9Dk`+;*x!rqBmz@bf_*6L2KOrV>Y1LumWnX`c*kGaoj;-^+304=M(#*p~JVpZoNM zt_#>nsmxTstp>Rk!9uEob@OJ4MJ9ohZedk&TgNs;bt0m}CSy$QgT6;?G1g54BH+2n zsfBc$m^0_EO9-rZEizgOM3}-z_s7n$rllIxXM@12+&`gD`7Xmm-6Yz%W)x_;;J5XO ziUc(Ed^76S7;Ip=eU1AQV#+cHIT2kA1>i$QR%y4)H~ML<9@gr0u$q&D3(${<`{-}T zcmm<s;Q-5zrbw?2J)EpXBuONkJQyis1CtL&u<Et_^i$hUp7xRH?dMT7n`u|Wor^4q z)vU*9=Yl;BT{P@Ejx^EJuwHS3?CLS0D|Bk-CIY^+)BJx9{r>{`e-Zls59t5<(EkY# zZeQ8qi_L((n`#(*-E8<C)Q6^A6XW@yZvv)%<i7&kO@7qj`36_(!954Q_^jzu00SNr zt<e<2w)cO6%gldl-%F_EkQco%vK6UWN7n?$j2Ux&-&O#zQ&ZKnoqU_1rxRfCP647c zq9)`K%>VTWN;X-5Gr{$<US|!w4;|@?j3*|dnvsVqfyKF&tv1fhnFzF{DdR>VuwQ;y zITPY5yi=D<h7dpr1&!DrIK;4XD^PLkM3xB~%g8%WLe1p~=@8IqwiOlaYW@;d<Mtp2 zm&KUu;mPI^nVBvZjd$ob<1Mke$uQ^7M5$3qJ+nlw1rwVSU8+Jx+0%D|3)p1i^?b!O z2I+YYG8Gh$)=W?%{8{Q}UaPBfI;Z{L=mQQN?(d9qvgnK1N4pW&&D2PPIs4Nw_m7S3 zL2nd8%?Hn%^qlAp^_)H4(tH#!;IS6~<;hY~ho%h~oFdtW@fUkwWPxWBxTFL{i1ZQs zQ?WVa9o7$3R~OSbC}9xU1-;G;U9y1zv?v^vcZ!XV?+yeArW{d@C<m-TUOd9!L$Lo` zMrZgXa+KmhXxEoLl#c{XrTAI;G8J9{_3Z@p-3#iQ4C>1T^)c_%J`-mgG>k+fB9VTU zik_XR+2ZxOPwcBGz?69qojwRV4u%KiK~$Eh_?H{G3+l~ZAjoN3K6Y3DCaw4q=O8f3 z4_SH#_YkVj{1u}>4Fxzke~%+}mwkTzU|iVX{P|DXu(JP4ULD@jJZXp<bN9T*CV+6L zJ*#?TUQw(xomByJkXj{I#qH$&$+^%P0Y<rwyO9_UpLOlLDX<8+5XSldYVd5}p5x}r z_Lc42{nt$c1NaF<cm!nlJ;V<;R27Ph^0H2L9I}*AEP$PA4qJ#dM=|8#Swl7bT%#8v z_(J3S8khRD^KRTg7SOoJEKnb5hi#Ff!+(!Cb&13#LvERazF8>U10iq|Oa=G!5g!@) z(;<#4L_0aU2)|VWg-T&i2k?Fqa|m-Wo#tAZ11O!#CWAL_f-O#ATnJXcrxlP$w_jsP z@*#Wg)X5H7dQl}hDM1yA^r{n*2Blv;dUQIX_F@u~2Bs5ca#B18-}8lXPEAk?y_6M? zq<ANMwk+bjrpcW&m@51M;|>p9lKXTB_REW%?w^{!+W%GakDgN}Pq=?}xqki`Jk29r zf}fT5k8Dx+*`GmC4}hX<peRB<C5x~%dK;zWpXtDr`hNcYko^vdFktcYj7G6@_o43| zNALXs84b%-2T-^ZW-O>&FUs*LFF+Ef_8Qx&R0q9vGWrt`)bRB^4(}edxzTxQ8Gm;# zA-o{4Iu;3>CxT~nhSbrM=S)S61Xh%2bKfem9ji<=nC}MdvL$nJ5>aWM!YxIv`T718 zWoonli<U#(-i(ZkKU}`57-AfpDN~BE+sD}E&6_uS_VNi#geZij`rVkcv}tnGME^pP zCoe2Y1Vw)IQ49c<OCF{%LOza3!2^|wQ&V|IQcp}uTbt+9PwwL<+F6A0stX>836K|8 zCthTkS-@xf<)I-TSMW5b^0*6yUbqk(S-Ju6onK)QAYQ_t14cs25###mXwtZ>#<<*y zaUmP<wHTMd$Sx_OH6%YJ^69hXHd}0@{Zp{snti^Ba{VWY{{Rd!z{V%ZluL0ER2K@b z6!xs!n?Eu2w7YOZnnRV4lQWZ&kEn@Be=Kr;{^4G`AlMlM`Mvr1d%;?q%;{8_&0pIm zz*R_c<O3@ESEkZjtjrCXnysfyLuWii=@54QsXK>G<O)%6ob(9-oi&*zk(pHf+_xQK zz%Ef&>U6HFtaf`*4E@_mn2zr4n^SkIYh2YwuPwF02robrciXkNkcCd?Lg<^Ac214K z>s4nLFP?@4uTho>T=2F~qV4O@U8vQta?_GxtHn@hw^uH-+ZW;p!@|PCh0@y@0o0se z;dq1UVj#rBNtKeClALG=2fELDc^)O8P%hPA2(aX2Ck8_;C(=T<V}cyxf*`aFR~tMX zU0vQ_7)JbP(Ca<^ee>a;yZqjOCO$nJ#vfpCpu~h*S`fY_zOBqHHO5ebF}&OlDPp;I zg0})UPI<^u#ed$jR^HS3t3AmpO6SyAlz42F5|7R4YB>|Ss(?8~3<(hF!3#h#JOZ=j zUw8o@Np4w;O%H;eX3&>mJH{5;Jgf~*s$iM6Tcc0vpRN7y=tXE0s@B&CeEyN>`e>GJ zZTlN<9(><!#~w>#R#k01XtY|bu_&ONp?13;dMJ$PzgWa=*)9ICFleYL+I=2uCUoY9 zeS0Ab9zRmOFDLzv$dHa}ddG$wIa!#AE*4%nHGJCQe4-(UZb5KK5D*Coh$wc+Gyh*0 zUdkCn)?ob7;;d}lzcy`p;at|RLBq0g5oWv}Kwq&rSaYc4b~P(A&Mz5ra(7i#)i=qg zY_)D(9oR%Yt}9w#X=(Xx?|aoRz5WFz;gOb3VK}6fd!AaRt1=j1%86K}QrJT!HTCjo zmgE!2UZEvoAu}netR$1Vrqu60`|TU+Cu709B*t6~bLcF{d=7+_K5s9A_+mpCX$ku7 zDFl;0g;`k&jyJV$H7Sn%(Xev;tDl13`RB};!wh1X`fP_kaIqI$W(6V9a%+T0C~)Td znz0CJ^ZVM*M#G`NS+D2pg^TCAyE{8hpTE%M*Yoi}GT;Me-QOMfy5+b(tVX1q&YzTo zify7ZgNrvp6OyGCom!S$$l`(2IXo*O3Xfo5mJqjQtRT2q7{Efo^B2POZG_Vx!Zbd4 zXqrBx(L^IrUA!r6`0(K=2{Ag}k3wfU^dZQ+Or4Ny&}&t=;1$FoBWncI;!TWQBU9Y{ zptvVMaa3XbN>JQLP+Y8YUG0IEQ;68hzWsig!+^nTK(#pt9>(hG0`tcpu~qN3Mzg09 z>R%jh1cWUgqYVicPj$3mZN)th^4lwHo30(DTJ9Yc^1eoi9ccU}7cWhKm+2@>n=91T zw4>mRxky2pr>d;1s8I9~807h7%TgyYCp$?A1DwFV)co0&()?NlNCn{Zi{@mYxGQJ) zcKc^7E!Jo{P;_Y3PX`&u<e;iG<}9Dc{@J(oe+`OVBr!Xg#&3y^lpFk?No!vJw#(OD zvV8gM*|WMqU-d7q$w$b=J&?+%&5S<AW0s2B^nw<Q4x=KdRSr{%AYet0Bqt{iK&tY2 z^fZbpNZW=R<J6c<h`s^C3I>lxB8bOi?d|PnIo*JvSEi>AHyfpG3eQ1_9R!Ig_0?yg z*Y85F^Pg=1g8xHYTbqsTi|&;d;@QI1?{rrTpMW@#iBZh+_zl(HK=|Lc+4=q%_#IxM ztSv&kOUKuf`W)^LM9ZKFmY`B=D)_)+Q7y3fHrvr$8W64p(W~+}q`&l2AmBQMar1n+ z_oH`f-udKccO(m504N~`dNf(H=FXUuB}jZafz)h3dd9>^2TKRL;@~!4uX@5d#B76% zcM>l2ciD!x$8JHF3?4B)Q4MqBEtCu*_@_er--&TPDew1BNSpPn4dqN27MW^MRIO-g z%8`qfjY__4`SRtDj8953C*Xn%sUyeSoHKsR5N+rL3>@&n4e9o@e!gSJt|KZ*yL|cl z?(X>6v+u-x%tZD;KKf-c<P=&}XG3}>g)<GYN=5j7>A)A>tlhb1|Ka0jySp)7YESc? zSJ#)Xq}b0#rIiEpH1U3Ur~uTZjy{8hMC8<Z={ltR>Gi>slt3pSce_Jil$<(Z(Dj5a zoY7?`N5c_qtX>aKN}!kN23%WsH8QwX4kqX$L?R>IlGFmGjTa(XV+@D&XpNvX#`a#o zdHJqDK;PEJv?k+#M5rz*WEH`2r$G>xUZ=v^bphYgwS;>D-QE6RFD^9z4dv3KHxvl; z@XyEwvYvo~;PpCa>Lt+BZJ5b(K~sc)#9@KO>YYW2GO}<`3QD>bIf~y$)<vF<)FJ`$ zZsekvBIjj5hz*ffQBahiq?K~NA0fHg7x_HW0=rN-$c*8r&A`+i34RG)px|k*72|ZH z3g<ldKv7P?Z2+d6I|)lz6$F50S>-@fPD1uz-+}t~n|+;Uu>z;vk`0xHdk%qhatscu zS@|f^<g^H0$lxY%w{k<_W*o|0!~Kr4b6dFYxeHtn-^FspFoOQTo#XuY@5NRZ_Y-%V zbL0OD?r(60#G-NdP0~92@bzXxxX}XRcnOcP1y<f9##nss*H+hj)_m-oBS{E*JSVW4 z9`X3&(lc)yV>Id<s!;2$5*t*2=lYhj+g1*3{I=cOt+r$r{2sws58JY`awzyEd-N41 zqqe<iN5AzmrtFov<~`Lgita?BDf%7HQl0%;_4$xtU}Ai{Ud;>fgHuwj965SeYJ9Bf z)V|gLVA%xC)Q89FyL8uC+D@H^uE9$&;V5in#*~x<s1vA03*5*UReZb_)q&6ZE=ub5 zBhVIosM)bHMnJY~_gOz8MI8x91*gPBFRUqu1=4At?@GFm-<S;T->hF*r|_L&ppj9a zkx>@JI9iZ1Z4u%OeSr$fJb?VCYG^FZkg-pHdG}|wz$q*MK?zu;Eu1BF0#?rku&B%5 zTMg^TYATcqVKk(b2p*3h*hyZs3pNM}q;NuAkddyGS11(HOL4IL;~@z0v)aI$Omr<t zNqFK6%4I3fNFu>Kk{G8vJf8k{B+tF1+~X|V<Gr}Y49o+H6-&o8p&XX3{lM38!#ln` zaEeb#uiY20jGI0K><(W4*Y<z@Hq0m}{|-Fw=zsCpGy%+HUc?)nr2PSl;B~(92#ovT z?aE+q-9)ez#gCdFwMp?UE#I~@e+>x0^Bv#R@0FuG{|U+WEy%f|_8P?T78Xu>d;%EX zb}T_vAPT!U*s$<%kkZvgGg*X<2?i4&5X}0_#Rdbx^Q=MAO#$+C2AQn4B5(Ju1q+HY zu$u`PEs)WU_#pD5?=-+21Pn}2s!Gs#IwA9RdJg~Gix?GMM8smO?)7)GaM#IWFoL>Z zl!P5U+zZq<2mw8->;^dj91sAIGz3A^k^~}fI+Lg|4}{$}76BHrY(NqIzs*AAkhK{3 zKy+GJ4HWzIf0KHD8_~!6kS5_o;27CT`-Ev_oc^<o9x5Z&tTM#R@VPKbWL|EgC#m|k z*Ta{vH*q!5QuOV*{vVL99<hdU{cMtKia`h0gATZL!HJOhtkGI5mYbr>V!gt)Pk!v^ z=s05-<H-j<S_O?+f!&y)Te<CX1fF#?c1!~6Gs292Ctj&7gyD*!SMe_dgW1_YW6jdz zB@{aIT|?uMF+dv;)ej|n@>b1rdC;WMgmpDF!FiCpt27f&{p+*CXF?KJYJhUgEwLb^ zJT7~QIaoZ+eA09Btjd6{S{J|I4-ef}a^GFWMH6fjatq8<es>8H*<OOAU5$T{y9c{% z!WnlV?Fs=UcylFQ5T=xpJ#N~9#TgkaWqe`LG?0+3XwsFzjErTawroVJ8YNaNlMvKD zOh3L@ei>d{`_X~cW9}|LiqAy6uGS-vdyllXT`**1K(sy9dSG|0RGXQcJ<ev!PO{p@ z<=i?xJL~$JXFNWB{FKSJUY|88CFP1yS=W!9GJgDwyc@3@lYPsr662lt)2OsMP0Y~o z4#7NFO~rWyo$(rn$}%`k1t#T8LSY0v=owBPgapMKjR1au!$23S6%f%Js|$-UMwGy$ z#TwJRRvul_#nhPPzt-AzK^KFE>sNH9#h(3Ed>(Y51|8UW62E0C<NOxR4b7&NfUX^2 zaF;T0wKzZ7{^=;Ke3Xlhvh#js!3*hc(A#)$aj{IH>6!SgKj0{;fJBjdM02rb=bj8; z%PhP_2t$UxA(|Z@44pY0-d_cKYQ_5Ubtnjga9}`Wu#KX|<@)K91Exhbj4@$wp$P>( zUu?W1X56AhrkLBGT)x~TA_H1qTry-YR-4L$SC!-;OZph|stqc`bw&42gvq4e$R_c> zFDcF?!!YvOK`>RKV6j-5QHW>>=R1I^@QTAnc)F&h4N*dR4NMeEFb!ra!UAp+=w}Wg zIj6YfZ`0To_~@y<EU%8QfX`8CZ!6HxR>hPQUvr-1UAx^0MPscjMDg4jOE`SC<80Vq z8e~cufXUK((I33ft2KmswWgF5$TVS81&IL45q|{#BEod$hyf`?LX;^<Ur4|&62fOZ z!LFa-`8$bFJ|GQ+&z}o=PE&nn0R{jGDw&A5VytB3F#NS<L(yS{7z?VOKn1fOi92@e z|7A$@bwx#W|Jz~7g`{FI6czn{j*iaac4L74Uq?vQR9V^d|2j;tzyC5!>D@4d|Ib6E zp$gvr({K#~(hWxJe;TrtzaBDW{yfk(f3C-vjmMbL+O1o#pmgr<iV6!0N$8-q%pk1> zJlKX8-`f2Hz$7NXc9xAQ+JBCzKastlzFrWJl93vTPeYi(Rbv8ykp}P4@4k1npS}nN z621@&o<ki7SqW0F{;F%~(k@BYa-{jIy?Z{~wQC9%?i%31y^95V2RvRo<^Pw}f3S^G zpGBRpdbn9%6do?R^6U{A?GuO!m{!%|085<T)1|p_7JMyP!-ico+CuVVtkG;RjC~lZ z{oLz8dssW1+QzSsbp&+75FZGCT1@sxldkv7kxO!9{D$2J5AJyb6Z?(bONxt^NN;F) zwKfJ1y%?|8aG?F(NEC6bFcCO(=R6&!&h(&+I;dZKRxV4;t0?1x0`^xL1=<}!5m*=q z0Y<GVLxFT)wj@GHGwPVf<9tKu_x_cY>{W6$YM;Hzx{*tl;j^mXinN1EmXn8*#mmpX zRN%V{qel6AH(=C8VAO_T)Qrx$x^?C2iN#gzhdnM7q*97E#B2*|ZY5?ovOX8#lO~nN z1Fn~loxO463*Q?N@Y)7*YfMN~)j1rFT$uSE(^d-wGjC+s*-im<iWT;@S!QsXnWTQ8 zc*0<nArCVDF}7A$a?Rl_m6cnXuU4R?k<Uad4|Ul46M3s(Ia<X7j|8~QDMdv~CxC}h zd!DlyA)u&d>rvXH1tDyugnWgjerQa5=;#*80YZ!4_(@C4XRmI3bx(UJe#F!Vt?V#% z#j{ieX{w{+R3IAmb_N_ty-2?~)9yLxYV(G5dKKnF7`uc*5cGzmBm><{GJ@ZmEW<5> zV)*1ZK&XU5&MIXrO3<5xb2SdVNtLcs(VK#|=VU|KL@04&=AgDH?lX_4@$KD5!4n&I z)W2baGF${y8#qBY0n!PQF)SF&=uJ;T8sVB#@?dWOYK^Fh9;(|v5yB`C<)NdYaratQ z4w^IL!G)zTbIrMT-hyB-(|Z`Igg3Te@kFdZU%;zl#Hb@18U0x&YK>Q8dS88;g_QRv zG>F#6$68o5qnWWr0U))F$Bo1QqyiimP>_xg!O_BC{nb7N=@!Gkd@?Sf23roY4mo)~ z2s1&8YT-g;SZ_7x5S|*;B&P%s)|KMWhy1~m)FF6l)QLdL0c5rvP>Jv(yo3xFhgPQ- zT&EzZIrQh+S_K5X0+2vhxmD@S8R*UF=uJXtxB<OMm6TM4x1X=0fJh}RX-QnA-M*>v z1K1jNzg_#zGkHiGDUaG9-r4Mck44`6976O(i@SID*-si8X3V(ruDp>Z1lYzTAp57G zK~kB9<|9q(4H&!Y@V}MKBHh<u9Fli`$^CavE52{$L>uUf8#fNmb|Ol>rxgWd54Zpu zoazvUjfC*y&~&#$VM<MvCdz&(C4}c${j!G<5emin_W8>w^|>B>Mr{vhxm;y36%|R9 zsk|}8oEonIRs}*Q65;@`ObFz?q&E5e5_K2El-@FdM|FFix^9)85FGp$fvhLMfUee* z@j&Dto4Qn~^xVVfIntxXqUWya>p4>X>fbMfbWjB6l2Rw(2E3muyWY~HQ#2JsI0sfy z-MuT}=4_;#0j^OdNZw*W=7QXj;II{{{dI?;VjfW?dzMRqlYG7U$(y2#x2#mpX*rc( zU0%RG@0*`T(4FNZd&CwL-3uzsA73!#{;XW|KqVps6{0kHL3uq!5~d0?wYVz~W-h|C zt$Is_T+3dj$;qI@7SNgk*&x#-tI$3Lk_2HsHA$w)7KH2*GGQtUC=|IxuhT&zPq`u` z=npz#@lG8|83f3vi;y>XUV4s$md<)sf(b-GeG#Fx?VN*BmQT6hQU>tt$}LKtQY7#n z(Wiv!cn$iL{6zzeh-!@Cv3Ia*@1_mUZK^1_uWJ)37v4=a7P&3d99g!krUsmnbG!2( z-#M75o)BkVv}l||NF0`$`XB+EQQOJh&@M6``usR^xtt7$(zsjw|0=7QfAZkLT%uZ; zJh_aFiR6$%n+HF@65hl2B{%owhFGBm?eaj5R96QxSbDk>!C8?10@uu#mk$#?CAd@j z6ad%Dm)j7E^d7Bu?4_8$%$sqG2?hBgcF8H*ucA@pH?IacCMOS!QwvE68b=}_VS%Ct zr==tbs83DY(J70R9Ebem)fT-T%obROFq;vH_XYx9)K59(k9Y$JJk;rUoSV#e%I-?v zL;L$TjRC3m&>eqC{<l-?NdH<$azA(lKEpQqTP;(@0M3Bme_5mu#`W@Jpxw#UhzL0< zljLZp97M)nsz&rTToGZVOvQ1OaVqEeK#&=)MTA1=<o*xVPJx_47?1>(Qi3qD@pun) zl3TaYhS&QrHfU<l<Ij8E%tZ{q3^1&DqI#JiEW9_vfg-QQ0?e9^WT~Cx_D$frtJtj$ zHD?usMWy|-(a9W=x}-#>)8<Zr@vZ@6^bH*P4QTHna^N7S?Y>#FemD0q8<v3$vI<(Q zD=eHkzxd9(euwE-EherLgqlDyrkK`fZaD@@*tiNI@HLgN?juu?9EK*-9WVqF@QggS z@SFm(00A2+6&_A=OW<T$i)&T*+q>YGCR09sk=*#yUSTVw*GHHIjVVbBMx_!o!$%CW z3`<K%8$u2UE*@#4Ch*h2X5>Gp_$@Io4|zkdy&?sEaIois|3VkcW8@nom@UAr_`1&n z+DUv}9(Rfjz6qm|j?pk-G)x$G7S4mY0L}1pfV-`@c*=E|DR8w=oNO*k0!v`w@*F=# z8LqM+8|xv(%s|CnK-Fc@;`37llxq><QVlmQSO6!IESYGmHz93dc!mwP_L3~iY~q*P zVU@V5sypDom?+!+VO&E~;%ex*5M#Yi+F%R>+yNMhH2`AsdOJJX-Pi^!1w!Ie>mXp5 z&8B#Rv_Zb79Ng1&xTh;GyQi3U216jN-nOms@1*Sg8TMhyM16$4DxrKXA)^^_dz0ko zl<O7!5O;SQf9$wN5(-Da3MIyHH_j_6d2rF9`{qlkjEtMCio9hle1h(X8t#h64T4!v zJOQ%$aBEX=YxCg5ymU)+gQ@Z@wH<70JNWH)-?x0<(&Fzvk8L_#3_(Q16F?}ecWRxq zL7B&7H~Os=2y+<GFwHOoaYnn9gJ(^7FuQ<pOv4eQ(F^^#@p0)RF0|CIEni#Ta()Ec zF2?%5d#~=j@BE2yHYQ3!(?5;2Kj%TKZD5}Wf3^+yCn(%0a^`|O5`q9RRbW1Wthf`B zU9W)yPR&B_F7zNF-Z&h-is8lxhysu!|36nt{D<rnm*1aadDwvZOJ&5G?W`|u)y_jM z#J2up`mGfdsi+*2E+4}mq9bH$h4OUSahLbyFA<J_M6xTt7B%+$ntY&a98vCS6t3}V z^ypQfD?*b+eLr;4CX_7J8FeZYoQXAOKOiee67r!t&SScTBZY-XYP$hYP0`}mii($C zsi}RdwsvC~0!#mfwXT?cO4LPAoG0s=EFDTa@H%NaWdcEOxcZl+FkKefC=n4=E~ChO zfWH3>;5%i%i>RR_J!5PHn|baThnf;{bh?$8<MM`I`ilCu-?Bqo-p-e@19Jbiqk3*% zZ&8V4`3SOul3i14`IUCWTu_QQkE|bU;&w3x=DSGNjFb|PetO@(qG)hDtqx>MqF;n` znIk%3zpKAQtF$jtyJUYXMU-5NeX+(cuKvYb6#r~9K<8}}dVzP`)zt6|{C$y5Y^K(R zc(O-TAGEc#O`-f1K(~Dwc_p$f@_OV=v>lNjFgv!163fVk4F6LfJAIecYD|gfpRE7N zW5>DlXesQ#t<O%0W<)%!GTI70*<VxzWf6IZH8=segKG`NesAZ6j3J2z-GHKnd2AbG z-t{pE94JYRxdEZi6d6FRkyXhuF)bvu++vVOlPK{m{+%{>D5?Dgb|{FS!m00$__Iar zh}`kU{TYTkDbt_Y(^vw+QLIifSgX!ao;`K$yt%-w!88;hWjL86{O!R>+3%A>Z&}>R zmp<HI_{9F5P|#kjvgg93|D^QRRU{zjvoeOJ4YgR{!3A{pz^ktJ2<phWpAVY@EiO+7 z<|~|V(o0Yj|89@-2K2#*|CHy{DG&S-D9&>+6w!$WO)O+I4IekiJjiTb@s={O*I=}e zp#pp>1uK>CLFJVIE0+zU;Kw~yMvFP#lo!oMc997rf?-z`&wTSuk(<5EDO&-cLD;xt zZno?(YvA@a0AZa&+5)CKsDq%G7I4d!iCj&S)5`3e-JVNq2$79sy0xq9KBHZF)(Iz3 zcelvJ`<!^+-kuC#$L@ershr(E&--a!<_}ysqX6SFJ4#+*f&PW+`xuLIha+%@SK$uL z7E}kf08iT@#Of)fm9knnPDS~q#qgBmah`29I1f$H1JPxX_cinPviYM~NaXgiDO?3s zgCqnVEr9c<mRp5i^YTX3h9Z7L9w>xIVgxRMsd7xF9JtNk|4GM-kZHFAkn35dMYM!p zNKVo~hw=HbAqF=ZAL;H+i?ri@<6-@aI9OzrJl9BjehAk~S_|QSlNZ#qZCeZKox#V^ zxqsKzii(nwaTlB4r$T*-29pITtCC>(RPflof|*$=#&x=bhM@#Rkpy^L;83n&TS(hr zh_f^QSL%7f8T<QidTDR$1B8&NbR9FDne7E0c|NO3Oe#xE}3Hgib<gfBvgqxLa- zlESWJZzME8E5IL770M_W4GL_~1{=U2lmPtyQXNJ)syq-lrVc8{U|)p2$W*T0+8Sh* zd#SXCgGt6mZXZ58dpZK<tOHrF{o^gz2{!^rv=wrAZTV0SQ(Zh45sZ3NEC8amE`HFE zlpz+g5b11d_k=<o39(dyi19@JM0f=}(J;iW9y%NaK7)b~AB%D3p(vg?3EpxRdumL> zhU@ji(dY0f$tCU-l-hLk`%v`z5cInl{Z2?^T8M$?23qF*Z2}M)<QWZ$E*I@FIoDr5 zQosL<F(b!mz(Q>=uiEh93&@H9J(}^g>+ttpW*cMlyPQ)oCmO+BUIAlt;vAGcv>RKR zvE1@{y&;wlMR~OzfqSSc1e*ZImDyu}4Ig0!9TZw;-zrQpy#`lD^iMK9R!+vUBnG&= z8VN=%D`%CQ2;`R~beWE*s#Oh+n2jTD!x1;(h~!4kvAT8Zp4t31irMYbmX<y+%G2m> z+&Y2apwXV-SFGJPfwDb-X*g4}?aN*kJ&Fo6k7`<Px8AO8bdy#*8#RLovOGn25g`E8 zq9e|nJ$~$U2q53LZ=Z1r3U<hXqXt~-tiPjM;�PcR3KyzIewmq0fh38owiw^Uy;N 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 >GjZLQF0IXoz#S94~IrS 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 Px}&0SwEu%=SLuJU9z%U0dG>;EXY-e# zV_!CRhO;v9We!Z0y{N|b%go~AbL^O*hzOB}jBrBQASGi^T0*$75qD^F3mIYxBqKeY zc>a8UijD+{l32*oznrsN%G1x4W0nk@px8&n43*@Q$98^s08|9^eXxjoANFJ({zU1i zcWiaaq=qkEdVI?t3L<lu8lybQ7`+&CZm+mqdD~gaGag(#ZRWx|Ck{;|f~>ukP+BoV z@^-vv+O-?e1C#VZY~B!vf~mNBGU<*lOr3l)w$f|31$vWhYDl7gO<8ZBOUVa*v~r1G zU8{U3RK#!%Al}G)OYM6#C%ks6125)Rf8U2RS!J8?qb$u?hd_?TBYvg$bY(&zv>#(! z_uiZC7&>|0uNN<_xJc{z{AJQm7e(%Lu6lg)kuGiEk4c6pzC?e45>VR6qTE3Vp45oF zFR5I8;%!<>he{4-iiBroUZTUe=f#@;&!H^vK<=R5jW8z^Zpmip=?bUz?Ze8{-HI3X zbU^<dQ%X8#bq-QQj3J6{LvloYcD?qra(^jqfEJAYHY}zGl{I=?;`WC8)Un6j(8tqD z4TL^xjP3jl8Z~aEz!R69A85?>2lMdgt;1zTVPgIU`MX_z*llYK*%f;zfZxt;C$j@< zxYti7Ee0v~ESbp1%x~nLX}}Zu%@PG3rLt1~`?mgoHFgZ+kJgL3-h@=;srQOiQ{K#H zPl?6JWxp}(nawBzKrQ)lNi^B@9C`qcdf@JwB0@RnmgMUDe4WFK>7$BBYh;GS`}?fY zLWJiu%gB+izj*A`k4g;4lmAuC%Z37ezNkhk!LbDWjwcQ(;w=8}0R>LhQv-}+r?M&* zl%N5=MMgOOGOOQz;%b>F_(z6XgB)N8y1DjZybU$fnLBD(0Ov@dbhM}tcHoNOEAxiY z)oB?c^9W_XUM!tUve`b&Q?_g&s&3n~NlD{>Oa|!#-R|mta)Zv${%T%+#1!;@R4vnB z1BE<9H@?6E#jOU+KNijH)+idJs=@ZwHWu2pATO0Z4o4p&sI(P1DAq+7Q#$OB>s`86 z2G<R;p)@>o<U~Cx6LqW>&k+3cvS-^*;0Eiohw;oSUHooR2q(Z;2@{IvrRdCGNuNAM zpGbYKh(5WRJ}D#?xZApMqtBO<Q(zoZsq<7yd~PwZy!jH885v0mkMZ6F-Y>>HqT&;; z?nEwJF4i9$hxMRF)&laSHnTVoD3mx9wYHX3<p{Wuf`aPGxM;UM`hWMDrJ<pwMy5jr z#P;n4Vxde)Ek#T4D`8+$rq@?pvSi70<$csQKNiqJ8lXqh0UAVwSj!3;62IirAk(J; zC-VYUY&U`es+qJ^tI{gtq8&Qy-|SC|)9-iEV?v(8oko{_E_?U$YF_P^oxA^k@7%2x zf5;iuFEWh4nda8klV1mT)e~>C#fJmo*0Hv5TNh)+aN=Vzj84=VyM3AL-tf1bY{4m^ z$ul?{L`SR+@)aGOq<)+{=YUDUz}{+Y^{cI|;U>dq(m}`}VAe-_yO7>4qPP3g+r2iV z@)$t?v2ovIaJa2ZwQY1*hH2dZ6p>&IwXTlN+v_P1rFh<WElR1Rq3o=v*ctFZc{Lfy zvWh1@2j{zw$bmvm@KPd{JAhUfn>sQcU$;!|r4+J9Eh%Agq{Q(jt)?bz7047lDckK{ zvc#RufB&96{sy<Z0b?<r%&;z7J}&BDVxmmA4`VFWd9aO@I{p*0(po%NKheA~;tJ84 zd?Pc##bi>GFH?(BYnhs+WQE}eseBVCzj-)tM;SLn8d%B}fIV+DiU5js;mohWv9JNm zvEN-F7WmYi6#<<WZeA!iiC?P8BA~8U7evU7kJJ!TJpuul4;~^-w5WJ6)QuwSE-()I z)U?`FIxpO68acAUoogoCGic1e@$Pq<n%;FEJsNv&%{4dZpgz@tDqCV_Cwu{9I2LL0 zC7a#Kfht><1{#=Xne~7Y!Xqy?OMNqr`*vh1ij_XKGJ~ZT%B|kO04E$IRO+)TYdx{D zEGis5CYs=19QF7&M@d)^M{$7p>%606=FE4$E2OOURJz4Tr9cVrLe`COD_!!dqE{&O dOnHTJefZ`IWl=bJoOzARPmbiMuz8fC{5NLxuU-HE literal 0 HcmV?d00001 diff --git a/static/images/signin-bg.svg b/static/images/signin-bg.svg new file mode 100755 index 0000000..cf9fcd7 --- /dev/null +++ b/static/images/signin-bg.svg @@ -0,0 +1,103 @@ +<svg width="1440" height="900" viewBox="0 0 1440 900" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_1707_14362)"> +<mask id="mask0_1707_14362" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="1440" height="900"> +<path d="M1440 0H0V900H1440V0Z" fill="white"/> +</mask> +<g mask="url(#mask0_1707_14362)"> +<path d="M1440 0H0V900H1440V0Z" fill="#075985"/> +<g style="mix-blend-mode:color-dodge"> +<path d="M141.358 246.312C215.112 119.681 321.259 96.3337 449.761 99.4994C559.715 102.206 678.61 131.562 780.09 88.2118C881.256 44.9931 951.272 -32.6756 1060.31 -28.21C1206.51 -22.2225 1269.48 96.6212 1260.63 213.287C1248.38 375.043 1111.35 457.44 975.438 448.706C862.958 441.481 743.869 431.287 643.404 506.249C550.869 575.29 487.949 717.627 359.976 730.618C107.484 756.249 4.94244 480.521 141.358 246.312Z" fill="url(#paint0_linear_1707_14362)"/> +</g> +<g style="mix-blend-mode:color-dodge"> +<path d="M1198.87 152.182C1141.67 94.0852 1048.06 94.0852 990.857 152.182L134.125 1022.3C76.9219 1080.4 76.9219 1175.47 134.125 1233.56C191.328 1291.66 284.934 1291.66 342.137 1233.56L1198.87 363.445C1256.08 305.348 1256.08 210.279 1198.87 152.182Z" fill="url(#paint1_linear_1707_14362)"/> +</g> +<g style="mix-blend-mode:color-dodge"> +<path d="M355.017 1010.77C390.642 1046.95 448.934 1046.95 484.558 1010.77L1018.1 468.897C1053.72 432.716 1053.72 373.512 1018.1 337.331C982.472 301.15 924.18 301.15 888.552 337.331L355.017 879.203C319.395 915.384 319.395 974.587 355.017 1010.77Z" fill="url(#paint2_linear_1707_14362)"/> +</g> +<g style="mix-blend-mode:color-dodge"> +<path d="M847.966 774.192C872.44 799.045 912.486 799.045 936.957 774.192L1303.48 401.941C1327.95 377.085 1327.95 336.413 1303.48 311.56C1279.01 286.704 1238.96 286.704 1214.49 311.56L847.966 683.81C823.496 708.663 823.496 749.335 847.966 774.192Z" fill="url(#paint3_linear_1707_14362)"/> +</g> +<g style="mix-blend-mode:screen"> +<path d="M946.453 353.643C946.063 353.643 945.669 353.49 945.364 353.187C944.764 352.577 944.764 351.587 945.364 350.977L1318.7 -28.1914C1319.3 -28.8008 1320.27 -28.8008 1320.87 -28.1914C1321.47 -27.582 1321.47 -26.5914 1320.87 -25.982L947.539 353.184C947.241 353.49 946.85 353.643 946.453 353.643Z" fill="url(#paint4_linear_1707_14362)"/> +</g> +<g style="mix-blend-mode:screen"> +<path d="M478.762 997.396C478.368 997.396 477.974 997.24 477.673 996.94C477.073 996.331 477.073 995.34 477.673 994.73L1129.98 332.23C1130.58 331.621 1131.56 331.621 1132.16 332.23C1132.76 332.84 1132.76 333.83 1132.16 334.44L479.848 996.94C479.55 997.24 479.156 997.396 478.762 997.396Z" fill="url(#paint5_linear_1707_14362)"/> +</g> +<g style="mix-blend-mode:screen"> +<path d="M21.1247 1027C20.8369 1027 20.5491 1026.89 20.3288 1026.67C19.8904 1026.22 19.8904 1025.5 20.3288 1025.05L326.082 714.334C326.52 713.889 327.233 713.889 327.671 714.334C328.11 714.78 328.11 715.504 327.671 715.949L21.9183 1026.67C21.7002 1026.89 21.4124 1027 21.1247 1027Z" fill="url(#paint6_linear_1707_14362)"/> +</g> +<g style="mix-blend-mode:screen"> +<path d="M1161.56 238.297C1161.52 238.297 1161.47 238.297 1161.42 238.29C1160.58 238.212 1159.95 237.45 1160.03 236.593L1162.68 207.093C1162.75 206.343 1163.34 205.747 1164.07 205.678L1191.83 203.115L1194.36 174.915C1194.43 174.165 1195.01 173.568 1195.75 173.5L1223.5 170.947L1226.03 142.75C1226.09 142 1226.68 141.403 1227.42 141.334L1256.45 138.665C1257.29 138.597 1258.04 139.222 1258.12 140.081C1258.19 140.94 1257.57 141.7 1256.72 141.778L1228.98 144.328L1226.45 172.525C1226.38 173.275 1225.79 173.872 1225.05 173.94L1197.31 176.493L1194.77 204.693C1194.71 205.443 1194.12 206.04 1193.38 206.109L1165.63 208.672L1163.09 236.875C1163.02 237.69 1162.35 238.297 1161.56 238.297Z" fill="url(#paint7_linear_1707_14362)"/> +</g> +<g style="mix-blend-mode:screen"> +<path d="M141.335 846.698C141.289 846.698 141.242 846.698 141.193 846.691C140.347 846.613 139.722 845.851 139.799 844.991L141.941 821.188C142.009 820.438 142.593 819.842 143.335 819.773L165.486 817.729L167.507 795.223C167.575 794.473 168.159 793.876 168.901 793.81L191.042 791.776L193.061 769.273C193.129 768.523 193.713 767.926 194.455 767.86L217.873 765.704C218.719 765.638 219.467 766.263 219.544 767.12C219.621 767.979 218.996 768.741 218.15 768.816L196.009 770.854L193.99 793.357C193.922 794.107 193.338 794.704 192.596 794.773L170.455 796.804L168.433 819.313C168.366 820.063 167.781 820.657 167.039 820.726L144.889 822.77L142.864 845.276C142.79 846.088 142.122 846.698 141.335 846.698Z" fill="url(#paint8_linear_1707_14362)"/> +</g> +</g> +</g> +<defs> +<linearGradient id="paint0_linear_1707_14362" x1="526.132" y1="79.1813" x2="882.91" y2="665.013" gradientUnits="userSpaceOnUse"> +<stop/> +<stop offset="0.2295" stop-color="#050505"/> +<stop offset="0.4926" stop-color="#131313"/> +<stop offset="0.7711" stop-color="#292929"/> +<stop offset="1" stop-color="#424242"/> +</linearGradient> +<linearGradient id="paint1_linear_1707_14362" x1="222.819" y1="1071.31" x2="1389.32" y2="106.719" gradientUnits="userSpaceOnUse"> +<stop/> +<stop offset="0.1942" stop-color="#050505"/> +<stop offset="0.4169" stop-color="#131313"/> +<stop offset="0.6536" stop-color="#2A2A2A"/> +<stop offset="0.8985" stop-color="#494949"/> +<stop offset="1" stop-color="#595959"/> +</linearGradient> +<linearGradient id="paint2_linear_1707_14362" x1="962.861" y1="438.379" x2="236.413" y2="1039.08" gradientUnits="userSpaceOnUse"> +<stop/> +<stop offset="0.1942" stop-color="#050505"/> +<stop offset="0.4169" stop-color="#131313"/> +<stop offset="0.6536" stop-color="#2A2A2A"/> +<stop offset="0.8985" stop-color="#494949"/> +<stop offset="1" stop-color="#595959"/> +</linearGradient> +<linearGradient id="paint3_linear_1707_14362" x1="1265.53" y1="380.976" x2="766.485" y2="793.641" gradientUnits="userSpaceOnUse"> +<stop/> +<stop offset="0.1942" stop-color="#050505"/> +<stop offset="0.4169" stop-color="#131313"/> +<stop offset="0.6536" stop-color="#2A2A2A"/> +<stop offset="0.8985" stop-color="#494949"/> +<stop offset="1" stop-color="#595959"/> +</linearGradient> +<linearGradient id="paint4_linear_1707_14362" x1="944.914" y1="162.496" x2="1321.33" y2="162.496" gradientUnits="userSpaceOnUse"> +<stop stop-color="#918D60"/> +<stop offset="0.3772" stop-color="#555338"/> +<stop offset="0.799" stop-color="#181710"/> +<stop offset="1"/> +</linearGradient> +<linearGradient id="paint5_linear_1707_14362" x1="477.224" y1="664.584" x2="1132.61" y2="664.584" gradientUnits="userSpaceOnUse"> +<stop stop-color="#918D60"/> +<stop offset="0.3772" stop-color="#555338"/> +<stop offset="0.799" stop-color="#181710"/> +<stop offset="1"/> +</linearGradient> +<linearGradient id="paint6_linear_1707_14362" x1="328.001" y1="870.499" x2="19.9997" y2="870.499" gradientUnits="userSpaceOnUse"> +<stop stop-color="#918D60"/> +<stop offset="0.3772" stop-color="#555338"/> +<stop offset="0.799" stop-color="#181710"/> +<stop offset="1"/> +</linearGradient> +<linearGradient id="paint7_linear_1707_14362" x1="1160.02" y1="188.482" x2="1258.12" y2="188.482" gradientUnits="userSpaceOnUse"> +<stop stop-color="#918D60"/> +<stop offset="0.3772" stop-color="#555338"/> +<stop offset="0.799" stop-color="#181710"/> +<stop offset="1"/> +</linearGradient> +<linearGradient id="paint8_linear_1707_14362" x1="139.794" y1="806.196" x2="219.552" y2="806.196" gradientUnits="userSpaceOnUse"> +<stop stop-color="#918D60"/> +<stop offset="0.3772" stop-color="#555338"/> +<stop offset="0.799" stop-color="#181710"/> +<stop offset="1"/> +</linearGradient> +<clipPath id="clip0_1707_14362"> +<rect width="1440" height="900" fill="white"/> +</clipPath> +</defs> +</svg> diff --git a/svelte.config.js b/svelte.config.js new file mode 100755 index 0000000..7074a19 --- /dev/null +++ b/svelte.config.js @@ -0,0 +1,17 @@ +import adapter from "@sveltejs/adapter-node"; +import { vitePreprocess } from "@sveltejs/kit/vite"; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + // Consult https://kit.svelte.dev/docs/integrations#preprocessors + // for more information about preprocessors + preprocess: vitePreprocess(), + kit: { + // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. + // If your environment is not supported or you settled on a specific environment, switch out the adapter. + // See https://kit.svelte.dev/docs/adapters for more information about adapters. + adapter: adapter(), + }, +}; + +export default config; diff --git a/tailwind.config.ts b/tailwind.config.ts new file mode 100644 index 0000000..7667e41 --- /dev/null +++ b/tailwind.config.ts @@ -0,0 +1,64 @@ +import { fontFamily } from "tailwindcss/defaultTheme"; +import type { Config } from "tailwindcss"; + +const config: Config = { + darkMode: ["class"], + content: ["./src/**/*.{html,js,svelte,ts}"], + theme: { + container: { + center: true, + padding: "2rem", + screens: { + xs: "375px", + "2xl": "1400px", + }, + }, + extend: { + colors: { + border: "hsl(var(--border) / <alpha-value>)", + input: "hsl(var(--input) / <alpha-value>)", + ring: "hsl(var(--ring) / <alpha-value>)", + background: "hsl(var(--background) / <alpha-value>)", + foreground: "hsl(var(--foreground) / <alpha-value>)", + primary: { + DEFAULT: "hsl(var(--primary) / <alpha-value>)", + foreground: "hsl(var(--primary-foreground) / <alpha-value>)", + }, + secondary: { + DEFAULT: "hsl(var(--secondary) / <alpha-value>)", + foreground: "hsl(var(--secondary-foreground) / <alpha-value>)", + }, + destructive: { + DEFAULT: "hsl(var(--destructive) / <alpha-value>)", + foreground: "hsl(var(--destructive-foreground) / <alpha-value>)", + }, + muted: { + DEFAULT: "hsl(var(--muted) / <alpha-value>)", + foreground: "hsl(var(--muted-foreground) / <alpha-value>)", + }, + accent: { + DEFAULT: "hsl(var(--accent) / <alpha-value>)", + foreground: "hsl(var(--accent-foreground) / <alpha-value>)", + }, + popover: { + DEFAULT: "hsl(var(--popover) / <alpha-value>)", + foreground: "hsl(var(--popover-foreground) / <alpha-value>)", + }, + card: { + DEFAULT: "hsl(var(--card) / <alpha-value>)", + foreground: "hsl(var(--card-foreground) / <alpha-value>)", + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + fontFamily: { + sans: [...fontFamily.sans], + }, + }, + }, +}; + +export default config; diff --git a/tsconfig.json b/tsconfig.json new file mode 100755 index 0000000..6ae0c8c --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true + } + // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias + // + // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes + // from the referenced tsconfig.json - TypeScript does not merge them in +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100755 index 0000000..34d3f85 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,26 @@ +import { sveltekit } from "@sveltejs/kit/vite"; +import AutoImport from "unplugin-auto-import/vite"; +import IconsResolver from "unplugin-icons/resolver"; +import Icons from "unplugin-icons/vite"; +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + plugins: [ + sveltekit(), + Icons({ compiler: "svelte" }), + AutoImport({ + resolvers: [ + IconsResolver({ + prefix: "Icon", + extension: "svelte", + }), + ], + dts: "src/auto-imports.d.ts", + imports: ["svelte"], + dirs: ["src"], + ignore: ["**/*.test.{js,ts}", "**/*.spec.{js,ts}"], + exclude: [/node_modules/, /@sveltejs\/kit/, /.git/], + }), + ], + test: { include: ["src/**/*.{test,spec}.{js,ts}"] }, +});