diff --git a/next.config.mjs b/next.config.mjs index 4d4990a0..2c27e1f7 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -12,17 +12,21 @@ function defineNextConfig(config) { return config; } -export default defineNextConfig({ - reactStrictMode: true, - swcMinify: true, - images: { - remotePatterns: [ - { - protocol: "https", - hostname: "lh3.googleusercontent.com", - port: "", - pathname: "/**", - }, - ], - }, -}); +import removeImports from "next-remove-imports"; + +export default defineNextConfig( + removeImports({ + reactStrictMode: true, + swcMinify: true, + images: { + remotePatterns: [ + { + protocol: "https", + hostname: "lh3.googleusercontent.com", + port: "", + pathname: "/**", + }, + ], + }, + }) +); diff --git a/package.json b/package.json index 74e5c293..6f6d10da 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "@trpc/next": "^10.38.5", "@trpc/react-query": "^10.38.5", "@trpc/server": "^10.38.5", + "@uiw/react-md-editor": "^4.0.5", "@uppy/core": "^4.2.2", "@uppy/dashboard": "^4.1.1", "@uppy/drag-drop": "^4.0.3", @@ -57,8 +58,9 @@ "lucide-react": "^0.294.0", "next": "^13.4.8", "next-auth": "^4.15.1", + "next-remove-imports": "^1.0.12", "next-themes": "^0.2.1", - "papaparse": "^5.3.2", + "papaparse": "^5.4.1", "planby": "^1.1.2", "posthog-js": "^1.174.3", "posthog-node": "^4.2.1", @@ -68,6 +70,7 @@ "react-hook-form": "^7.47.0", "react-hook-form-persist": "^3.0.0", "react-icons": "^4.11.0", + "react-markdown": "^9.0.1", "react-qr-code": "^2.0.11", "react-qr-reader": "^3.0.0-beta-1", "react-select": "^5.8.0", @@ -79,8 +82,10 @@ "zod": "^3.18.0" }, "devDependencies": { + "@tailwindcss/typography": "^0.5.15", "@types/logrocket-react": "^3.0.3", "@types/node": "18.0.0", + "@types/papaparse": "^5.3.15", "@types/react": "18.0.14", "@types/react-dom": "18.0.5", "@types/validator": "^13.11.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a6ad49bb..a87b212a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -80,6 +80,9 @@ importers: '@trpc/server': specifier: ^10.38.5 version: 10.43.1 + '@uiw/react-md-editor': + specifier: ^4.0.5 + version: 4.0.5(@types/react@18.0.14)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@uppy/core': specifier: ^4.2.2 version: 4.2.2 @@ -146,11 +149,14 @@ importers: next-auth: specifier: ^4.15.1 version: 4.24.4(next@13.4.8(@babel/core@7.23.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + next-remove-imports: + specifier: ^1.0.12 + version: 1.0.12(webpack@5.97.1) next-themes: specifier: ^0.2.1 version: 0.2.1(next@13.4.8(@babel/core@7.23.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) papaparse: - specifier: ^5.3.2 + specifier: ^5.4.1 version: 5.4.1 planby: specifier: ^1.1.2 @@ -179,6 +185,9 @@ importers: react-icons: specifier: ^4.11.0 version: 4.11.0(react@18.2.0) + react-markdown: + specifier: ^9.0.1 + version: 9.0.1(@types/react@18.0.14)(react@18.2.0) react-qr-code: specifier: ^2.0.11 version: 2.0.12(react@18.2.0) @@ -207,12 +216,18 @@ importers: specifier: ^3.18.0 version: 3.22.4 devDependencies: + '@tailwindcss/typography': + specifier: ^0.5.15 + version: 0.5.15(tailwindcss@3.3.5) '@types/logrocket-react': specifier: ^3.0.3 version: 3.0.3 '@types/node': specifier: 18.0.0 version: 18.0.0 + '@types/papaparse': + specifier: ^5.3.15 + version: 5.3.15 '@types/react': specifier: 18.0.14 version: 18.0.14 @@ -542,10 +557,6 @@ packages: resolution: {integrity: sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.23.0': - resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} - engines: {node: '>=6.9.0'} - '@babel/types@7.23.3': resolution: {integrity: sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==} engines: {node: '>=6.9.0'} @@ -689,6 +700,10 @@ packages: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + 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'} @@ -697,12 +712,22 @@ packages: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} '@jridgewell/trace-mapping@0.3.20': resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@logsnag/node@1.0.1': resolution: {integrity: sha512-JW2S1KN91XyOb0oG2PblboZ1Ys4mkOSMn83GDYjM8CXzcFbkYFMnlFQoEgP0Y5z+1A56hOO+a7uLsvxO5IdUFA==} @@ -1357,6 +1382,11 @@ packages: '@syncfusion/ej2-splitbuttons@20.4.50': resolution: {integrity: sha512-Av/d8K1tuRs/gLnWKVfyLZ7iLhW8DyaqBNdpdYWsjNBuoVpRZdYddOSqPOeOzq5Upd6DzCkGpUfT3WDpAoNH7w==} + '@tailwindcss/typography@0.5.15': + resolution: {integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20' + '@tanstack/query-core@4.36.1': resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} @@ -1415,6 +1445,27 @@ packages: resolution: {integrity: sha512-rKOSCpJOb1MdTyJFqdf3QNNESDfPkbP+yBOZBM2x6iIOS4VlCfJqxsaSrb3uLPR6s8Ni7DhTu+cu/q1r0xOGcw==} engines: {node: '>=18.0.0'} + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1424,12 +1475,24 @@ packages: '@types/logrocket-react@3.0.3': resolution: {integrity: sha512-fGpJV4ccwfWAL0293EQx5HrS4PGMvXBpTQOXpA/SLXSCm7fC2O19w7Y3CcgWDmyawQnqbzd8faKAL12VhPdZKA==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@types/node@18.0.0': resolution: {integrity: sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==} + '@types/papaparse@5.3.15': + resolution: {integrity: sha512-JHe6vF6x/8Z85nCX4yFdDslN11d+1pr12E526X8WAfhadOeaOTx5AuIkvDKIBopfvlzpzkdMx4YyvSKCM9oqtw==} + '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/prismjs@1.26.5': + resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} + '@types/prop-types@15.7.10': resolution: {integrity: sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==} @@ -1451,6 +1514,12 @@ packages: '@types/semver@7.5.5': resolution: {integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/validator@13.11.6': resolution: {integrity: sha512-HUgHujPhKuNzgNXBRZKYexwoG+gHKU+tnfPqjWXFghZAnn73JElicMkuSKJyLGr9JgyA8IgK7fj88IyA9rwYeQ==} @@ -1512,6 +1581,24 @@ packages: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@uiw/copy-to-clipboard@1.0.17': + resolution: {integrity: sha512-O2GUHV90Iw2VrSLVLK0OmNIMdZ5fgEg4NhvtwINsX+eZ/Wf6DWD0TdsK9xwV7dNRnK/UI2mQtl0a2/kRgm1m1A==} + + '@uiw/react-markdown-preview@5.1.3': + resolution: {integrity: sha512-jV02wO4XHWFk54kz7sLqOkdPgJLttSfKLyen47XgjcyGgQXU2I4WJBygmdpV2AT9m/MiQ8qrN1Y+E5Syv9ZDpw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@uiw/react-md-editor@4.0.5': + resolution: {integrity: sha512-x+S7ZMz1B+KwVODOZk663H2gdOZhcFsrPUF8V69K4L2BbTZ3A4sBCw/uTrBE9dHH0gajAzRAYbAYCHsUQaTcyA==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@ungap/structured-clone@1.2.1': + resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} + '@uppy/companion-client@4.1.0': resolution: {integrity: sha512-nQ8CQfZcYVBNtFQ6ePj7FDIq38DXlH0YpzP/91LR9gnDVISJKKUuvWfr6tPktj1lRw9FZV8jLmlMKT2ituVKiw==} peerDependencies: @@ -1593,6 +1680,57 @@ packages: peerDependencies: '@uppy/core': ^4.2.2 + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + '@zxing/browser@0.0.7': resolution: {integrity: sha512-AepzMgDnD6EjxewqmXpHJsi4S3Gw9ilZJLIbTf6fWuWySEcHBodnGu3p7FWlgq1Sd5QyfPhTum5z3CBkkhMVng==} peerDependencies: @@ -1620,9 +1758,35 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1718,17 +1882,38 @@ packages: axobject-query@3.2.1: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + babel-loader@9.2.1: + resolution: {integrity: sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5' + babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} + babel-plugin-transform-remove-imports@1.8.0: + resolution: {integrity: sha512-QdE5ZnIjON1pSgTPU8KzLnl/LEzdq9PLmZNuHgGKTx0LOI9PBrHBj0fz9uCg2CdssiTw7v/zVRYs8GJxbvhKnQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + bootstrap-icons@1.11.1: resolution: {integrity: sha512-F0DDp7nKUX+x/QtpfRZ+XHFya60ng9nfdpdS59vDDfs4Uhuxp7zym/QavMsu/xx51txkoM9eVmpE7D08N35blw==} @@ -1752,6 +1937,14 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.24.3: + resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -1773,6 +1966,12 @@ packages: caniuse-lite@1.0.30001562: resolution: {integrity: sha512-kfte3Hym//51EdX4239i+Rmp20EsLIYGdPkERegTgU19hQWCRhsRFGKHTliUlsry53tv17K7n077Kqa0WJU4ng==} + caniuse-lite@1.0.30001690: + resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -1781,10 +1980,26 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + class-variance-authority@0.7.0: resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} @@ -1823,10 +2038,19 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -1861,6 +2085,9 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + css-selector-parser@3.0.5: + resolution: {integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==} + css-selector-tokenizer@0.8.0: resolution: {integrity: sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==} @@ -1904,6 +2131,9 @@ packages: supports-color: optional: true + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1954,6 +2184,9 @@ packages: resolution: {integrity: sha512-+WChZfaQbX3Wpo10EzBr+KNS3nPJ5rEai4YZq4c0tLpyyLS1tPK0qVknBt4AqOn8vMetGM2yZ0ueMY9Ok9VU0w==} hasBin: true + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -1961,6 +2194,10 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -1981,6 +2218,9 @@ packages: electron-to-chromium@1.4.578: resolution: {integrity: sha512-V0ZhSu1BQZKfG0yNEL6Dadzik8E1vAzfpVOapdSiT9F6yapEJ3Bk+4tZ4SMPdWiUchCgnM/ByYtBzp5ntzDMIA==} + electron-to-chromium@1.5.76: + resolution: {integrity: sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1991,6 +2231,14 @@ packages: resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} engines: {node: '>=10.13.0'} + enhanced-resolve@5.18.0: + resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -2001,6 +2249,9 @@ packages: es-iterator-helpers@1.0.15: resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + es-set-tostringtag@2.0.2: resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} engines: {node: '>= 0.4'} @@ -2019,6 +2270,10 @@ packages: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -2027,6 +2282,10 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + eslint-config-next@13.5.6: resolution: {integrity: sha512-o8pQsUHTo9aHqJ2YiZDym5gQAMRf7O2HndHo/JZeY7TDD+W4hk6Ma8Vw54RHiBeb7OWWO5dPirQB+Is/aVQ7Kg==} peerDependencies: @@ -2142,6 +2401,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -2152,9 +2414,16 @@ packages: eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + exifr@7.1.3: resolution: {integrity: sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw==} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2171,6 +2440,9 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-uri@3.0.3: + resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} + fast-xml-parser@4.4.1: resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} hasBin: true @@ -2192,6 +2464,10 @@ packages: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} + find-cache-dir@4.0.0: + resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} + engines: {node: '>=14.16'} + find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} @@ -2199,6 +2475,10 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + flat-cache@3.1.1: resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} engines: {node: '>=12.0.0'} @@ -2283,6 +2563,9 @@ packages: get-tsconfig@4.7.2: resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2361,9 +2644,63 @@ packages: resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} engines: {node: '>= 0.4'} + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.2: + resolution: {integrity: sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A==} + + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + + hast-util-heading-rank@3.0.0: + resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-select@6.0.3: + resolution: {integrity: sha512-OVRQlQ1XuuLP8aFVLYmC2atrfWHS5UD3shonxpnyrjcCkwtvmt/+N6kYJdcY4mkMJhxp4kj2EFIxQ9kvkkt/eQ==} + + hast-util-to-html@9.0.4: + resolution: {integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==} + + hast-util-to-jsx-runtime@2.3.2: + resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==} + + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + + hastscript@9.0.0: + resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==} + hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + ical-js-parser@0.6.12: resolution: {integrity: sha512-Wgq9vSY/S8daSXvs+rSeOrrxX4YPcRNJJu1+4n/e9jGHHIGh6kjfxnb7Ltfxhg3eOZZVSZXWqkUlrz8f3fkBWQ==} @@ -2419,6 +2756,9 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + internal-slot@1.0.6: resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} engines: {node: '>= 0.4'} @@ -2426,6 +2766,12 @@ packages: invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} @@ -2458,6 +2804,9 @@ packages: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2477,6 +2826,9 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} @@ -2496,6 +2848,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -2546,6 +2902,10 @@ packages: iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + jiti@1.21.0: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true @@ -2574,6 +2934,9 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -2617,16 +2980,30 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + lodash.clonedeep@4.5.0: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -2636,6 +3013,9 @@ packages: logrocket@1.0.1: resolution: {integrity: sha512-oPA0c5GzMKsWp/6p19OaujZQMzttluqVOI+989uHeciPAljPZvGEpZRbNO3Rr+jC/8jVLJdlMP9IHuyhKsASGA==} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -2659,13 +3039,148 @@ packages: resolution: {integrity: sha512-IDkEPB80Rb6gCAU+FEib0t4FeJ4uVOuX1CQ9GsvU3O+JAGIgu0J7sf1OarXKaKDygTZIoJyU6YdZzTFRu+YR0A==} engines: {node: '>=12'} + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.1.3: + resolution: {integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + memoize-one@6.0.0: resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + 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'} + micromark-core-commonmark@2.0.2: + resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.0: + resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.0.3: + resolution: {integrity: sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.1: + resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + + micromark@4.0.1: + resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} + micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -2715,6 +3230,9 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + next-auth@4.24.4: resolution: {integrity: sha512-5DGffi+OpkbU62vPQIJ1z+hFnmow+ec5Qrn9m6eoglIO51m0DlrmLxBduZEwKAYDEg9k2joi1yelgmq1vqK3aQ==} peerDependencies: @@ -2726,6 +3244,9 @@ packages: nodemailer: optional: true + next-remove-imports@1.0.12: + resolution: {integrity: sha512-3tdL6VuSykJ/mcUwxfjQ+Fd4OpEmrwWVHtLZ/fhNcSaToWCutUp7nrfIww7/4CURe9I7BDCQE9AWl4fkY3YZOQ==} + next-themes@0.2.1: resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} peerDependencies: @@ -2754,6 +3275,9 @@ packages: node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -2762,6 +3286,9 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + oauth@0.9.15: resolution: {integrity: sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==} @@ -2828,10 +3355,18 @@ packages: 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'} + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-queue@8.0.1: resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==} engines: {node: '>=18'} @@ -2857,14 +3392,27 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse-numeric-range@1.3.0: + resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -2883,6 +3431,9 @@ packages: picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -2895,6 +3446,10 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + pkg-dir@7.0.0: + resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} + engines: {node: '>=14.16'} + planby@1.1.4: resolution: {integrity: sha512-SmSGbyJhMvxW1Pg09LS5rNlV55SjE75b+QoDFzjKcEkjAqWV2tNZIhOUarBU5J1msu20XepgZf/s4UzxKU5BVA==} engines: {node: '>=10'} @@ -2931,6 +3486,10 @@ packages: 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'} @@ -2999,6 +3558,9 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -3015,6 +3577,9 @@ packages: quill-delta@4.2.2: resolution: {integrity: sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg==} + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + react-dom@18.2.0: resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: @@ -3040,6 +3605,12 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-markdown@9.0.1: + resolution: {integrity: sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + react-qr-code@2.0.12: resolution: {integrity: sha512-k+pzP5CKLEGBRwZsDPp98/CAJeXlsYRHM2iZn1Sd5Th/HnKhIZCSg27PXO58zk8z02RaEryg+60xa4vyywMJwg==} peerDependencies: @@ -3126,6 +3697,9 @@ packages: resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} engines: {node: '>= 0.4'} + refractor@4.8.1: + resolution: {integrity: sha512-/fk5sI0iTgFYlmVGYVew90AoYnNMP6pooClx/XKqyeeCQXrL0Kvgn8V0VEht5ccdljbzzF1i3Q213gcntkRExg==} + regenerator-runtime@0.14.0: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} @@ -3137,10 +3711,63 @@ packages: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} + rehype-attr@3.0.3: + resolution: {integrity: sha512-Up50Xfra8tyxnkJdCzLBIBtxOcB2M1xdeKe1324U06RAvSjYm7ULSeoM+b/nYPQPVd7jsXJ9+39IG1WAJPXONw==} + engines: {node: '>=16'} + + rehype-autolink-headings@7.1.0: + resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} + + rehype-ignore@2.0.2: + resolution: {integrity: sha512-BpAT/3lU9DMJ2siYVD/dSR0A/zQgD6Fb+fxkJd4j+wDVy6TYbYpK+FZqu8eM9EuNKGvi4BJR7XTZ/+zF02Dq8w==} + engines: {node: '>=16'} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-prism-plus@2.0.0: + resolution: {integrity: sha512-FeM/9V2N7EvDZVdR2dqhAzlw5YI49m9Tgn7ZrYJeYHIahM6gcXpH0K1y2gNnKanZCydOMluJvX2cB9z3lhY8XQ==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-rewrite@4.0.2: + resolution: {integrity: sha512-rjLJ3z6fIV11phwCqHp/KRo8xuUCO8o9bFJCNw5o6O2wlLk6g8r323aRswdGBQwfXPFYeSuZdAjp4tzo6RGqEg==} + engines: {node: '>=16.0.0'} + + rehype-slug@6.0.0: + resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + + rehype@13.0.2: + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} + + remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + + remark-github-blockquote-alert@1.3.0: + resolution: {integrity: sha512-cwkBA4x+VH4J2VAMzhbmSeAmK5tBd5iwesgSUUQuRtuQ48XQm6sXXNLY9PR7ohZmZiqMeoDMUGCTur5zwR4lTQ==} + engines: {node: '>=16'} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.1: + resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3195,6 +3822,14 @@ packages: scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + schema-utils@4.3.0: + resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} + engines: {node: '>= 10.13.0'} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -3204,6 +3839,9 @@ packages: engines: {node: '>=10'} hasBin: true + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + set-function-length@1.1.1: resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} engines: {node: '>= 0.4'} @@ -3237,10 +3875,20 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -3265,6 +3913,9 @@ packages: string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -3280,6 +3931,9 @@ packages: strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + style-to-object@1.0.8: + resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + styled-jsx@5.1.1: resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} @@ -3313,6 +3967,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -3334,6 +3992,27 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} + terser-webpack-plugin@5.3.11: + resolution: {integrity: sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.37.0: + resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==} + engines: {node: '>=10'} + hasBin: true + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -3352,6 +4031,12 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-custom-error@3.3.1: resolution: {integrity: sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==} engines: {node: '>=14.0.0'} @@ -3414,10 +4099,37 @@ packages: unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-filter@5.0.1: + resolution: {integrity: sha512-pHx7D4Zt6+TsfwylH9+lYhBhzyhEnCXs/lbq/Hstxno5z4gVdyc2WEW0asfjGKPyG4pEKrnBv5hdkO6+aRnQJw==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: browserslist: '>= 4.21.0' uri-js@4.4.1: @@ -3481,13 +4193,43 @@ packages: resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} engines: {node: '>= 0.10'} + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} + watchpack@2.4.2: + resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + engines: {node: '>=10.13.0'} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + web-vitals@4.2.2: resolution: {integrity: sha512-nYfoOqb4EmElljyXU2qdeE76KsvoHdftQKY4DzA9Aw8DervCg2bG634pHLrJ/d6+B4mE3nWTSJv8Mo7B2mbZkw==} + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.97.1: + resolution: {integrity: sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} @@ -3547,12 +4289,19 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + zod@3.21.4: resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: '@aashutoshrathi/word-wrap@1.2.6': {} @@ -4142,7 +4891,7 @@ snapshots: '@babel/helper-module-imports@7.22.15': dependencies: - '@babel/types': 7.23.0 + '@babel/types': 7.23.3 '@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3)': dependencies: @@ -4221,12 +4970,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/types@7.23.0': - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - '@babel/types@7.23.3': dependencies: '@babel/helper-string-parser': 7.22.5 @@ -4250,7 +4993,7 @@ snapshots: '@emotion/babel-plugin@11.11.0': dependencies: '@babel/helper-module-imports': 7.22.15 - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 '@emotion/serialize': 1.1.2 @@ -4279,7 +5022,7 @@ snapshots: '@emotion/react@11.11.1(@types/react@18.0.14)(react@18.2.0)': dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 '@emotion/babel-plugin': 11.11.0 '@emotion/cache': 11.11.0 '@emotion/serialize': 1.1.2 @@ -4303,7 +5046,7 @@ snapshots: '@emotion/styled@11.11.0(@emotion/react@11.11.1(@types/react@18.0.14)(react@18.2.0))(@types/react@18.0.14)(react@18.2.0)': dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 '@emotion/babel-plugin': 11.11.0 '@emotion/is-prop-valid': 1.2.1 '@emotion/react': 11.11.1(@types/react@18.0.14)(react@18.2.0) @@ -4409,10 +5152,23 @@ snapshots: '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/resolve-uri@3.1.1': {} '@jridgewell/set-array@1.1.2': {} + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec@1.4.15': {} '@jridgewell/trace-mapping@0.3.20': @@ -4420,6 +5176,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@logsnag/node@1.0.1': {} '@next-auth/prisma-adapter@1.0.7(@prisma/client@5.6.0(prisma@5.6.0))(next-auth@4.24.4(next@13.4.8(@babel/core@7.23.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': @@ -4492,7 +5253,7 @@ snapshots: '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.0.5)(@types/react@18.0.14)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.5)(@types/react@18.0.14)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -4519,7 +5280,7 @@ snapshots: '@radix-ui/react-collection@1.0.3(@types/react-dom@18.0.5)(@types/react@18.0.14)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.14)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.0.14)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.5)(@types/react@18.0.14)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -4546,14 +5307,14 @@ snapshots: '@radix-ui/react-direction@1.0.1(@types/react@18.0.14)(react@18.2.0)': dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 react: 18.2.0 optionalDependencies: '@types/react': 18.0.14 '@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.0.5)(@types/react@18.0.14)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.14)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.5)(@types/react@18.0.14)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -4583,14 +5344,14 @@ snapshots: '@radix-ui/react-focus-guards@1.0.1(@types/react@18.0.14)(react@18.2.0)': dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 react: 18.2.0 optionalDependencies: '@types/react': 18.0.14 '@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.0.5)(@types/react@18.0.14)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.14)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.5)(@types/react@18.0.14)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.0.14)(react@18.2.0) @@ -4637,7 +5398,7 @@ snapshots: '@radix-ui/react-popper@1.1.3(@types/react-dom@18.0.5)(@types/react@18.0.14)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 '@floating-ui/react-dom': 2.0.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.0.5)(@types/react@18.0.14)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.14)(react@18.2.0) @@ -4656,7 +5417,7 @@ snapshots: '@radix-ui/react-portal@1.0.4(@types/react-dom@18.0.5)(@types/react@18.0.14)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.0.5)(@types/react@18.0.14)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -4687,7 +5448,7 @@ snapshots: '@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.0.5)(@types/react@18.0.14)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.0.5)(@types/react@18.0.14)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.0.14)(react@18.2.0) @@ -4713,7 +5474,7 @@ snapshots: '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.0.14)(react@18.2.0)': dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 react: 18.2.0 optionalDependencies: '@types/react': 18.0.14 @@ -4728,7 +5489,7 @@ snapshots: '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.0.14)(react@18.2.0)': dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.0.14)(react@18.2.0) react: 18.2.0 optionalDependencies: @@ -4736,7 +5497,7 @@ snapshots: '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.0.14)(react@18.2.0)': dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 react: 18.2.0 optionalDependencies: '@types/react': 18.0.14 @@ -4750,7 +5511,7 @@ snapshots: '@radix-ui/react-use-rect@1.0.1(@types/react@18.0.14)(react@18.2.0)': dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 '@radix-ui/rect': 1.0.1 react: 18.2.0 optionalDependencies: @@ -4766,7 +5527,7 @@ snapshots: '@radix-ui/rect@1.0.1': dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 '@rushstack/eslint-patch@1.5.1': {} @@ -5220,6 +5981,14 @@ snapshots: '@syncfusion/ej2-base': 20.4.51 '@syncfusion/ej2-popups': 20.4.53 + '@tailwindcss/typography@0.5.15(tailwindcss@3.3.5)': + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.3.5 + '@tanstack/query-core@4.36.1': {} '@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': @@ -5265,6 +6034,34 @@ snapshots: '@trpc/server@10.43.1': {} + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.6 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.6 + + '@types/estree@1.0.6': {} + + '@types/hast@2.3.10': + dependencies: + '@types/unist': 2.0.11 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} @@ -5273,10 +6070,22 @@ snapshots: dependencies: logrocket: 1.0.1 + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/ms@0.7.34': {} + '@types/node@18.0.0': {} + '@types/papaparse@5.3.15': + dependencies: + '@types/node': 18.0.0 + '@types/parse-json@4.0.2': {} + '@types/prismjs@1.26.5': {} + '@types/prop-types@15.7.10': {} '@types/react-dom@18.0.5': @@ -5299,6 +6108,10 @@ snapshots: '@types/semver@7.5.5': {} + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + '@types/validator@13.11.6': {} '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.22.0)(typescript@4.7.4))(eslint@8.22.0)(typescript@4.7.4)': @@ -5385,6 +6198,43 @@ snapshots: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 + '@uiw/copy-to-clipboard@1.0.17': {} + + '@uiw/react-markdown-preview@5.1.3(@types/react@18.0.14)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@babel/runtime': 7.23.6 + '@uiw/copy-to-clipboard': 1.0.17 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-markdown: 9.0.1(@types/react@18.0.14)(react@18.2.0) + rehype-attr: 3.0.3 + rehype-autolink-headings: 7.1.0 + rehype-ignore: 2.0.2 + rehype-prism-plus: 2.0.0 + rehype-raw: 7.0.0 + rehype-rewrite: 4.0.2 + rehype-slug: 6.0.0 + remark-gfm: 4.0.0 + remark-github-blockquote-alert: 1.3.0 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - '@types/react' + - supports-color + + '@uiw/react-md-editor@4.0.5(@types/react@18.0.14)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@babel/runtime': 7.23.6 + '@uiw/react-markdown-preview': 5.1.3(@types/react@18.0.14)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + rehype: 13.0.2 + rehype-prism-plus: 2.0.0 + transitivePeerDependencies: + - '@types/react' + - supports-color + + '@ungap/structured-clone@1.2.1': {} + '@uppy/companion-client@4.1.0(@uppy/core@4.2.2)': dependencies: '@uppy/core': 4.2.2 @@ -5492,6 +6342,86 @@ snapshots: '@uppy/core': 4.2.2 '@uppy/utils': 6.0.3 + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + '@zxing/browser@0.0.7(@zxing/library@0.18.6)': dependencies: '@zxing/library': 0.18.6 @@ -5519,6 +6449,21 @@ snapshots: acorn@8.11.2: {} + acorn@8.14.0: {} + + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -5526,6 +6471,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-regex@5.0.1: {} ansi-styles@3.2.1: @@ -5650,16 +6602,33 @@ snapshots: dependencies: dequal: 2.0.3 + babel-loader@9.2.1(@babel/core@7.23.3)(webpack@5.97.1): + dependencies: + '@babel/core': 7.23.3 + find-cache-dir: 4.0.0 + schema-utils: 4.3.0 + webpack: 5.97.1 + babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 cosmiconfig: 7.1.0 resolve: 1.22.8 + babel-plugin-transform-remove-imports@1.8.0(@babel/core@7.23.3): + dependencies: + '@babel/core': 7.23.3 + + bail@2.0.2: {} + balanced-match@1.0.2: {} + bcp-47-match@2.0.3: {} + binary-extensions@2.2.0: {} + boolbase@1.0.0: {} + bootstrap-icons@1.11.1: {} bootstrap@5.3.2(@popperjs/core@2.11.8): @@ -5684,6 +6653,15 @@ snapshots: node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.1) + browserslist@4.24.3: + dependencies: + caniuse-lite: 1.0.30001690 + electron-to-chromium: 1.5.76 + node-releases: 2.0.19 + update-browserslist-db: 1.1.1(browserslist@4.24.3) + + buffer-from@1.1.2: {} + busboy@1.6.0: dependencies: streamsearch: 1.1.0 @@ -5702,6 +6680,10 @@ snapshots: caniuse-lite@1.0.30001562: {} + caniuse-lite@1.0.30001690: {} + + ccount@2.0.1: {} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -5713,6 +6695,14 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + chokidar@3.5.3: dependencies: anymatch: 3.1.3 @@ -5725,6 +6715,8 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chrome-trace-event@1.0.4: {} + class-variance-authority@0.7.0: dependencies: clsx: 2.0.0 @@ -5759,8 +6751,14 @@ snapshots: dependencies: delayed-stream: 1.0.0 + comma-separated-tokens@2.0.3: {} + + commander@2.20.3: {} + commander@4.1.1: {} + common-path-prefix@3.0.0: {} + concat-map@0.0.1: {} convert-source-map@1.9.0: {} @@ -5793,6 +6791,8 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + css-selector-parser@3.0.5: {} + css-selector-tokenizer@0.8.0: dependencies: cssesc: 3.0.0 @@ -5817,7 +6817,7 @@ snapshots: date-fns@2.30.0: dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 debug@3.2.7: dependencies: @@ -5827,6 +6827,10 @@ snapshots: dependencies: ms: 2.1.2 + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -5896,12 +6900,18 @@ snapshots: rrule: 2.6.6 turndown: 7.1.2 + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + didyoumean@1.2.2: {} dir-glob@3.0.1: dependencies: path-type: 4.0.0 + direction@2.0.1: {} + dlv@1.1.3: {} doctrine@2.1.0: @@ -5914,13 +6924,15 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 csstype: 3.1.2 domino@2.1.6: {} electron-to-chromium@1.4.578: {} + electron-to-chromium@1.5.76: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -5930,6 +6942,13 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.1 + enhanced-resolve@5.18.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + entities@4.5.0: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -5993,6 +7012,8 @@ snapshots: iterator.prototype: 1.1.2 safe-array-concat: 1.0.1 + es-module-lexer@1.6.0: {} + es-set-tostringtag@2.0.2: dependencies: get-intrinsic: 1.2.2 @@ -6013,10 +7034,14 @@ snapshots: escalade@3.1.1: {} + escalade@3.2.0: {} + escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} + escape-string-regexp@5.0.0: {} + eslint-config-next@13.5.6(eslint@8.22.0)(typescript@4.7.4): dependencies: '@next/eslint-plugin-next': 13.5.6 @@ -6223,14 +7248,20 @@ snapshots: estraverse@5.3.0: {} + estree-util-is-identifier-name@3.0.0: {} + esutils@2.0.3: {} eventemitter3@4.0.7: {} eventemitter3@5.0.1: {} + events@3.3.0: {} + exifr@7.1.3: {} + extend@3.0.2: {} + fast-deep-equal@3.1.3: {} fast-diff@1.2.0: {} @@ -6247,6 +7278,8 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-uri@3.0.3: {} + fast-xml-parser@4.4.1: dependencies: strnum: 1.0.5 @@ -6267,6 +7300,11 @@ snapshots: dependencies: to-regex-range: 5.0.1 + find-cache-dir@4.0.0: + dependencies: + common-path-prefix: 3.0.0 + pkg-dir: 7.0.0 + find-root@1.1.0: {} find-up@5.0.0: @@ -6274,6 +7312,11 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + find-up@6.3.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + flat-cache@3.1.1: dependencies: flatted: 3.2.9 @@ -6346,6 +7389,8 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + github-slugger@2.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -6434,10 +7479,156 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.2 + parse5: 7.2.1 + vfile: 6.0.3 + vfile-message: 4.0.2 + + hast-util-from-parse5@8.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.0 + property-information: 6.5.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-has-property@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-heading-rank@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@3.1.1: + dependencies: + '@types/hast': 2.3.10 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.2.1 + hast-util-from-parse5: 8.0.2 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.2.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-select@6.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 3.0.5 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.1 + hast-util-whitespace: 3.0.0 + nth-check: 2.1.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + hast-util-to-html@9.0.4: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.2: + dependencies: + '@types/estree': 1.0.6 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.1.3 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.8 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@7.2.0: + dependencies: + '@types/hast': 2.3.10 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 3.1.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + + hastscript@9.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 + html-url-attributes@3.0.1: {} + + html-void-elements@3.0.0: {} + ical-js-parser@0.6.12: dependencies: luxon: 2.5.0 @@ -6500,6 +7691,8 @@ snapshots: inherits@2.0.4: {} + inline-style-parser@0.2.4: {} + internal-slot@1.0.6: dependencies: get-intrinsic: 1.2.2 @@ -6510,6 +7703,13 @@ snapshots: dependencies: loose-envify: 1.4.0 + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + is-array-buffer@3.0.2: dependencies: call-bind: 1.0.5 @@ -6545,6 +7745,8 @@ snapshots: dependencies: has-tostringtag: 1.0.0 + is-decimal@2.0.1: {} + is-extglob@2.1.1: {} is-finalizationregistry@1.0.2: @@ -6561,6 +7763,8 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-hexadecimal@2.0.1: {} + is-map@2.0.2: {} is-negative-zero@2.0.2: {} @@ -6573,6 +7777,8 @@ snapshots: is-number@7.0.0: {} + is-plain-obj@4.1.0: {} + is-regex@1.1.4: dependencies: call-bind: 1.0.5 @@ -6625,6 +7831,12 @@ snapshots: reflect.getprototypeof: 1.0.4 set-function-name: 2.0.1 + jest-worker@27.5.1: + dependencies: + '@types/node': 18.0.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + jiti@1.21.0: {} jose@4.15.4: {} @@ -6643,6 +7855,8 @@ snapshots: json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@1.0.2: @@ -6688,20 +7902,32 @@ snapshots: lines-and-columns@1.2.4: {} + loader-runner@4.3.0: {} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash.castarray@4.4.0: {} + lodash.clonedeep@4.5.0: {} lodash.isequal@4.5.0: {} + lodash.isplainobject@4.0.6: {} + lodash.merge@4.6.2: {} lodash@4.17.21: {} logrocket@1.0.1: {} + longest-streak@3.1.0: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -6723,10 +7949,358 @@ snapshots: luxon@2.5.0: {} + markdown-table@3.0.4: {} + + mdast-util-find-and-replace@3.0.1: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.1.3: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.1 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + memoize-one@6.0.0: {} + merge-stream@2.0.0: {} + merge2@1.4.1: {} + micromark-core-commonmark@2.0.2: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-table@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.1 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.1 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.1 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.0.3: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.1: {} + + micromark@4.0.1: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + transitivePeerDependencies: + - supports-color + micromatch@4.0.5: dependencies: braces: 3.0.2 @@ -6768,6 +8342,8 @@ snapshots: natural-compare@1.4.0: {} + neo-async@2.6.2: {} + next-auth@4.24.4(next@13.4.8(@babel/core@7.23.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@babel/runtime': 7.23.2 @@ -6783,6 +8359,15 @@ snapshots: react-dom: 18.2.0(react@18.2.0) uuid: 8.3.2 + next-remove-imports@1.0.12(webpack@5.97.1): + dependencies: + '@babel/core': 7.23.3 + babel-loader: 9.2.1(@babel/core@7.23.3)(webpack@5.97.1) + babel-plugin-transform-remove-imports: 1.8.0(@babel/core@7.23.3) + transitivePeerDependencies: + - supports-color + - webpack + next-themes@0.2.1(next@13.4.8(@babel/core@7.23.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: next: 13.4.8(@babel/core@7.23.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -6817,10 +8402,16 @@ snapshots: node-releases@2.0.13: {} + node-releases@2.0.19: {} + normalize-path@3.0.0: {} normalize-range@0.1.2: {} + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + oauth@0.9.15: {} object-assign@4.1.1: {} @@ -6898,10 +8489,18 @@ snapshots: dependencies: yocto-queue: 0.1.0 + p-limit@4.0.0: + dependencies: + yocto-queue: 1.1.1 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + p-queue@8.0.1: dependencies: eventemitter3: 5.0.1 @@ -6925,6 +8524,16 @@ snapshots: dependencies: callsites: 3.1.0 + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.22.13 @@ -6932,8 +8541,16 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse-numeric-range@1.3.0: {} + + parse5@7.2.1: + dependencies: + entities: 4.5.0 + path-exists@4.0.0: {} + path-exists@5.0.0: {} + path-is-absolute@1.0.1: {} path-key@3.1.1: {} @@ -6944,12 +8561,18 @@ snapshots: picocolors@1.0.0: {} + picocolors@1.1.1: {} + picomatch@2.3.1: {} pify@2.3.0: {} pirates@4.0.6: {} + pkg-dir@7.0.0: + dependencies: + find-up: 6.3.0 + planby@1.1.4(@types/react@18.0.14)(react@18.2.0): dependencies: '@emotion/react': 11.11.1(@types/react@18.0.14)(react@18.2.0) @@ -6984,6 +8607,11 @@ snapshots: postcss: 8.4.31 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 @@ -7052,6 +8680,8 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + property-information@6.5.0: {} + proxy-from-env@1.1.0: {} punycode@2.3.1: {} @@ -7066,6 +8696,10 @@ snapshots: lodash.clonedeep: 4.5.0 lodash.isequal: 4.5.0 + randombytes@2.1.0: + dependencies: + safe-buffer: 5.1.2 + react-dom@18.2.0(react@18.2.0): dependencies: loose-envify: 1.4.0 @@ -7087,6 +8721,23 @@ snapshots: react-is@16.13.1: {} + react-markdown@9.0.1(@types/react@18.0.14)(react@18.2.0): + dependencies: + '@types/hast': 3.0.4 + '@types/react': 18.0.14 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.2 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.0 + react: 18.2.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.1 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + react-qr-code@2.0.12(react@18.2.0): dependencies: prop-types: 15.8.1 @@ -7157,7 +8808,7 @@ snapshots: react-transition-group@4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.6 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -7195,6 +8846,13 @@ snapshots: globalthis: 1.0.3 which-builtin-type: 1.1.3 + refractor@4.8.1: + dependencies: + '@types/hast': 2.3.10 + '@types/prismjs': 1.26.5 + hastscript: 7.2.0 + parse-entities: 4.0.2 + regenerator-runtime@0.14.0: {} regexp.prototype.flags@1.5.1: @@ -7205,8 +8863,116 @@ snapshots: regexpp@3.2.0: {} + rehype-attr@3.0.3: + dependencies: + unified: 11.0.5 + unist-util-visit: 5.0.0 + + rehype-autolink-headings@7.1.0: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.2.1 + hast-util-heading-rank: 3.0.0 + hast-util-is-element: 3.0.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + rehype-ignore@2.0.2: + dependencies: + hast-util-select: 6.0.3 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-prism-plus@2.0.0: + dependencies: + hast-util-to-string: 3.0.1 + parse-numeric-range: 1.3.0 + refractor: 4.8.1 + rehype-parse: 9.0.1 + unist-util-filter: 5.0.1 + unist-util-visit: 5.0.0 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-rewrite@4.0.2: + dependencies: + hast-util-select: 6.0.3 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + rehype-slug@6.0.0: + dependencies: + '@types/hast': 3.0.4 + github-slugger: 2.0.0 + hast-util-heading-rank: 3.0.0 + hast-util-to-string: 3.0.1 + unist-util-visit: 5.0.0 + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.4 + unified: 11.0.5 + + rehype@13.0.2: + dependencies: + '@types/hast': 3.0.4 + rehype-parse: 9.0.1 + rehype-stringify: 10.0.1 + unified: 11.0.5 + + remark-gfm@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-github-blockquote-alert@1.3.0: + dependencies: + unist-util-visit: 5.0.0 + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.1 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + require-directory@2.1.1: {} + require-from-string@2.0.2: {} + resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -7266,12 +9032,29 @@ snapshots: dependencies: loose-envify: 1.4.0 + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + schema-utils@4.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + semver@6.3.1: {} semver@7.5.4: dependencies: lru-cache: 6.0.0 + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + set-function-length@1.1.1: dependencies: define-data-property: 1.1.1 @@ -7305,8 +9088,17 @@ snapshots: source-map-js@1.0.2: {} + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + source-map@0.5.7: {} + source-map@0.6.1: {} + + space-separated-tokens@2.0.2: {} + streamsearch@1.1.0: {} string-width@4.2.3: @@ -7349,6 +9141,11 @@ snapshots: dependencies: safe-buffer: 5.1.2 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -7359,6 +9156,10 @@ snapshots: strnum@1.0.5: {} + style-to-object@1.0.8: + dependencies: + inline-style-parser: 0.2.4 + styled-jsx@5.1.1(@babel/core@7.23.3)(react@18.2.0): dependencies: client-only: 0.0.1 @@ -7390,6 +9191,10 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + supports-preserve-symlinks-flag@1.0.0: {} tailwind-merge@2.1.0: @@ -7429,6 +9234,22 @@ snapshots: tapable@2.2.1: {} + terser-webpack-plugin@5.3.11(webpack@5.97.1): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 4.3.0 + serialize-javascript: 6.0.2 + terser: 5.37.0 + webpack: 5.97.1 + + terser@5.37.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.0 + commander: 2.20.3 + source-map-support: 0.5.21 + text-table@0.2.0: {} thenify-all@1.6.0: @@ -7445,6 +9266,10 @@ snapshots: dependencies: is-number: 7.0.0 + trim-lines@3.0.1: {} + + trough@2.2.0: {} + ts-custom-error@3.3.1: {} ts-interface-checker@0.1.13: {} @@ -7515,12 +9340,57 @@ snapshots: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-filter@5.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + update-browserslist-db@1.0.13(browserslist@4.22.1): dependencies: browserslist: 4.22.1 escalade: 3.1.1 picocolors: 1.0.0 + update-browserslist-db@1.1.1(browserslist@4.24.3): + dependencies: + browserslist: 4.24.3 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -7564,13 +9434,67 @@ snapshots: validator@13.11.0: {} + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + watchpack@2.4.0: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 + watchpack@2.4.2: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + web-namespaces@2.0.1: {} + web-vitals@4.2.2: {} + webpack-sources@3.2.3: {} + + webpack@5.97.1: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.6 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.14.0 + browserslist: 4.24.3 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.0 + es-module-lexer: 1.6.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.11(webpack@5.97.1) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 @@ -7647,6 +9571,10 @@ snapshots: yocto-queue@0.1.0: {} + yocto-queue@1.1.1: {} + zod@3.21.4: {} zod@3.22.4: {} + + zwitch@2.0.4: {} diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 55ab4cd9..de813d74 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -39,20 +39,21 @@ model Session { } model User { - id String @id @default(cuid()) + id String @id @default(cuid()) name String? - email String? @unique + email String? @unique emailVerified DateTime? image String? accounts Account[] sessions Session[] typeform_response_id String? - role Role[] @default([HACKER]) - hacker Review[] @relation("hacker") - reviewer Review[] @relation("reviewer") - status Status @default(IN_REVIEW) - qrcode Int? @unique - mealsTaken Int @default(0) + role Role[] @default([HACKER]) + hacker Review[] @relation("hacker") + reviewer Review[] @relation("reviewer") + judge JudgingResult[] @relation("judge") + status Status @default(IN_REVIEW) + qrcode Int? @unique + mealsTaken Int @default(0) lastMealTaken DateTime? EventLog EventLog[] @@ -99,6 +100,7 @@ enum Role { EVENT_MANAGER GENERAL_SCANNER SPONSER + JUDGE } enum Status { @@ -244,3 +246,91 @@ enum YesNoUnsure { NO UNSURE } + +// Glossary: +// Track: Different topic/categories used to classify projects +model ProjectTrack { + id String @id @default(cuid()) + project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) + projectId String + track Track @relation(fields: [trackId], references: [id], onDelete: Cascade) + trackId String + + @@unique([projectId, trackId]) +} + +model Track { + id String @id @default(cuid()) + name String @unique + ProjectTrack ProjectTrack[] + Table Table[] + RubricQuestion RubricQuestion[] +} + +model Table { + id String @id @default(cuid()) + number Int @unique + trackId String + track Track @relation(fields: [trackId], references: [id]) + TimeSlot TimeSlot[] +} + +model Project { + id String @id @default(cuid()) + name String + description String + link String + tracks ProjectTrack[] + judgingResults JudgingResult[] + TimeSlot TimeSlot[] + dhYear String +} + +model TimeSlot { + id String @id @default(cuid()) + startTime DateTime + endTime DateTime + project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) + projectId String + table Table @relation(fields: [tableId], references: [id], onDelete: Cascade) + tableId String + dhYear String + + @@unique([projectId, startTime]) + @@unique([tableId, startTime]) +} + +model JudgingResult { + id String @id @default(cuid()) + + judgeId String + judge User @relation("judge", fields: [judgeId], references: [id], onDelete: Cascade) + + project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) + projectId String + responses RubricResponse[] + dhYear String + + @@unique([judgeId, projectId]) +} + +model RubricQuestion { + id String @id @default(cuid()) + title String + question String + points Int + trackId String + track Track @relation(fields: [trackId], references: [id], onDelete: Cascade) + responses RubricResponse[] +} + +model RubricResponse { + id String @id @default(cuid()) + score Int + judgingResultId String + questionId String + judgingResult JudgingResult @relation(fields: [judgingResultId], references: [id], onDelete: Cascade) + question RubricQuestion @relation(fields: [questionId], references: [id], onDelete: Cascade) + + @@unique([judgingResultId, questionId]) +} diff --git a/src/components/CSVUploader.tsx b/src/components/CSVUploader.tsx new file mode 100644 index 00000000..8a1db77e --- /dev/null +++ b/src/components/CSVUploader.tsx @@ -0,0 +1,90 @@ +import React, { useState } from "react"; +import { trpc } from "../utils/trpc"; +import Papa from "papaparse"; +import { CSVProcessor } from "../utils/csvProcessors"; + +interface CSVUploaderProps { + csvProcessor: CSVProcessor; +} + +export const CSVUploader: React.FC = ({ csvProcessor }) => { + const uploadProjectsMutation = trpc.project.uploadProjects.useMutation({}); + + const handleFileUpload = (file: File) => { + Papa.parse(file, { + header: true, + complete: function (results) { + const processedData = csvProcessor.processCSVData(results.data); + const data = processedData + .filter((obj) => { + return Object.values(obj).some( + (value) => value !== "" && value !== undefined && value !== null + ); + }) + .filter((obj) => { + return obj.name !== "Untitled" && obj.tracks.length > 0; + }); + + uploadProjectsMutation.mutate(data); + }, + error: function (error) { + console.error(`CSV parsing error: ${error.message}`); + }, + }); + }; + + const handleFileChange = (event: React.ChangeEvent) => { + const file = event.target.files?.[0]; + if (file) { + handleFileUpload(file); + } + }; + + return ( +
+
+

+ Upload Project Export +

+
+ + +
+ {uploadProjectsMutation.isLoading && ( +
+

Uploading...

+
+ )} + {uploadProjectsMutation.isSuccess && ( +
+

+ Upload successful! +

+
+ )} + {uploadProjectsMutation.isError && ( +
+

+ Error: {uploadProjectsMutation.error?.message} +

+
+ )} +
+

Accepted file format: .csv

+
+
+
+ ); +}; diff --git a/src/components/CustomInput.tsx b/src/components/CustomInput.tsx new file mode 100644 index 00000000..2ecb547c --- /dev/null +++ b/src/components/CustomInput.tsx @@ -0,0 +1,52 @@ +import { + useForm, + SubmitHandler, + Controller, + FieldError, + UseFormRegister, + FieldValues, + Path, +} from "react-hook-form"; + +import React from "react"; + +interface FormInputProps { + label: string; + id: Path; + errors: FieldError | undefined; + optional?: boolean; + register: UseFormRegister; + link?: string | undefined; +} + +const FormInput = ({ + label, + id, + errors, + optional, + register, + ...props +}: FormInputProps & React.HTMLProps) => { + return ( +
+ + + {errors && {errors.message}} +
+ ); +}; + +export default FormInput; diff --git a/src/components/NavBar.tsx b/src/components/NavBar.tsx index 24e4d613..4e10b5dc 100644 --- a/src/components/NavBar.tsx +++ b/src/components/NavBar.tsx @@ -16,7 +16,7 @@ const NavBar = () => { logo diff --git a/src/pages/admin/index.tsx b/src/pages/admin/index.tsx index b79ed319..6dd9bacf 100644 --- a/src/pages/admin/index.tsx +++ b/src/pages/admin/index.tsx @@ -8,38 +8,133 @@ import { Role } from "@prisma/client"; import { rbac } from "../../components/RBACWrapper"; import { getServerAuthSession } from "../../server/common/get-server-auth-session"; import { trpc } from "../../utils/trpc"; +import Head from "next/head"; +import Drawer from "../../components/Drawer"; +import { useState, useEffect } from "react"; + +const AdminCard = ({ + title, + description, + href, +}: { + title: string; + description: string; + href: string; +}) => ( + +
+
+

{title}

+

{description}

+
+
+ +); -// TODO const Admin: NextPage = () => { - const { mutateAsync } = trpc.admin.setKillSwitch.useMutation(); + const { mutateAsync: setKillSwitch } = trpc.admin.setKillSwitch.useMutation(); + const { mutateAsync: setDhYear } = trpc.admin.setDhYear.useMutation({ + onSuccess: () => { + utils.admin.getDhYear.invalidate(); + }, + }); + const { data: currentDhYear } = trpc.admin.getDhYear.useQuery(); + const utils = trpc.useUtils(); + + const handleYearChange = async (newYear: string) => { + try { + await setDhYear(newYear); + } catch (error) { + console.error("Failed to update DH year:", error); + } + }; + + const dhYears = Array.from({ length: 15 }, (_, i) => `DH${i + 11}`); return ( <> - Tempor tempor ea ad consectetur consequat pariatur et officia est mollit - nostrud. -
- - Roles - -
- Application Kill Switch - - -
+ + Admin Dashboard - DeltaHacks + + +
+

+ Admin Dashboard +

+ +
+ + + + +
+ +
+

System Controls

+ +
+ {/* Kill Switch Controls */} +
+ + +
+ + {/* DH Year Configuration */} +
DeltaHacks Year Configuration
+
+
+ + +
+ +
+
+
+
+
); }; diff --git a/src/pages/admin/judging/index.tsx b/src/pages/admin/judging/index.tsx new file mode 100644 index 00000000..5fc42194 --- /dev/null +++ b/src/pages/admin/judging/index.tsx @@ -0,0 +1,189 @@ +import React from "react"; +import Head from "next/head"; +import Drawer from "../../../components/Drawer"; +import { CSVUploader } from "../../../components/CSVUploader"; +import { trpc } from "../../../utils/trpc"; +import { GetServerSidePropsContext, GetServerSidePropsResult } from "next"; +import { Role } from "@prisma/client"; +import { rbac } from "../../../components/RBACWrapper"; +import { getServerAuthSession } from "../../../server/common/get-server-auth-session"; +import Link from "next/link"; +import { + DevpostCSVProcessor, + DoraHacksCSVProcessor, +} from "../../../utils/csvProcessors"; + +const JudgingPage: React.FC = () => { + const [startTime, setStartTime] = React.useState( + new Date().toISOString().slice(0, 16) + ); + const [judgingDuration, setJudgingDuration] = React.useState(""); + const [endTime, setEndTime] = React.useState(""); + const [numTables, setNumTables] = React.useState(null); + + const createTables = trpc.project.createTables.useMutation({ + onSuccess: () => { + createTimeSlots.mutate({ + startTime: new Date(startTime).toISOString(), + }); + }, + }); + + const createTimeSlots = trpc.timeSlot.createTimeSlots.useMutation({ + onSuccess: (data) => { + if (data.endTime) { + const start = new Date(startTime); + const end = new Date(data.endTime); + const durationMs = end.getTime() - start.getTime(); + const hours = Math.floor(durationMs / (1000 * 60 * 60)); + const minutes = Math.floor( + (durationMs % (1000 * 60 * 60)) / (1000 * 60) + ); + setJudgingDuration(`${hours} hours and ${minutes} minutes`); + + setEndTime( + end.toLocaleTimeString("en-US", { + hour: "2-digit", + minute: "2-digit", + hour12: false, + }) + ); + } + if (data.numTables) { + setNumTables(data.numTables); + } + }, + }); + + return ( + <> + + Judging Admin - DeltaHacks + + +
+

+ Judging Administration +

+ + {/* Navigation Buttons */} +
+ + Manage Judging Rubric + + + View Leaderboard + +
+ +
+ {/* CSV Upload Section */} +
+
+

+ Import Project Data +

+ +
+
+ + {/* Schedule Configuration Section */} +
+
+

+ Schedule Configuration +

+ +
+ {/* Time Configuration */} +
+
+ + setStartTime(e.target.value)} + className="input input-bordered w-full" + /> +
+
+ + {/* Action Button */} + + {/* Status Information */} + {(createTimeSlots.isSuccess || + createTables.isLoading || + createTimeSlots.isLoading) && ( +
+ {judgingDuration && ( +
+ Total Duration: {judgingDuration} +
+ )} + {endTime && ( +
+ End Time: {endTime} +
+ )} + {numTables && ( +
+ Number of Tables: {numTables} +
+ )} +
+ )} +
+
+
+
+
+
+ + ); +}; + +// Add server-side props function for access control +export async function getServerSideProps(context: GetServerSidePropsContext) { + let output: GetServerSidePropsResult> = { props: {} }; + output = rbac( + await getServerAuthSession(context), + [Role.ADMIN], + undefined, + output + ); + return output; +} + +export default JudgingPage; diff --git a/src/pages/admin/judging/leaderboard.tsx b/src/pages/admin/judging/leaderboard.tsx new file mode 100644 index 00000000..5be5b922 --- /dev/null +++ b/src/pages/admin/judging/leaderboard.tsx @@ -0,0 +1,111 @@ +import { + GetServerSidePropsContext, + GetServerSidePropsResult, + type NextPage, +} from "next"; +import Head from "next/head"; +import { trpc } from "../../../utils/trpc"; +import Drawer from "../../../components/Drawer"; +import { getServerAuthSession } from "../../../server/common/get-server-auth-session"; +import { rbac } from "../../../components/RBACWrapper"; +import { Role } from "@prisma/client"; + +const LeaderboardPage: NextPage = () => { + const { data: leaderboard, isLoading } = trpc.judging.getLeaderboard.useQuery( + undefined, + { + refetchInterval: 30 * 1000, + refetchIntervalInBackground: true, + } + ); + + if (isLoading) { + return ( +
+
+
+ ); + } + + return ( + <> + + Judging Leaderboard + + + +
+ + + +
+

Project Leaderboard

+ +
+ + + + + + + + + + + {leaderboard?.map((project, index) => ( + + + + + + + ))} + +
+ Rank + + Project Name + + Score + + Judges +
+
+ {index + 1} +
+
+
+ {project.projectName} +
+
+
+ {project.score.toFixed(2)} +
+
+
+ {project.numberOfJudges} +
+
+
+
+
+
+ + ); +}; + +export async function getServerSideProps(context: GetServerSidePropsContext) { + let output: GetServerSidePropsResult> = { props: {} }; + output = rbac( + await getServerAuthSession(context), + [Role.ADMIN], + undefined, + output + ); + return output; +} + +export default LeaderboardPage; diff --git a/src/pages/admin/judging/rubric.tsx b/src/pages/admin/judging/rubric.tsx new file mode 100644 index 00000000..cfe5b069 --- /dev/null +++ b/src/pages/admin/judging/rubric.tsx @@ -0,0 +1,272 @@ +import { + GetServerSidePropsContext, + GetServerSidePropsResult, + NextPage, +} from "next"; +import { getServerAuthSession } from "../../../server/common/get-server-auth-session"; +import Head from "next/head"; +import { trpc } from "../../../utils/trpc"; +import { useForm, Controller } from "react-hook-form"; +import Drawer from "../../../components/Drawer"; +import { rbac } from "../../../components/RBACWrapper"; +import { Role } from "@prisma/client"; +import Select from "react-select"; +import { useState, useRef } from "react"; +import ReactMarkdown from "react-markdown"; + +import "@uiw/react-md-editor/markdown-editor.css"; +import "@uiw/react-markdown-preview/markdown.css"; +import dynamic from "next/dynamic"; + +const MDEditor = dynamic( + () => import("@uiw/react-md-editor").then((mod) => mod.default), + { ssr: false } +); + +type RubricFormData = { + question: string; + points: number; + trackId: string; + title: string; +}; + +const RubricPage: NextPage = () => { + const [selectedTrack, setSelectedTrack] = useState(null); + const { register, handleSubmit, reset, control, setValue } = + useForm(); + + const { data: tracks } = trpc.track.getTracks.useQuery(); + const { data: rubricQuestions, refetch: refetchQuestions } = + trpc.judging.getRubricQuestions.useQuery( + { trackId: selectedTrack || "" }, + { enabled: !!selectedTrack } + ); + + const createQuestion = trpc.judging.createRubricQuestion.useMutation({ + onSuccess: () => { + reset(); + reset({ trackId: selectedTrack || "" }); + refetchQuestions(); + }, + }); + + const onSubmit = (data: RubricFormData) => { + createQuestion.mutate(data); + }; + + const trackOptions = + tracks?.map((track) => ({ + value: track.id, + label: track.name, + })) || []; + + const [markdownValue, setMarkdownValue] = useState(""); + const questionDialogRef = useRef(null); + const [selectedQuestion, setSelectedQuestion] = useState(null); + + return ( + <> + + Rubric Management - DeltaHacks XI + + +
+ + + +
+

Rubric Management

+ +
+ {/* Create New Question Form */} +
+
+

Create New Question

+
+
+ + ( + +
+ +
+ +
+ { + setMarkdownValue(val || ""); + setValue("question", val || ""); + }} + preview="edit" + /> +
+
+ +
+ + +
+ + +
+
+
+ + {/* Existing Questions List */} +
+
+

Existing Questions

+ {selectedTrack ? ( + rubricQuestions && rubricQuestions.length > 0 ? ( +
+ {rubricQuestions.map((question) => ( +
{ + setSelectedQuestion(question); + questionDialogRef.current?.showModal(); + }} + > +

{question.title}

+

+ Points: {question.points} +

+
+ ))} +
+ ) : ( +

+ No questions created for this track yet. +

+ ) + ) : ( +

+ Select a track to view its questions. +

+ )} +
+
+
+
+
+
+ + {/* Question Details Modal */} + +
+

+ {selectedQuestion?.title} +

+
+

Question:

+
+ {selectedQuestion?.question || ""} +
+

+ Points:{" "} + {selectedQuestion?.points} +

+
+
+
+ +
+
+
+
+ + ); +}; + +export async function getServerSideProps(context: GetServerSidePropsContext) { + let output: GetServerSidePropsResult> = { props: {} }; + output = rbac( + await getServerAuthSession(context), + [Role.ADMIN], + undefined, + output + ); + return output; +} + +export default RubricPage; diff --git a/src/pages/admin/timeslot.tsx b/src/pages/admin/timeslot.tsx new file mode 100644 index 00000000..e32ca18b --- /dev/null +++ b/src/pages/admin/timeslot.tsx @@ -0,0 +1,461 @@ +import { useState, useEffect } from "react"; +import Head from "next/head"; +import { trpc } from "../../utils/trpc"; +import Drawer from "../../components/Drawer"; +import { Role } from "@prisma/client"; +import { rbac } from "../../components/RBACWrapper"; +import { getServerAuthSession } from "../../server/common/get-server-auth-session"; +import type { + GetServerSidePropsContext, + GetServerSidePropsResult, + NextPage, +} from "next"; + +/** + * Helper to step through time in X-minute increments from start to end. + */ +const generateTimeChunks = (start: Date, end: Date): Date[] => { + const chunks: Date[] = []; + let current = new Date(start); + const stepMinutes = 10; + + while (current <= end) { + chunks.push(new Date(current)); + current = new Date(current.getTime() + stepMinutes * 60_000); + } + return chunks; +}; + +const TimeSlotPage: NextPage = () => { + const [currentTimeIndex, setCurrentTimeIndex] = useState(0); + const [showOverview, setShowOverview] = useState(false); + + // 1) Grab relevant data + const { data: timeSlots } = trpc.timeSlot.getAllTimeSlots.useQuery(); + const { data: tables } = trpc.table.getTables.useQuery(); + + // We'll derive all 10-minute chunk boundaries from the earliest to the latest time. + const [tenMinuteChunks, setTenMinuteChunks] = useState([]); + + useEffect(() => { + if (timeSlots && timeSlots.length > 0) { + const earliestStart = new Date(timeSlots[0]?.startTime || Date.now()); + const latestEnd = new Date( + timeSlots[timeSlots.length - 1]?.startTime ?? + (timeSlots[0]?.startTime || Date.now()) + ); + // Always use 10-minute chunks + setTenMinuteChunks(generateTimeChunks(earliestStart, latestEnd)); + } + }, [timeSlots]); + + // If we have some 10-min chunk boundaries, pick the one at currentTimeIndex + const currentTime = tenMinuteChunks[currentTimeIndex]; + + // For the timeline mode (not the overview), we need up to 3 sets of MLH assignments: + // - From currentTime + // - currentTime + 5 min + // - currentTime + 10 min + // We fetch these only if currentTime is defined + const timesToQuery = currentTime + ? [ + currentTime, + new Date(currentTime.getTime() + 5 * 60_000), + new Date(currentTime.getTime() + 10 * 60_000), + ] + : []; + // We'll grab the three assignment sets in parallel. + // For normal tables, we'll only use index 0's data. + // For MLH, we'll gather from all three. + const firstAssignment = trpc.timeSlot.getAssignmentsAtTime.useQuery( + { time: timesToQuery[0]?.toISOString() ?? "" }, + { + enabled: !!currentTime && !!timeSlots && timesToQuery.length > 0, + keepPreviousData: true, + } + ); + + const secondAssignment = trpc.timeSlot.getAssignmentsAtTime.useQuery( + { time: timesToQuery[1]?.toISOString() ?? "" }, + { + enabled: !!currentTime && !!timeSlots && timesToQuery.length > 1, + keepPreviousData: true, + } + ); + + const thirdAssignment = trpc.timeSlot.getAssignmentsAtTime.useQuery( + { time: timesToQuery[2]?.toISOString() ?? "" }, + { + enabled: !!currentTime && !!timeSlots && timesToQuery.length > 2, + keepPreviousData: true, + } + ); + + const assignmentQueries = [ + firstAssignment, + secondAssignment, + thirdAssignment, + ]; + + // Now we can unify them in a helper function: + const getAssignmentsForTable = (tableId: string, isMlh: boolean) => { + if (!isMlh) { + // For non-MLH tables, just use the first query result + return assignmentQueries[0]?.data?.[tableId] ?? null; + } else { + // For MLH, gather all three + const first = assignmentQueries[0]?.data?.[tableId] ?? null; + const second = assignmentQueries[1]?.data?.[tableId] ?? null; + const third = assignmentQueries[2]?.data?.[tableId] ?? null; + + // Return an array of projects (some might be null if no assignment at that 5-min block) + const mlhProjects = [first, second, third].filter(Boolean); + return mlhProjects; + } + }; + + // If the queries or data isn't ready, we show a loading state + if (!timeSlots || !tables || tenMinuteChunks.length === 0) { + return ( +
+
+
+ ); + } + + /** + * TableOverview: + * Shows two sections: + * -- Non-MLH tables (10-minute increments) + * -- MLH table (5-minute increments) + * Each section is displayed as a table with rows indicating time chunks. + */ + const TableOverview: React.FC = () => { + if (!timeSlots?.length) { + return
No time slots found.
; + } + + // Separate the MLH table from the rest + const mlhTable = tables.find((t) => t.track.name === "MLH"); + const nonMlhTables = tables.filter((t) => t.track.name !== "MLH"); + + // Derive an earliest start and latest end from timeSlots. + const earliestStartTime = timeSlots[0]?.startTime ?? new Date(); + const latestEndTime = + timeSlots[timeSlots.length - 1]?.endTime ?? new Date(); + + // Generate the increments with fixed 10-minute chunks + const chunks = generateTimeChunks(earliestStartTime, latestEndTime); + + /** + * A small row component that grabs the assignment for the given time/table. + * For demonstration, we do a separate query per row/time/table. + * (In a large-scale scenario, you'd likely want a combined approach + * to avoid many repeated queries. This is simplified for illustration.) + */ + const TimeRowCell: React.FC<{ + chunk: Date; + tableId: string; + }> = ({ chunk, tableId }) => { + const { data: assignments } = trpc.timeSlot.getAssignmentsAtTime.useQuery( + { time: chunk.toISOString() }, + { enabled: !!chunk } + ); + const project = assignments?.[tableId]; + return ( + + {project ? ( + + {project.name} + + ) : ( + + )} + + ); + }; + + return ( +
+ {/* Non-MLH tables */} +
+

+ Non-MLH Tables (10-minute increments) +

+ {nonMlhTables.length === 0 ? ( +
No non-MLH tables found.
+ ) : ( +
+ + + + + {nonMlhTables.map((table) => ( + + ))} + + + + {chunks.map((chunk) => ( + + {/* Time label */} + + {/* One cell per non-MLH table */} + {nonMlhTables.map((table) => ( + + ))} + + ))} + +
+ Time + + Table {table.number} - {table.track.name} +
+ {chunk.toLocaleTimeString("en-US", { + hour: "numeric", + minute: "2-digit", + })} +
+
+ )} +
+ + {/* MLH table (if it exists) */} +
+

+ MLH Table (5-minute increments) +

+ {!mlhTable ? ( +
No MLH table found.
+ ) : ( +
+ + + + + + + + + {chunks + .flatMap((chunk) => [ + // For each 10-minute chunk, create two 5-minute rows + new Date(chunk), + new Date(chunk.getTime() + 5 * 60_000), + ]) + .map((chunk) => ( + + {/* Time label */} + + + + ))} + +
+ Time + + Table {mlhTable.number} - MLH +
+ {chunk.toLocaleTimeString("en-US", { + hour: "numeric", + minute: "2-digit", + })} +
+
+ )} +
+
+ ); + }; + + return ( + <> + + Project Timeline - DeltaHacks XI + + +
+ + + +
+
+
+

+ {showOverview ? "Project Overview" : "Project Timeline"} +

+
+ Overview + setShowOverview(!showOverview)} + /> + Timeline +
+
+ + {/* Timeline view is the new 10-min slider approach; + Overview view is the existing chunk-based schedule. */} + {!showOverview ? ( + <> + {/* -- Timeline (revamped) -- */} +
+
+ {currentTime && ( + + {currentTime.toLocaleTimeString("en-US", { + hour: "numeric", + minute: "2-digit", + })} + + )} +
+ + setCurrentTimeIndex(Number(e.target.value)) + } + className="range range-primary w-full max-w-2xl" + /> +
+ +
+ {tables.map((table) => { + const isMlh = table.track.name === "MLH"; + const assignmentData = getAssignmentsForTable( + table.id, + isMlh + ); + + return ( +
+
+

+ Table {table.number} - {table.track.name} +

+ {/* If MLH, array of up to 3 projects. Otherwise, single project. */} + {!isMlh ? ( + <> + {Array.isArray(assignmentData) + ? assignmentData.map( + (project, idx) => + project && ( +
+

+ {project.name} +

+ {/* Add time range display logic here if needed */} +
+ ) + ) + : assignmentData && ( +
+

+ {assignmentData.name} +

+ {/* Shows the relevant 10-min window */} +
+ )} + + ) : ( + // MLH => up to 3 assignments + <> + {Array.isArray(assignmentData) && + assignmentData.length > 0 ? ( + assignmentData.map((project, idx) => { + // each project covers a 5-min sub-slot in this 10-min chunk + const subSlotStart = new Date( + currentTime?.getTime() ?? + Date.now() + idx * 5 * 60_000 + ); + const subSlotEnd = new Date( + subSlotStart.getTime() + 5 * 60_000 + ); + + return ( +
+

+ {project?.name} +

+

+ {subSlotStart.toLocaleTimeString( + "en-US", + { + hour: "numeric", + minute: "2-digit", + } + )} + {" - "} + {subSlotEnd.toLocaleTimeString( + "en-US", + { + hour: "numeric", + minute: "2-digit", + } + )} +

+
+ ); + }) + ) : ( +

+ No project scheduled +

+ )} + + )} +
+
+ ); + })} +
+ + ) : ( + + )} +
+
+
+
+ + ); +}; + +export async function getServerSideProps(context: GetServerSidePropsContext) { + let output: GetServerSidePropsResult> = { props: {} }; + output = rbac( + await getServerAuthSession(context), + [Role.ADMIN], + undefined, + output + ); + return output; +} + +export default TimeSlotPage; diff --git a/src/pages/apply.tsx b/src/pages/apply.tsx index c201104c..56faa84b 100644 --- a/src/pages/apply.tsx +++ b/src/pages/apply.tsx @@ -49,6 +49,7 @@ import "@uppy/dashboard/dist/style.min.css"; import XHR from "@uppy/xhr-upload"; import { useSession } from "next-auth/react"; import { useTheme } from "next-themes"; +import FormInput from "../components/CustomInput"; export type InputsType = z.infer; const pt = applicationSchema.partial(); @@ -63,31 +64,6 @@ interface FormInputProps { link?: string | undefined; } -const FormInput: React.FC< - FormInputProps & React.HTMLProps -> = ({ label, id, errors, optional, register, ...props }) => { - return ( -
- - - {errors && {errors.message}} -
- ); -}; - const FormCheckbox: React.FC< FormInputProps & React.HTMLProps > = ({ label, id, errors, optional, register, link, ...props }) => { diff --git a/src/pages/judging.tsx b/src/pages/judging.tsx new file mode 100644 index 00000000..175001f7 --- /dev/null +++ b/src/pages/judging.tsx @@ -0,0 +1,367 @@ +import next, { + GetServerSidePropsContext, + GetServerSidePropsResult, + NextPage, +} from "next"; +import { getServerAuthSession } from "../server/common/get-server-auth-session"; +import Head from "next/head"; +import { trpc } from "../utils/trpc"; +import { useEffect, useRef, useState } from "react"; +import Drawer from "../components/Drawer"; +import { rbac } from "../components/RBACWrapper"; +import { Project, Role } from "@prisma/client"; +import { useForm, Controller } from "react-hook-form"; +import Select from "react-select"; +import { z } from "zod"; +import ReactMarkdown from "react-markdown"; + +const TableOptionSchema = z.object({ + value: z.string(), + label: z.string(), +}); + +type TableOption = z.infer; + +// Add this type for better type safety +type ScoreType = 0 | 1 | 2 | 3; + +const Judging: NextPage = () => { + const { control, handleSubmit, reset, register } = useForm(); + // const [currentProject, setCurrentProject] = useState(null); + const [selectedTable, setSelectedTable] = useState(null); + + const { data: tables, isLoading: tablesLoading } = + trpc.table.getTables.useQuery(); + const { mutate: submitJudgment } = + trpc.judging.createJudgingResult.useMutation(); + const { + data: nextProject, + refetch: refetchNextProject, + isSuccess: projectSuccess, + } = trpc.project.getNextProject.useQuery( + { tableId: selectedTable?.value || "" }, + { enabled: !!selectedTable } + ); + const generalTrackId = tables?.find( + (t) => t.track.name.toLowerCase() === "general" + )?.trackId; + const { data: rubricQuestions } = trpc.judging.getRubricQuestions.useQuery( + { + trackId: + tables?.find((t) => t.id === selectedTable?.value)?.trackId || "", + }, + { enabled: !!selectedTable } + ); + // need to add general questions to other tracks + const { data: generalQuestions } = trpc.judging.getRubricQuestions.useQuery( + { + trackId: generalTrackId || "", + }, + { + enabled: + !!selectedTable && + !!generalTrackId && + tables + ?.find((t) => t.id === selectedTable?.value) + ?.track.name.toLowerCase() !== "general", + } + ); + + const allQuestions = [ + ...(rubricQuestions || []), + ...((tables + ?.find((t) => t.id === selectedTable?.value) + ?.track.name.toLowerCase() !== "general" + ? generalQuestions + : []) || []), + ]; + + const onSubmit = (data: any) => { + if (!nextProject?.id) return; + + submitJudgment( + { + projectId: nextProject.id, + responses: Object.entries(data.scores || {}).map( + ([questionId, score]) => ({ + questionId, + score: Number(score), + }) + ), + }, + { + onSuccess: () => { + reset(); + refetchNextProject(); + }, + } + ); + }; + + const tableOptions = + tables?.map((table) => ({ + value: table.id, + label: `Table ${table.number} - ${table.track.name}`, + })) || []; + + return ( + <> + + Dashboard - DeltaHacks XI + + +
+ + + +
+
+

Project Judging

+ +
+ + ( + + state.menuIsOpen + ? "rounded-md p-3 dark:bg-neutral-800 border-neutral-300 dark:border-neutral-700 bg-white border" + : "rounded-md p-3 dark:bg-neutral-800 border-neutral-300 dark:border-neutral-700 bg-white border", + menu: () => + "dark:bg-neutral-800 border-neutral-300 dark:border-neutral-700 bg-white border -mt-1 rounded-b-lg overflow-hidden", + option: () => + "p-2 dark:bg-neutral-800 border-neutral-300 dark:border-neutral-700 bg-white hover:bg-neutral-100 dark:hover:bg-neutral-900", + valueContainer: () => + "dark:text-neutral-500 text-neutral-700 gap-2", + placeholder: () => "dark:text-neutral-500 text-neutral-700", + singleValue: () => "dark:text-neutral-500 text-neutral-700", + }} + /> +
+ + {selectedProject && timeSlots && timeSlots.length > 0 && ( +
+

+ Your presentation times: +

+
+ {timeSlots.map((slot) => ( +
+

+ Table {slot.table.number} ({slot.table.track.name}) +

+

+ {new Date(slot.startTime).toLocaleTimeString("en-US", { + hour: "numeric", + minute: "2-digit", + })}{" "} + -{" "} + {new Date(slot.endTime).toLocaleTimeString("en-US", { + hour: "numeric", + minute: "2-digit", + })} +

+
+ ))} +
+
+ )} + + {selectedProject && timeSlots && timeSlots.length === 0 && ( +
+ No presentation times found for this project. +
+ )} +
+
+ + ); +}; + +export default TimeslotPage; diff --git a/src/server/router/admin.ts b/src/server/router/admin.ts index 98c0f7e1..ceb875e8 100644 --- a/src/server/router/admin.ts +++ b/src/server/router/admin.ts @@ -17,4 +17,59 @@ export const adminRouter = router({ create: { name: "killApplications", value: JSON.stringify(input) }, }); }), + setDhYear: protectedProcedure + .input(z.string().regex(/^DH\d{1,2}$/)) + .mutation(async ({ ctx, input }) => { + if (!ctx.session.user.role.includes(Role.ADMIN)) { + throw new TRPCError({ code: "UNAUTHORIZED" }); + } + + return await ctx.prisma.config.upsert({ + where: { name: "dhYear" }, + update: { value: input }, + create: { name: "dhYear", value: input }, + }); + }), + + getConfig: protectedProcedure.query(async ({ ctx }) => { + if (!ctx.session.user.role.includes(Role.ADMIN)) { + throw new TRPCError({ code: "UNAUTHORIZED" }); + } + + const configs = await ctx.prisma.config.findMany({ + where: { + name: { + in: ["dhYear", "killApplications"], + }, + }, + }); + + return { + dhYear: configs.find((c) => c.name === "dhYear")?.value || "DH11", + killApplications: JSON.parse( + configs.find((c) => c.name === "killApplications")?.value || "false" + ), + }; + }), + + getDhYear: protectedProcedure.query(async ({ ctx }) => { + if (!ctx.session.user.role.includes(Role.ADMIN)) { + throw new TRPCError({ code: "UNAUTHORIZED" }); + } + + const dhYearConfig = await ctx.prisma.config.findUnique({ + where: { + name: "dhYear", + }, + }); + + if (!dhYearConfig?.value) { + throw new TRPCError({ + code: "NOT_FOUND", + message: "DH Year configuration not found", + }); + } + + return dhYearConfig.value; + }), }); diff --git a/src/server/router/index.ts b/src/server/router/index.ts index 5ea2327a..cd2aee3d 100644 --- a/src/server/router/index.ts +++ b/src/server/router/index.ts @@ -8,6 +8,13 @@ import { userRouter } from "./users"; import { router } from "./trpc"; import { adminRouter } from "./admin"; import { fileUploadRouter } from "./file"; +import { + tableRouter, + trackRouter, + projectRouter, + judgingRouter, + timeSlotRouter, +} from "./judging"; export const appRouter = router({ application: applicationRouter, @@ -15,6 +22,11 @@ export const appRouter = router({ user: userRouter, admin: adminRouter, file: fileUploadRouter, + table: tableRouter, + track: trackRouter, + project: projectRouter, + judging: judgingRouter, + timeSlot: timeSlotRouter, // NOTE: Will be deprecated food: foodRouter, events: eventsRouter, diff --git a/src/server/router/judging.ts b/src/server/router/judging.ts new file mode 100644 index 00000000..505a6663 --- /dev/null +++ b/src/server/router/judging.ts @@ -0,0 +1,780 @@ +import { z } from "zod"; +import { router, protectedProcedure } from "./trpc"; +import { TRPCError } from "@trpc/server"; + +export const projectRouter = router({ + uploadProjects: protectedProcedure + .input( + z.array( + z.object({ + name: z.string(), + description: z.string(), + link: z.string(), + tracks: z.array(z.string()), + }) + ) + ) + .mutation(async ({ ctx, input }) => { + try { + // Get current dhYear from Config + const dhYearConfig = await ctx.prisma.config.findUnique({ + where: { name: "dhYear" }, + }); + + if (!dhYearConfig) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "dhYear not configured", + }); + } + + // delete existing data for this year + await ctx.prisma.projectTrack.deleteMany({ + where: { + project: { + dhYear: dhYearConfig.value, + }, + }, + }); + await ctx.prisma.project.deleteMany({ + where: { dhYear: dhYearConfig.value }, + }); + + // Create or get the General track + const generalTrack = await ctx.prisma.track.upsert({ + where: { name: "General" }, + update: {}, + create: { name: "General" }, + }); + + // Process and save projects to the database + for (const project of input) { + try { + const createdProject = await ctx.prisma.project.create({ + data: { + name: project.name, + description: project.description, + link: project.link, + dhYear: dhYearConfig.value, + }, + }); + + // Add General track to every project + await ctx.prisma.projectTrack.create({ + data: { + projectId: createdProject.id, + trackId: generalTrack.id, + }, + }); + + // Process other tracks and create project-track relations + for (const trackName of project.tracks) { + const normalizedTrackName = trackName + .toUpperCase() + .includes("MLH") + ? "MLH" + : trackName; + + const createdTrack = await ctx.prisma.track.upsert({ + where: { name: normalizedTrackName }, + update: {}, + create: { name: normalizedTrackName }, + }); + // use upsert to avoid duplicate entries + await ctx.prisma.projectTrack.upsert({ + where: { + projectId_trackId: { + projectId: createdProject.id, + trackId: createdTrack.id, + }, + }, + update: {}, + create: { + projectId: createdProject.id, + trackId: createdTrack.id, + }, + }); + } + } catch (projectError) { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: `Failed to process project ${project.name}: ${projectError}`, + }); + } + } + + return { message: "Projects uploaded successfully" }; + } catch (error) { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: `Failed to upload projects: ${error}`, + }); + } + }), + createTables: protectedProcedure + .input( + z.object({ projectsPerTable: z.number().min(1).max(20).default(10) }) + ) + .mutation(async ({ ctx, input }) => { + // First, clear existing tables and time slots + await ctx.prisma.timeSlot.deleteMany(); + await ctx.prisma.table.deleteMany(); + + const tracks = await ctx.prisma.track.findMany(); + let tableCounter = 1; + + // Create tables for each track + for (const track of tracks) { + // Special handling for MLH track - only create one table + if (track.name === "MLH") { + await ctx.prisma.table.create({ + data: { + number: tableCounter++, + trackId: track.id, + }, + }); + continue; + } + + const projectCount = await ctx.prisma.projectTrack.count({ + where: { trackId: track.id }, + }); + + const tablesNeeded = Math.ceil(projectCount / input.projectsPerTable); + + // Create tables for this track + for (let i = 0; i < tablesNeeded; i++) { + await ctx.prisma.table.create({ + data: { + number: tableCounter++, + trackId: track.id, + }, + }); + } + } + + return { message: "Tables created successfully" }; + }), + getNextProject: protectedProcedure + .input(z.object({ tableId: z.string() })) + .query(async ({ ctx, input }) => { + const dhYearConfig = await ctx.prisma.config.findUnique({ + where: { name: "dhYear" }, + }); + + if (!dhYearConfig) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "dhYear not configured", + }); + } + + const judgedProjects = await ctx.prisma.judgingResult.findMany({ + where: { + judgeId: ctx.session.user.id, + dhYear: dhYearConfig.value, + }, + select: { projectId: true }, + }); + + // Find projects in this track that haven't been judged + + const timeSlot = await ctx.prisma.timeSlot.findFirst({ + where: { + tableId: input.tableId, + dhYear: dhYearConfig.value, + projectId: { + notIn: judgedProjects.map((jp) => jp.projectId), + }, + }, + orderBy: { + startTime: "asc", + }, + include: { + project: true, + }, + }); + + return timeSlot?.project; + }), + getAllProjects: protectedProcedure.query(async ({ ctx }) => { + const dhYearConfig = await ctx.prisma.config.findUnique({ + where: { name: "dhYear" }, + }); + + return ctx.prisma.project.findMany({ + where: { + dhYear: dhYearConfig?.value, + }, + select: { + id: true, + name: true, + }, + orderBy: { + name: "asc", + }, + }); + }), + getProjectTimeSlots: protectedProcedure + .input(z.object({ projectId: z.string() })) + .query(async ({ ctx, input }) => { + return ctx.prisma.timeSlot.findMany({ + where: { + projectId: input.projectId, + }, + include: { + table: { + include: { + track: true, + }, + }, + }, + orderBy: { + startTime: "asc", + }, + }); + }), +}); + +export const tableRouter = router({ + getTables: protectedProcedure.query(async ({ ctx }) => { + return ctx.prisma.table.findMany({ + include: { + track: true, + }, + }); + }), + getTableProjects: protectedProcedure + .input(z.object({ tableId: z.string() })) + .query(async ({ ctx, input }) => { + return ctx.prisma.project.findMany({ + where: { + TimeSlot: { + some: { + tableId: input.tableId, + }, + }, + }, + include: { + TimeSlot: { + where: { + tableId: input.tableId, + }, + }, + }, + orderBy: { + id: "asc", + }, + }); + }), +}); + +export const trackRouter = router({ + getTracks: protectedProcedure.query(async ({ ctx }) => { + const tracks = ctx.prisma.track.findMany(); + return tracks; + }), + createTrack: protectedProcedure + .input(z.object({ name: z.string() })) + .mutation(async ({ ctx, input }) => { + const createdTrack = ctx.prisma.track.create({ + data: { + name: input.name, + }, + }); + return createdTrack; + }), +}); + +export const judgingRouter = router({ + createJudgingResult: protectedProcedure + .input( + z.object({ + projectId: z.string(), + responses: z.array( + z.object({ + questionId: z.string(), + score: z.number().min(0), + }) + ), + }) + ) + .mutation(async ({ ctx, input }) => { + // Get current dhYear from Config + const dhYearConfig = await ctx.prisma.config.findUnique({ + where: { name: "dhYear" }, + }); + + if (!dhYearConfig) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "dhYear not configured", + }); + } + + // Check if this judge has already judged this project + const existingResult = await ctx.prisma.judgingResult.findUnique({ + where: { + judgeId_projectId: { + judgeId: ctx.session.user.id, + projectId: input.projectId, + }, + }, + }); + + if (existingResult) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "You have already judged this project", + }); + } + + // Create the judging result and its responses in a transaction + return ctx.prisma.$transaction(async (tx) => { + // Create the judging result + const judgingResult = await tx.judgingResult.create({ + data: { + judgeId: ctx.session.user.id, + projectId: input.projectId, + dhYear: dhYearConfig.value, + }, + }); + + // Create all rubric responses + await tx.rubricResponse.createMany({ + data: input.responses.map((response) => ({ + judgingResultId: judgingResult.id, + questionId: response.questionId, + score: response.score, + })), + }); + + return judgingResult; + }); + }), + createRubricQuestion: protectedProcedure + .input( + z.object({ + question: z.string(), + points: z.number().min(0).max(100), + title: z.string(), + trackId: z.string(), + }) + ) + .mutation(async ({ ctx, input }) => { + // Verify user is an admin + if (!ctx.session.user.role?.includes("ADMIN")) { + throw new TRPCError({ + code: "UNAUTHORIZED", + message: "Only admins can create rubric questions", + }); + } + + // Create the rubric question + const rubricQuestion = await ctx.prisma.rubricQuestion.create({ + data: { + question: input.question, + points: input.points, + title: input.title, + trackId: input.trackId, + }, + include: { + track: true, // Include track details in the response + }, + }); + + return rubricQuestion; + }), + getRubricQuestions: protectedProcedure + .input(z.object({ trackId: z.string() })) + .query(async ({ ctx, input }) => { + return ctx.prisma.rubricQuestion.findMany({ + where: { + trackId: input.trackId, + }, + orderBy: { + id: "asc", + }, + }); + }), + getLeaderboard: protectedProcedure.query(async ({ ctx }) => { + // Get current dhYear from Config + const dhYearConfig = await ctx.prisma.config.findUnique({ + where: { name: "dhYear" }, + }); + + if (!dhYearConfig) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "dhYear not configured", + }); + } + + // Get all projects with their judging results and responses + const projectScores = await ctx.prisma.project.findMany({ + where: { + dhYear: dhYearConfig.value, + }, + select: { + id: true, + name: true, + judgingResults: { + select: { + responses: { + select: { + score: true, + question: { + select: { + points: true, + }, + }, + }, + }, + }, + }, + }, + }); + + // Calculate total score for each project + const leaderboard = projectScores.map((project) => { + let totalScore = 0; + const numberOfJudges = project.judgingResults.length; + + // Sum up scores from all judges + project.judgingResults.forEach((result) => { + result.responses.forEach((response) => { + totalScore += response.score * response.question.points; + }); + }); + + // Calculate average score if project was judged by multiple judges + const averageScore = numberOfJudges > 0 ? totalScore / numberOfJudges : 0; + + return { + projectId: project.id, + projectName: project.name, + score: averageScore, + numberOfJudges, + }; + }); + + // Sort by score in descending order + return leaderboard.sort((a, b) => b.score - a.score); + }), +}); + +export const timeSlotRouter = router({ + getTableTimeSlots: protectedProcedure + .input(z.object({ tableId: z.string() })) + .query(async ({ ctx, input }) => { + return ctx.prisma.timeSlot.findMany({ + where: { + tableId: input.tableId, + }, + include: { + project: true, + }, + orderBy: { + startTime: "asc", + }, + }); + }), + createTimeSlots: protectedProcedure + .input( + z.object({ + slotDurationMinutes: z.number().min(1).default(10), + startTime: z.string().datetime(), + }) + ) + .mutation(async ({ ctx, input }) => { + // Get current dhYear from Config + const dhYearConfig = await ctx.prisma.config.findUnique({ + where: { name: "dhYear" }, + }); + + if (!dhYearConfig) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "dhYear not configured", + }); + } + + // 1) Clear existing timeslots for this year + await ctx.prisma.timeSlot.deleteMany({ + where: { dhYear: dhYearConfig.value }, + }); + + // 2) Fetch tables & projectTracks + const tables = await ctx.prisma.table.findMany({ + include: { track: true }, + orderBy: { number: "asc" }, + }); + if (tables.length === 0) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "No tables found.", + }); + } + + const allProjectTracks = await ctx.prisma.projectTrack.findMany({ + include: { + project: true, + track: true, + }, + }); + if (allProjectTracks.length === 0) { + return { + message: "No projectTrack entries found. Nothing to schedule.", + }; + } + + // Separate MLH and non-MLH tracks + const mlhProjectTracks = allProjectTracks.filter( + (pt) => pt.track.name === "MLH" + ); + const projectTracks = allProjectTracks.filter( + (pt) => pt.track.name !== "MLH" + ); + + // Find the existing MLH table instead of creating a new one + const mlhTable = tables.find((table) => table.track.name === "MLH"); + if (!mlhTable) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "MLH table not found.", + }); + } + + // Create a map to track how many times each project has been skipped + const starvingProjects = new Map(); + // Initialize skip count for all projects + projectTracks.forEach((pt) => { + starvingProjects.set(pt.projectId, 0); + }); + + let currentTimeChunk = new Date(input.startTime); + + while (projectTracks.length > 0) { + // main time loop + + const busyProjects = new Set(); // projects already assigned for this time chunk + + for (const table of tables) { + const tableTrack = table.track; + const suitableProjects = projectTracks.filter( + (pt) => + pt.trackId === tableTrack.id && !busyProjects.has(pt.projectId) + ); + // Find project with highest starvation value + const chosenProject = suitableProjects.reduce( + (mostStarved, current) => { + const currentStarvation = + starvingProjects.get(current.projectId) || 0; + const mostStarvedValue = + starvingProjects.get(mostStarved?.projectId ?? "") || 0; + return currentStarvation > mostStarvedValue + ? current + : mostStarved; + }, + suitableProjects[0] + ); + if (chosenProject) { + await ctx.prisma.timeSlot.create({ + data: { + tableId: table.id, + projectId: chosenProject.projectId, + startTime: currentTimeChunk, + endTime: new Date( + new Date(currentTimeChunk).setMinutes( + currentTimeChunk.getMinutes() + input.slotDurationMinutes + ) + ), + dhYear: dhYearConfig.value, + }, + }); + projectTracks.splice(projectTracks.indexOf(chosenProject), 1); + starvingProjects.set(chosenProject.projectId, 0); + busyProjects.add(chosenProject.projectId); + } + // Increment starvation counter for remaining projects + projectTracks.forEach((pt) => { + const currentStarvation = starvingProjects.get(pt.projectId) || 0; + starvingProjects.set(pt.projectId, currentStarvation + 1); + }); + } + + // find projects that are not in the busyProjects set + const availableForMlh = mlhProjectTracks.filter( + (pt) => !busyProjects.has(pt.projectId) + ); + + // Schedule MLH judging slots + const mlhSlotsToSchedule = Math.floor(input.slotDurationMinutes / 5); + let mlhStartTime = currentTimeChunk; + + for ( + let i = 0; + i < mlhSlotsToSchedule && availableForMlh.length > 0; + i++ + ) { + // Find project with highest starvation value among available MLH projects + const chosenProject = availableForMlh.reduce( + (mostStarved, current) => { + const currentStarvation = + starvingProjects.get(current.projectId) || 0; + const mostStarvedValue = + starvingProjects.get(mostStarved?.projectId ?? "") || 0; + return currentStarvation > mostStarvedValue + ? current + : mostStarved; + }, + availableForMlh[0] + ); + + if (chosenProject) { + await ctx.prisma.timeSlot.create({ + data: { + tableId: mlhTable.id, + projectId: chosenProject.projectId, + startTime: mlhStartTime, + endTime: new Date( + new Date(mlhStartTime).setMinutes( + mlhStartTime.getMinutes() + 5 + ) + ), + dhYear: dhYearConfig.value, + }, + }); + + // Remove scheduled project from MLH pool and reset its starvation + const indexInMlh = mlhProjectTracks.findIndex( + (p) => p.projectId === chosenProject.projectId + ); + if (indexInMlh > -1) { + mlhProjectTracks.splice(indexInMlh, 1); + } + + // Also remove from availableForMlh + const indexInAvailable = availableForMlh.findIndex( + (p) => p.projectId === chosenProject.projectId + ); + if (indexInAvailable > -1) { + availableForMlh.splice(indexInAvailable, 1); + } + + starvingProjects.set(chosenProject.projectId, 0); + } + + // Increment starvation counter for remaining MLH projects + mlhProjectTracks.forEach((pt) => { + const currentStarvation = starvingProjects.get(pt.projectId) || 0; + starvingProjects.set(pt.projectId, currentStarvation + 1); + }); + + mlhStartTime = new Date( + new Date(mlhStartTime).setMinutes(mlhStartTime.getMinutes() + 5) + ); + } + currentTimeChunk = new Date( + new Date(currentTimeChunk).setMinutes( + currentTimeChunk.getMinutes() + input.slotDurationMinutes + ) + ); + } + // Handle remaining MLH projects if any left + for (const mlhProject of mlhProjectTracks) { + await ctx.prisma.timeSlot.create({ + data: { + tableId: mlhTable.id, + projectId: mlhProject.projectId, + startTime: currentTimeChunk, + endTime: new Date( + new Date(currentTimeChunk).setMinutes( + currentTimeChunk.getMinutes() + 5 // 5 minute slots for MLH + ) + ), + dhYear: dhYearConfig.value, + }, + }); + + currentTimeChunk = new Date( + new Date(currentTimeChunk).setMinutes( + currentTimeChunk.getMinutes() + 5 + ) + ); + } + + return { + message: "Time slots created successfully", + endTime: currentTimeChunk, + numTables: tables.length, + }; + }), + getAllTimeSlots: protectedProcedure.query(async ({ ctx }) => { + const timeSlots = await ctx.prisma.timeSlot.findMany({ + select: { + startTime: true, + endTime: true, + }, + distinct: ["startTime"], + orderBy: { + startTime: "asc", + }, + }); + return timeSlots; + }), + getJudgingDuration: protectedProcedure.query(async ({ ctx }) => { + // Get first non-MLH timeslot to find start time + const firstSlot = await ctx.prisma.timeSlot.findFirst({ + where: { + table: { + track: { + name: { + not: "MLH", + }, + }, + }, + }, + orderBy: { + startTime: "asc", + }, + include: { + table: { + include: { + track: true, + }, + }, + }, + }); + if (firstSlot) { + return ( + (firstSlot.endTime.getTime() - firstSlot.startTime.getTime()) / + (1000 * 60) + ); + } + }), + getAssignmentsAtTime: protectedProcedure + .input(z.object({ time: z.string() })) + .query(async ({ ctx, input }) => { + const assignments = await ctx.prisma.timeSlot.findMany({ + where: { + startTime: new Date(input.time), + }, + include: { + project: true, + table: true, + }, + }); + + // Convert to a map of tableId -> project + const tableAssignments: Record = {}; + assignments.forEach((assignment) => { + tableAssignments[assignment.tableId] = { + id: assignment.project.id, + name: assignment.project.name, + }; + }); + + return tableAssignments; + }), +}); diff --git a/src/utils/csvProcessors.ts b/src/utils/csvProcessors.ts new file mode 100644 index 00000000..52ae4444 --- /dev/null +++ b/src/utils/csvProcessors.ts @@ -0,0 +1,43 @@ +interface ProjectData { + name: string; + description: string; + link: string; + tracks: string[]; + // Add other common fields as needed +} + +export interface CSVProcessor { + processCSVData(data: any[]): ProjectData[]; +} + +// Utility function for track processing +const getTrackList = (data: string): string[] => { + if (!data) { + return []; + } + return data.split(",").map((track) => track.trim()); +}; + +export class DevpostCSVProcessor implements CSVProcessor { + processCSVData(data: any[]): ProjectData[] { + return data.map((row) => ({ + name: row["Project Title"], + description: row["About The Project"], + link: row["Submission Url"], + tracks: getTrackList(row["Opt-In Prizes"]), + // Add other fields as needed + })); + } +} + +export class DoraHacksCSVProcessor implements CSVProcessor { + processCSVData(data: any[]): ProjectData[] { + return data.map((row) => ({ + name: row["BUIDL name"], // Different column name + description: "", // Dora hacks doesn't have a description bruh! + link: row["BUIDL URL"], // Different column name + tracks: getTrackList(row["Track"]), // Different column name + // Add other fields as needed + })); + } +} diff --git a/tailwind.config.cjs b/tailwind.config.cjs index 1e4414e5..386668b9 100644 --- a/tailwind.config.cjs +++ b/tailwind.config.cjs @@ -30,7 +30,11 @@ module.exports = { }, }, }, - plugins: [require("tailwindcss-animate"), require("daisyui")], + plugins: [ + require("tailwindcss-animate"), + require("daisyui"), + require("@tailwindcss/typography"), + ], daisyui: { themes: [ {