From 23e17818c58339b271d14d1aa07266b8df610ead Mon Sep 17 00:00:00 2001 From: Saikiruthiga Date: Wed, 6 Nov 2024 11:18:23 +0100 Subject: [PATCH 001/255] Switched from Vite to Nextjs --- app/.env | 7 - app/.eslintrc.json | 3 + app/.gitignore | 42 +- app/README.md | 95 +- app/app/favicon.ico | Bin 0 -> 25931 bytes app/app/fonts/GeistMonoVF.woff | Bin 0 -> 67864 bytes app/app/fonts/GeistVF.woff | Bin 0 -> 66268 bytes app/app/globals.css | 42 + app/app/layout.js | 28 + app/app/page.js | 95 + app/app/page.module.css | 168 + app/eslint.config.js | 19 - app/index.html | 13 - app/jsconfig.json | 7 + app/next.config.mjs | 4 + app/package-lock.json | 3986 +- app/package.json | 34 +- app/public/favicon.ico | Bin 15086 -> 0 bytes app/public/file.svg | 1 + app/public/globe.svg | 1 + app/public/next.svg | 1 + app/public/vercel.svg | 1 + app/public/window.svg | 1 + app/src/api.js | 3 - app/src/assets/hyf.svg | 23 - app/src/components/HomePage/HomePage.css | 9 - app/src/components/HomePage/HomePage.jsx | 19 - app/src/components/TestPage/TestPage.jsx | 21 - app/src/main.css | 8 - app/src/main.jsx | 24 - app/vite.config.js | 12 - node_modules/.bin/loose-envify | 16 + node_modules/.bin/loose-envify.cmd | 17 + node_modules/.bin/loose-envify.ps1 | 28 + node_modules/.package-lock.json | 59 + node_modules/js-tokens/CHANGELOG.md | 151 + node_modules/js-tokens/LICENSE | 21 + node_modules/js-tokens/README.md | 240 + node_modules/js-tokens/index.js | 23 + node_modules/js-tokens/package.json | 30 + node_modules/loose-envify/LICENSE | 21 + node_modules/loose-envify/README.md | 45 + node_modules/loose-envify/cli.js | 16 + node_modules/loose-envify/custom.js | 4 + node_modules/loose-envify/index.js | 3 + node_modules/loose-envify/loose-envify.js | 36 + node_modules/loose-envify/package.json | 36 + node_modules/loose-envify/replace.js | 65 + node_modules/react-dom/LICENSE | 21 + node_modules/react-dom/README.md | 60 + ...t-dom-server-legacy.browser.development.js | 7029 ++++ ...om-server-legacy.browser.production.min.js | 93 + ...eact-dom-server-legacy.node.development.js | 7093 ++++ ...t-dom-server-legacy.node.production.min.js | 101 + .../react-dom-server.browser.development.js | 7014 ++++ ...react-dom-server.browser.production.min.js | 96 + .../cjs/react-dom-server.node.development.js | 7070 ++++ .../react-dom-server.node.production.min.js | 102 + .../cjs/react-dom-test-utils.development.js | 1763 + .../react-dom-test-utils.production.min.js | 40 + .../react-dom/cjs/react-dom.development.js | 29923 +++++++++++++++ .../react-dom/cjs/react-dom.production.min.js | 322 + .../react-dom/cjs/react-dom.profiling.min.js | 366 + node_modules/react-dom/client.js | 25 + node_modules/react-dom/index.js | 38 + node_modules/react-dom/package.json | 62 + node_modules/react-dom/profiling.js | 38 + node_modules/react-dom/server.browser.js | 17 + node_modules/react-dom/server.js | 3 + node_modules/react-dom/server.node.js | 17 + node_modules/react-dom/test-utils.js | 7 + ...t-dom-server-legacy.browser.development.js | 7026 ++++ ...om-server-legacy.browser.production.min.js | 75 + .../react-dom-server.browser.development.js | 7011 ++++ ...react-dom-server.browser.production.min.js | 76 + .../umd/react-dom-test-utils.development.js | 1759 + .../react-dom-test-utils.production.min.js | 33 + .../react-dom/umd/react-dom.development.js | 29924 ++++++++++++++++ .../react-dom/umd/react-dom.production.min.js | 267 + .../react-dom/umd/react-dom.profiling.min.js | 285 + node_modules/react/LICENSE | 21 + node_modules/react/README.md | 37 + .../cjs/react-jsx-dev-runtime.development.js | 1315 + .../react-jsx-dev-runtime.production.min.js | 10 + .../react-jsx-dev-runtime.profiling.min.js | 10 + .../cjs/react-jsx-runtime.development.js | 1333 + .../cjs/react-jsx-runtime.production.min.js | 11 + .../cjs/react-jsx-runtime.profiling.min.js | 11 + node_modules/react/cjs/react.development.js | 2740 ++ .../react/cjs/react.production.min.js | 26 + .../cjs/react.shared-subset.development.js | 20 + .../cjs/react.shared-subset.production.min.js | 10 + node_modules/react/index.js | 7 + node_modules/react/jsx-dev-runtime.js | 7 + node_modules/react/jsx-runtime.js | 7 + node_modules/react/package.json | 47 + node_modules/react/react.shared-subset.js | 7 + node_modules/react/umd/react.development.js | 3343 ++ .../react/umd/react.production.min.js | 31 + node_modules/react/umd/react.profiling.min.js | 31 + node_modules/scheduler/LICENSE | 21 + node_modules/scheduler/README.md | 9 + .../scheduler-unstable_mock.development.js | 700 + .../scheduler-unstable_mock.production.min.js | 20 + ...cheduler-unstable_post_task.development.js | 207 + ...duler-unstable_post_task.production.min.js | 14 + .../scheduler/cjs/scheduler.development.js | 634 + .../scheduler/cjs/scheduler.production.min.js | 19 + node_modules/scheduler/index.js | 7 + node_modules/scheduler/package.json | 36 + .../scheduler-unstable_mock.development.js | 699 + .../scheduler-unstable_mock.production.min.js | 19 + .../scheduler/umd/scheduler.development.js | 152 + .../scheduler/umd/scheduler.production.min.js | 146 + .../scheduler/umd/scheduler.profiling.min.js | 146 + node_modules/scheduler/unstable_mock.js | 7 + node_modules/scheduler/unstable_post_task.js | 7 + package-lock.json | 65 + package.json | 6 + 119 files changed, 123501 insertions(+), 1671 deletions(-) delete mode 100644 app/.env create mode 100644 app/.eslintrc.json create mode 100644 app/app/favicon.ico create mode 100644 app/app/fonts/GeistMonoVF.woff create mode 100644 app/app/fonts/GeistVF.woff create mode 100644 app/app/globals.css create mode 100644 app/app/layout.js create mode 100644 app/app/page.js create mode 100644 app/app/page.module.css delete mode 100644 app/eslint.config.js delete mode 100644 app/index.html create mode 100644 app/jsconfig.json create mode 100644 app/next.config.mjs delete mode 100644 app/public/favicon.ico create mode 100644 app/public/file.svg create mode 100644 app/public/globe.svg create mode 100644 app/public/next.svg create mode 100644 app/public/vercel.svg create mode 100644 app/public/window.svg delete mode 100644 app/src/api.js delete mode 100644 app/src/assets/hyf.svg delete mode 100644 app/src/components/HomePage/HomePage.css delete mode 100644 app/src/components/HomePage/HomePage.jsx delete mode 100644 app/src/components/TestPage/TestPage.jsx delete mode 100644 app/src/main.css delete mode 100644 app/src/main.jsx delete mode 100644 app/vite.config.js create mode 100644 node_modules/.bin/loose-envify create mode 100644 node_modules/.bin/loose-envify.cmd create mode 100644 node_modules/.bin/loose-envify.ps1 create mode 100644 node_modules/.package-lock.json create mode 100644 node_modules/js-tokens/CHANGELOG.md create mode 100644 node_modules/js-tokens/LICENSE create mode 100644 node_modules/js-tokens/README.md create mode 100644 node_modules/js-tokens/index.js create mode 100644 node_modules/js-tokens/package.json create mode 100644 node_modules/loose-envify/LICENSE create mode 100644 node_modules/loose-envify/README.md create mode 100644 node_modules/loose-envify/cli.js create mode 100644 node_modules/loose-envify/custom.js create mode 100644 node_modules/loose-envify/index.js create mode 100644 node_modules/loose-envify/loose-envify.js create mode 100644 node_modules/loose-envify/package.json create mode 100644 node_modules/loose-envify/replace.js create mode 100644 node_modules/react-dom/LICENSE create mode 100644 node_modules/react-dom/README.md create mode 100644 node_modules/react-dom/cjs/react-dom-server-legacy.browser.development.js create mode 100644 node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.min.js create mode 100644 node_modules/react-dom/cjs/react-dom-server-legacy.node.development.js create mode 100644 node_modules/react-dom/cjs/react-dom-server-legacy.node.production.min.js create mode 100644 node_modules/react-dom/cjs/react-dom-server.browser.development.js create mode 100644 node_modules/react-dom/cjs/react-dom-server.browser.production.min.js create mode 100644 node_modules/react-dom/cjs/react-dom-server.node.development.js create mode 100644 node_modules/react-dom/cjs/react-dom-server.node.production.min.js create mode 100644 node_modules/react-dom/cjs/react-dom-test-utils.development.js create mode 100644 node_modules/react-dom/cjs/react-dom-test-utils.production.min.js create mode 100644 node_modules/react-dom/cjs/react-dom.development.js create mode 100644 node_modules/react-dom/cjs/react-dom.production.min.js create mode 100644 node_modules/react-dom/cjs/react-dom.profiling.min.js create mode 100644 node_modules/react-dom/client.js create mode 100644 node_modules/react-dom/index.js create mode 100644 node_modules/react-dom/package.json create mode 100644 node_modules/react-dom/profiling.js create mode 100644 node_modules/react-dom/server.browser.js create mode 100644 node_modules/react-dom/server.js create mode 100644 node_modules/react-dom/server.node.js create mode 100644 node_modules/react-dom/test-utils.js create mode 100644 node_modules/react-dom/umd/react-dom-server-legacy.browser.development.js create mode 100644 node_modules/react-dom/umd/react-dom-server-legacy.browser.production.min.js create mode 100644 node_modules/react-dom/umd/react-dom-server.browser.development.js create mode 100644 node_modules/react-dom/umd/react-dom-server.browser.production.min.js create mode 100644 node_modules/react-dom/umd/react-dom-test-utils.development.js create mode 100644 node_modules/react-dom/umd/react-dom-test-utils.production.min.js create mode 100644 node_modules/react-dom/umd/react-dom.development.js create mode 100644 node_modules/react-dom/umd/react-dom.production.min.js create mode 100644 node_modules/react-dom/umd/react-dom.profiling.min.js create mode 100644 node_modules/react/LICENSE create mode 100644 node_modules/react/README.md create mode 100644 node_modules/react/cjs/react-jsx-dev-runtime.development.js create mode 100644 node_modules/react/cjs/react-jsx-dev-runtime.production.min.js create mode 100644 node_modules/react/cjs/react-jsx-dev-runtime.profiling.min.js create mode 100644 node_modules/react/cjs/react-jsx-runtime.development.js create mode 100644 node_modules/react/cjs/react-jsx-runtime.production.min.js create mode 100644 node_modules/react/cjs/react-jsx-runtime.profiling.min.js create mode 100644 node_modules/react/cjs/react.development.js create mode 100644 node_modules/react/cjs/react.production.min.js create mode 100644 node_modules/react/cjs/react.shared-subset.development.js create mode 100644 node_modules/react/cjs/react.shared-subset.production.min.js create mode 100644 node_modules/react/index.js create mode 100644 node_modules/react/jsx-dev-runtime.js create mode 100644 node_modules/react/jsx-runtime.js create mode 100644 node_modules/react/package.json create mode 100644 node_modules/react/react.shared-subset.js create mode 100644 node_modules/react/umd/react.development.js create mode 100644 node_modules/react/umd/react.production.min.js create mode 100644 node_modules/react/umd/react.profiling.min.js create mode 100644 node_modules/scheduler/LICENSE create mode 100644 node_modules/scheduler/README.md create mode 100644 node_modules/scheduler/cjs/scheduler-unstable_mock.development.js create mode 100644 node_modules/scheduler/cjs/scheduler-unstable_mock.production.min.js create mode 100644 node_modules/scheduler/cjs/scheduler-unstable_post_task.development.js create mode 100644 node_modules/scheduler/cjs/scheduler-unstable_post_task.production.min.js create mode 100644 node_modules/scheduler/cjs/scheduler.development.js create mode 100644 node_modules/scheduler/cjs/scheduler.production.min.js create mode 100644 node_modules/scheduler/index.js create mode 100644 node_modules/scheduler/package.json create mode 100644 node_modules/scheduler/umd/scheduler-unstable_mock.development.js create mode 100644 node_modules/scheduler/umd/scheduler-unstable_mock.production.min.js create mode 100644 node_modules/scheduler/umd/scheduler.development.js create mode 100644 node_modules/scheduler/umd/scheduler.production.min.js create mode 100644 node_modules/scheduler/umd/scheduler.profiling.min.js create mode 100644 node_modules/scheduler/unstable_mock.js create mode 100644 node_modules/scheduler/unstable_post_task.js create mode 100644 package-lock.json create mode 100644 package.json diff --git a/app/.env b/app/.env deleted file mode 100644 index 7dbea100..00000000 --- a/app/.env +++ /dev/null @@ -1,7 +0,0 @@ -# This is the port the web app will be available at -PORT=3000 - -# If you add more variables for your app to use, make sure they all have the prefix "VITE_". - -# This tells the web app where to find the API server -VITE_API_URL=http://localhost:3001 diff --git a/app/.eslintrc.json b/app/.eslintrc.json new file mode 100644 index 00000000..bffb357a --- /dev/null +++ b/app/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/app/.gitignore b/app/.gitignore index 76add878..26b002aa 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1,2 +1,40 @@ -node_modules -dist \ No newline at end of file +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# env files (can opt-in for commiting if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/app/README.md b/app/README.md index d6f95934..09a8a4d2 100644 --- a/app/README.md +++ b/app/README.md @@ -1,87 +1,36 @@ -# The App package +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). -This package sets up a [React](https://react.dev/) web app and uses [Vite](https://vitejs.dev/) to manage the bundling and serving of web assets. -The React app uses [React Router](https://reactrouter.com/en/main) for Single Page Application routing. +## Getting Started -For development you can run the command `npm run dev` which uses `vite` to watch files so the web app updates each time you save a change. -You can visit [http://localhost:3000](http://localhost:3000) to see the app running. +First, run the development server: -To prepare your application for deployment you can run `npm run build`. -To preview your web app you can use `npx vite preview --port 3000`. - -## Environment variables - -You can set environment variables in the `.env` file or in the Render.com environment variables section. - -## JSX - -Vite has built in support for [JSX](https://www.w3schools.com/react/react_jsx.asp). Any file that contains JSX code should have the `.jsx` file extension. - -## CSS - -Vite has built in support for CSS imports, simply create a `.css` file and import it: - -``` -import "./main.css"; +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev ``` -## Assets - -Any asset linked in `index.html` should be placed in the `public` folder. -For assets that are used by React components, they should be placed in the `assets` folder. -You can import them into your files like this: - -``` -import hyfLogo from "../../assets/hyf.svg"; -``` - -## Calling the API using `fetch` and the `api()` helper - -When you need data from the API, you can use `fetch` but it's important to not hardcode the URLs since they will differ between your development environment and the deployment environment. For this we can use the `api()` helper function. - -Assuming you've deployed your API somewhere and you've defined the following environment variable: - -``` -VITE_API_URL=https://my-cool-domain:1234 - -``` - -When you call `api('/nested')` the helper generates the following URL `https://my-cool-domain:1234/api/nested` which you can pass to `fetch`: - -``` -const response = await fetch(api('/nested')); -``` - -## Deploying a static web app - -> Last tested: 2024-04-11 - -Follow the steps [here](../api/README.md#deploying) first to deploy your database and your web service. - -Once you've done that, click "New" and this time select "Static Site". - -![](../images/render/app/step16.png) -![](../images/render/app/step17.png) - -Select the same repository as you used for the web service. +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. -![](../images/render/app/step18.png) +You can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file. -Fill in the required fields and add the "VITE_API_URL" environment variable with the value based on the URL your web service got (for example `https://hyf-template-api.onrender.com/api`). Then click "Create Static Site". +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. -![](../images/render/app/step19.png) -![](../images/render/app/step20.png) +## Learn More -In the next screen, wait until you see the text "Your site is live". -Then navigate to "Redirects/Rewrites". +To learn more about Next.js, take a look at the following resources: -![](../images/render/app/step21.png) +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. -Click "Add Rule" and input the below rule settings before clicking "Save Changes". +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! -![](../images/render/app/step22.png) -![](../images/render/app/step23.png) +## Deploy on Vercel -After this you should be able to test your web app in your browser on the URL shown, which should be something like `https://hyf-template-app.onrender.com/`. +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. -If everything has been done correctly then your web app should be able to load data from your web service's API. +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/app/app/favicon.ico b/app/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/app/app/fonts/GeistMonoVF.woff b/app/app/fonts/GeistMonoVF.woff new file mode 100644 index 0000000000000000000000000000000000000000..f2ae185cbfd16946a534d819e9eb03924abbcc49 GIT binary patch literal 67864 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ϣ%UY8`RWp~V-U_7 zDSM&-@cv_g11tXxtR8hhSsvhbm}^TIbEA^ zez~Ise9A5xP83c_%z83NHI&u7X>Mt9`pnf9TVC8vDso9r$$%-f#fu6f@a*df)uo-Q_5os=ED| zcEe;FMSWSJ&ct}ag!R8s`bGUZ`f~{uR>BX_16UIZu3|HQ{An_9v zHp7)lLClDc62YY@VO}JkS_2kF)MYGEO;oHS%W;YuDSf29meyQ*kC&Q@D5Y()UirbQ zeT^&uH7^72nS2!YD|zY#+SZO~YV!l{p=s^XHa8fe1Wr{Ir~lt? z&T9&mFQ)1Obn6G9RBhN4O5^az)h8(>R7Z`?G=z2B6om`t%6fF1Lre{m0c~K~0 zXZ`%Asz;D)&nPl8w^z!q(xW3qYNIS&^j=w1)?4pd)hsHQJu%L&>=IUNSr-?V@a<#y zTe$XUE|?}yQS@G4Hzyq}NAYok$^v;@M3G?#N~=Lk0A7LKEyo$`IGn`T`3c+&xhE&g zGUdOb(GqsDl}c<$s___$V9iP|P`$KE66Ka)!2y>Q0W!(Z1+^C&IwAD7-&RKDm zn@lTqPUJ4whnly4U#AuBOX0`y@9}=T_iKqGj)SrPBvyHgUX8{~cQ&n$YZMhEYGih$;=(NLFnCA; zJ<{P6EViq3GdR@A0F*j71H;Z7rbk7w@|D5)fHG%I7z!A3i&zoOG}HN^4@2Y@zZPW8k#z-2^|-~Kx5rTa2PJ#IoVGbx9( zms$_6iSdGT;U0f^Fi(^HUqEObfHCxveHQQmm5N68!ya{NsbpQ!J&T!=K7H*BqwI3( z<(8F_S1t|R9X3GYtkqCkY%MCbUS*P0tD$w9$x6L;NSmOB={inXdS_%wItd~9g6P?q zbe5ls)xwWyqa@6o*JRjjFm*JXA3Z_f7BV2Q zr|8x;r2WS3q$)JNtkgct{V{eZW>(nSUAP3`gSGb@Ta068{O(62Mo>By3C4Fb0xq|f zF($svLG@T|?ZAQUbnm64rqnxjz@vnk*h&!BzyCpfWGxn*q%`b!2z>QlqgEDaj{z0qttc?)(Dp;3e z(yy(@YjF6%)!PGZ32TFI_{e0?Tr)><@Nh}%lMmyo%EZs_SFe3u*|%^JhjHJ1XGXjI z``I;gHSp+U(PI(CA?ZoqXG6&?-|KFNIGgKWj|g#lmAvsh#qaePKkb)vfkVD7B!sBr ztwrDIu9PhVp@t9Ota(3qIW!E{Stq+;x1M+(GR!qB3mdmJ6EZTkf_M>gnYyV*G~{HY z916Bf_&5)i%wxFAr?Wy1r!~*FqLp^99NyPZ-4ZHUy`0AUEz%0+bKT6;SlXPy5^Tn9 zit~>w<74c@=Of=s&C`mfeNxu7BhA8zZ8aUPGKDEyrHnjrw?v_#{)nzNg>MHveY_6& zIahSkcjLb>)xyrl4^6X;NEoPI)mVS-Scfz&*j>UtsLUHUf3vOFe{VM$n}31R)1_Fa z4wRr_VWG*Hdy0v*FC?d$Ny$k{ruxs|=UgZ|Sy?quvZB$JfE;70t4l^6I!Tg}>eg_Y zhK81qii(yP9MQjwa+ZXOmOLc=wpjZZ^%-&YDc@d%&LQkEUp2PM-s@%<^j>Wd*zN{m z`uIvD`cpvhgNaqh?8!Rgu94tEplL>Qwr-K^bDvl+D{FmgJ(tCsl2)sp@ zO8+Z6RqvHilF0dRCY(_2%LY>mq<5f&S<@pZhp;K@gL)OlJ+wIoR9s4riQb7G*E(lM zT`eb%v_6o2fW3}!gLQdyB7{*2rErWtZ}2<$YTTn(CQ5@*lC)YA5dw-p!l1x?Fy_?9 z3leg;vQHW-#<5G;K_a7kIS|F5x2qAw4Sjry?}hr}BzXo5(-a}1Nc2lv-Ux=7dw_`8 zr#XGH9?Vo})J2ws+jH0iX=yh&74q$+tx?E~Dm3uC#iso#%yxrgdwQ4sCaS#1Ba6qP@BDTTlWER; z_Nr?)h}&+X`Ml*kd?vj9KHR?7)+4QIjnxNdB$-4<7JHBLV%V%f75QVvg=?DA@P6oP z6|+Cm*j}NeBB0y|MVZI3d#*aVv3lH!Q7ug;bw0VX0C1mpTVDuBU-JlZ&L*CrEx~@g zvWYf!%l@HoTQc76+$Rpybh9IpMMRVsTga6ck4{C19$W_b-Af|r-k^#2-F(MyP}23< zJMWV1g}YafX{Z_Rw!3?-w2Q@oq1XAOMa^scf-SjkdSwG>qy_`I@4l?3=ytXtN6RU2 zRZ?CjbKpA1i}Nb`pyH@hS5vF0`s&TH$8A47t|iq@+0wI3nn-*7ob=)T!M(+ruye(< zEom9SCd#4heQ9Q{%npGh?2m^nPetWYjy9zv4ia)CrBY?wNlG2o zo#y=B+)MHX17`SlMY?qZw;;hMoH1JbxC*NXfq=*3fcaLt)%B_ci+Z)ctA0~lZj7Ga z6vPCw82$QeeH~s2j~}m&FVF^B5Z#nSEA;WOmT~aU%`JChOSD#3x0<`7!@a5b^5klL zE{Z37&-828$DM=l8@bj!a;JCkT=(qSYNG~mYkT=r@32~Pp9^&Xo0jSK~pHT?6)f?A*>9E846baRamXh?Tkxg^BjK7qxaHX5Y=?%)&BTXb5Z*`A0_YR#@MG~i$G&mDiVqBUEQmb~ zT-b4iN)tcawMQpfkx7NKEy1{U4Vn; zOn`N`SltDeICuwP!4I|f=KE&G=pA?A`qlH(c;DggP=Hm>jkJD-jK*C)#5xi`pESX`hO z)^AT71c;{_!-jQ+x%G$xqtk23#8vBfe!c#pI5j)(Ml$E{L-uq#7#P3Dj=X_A4S*3H znBlL^`de1}*(c$r2C$6jPAg-6!zeYxwbp@XvS>GY%obNhzgT{!V7`!tha) z-OVAEZ3n1vj2wN3s5_q~K0zKsWlI+qA)%XFSW#i>btv)AF5|UYK=>9Y<6WAGKhDm9 z>~TM~Vs#Y8lnF4USHyMiR4{8lyM^>Z)dfszO%?SH*J5wT-p#cJ8(>q7#3GzJM3d!F z)-Za@re5UMqQu?&n9LL_mJ&?!G}p(vhkYsK$*YuiBRNhjbc7<@KedR3oRvOw-kVSZ zvNJxHu<3gx+=T^c628Kyo3L^%6*UVHBMCbNS2_Jlr-!(Ngw;HidJPwcpmr&Bl;U59 zAB?_`@FD&}7<>qFe0pDef`=aa3O_%Rh`BLksk z1{srtza=8k86*=_O@dPgt9HG}|0hh)8OxMT0bAv-7S4Fb0 zkDTdD6%FGH%Ue}4h>u*^j8xB_GrG5#lle?4ZT|>P~W#{+!GHsZ*!l_U6YuunTFV9Vtqf-CEsVDxn`5_ zegWYFLHw{L|BwU&fdGMe0K@i!pl&e$0rj!O=1jNPZnS(7m~FJ!;{0j+xwhQ_1~U3a z05a}_tpl|I+UO&6fZzNz(^vM}Pl59UBL=z@EIP=wKXq5@hQb5vVDO@jfd;{P@VE}| z0xY~=(gD8rGvaO%D4&jJXmxC?gP==rw>UIMnZNf={z4-^_zT*Ix}^-jB!2k zsR-f(%PW|#fZ&86H7muGRa1F6?9pIhm8d1o)(~P9%PpAKkYJU7&co?v^T_d|XN>#) z!3%Ovp#4Gk3#VVSKe7Ntf`SREr>Nwd-~$rz5UQg@HcIOd^R48sza~N%YRAc*PdML#BJHU% zJ4#DV4c^j`%%U_6meXa;{077Xkq-yUny?@_RH-3I0cN|8tC7J-Yl^_$Rx=_&M=_pvWW=AIentRL+haM^^M| z!TJ`luzS(QKo?tikn2H_8}V;H#ebuMG_;kI2~LHZbhVRt6=mpZSrx`hmuKFx z3p~}OY^Pl#R_&`Tvz(4^{RvRshVqw-X{)yH9 zEB6-L=j}?Bvia1BBkGmEU6oSnRJ0X5#9WAJ5!^$}`yjW`GO}i*_erGV6U72-gx>Mg zW9BMOQH5LzgXPRFBi|ThsvX!{k@({FMf7vMm_e4Kum+_J(dn)Lx?}A7A200KY_cH& zZ?wkfPkq{|_yzY9Mp{DUScVS29VmOGc7M+9)y?>8m5*ZX!DrXh%3k;_&I`f^Jz;aa zG6fxC5KR*@I8v{~$+WUL|Ow zdm)QEgfm<=jDTes8x>}^Dn@G@!Z^BWn9Ycf*$dbtGkju9OVo@ zN9JtXndsN)ukmMZ%1Mg5TXE=SLrr7d` zicE-1gCh69WSS7B=|11x~CP`}>r@j8`xaL>{FyB{^fQ6J{djI=f^&&_Ni6`plZ3X^D3zfCZpN`I&8SBNX_9q)=j-Lf8 zYj3Tk$k~Cdm-m&_^Hkc^D`A`*;amMNkFK47Q+u?<4Y#Q_%qirCD5S5q7wGWybg1UW z$zq7iLKXIoVfZFiSM=*s=+hIaizoRvD#CpOAc7%+GWDghfOQ{tkn;%--4Rdsk7xQ1 zgN;yU_w@wG?XGduS}l@sWdStsu_z{6;wpta-!bKJ1NAzhaD3S(Z8t)%dEs)kE+ZJX zn8YzdzDArt7?Kv}*9<8pI<*d*u?4C%O?XObZYL18(V7*eHk@GU(b-JnjL1;83=vDO zb;;T{Zg#laRQT$Wg#f8g5vXrExuj*tA6dXNu?im;@qC!!En^%oGk<^`Y5@}S?vGnV zm-(nUVZCeBf=!wptO)3Hfz9gv<&t@Q067A9>=;Xr601f*wx}hVjrJs18=Pv$yWBLbvBXw>nybvCzqLC zIvrQL3rJLYh8-HK9rX@x*;aZ$M_Xqe$PWEobiHM zan!Ew`Cb1ABg@_`z-Ti_x(?)N#Fhiceb94=| zCK|AfQTYM6Amb+3f%HP z^V4u0z!4aj5*Yk9nldObupdW=d4v&@(TVAIU?{B2Hx}l~SJ>@fP_{27JOjnY%M8y! zFSIc9J%$(=7`=%Z6NZr7BHnsLv&+2%b>kD-&{MgM;U5Wu%_=ludGG0P;EwJW zw(-;ih3{K>ko83AOA0DgEede`#!H=+2LCmb%YhpN|7{bPt;+fcyrUuMIsZgGWq{iXfqPthbyUu9!)+ zJU47kLMuMCbn6s|E6}bu>(tIG0N>CJ@Q1Pr-g*MPj?{*DqyMSS{34WyvLz~O|1T(2 zL!vZgEsOg4iI8i%i@K`0YFUfAzVi_26`4t4@Yc>Z|G;(e@^zj z$RazYfEor}cw|BSH0p1sR9{H z5rKppn$OY{68FPYH>jflNo`1d5gH7I{M`SGey=+||IUHXQR9o|yI5~A4_rC(H ziNr(c;DY1}bfi`lQWhNvTivA%hIb~>UV>O*vs~WqJra`4%34)gQ6uu5Nrd}@kHYv9 zYLbh=uF#=k5vVROQ>1en6Dca%))vuV#c!4zxpn!=w5MsUA#AfLGdLllZ>os0SP!nK zGUf>;|Jv{1!@HI8m)2JoqbVhd({sx;Gc2P>wrloU#1#(d{Nas#BgdxI^s9)uBt)ia zj2)`u`D3HwLNo5h=+lDJ($hi5Jsnrb*)+;tiWerf?GSdd)}TI|C^nUe1fMU zzfJl#(}0yS{m1j&l~1x4VgC#H{ygyC0zhBjy>E89|ET$zUp;$Yo_wD9rnt914vO=h z8n1c%Fg^%@8mg8@?$*t??Ha4AQyTA5H{7(vs4cN*@=O~5Pf3@p1hkz~1CXK?M93+i zBqXGkV^Z)=$^k*BWke}|h2YK>LY`dmskcsyQ)qfsTllME$jy-N(`S^_8bYftjv&7F z8Ads#u;?7ay*K~W7YjgFIz&}bM46)5{8eq*q3tkjjBQz9Tcgu9bLK6WQr5IK^k4On zw~f9~hp|WEiNtH`~g%s2WN=~vDAXev}Q)o5k(7`1|7#$y#ymJcr$Sy=QryTHvc8)XBDW+kk z7<8p_$g1GU=lWAVB5ZXR!o^d@Hd8*Vj7zic{OJUL zu*i!8;e3v#P+SpiNyT4P&D~X5{!z)^RZ;y>(YILzB1IicRfSYl*>y?Dc1clpNtwD? zO}kl#_f7G8LH@1RZ&~28Q1DGP z_%SQ&3;}K-54)z9MF>J-+OC5F84oRYI!c0vZBCl;q&j^Wkf}{e+uYhFxOy23Vecw%=fq6_;Z3X&;HZgK zY1LfSvQ(F;Hgl%UT50E6Rl`~r2CLAOW?%M7?g1<_MXExofEv2@z5Tuk=I$PiN@D0s zTfCdy!%fImrCanX!RW^jE3Df(1~OM1xT6oZVBbYRj>#wnO{ zo|+`GnVs#`F*RnXWG6Z8b!I=lCcmBJoZChJkMC7wns_p2^7XI{r#*n@IYX~B!#ogR zOlT6gAq5M*#~BrBdd$~P&FmZsKbSZ$9_t8WL_@A>Qcm7P$w6x)?9-(MdAPLd(0*S zkhr0RX15y8;h<;k5lrB8dc^NR2846F>eFVcY9@g1?Jm-l7o+-I%+nqdHoCs0&}=s> z?DXGMD8-uGUnTkbO@FbvT41f|(#}Dn%xFV@>_!_`*p-PNbJ^_Xbw3qD_K;Re=fS)R z_e4U~4iu!8cSHqGU%!EHfL|Ah)B%6n&xq7MGiakN!FG0??PMfDzD^s^sOFsEtIMRE zV4H;eA_%N{(s|;J;^}xkIn1gRm0tQ`$=y&bOnhe^l(^;DZ7OeOtq@yoX#4$;G^O)LQ=g=q(@lq)b>A*=H@mxy1J=1&$=^A?lTO_)l#39YQ>8=k^ zm~&c`E@4bOQGyNNKrF$Sh~dLLVPP!6y3BDP`#UzA>@I>0Kg*Lx_+7KT=$om;f_*0EcZg?l*n zX>l~XdwUjs2d6Y6=?ALU)`6ast-`jVSY9kFg9XYb+lEo4ZL)Gd#>Qpc0$t~2!Mxsk z`973z41*Q_AUwwj;u1XfJ_T!B`yZ`m@4jH3vN$gU&sE|W&*UA@enDVCMIfO5ttcQw z&|P3YpnxpMnl}zXU;{F-NNCjwaP91JN3!W8P{|Fqi^PV}lvZB|k>XffE+?6=4wOt# zY`Gjx_q{|KPW76tHd6V(PHws@UWJFTyx$&u6~BKZ*yj9=WAYzBXuaq1j1{F~C0{Yg zj8?1Ja-~2y&5qaW@s!yPPg6dU^&Md0iW0NX@4opoq*35$~QV9DpFcPN^){+Vw{?Sin6l2 z;`R3Y`llrVF`z%-BU{$GM$u10*rtbz-d6PzU(k^$lxu`asFti2E0k*mi^!(5nxy{k z_m&Ga!ew+@UJqvr_I>$;gJLn*%yt9ClnZ8nOlJH3LefdKDy>Gl!BX0vo>_0a?kgZ3 zmCNRGz8WZ@Ub#IYOH7DzF(JZf9}_2xQgk|>?uPi2%j11}7M|z#dikgK%k%zfu(N6Jwh{(y%8})eFDrzrt0CJ69iK=NHI;V{+r*cDa#0yxXyC{;s zFG9~p?Vdi!(Ed|s<}7A&NPp|sTKDv6ulf{>4cEK3Nea!4X#6K&^4C>tYAW5>>j|6vzAEsWdBL!Irzul32428BP6n;xBh z-j5>ZCV&jv%pUen`nCs)oih!Iea(RjX-G;F~W5+~{MJX+Mq8nHs{#5OWyQbLN!9dgwk7DS!-P&l$( zq@ZmKP;a=}sQjW?tVMRtAe_q)pRVBZN#jX%IA5@$KkkyBUc^C85(;0Rzm7!q*n_PNR$*tPzlZz;(il~CDJR%oms*gR}8Ky_i&nk8k@OHEOulB zF$!Zc2i>M%cUvJmYW2NHG4xn7^qe!u?FJisln=BiFwjvkz{6mQ`bo#pLW(8AtY+i6 z>Xf^LNaije4=*VZ!HY(oVW$XD7tJHSZc_oLiD!TtuK$+72{{d}JNpg54Y3Sn@I@>| z7?==DXM+s>{rzCWMV)xs@}nmZDsUx#C&Eq88WLS(Lbev4rj~YIW^lbEAK_?L|H4=K z{-HZNu@wPE4dqrnZAchZ;H&C_6wY)&+3v!7#}76D{dNyi^cqbnBIUD8y&jeR;F;bT zeSP*Q`@*{(dOtY#Hq7?^nEy7e1E=MBm^WZODTc!=VYDcbO|Lf?CY#FVhR<$ukT#z! z6sDgl1Q7$I*BPXkEr4*dSyHjZU>0Y&48(wSy1=xu$d#IB0pNqHpt5Y>(=NdA$ZVW2 zIiq#pVdzfbv|LV1hpZBwfQw?ls~@14(W{u`I_83}I2`r|XoCf#;k#p^;V~JF2ZB^b zWDzb_O{!KIjN%RFf8M-cqS<8P%HVO!;1$zkc3b1ITch;?tRAg8skQT{ZH8B7)wUAY z<<7Tyz1$^EXMUKhzK>_4n9*p|8;%B|tRxw-X2AaZp3z_^M3ZmPP;avOfB|#ckB!%H z>d7xlkv=VT66ONLL&d{pDuI+h>aTn+^}hNqE~j)|f62w=t4V#&)YE+M!8NOqLt$R;ed=V(&BdkE+%zUu*e2|WOh&KbEFp<3FTBOjQ zCpX;rFkblx;J@$8M-1M(cA}hQ+oFdr2vvvvjOq^JUy|!C_^jNZ z71pFMm#kwXB&{YK?nzgO96d9 znhQcPoU>(ZsU(eentx@bDCGuT&~ncF&15hH;w#sAbmyXRO-5db`(!MXOwUn++L-sL zxa_%NS~TC4T(y=t}1I*7Xv9 z7HY}b#P->8Q3sw@DLwUXot%8iEJC+bHB)e$ueT{=RBxgsh!Ob1p-)8jX68vxZHk!y zLf041kwvK$7B2k5Ns!v$)wQ!QDg3RnX4M;vnoaR{tG^(mxG9fQfk!E^VlCI8uPRy( zF%A9%*_@DrSPa}Ei0wqDv_9Fh3rUIPxnYRmi&JmWFXZJPg+7+Lz4Pw009IOU<6aLU zA3%EYo{PW?5@n&-P(|^|=TX-iO$jpn9zj-{qvKo*e@zpr7kCTY*8#X!lI8gKzAQuw zn73cW^i7z18lQjuDA0ra;*qr0Wn$73v?y;sMh?S~tTH&U11gX|SPE6!~{hmrgr)BMD-fX)gy|Gn%k>5a_ z*t3=Y^$SP=^}vFLKp=bc{6EoT%sv6HdZr~*B`b7BKmo`@CKr-2MUDwnSk{mSmw7*<{BVX1;{23V3J@E)J+B; zfrGG>;+&tTR(09`qC~bEPfx(Vf&9gQ>iRjzUqEo+zfcg0!7~Kp6kt_;u?jNJLOnnX z_JKzjDr!J22Td86a{$$Zdw;!PX`&L82zx4Gslc&{>dpeO;BO6Ms*f}~!fc`;3?1Cq zd}Is}b4n;G1+$RmNboad%8*Nsfj8vvkX%#bLs@8LCZ(1wSsJhB#uaUxh^Z89M*$YGX3rW5heNEJ#Q4xS9Jru^T zhao>?eJc!&rAn53YC@-}lbQr~2+65Rmw0|i=c(+cqM?ZZmHJsvN6I&ngqE zTDHjgsL{O=>f))Z%f5`~qR%TMza0G_)-6x4g7F~xDbc&E56jeZYV($5XjYYBiJpFB z*0^RbmnEH`l^~ixo`Asj5KFKif7W`_`66zsv@zh;I(T8yIabs9eqrf7+0#U?3%jxa z=ZdnW^HYx06(X2M@Y6u7j%5`y8_o_~KKKtIv?wO43~DKibExZJ>Yjb-F7Sli@1G*d zw&dR9R4*}#|M4)`2!4W*{|Q2Bd#9gHP93H?X0>T=I$tqAN3*~7e{lI>_{a1P?SK%@ zA~u2X_5(5C#{637LvtW4bpm{(y9*H(v@+;m(gV=HqAZ61L};#aC}oilL-Gtz03ak9 z80!J>I=Bnq@IFQdaGhW5eU~?|A3)#vixeox3U-U2t^&TZkSxGcg4(mdF1Wg8_66o` zh;-rBduDAYSCQfS^&Vt;0V})LBv|7jkaH4liGPxbmL!Ph<7CKS#;~90JSBVP50lHF zn=S0LvegRUES%Tl+)6-BA-Mvl6A~po*RC!gEeo4;)~S8t`Nkp-V;X4Xlh`NdQ$(b^ zNVNx$p}46&lff=jkBTzInwONU^j&k_h~k-NQ?>{IeMBv44sJJM5>QKU)lk-ZQG0ZI zb9=TI%{O@xxgn&)3q;Yx(M1_Wu7x>;pM^<8&)oWL8a!)x4%M7tvV&cZRj>7$DdG6P2@M$3P z(#9RnWAOd6ntyJt5FIF6X}MQR_wa9Bd7}jT{14xssGw* z>)y%#3i3ym=ixe&HP2QaRy2PdC4_y>UP|=wmL)Q^&cZU$GoSLVW^otPR;K5XI&$9@ z-#Xsj!x%^EZs+qd8?vY}&eGX3r!%56HZsLCb~H3xWu?U@K_|H;v8=VMEve0OfJuXy zghLCQ;_-v>85TjX3-LiNLzD+g3}K%Jn)i+!$lEZwe$q8mRI?H==MgdjY((RJtIr-< zm^J;@f|t!-n040xr(st^u8bp0$H57s?Q=T_y*>7z_krbu&=0;Ik>6{*6&Il*B36tF zfTZt7k&W;>Qyfw;0Tg|Ezw*AGCo|77xX z-nUzOM|o>`ZhL3FV&;i|j_oY+Qz(!z5Z+`yHrTF#U4XkGct>>)_CT8j5!vsX-_r{>3oi&E3=R+a4onVk4~!0^5rYw{5=~1~ORS8&j7^MvQJ`NU z<00puOky^U5Y?B~8`gu}syOQU)bFC7LD7aH4VV}fIp}$i9%Crhx3tOdQ1K;9NDG{i z#46DzJ&j`>?mL-gq<%W-wrBC^=@Am7o^u zYgKPb1%x1`o4|6^yYu{HnK`XzJ8%2$+;k9Bi#<;-9Cy8U(Pu4e`X5|N_P}EX$1)lq zYX15OC23VJo^2~5uLhH@xqn=z`Gl5u4>bIoY zLzfH=cnChWD9kcg5I)bL=|ZU@c`bn4eq}p!DCrZ5y|e|2YXmOiT#ck7Ii^Xmqu;JJI6baux0aV7kP#z8%m3JV z{6#mQfD{F_WYw;tCf~T$RcZ-K{U9SJ=XG<(bd;N!>6Dt9#z{)Y09&CdL78@N6|QY6 zl~^2(kVJ)%n~@<&ma-}a2NSgGh8YIK_c}lFG#HN1x@4drJCJ6=h)FZRz%!~v8!>Oq z%KAh6$^D>0#makW-V{7MEZX~xo75Z1&=HIXy@AV+Iw-a$P#E+V^IxwOu>WA z&N->3J?mU=3 zPv(kPphJ%>;;7R$(C0I!0vS|>>eGorms0mg0Zgq=zwRT@?E0j$OwohG7ph(FYnQ7j zX~X`qrhS=JdTnc6t!i=ESG(BozUw~leopvqltk)E#>Yk0Hl$q(oIgW72Mt@Jl-b3- zS6O(k(Q)CaRcKMAxJ;jQKJ`D$7sY0(IvS|Clq`6mYLJ|vrib92!^IGkUGCNKe!kQr z7s;R;e7`rMr6k$;$=0%AP7fHwa8j4m_`mx1e$JTyo$Lr|Zt2l)YinsqRmNBjVPy&~ zbpYf=r#^j|xmcID7Vtv~h)AF_)pYf0*ml4~TL1tLMK+vhUoxwpzOA-?)*V(0O&u0R zd3myXO>1}l5TqXQCwwDNitITG)RD06uojT24o!wO0U9#xsNn)b{{S+hfFlLnKhnR3 zhYbFJpsUCQVXlTSK0llO9{^-Po4+bH97qfqgpjKy<(9n9HqI!|I8g0)K&-r6SkQGr zQ1g{Wl>?!`unDP}+TDbiHuA_Z2xRXqq*9_NQ-`_Ao3f$aRW@{Q(Mb#6E;Y`1kpl|o z-s2rDe-L4)2n{nL2xyU^OR01;WTh+Vjg5_Th334G2u&Xx9Gui>T2*PlU8RI<)_8z6 zaWCL*st2VP0e4$;D73d%t~KN)yDP(lLa@<50%yIykfWplJOtaZ6tI$F$CM2BM(b1caS63xzb@lPh(a|h4J0!`W(8c}zVgkLAB~FBR3(=A^ zRQ3bPxX;yOg+Ay#=(Q}n@)LA}t10w@f2sbmyUy+`nR*57Koi)9Gic@^Vs|wmB53UN zB3hhAU9FGzw=lZ*cz@eNf)>&Zb+9l7;i(~jxM*GwR#yuR*TlpGFifMN$UH?E$3PM} zmyBI(!li2^?Sq*xeYCK!AV2{Iv~vETp>bf9UWbew)SF!5BQu}2W8{2IC$C#V2t!54 z2K4Z?(u#J+Xwm}uZ5dT$9Ay$VpoE3sH-x)VlL}B&MnxIlTWI4M7a6(H2@h7%qF->C zvqd$C6PB0Dng();%07IU;ItbzP6R=NpLlw@ZS(>e!{2H2ENPj9(cggU1a4lygBNzL z{}=z>Y<&4;=IE%Q(8oVl`&!crwIBU4hX2;L%)UMzh&*7f|LQs-=cnb|0PILVQ^k)6 z-wb8^3jW476ui4jJ`>IupeWmCQ2T^!l6*z^)cle8hm=pzXXrEd{)fyTosZ{*@q7p& zt8kZ``X^0sjsBB@{y@U2N#vBXO*#Du`k!EQf2R!_LW|-%+q>sf+M+q!db;aV1U?4v zs{r>&j^Nd+S5;L-4(V4`#)EaUmAQBCs5IAFqtCUy1>!9j4ElqvUs*5jcDqH+?Z(vH z<&}Q}VWTm1bF&P?63xQsb;L5VbAF?Q#35p7icL#X zi5R47)j*Vm3`C*)Dy(ibk6fdmUq)Rp0?k~Ez|gXDdeDx}Ho*egJVW+DFoWJ-dc2Q+ z(t>MWQFefp0TrQGAhT(E7p~^sg{xT7F{Hi=UvuxqSG)AO(0U`gC5&-tcWv?i{Fndo zU;fYHTJrGlFuAr2mgw@@iD`cEMWgY>7p8ea)Lt1``8dN{QMn@9=66s(EVUnP&(9M> zC6(&w0X7_Av1yu!6`WEa5RjZgVQp=#APhn@V^Gj3>iYFo)nUL!1JQJxp(tcDWZM*M z8nj;t2~$(DWqH}}&txVh&gpMFiqRx$I&_#Os*1RC6c!~z(~P7976+4LWPx*p&_OwJ z>(;@6FH0d7FvcPZn0ga%wpkk;ttoL!IeVPhUR_<4d7*Ja5G4rb=Q@EfRNy0gN{x(+ zP^TE5W=~I{VuA3HdvkLWbpPPs;K|7eeDQj{pZiM8J`8@qlu9-$%xATg4u^&g6*ru9 z&`7~a6Dzssmf zB@n`)W-vB?q}S`Rv5AiI&-OYJa)Fypa;(zwzY`thn6B@6x0*9Oyp0`$^}i2JAoiqG9`O3)RO`txe<|3SQ$9c z{R0Dk`A36r2o|FpiVE)6E+Omkw_udCG=n86@ z%b0;l7;NFBWZo6a)@Hdnnx98??AMLL5lhhx5R0%-;csZ`!-|a8*FU#tcPQhY;K?cSr|9pazyJAb&t|ac z*{tiRCxw{d?9*Ycwmu2Hl1Wk(eCG~$Hp3pjL1l955^q#^szOFdp;YT#!TJb*u4Q+qFM~S1mKL$xUgB}Wz$gTo5Jh}sxeBw8@O z^9}}H6bt!l*9trL?%mtL*REmcRXZz|t5uoah9dJ$DxUevBnT8$K1v^C3|vmGtgLV` z7%vP)UX-%BYz|Qa9$bk?f7I{X&z30BxueW_c$Ol8X1#2hK8So>>Gk^L zF#}UBsYhxZsYw&}i+i+ZpmAUIq@dD{zH1W&Xe&4z=coBG!suHFp=cJs5`?g}j?1MY z*p$Um*#!omvsOw&OIibh#IYF#-``V^IcHxuLO$5cfPmDEg#{%V9UU9bW`~DIqhW~$ z+l-gO$zS~97n^yiXLxwHhb}_*hM`z3PGXaBEQ4kHq{Nnp?5wgbh*`Jza~TY^Dm#$Z#C0)#C03ve+W95I@Sm861EQmgp2x}5R^LD?yd0CPLI^%WHm>mE#fvAi;-@$XR47hGA5)d)uq)>yotcVs(43ky>A0PZ_Sk4?p}c2E1>@49gK5I4ue& zAvlXc7h5Hoti*yd|E7l6y%Zt*9>9MD@S)RG>h#@fZAIhXvf!bGk3U{0VT;9rOWC8H zy}fXFYkTJ?%bo7+?VVae6W{*!x32~i2Td1?=p74ht?&;ZjQ#{dXv`z%%wWvN)EeL+ z4zhL#ui05sS97^sv1U4fG+pK?1V~OnWQ*qDP~94xM8GJh@?%D2vh!7cdJ*HJc!$Gb!I(8crmsB9Vej}gkPi4(7#}aK zTqo3TA=EEc>b%ca1;XD`tGdh)@xp<4iD-F{FZoJcXF&ywO?b=cWRU=mH4vL1sHcx}H`$C~~ zI$fxizje0SeZVi;GWyYsf8xUa+KWrhynYaBhDvUy9q! zMuQcgI7LC2_Q>{#k87w0Kpv+JTO^`%)VYuj?hfxDDIM)_jlezce!esOuOkc<;M1Ch zeog!aiI_sa7LI49Ef#bJdVKP#ueSXF%KFMi8se3ym#a%Z{pAB1O6~N;g9rDY=M3Mq zYu6-0an)*>40;b-kDlikh?3sl$dpKc3?e>$^OR_AMW*(5PvXE+tP`vO7fwhjkmvQW zZ~$Zp7%qoZ574Ws$QDPh7v{3_GKUGfAF7F0w2Pdl6;aOQ2#!yaBg`_@r8fO7+9VF~=~-d-u21)?NL z+&Fd(%hb@*rwQlgema{yp&|LPxtW!utU|8=PU1MbB2ycalWi;Tca33ZNz2&fGmZf4 zJmUuyA@A+mgM;7w=5KxS$?q8eQE5ek3>8kn0E&u!&%f6F!*WQq7Ku%UJfzZEU)=;^fi>*ghYy?*Hz=(h6^v5Q*YbpKf1ir$f@8dziqd3@80d-gt`AVLg)j=ZnyI^GW2R?btO%E#&0x? z8m(dC{A-2dEjZ4t|`}0*tgm} z{UPx5^tAUO#v)+jb6~3siJpAvU-@6+WR#w*5QpLl4uzn7X)RW|k zH4q#kOeWNd+hm(19oY53{hc^t;Zda;r+qg+`Z~C4$4wU~0^8e#qljtKH?Q9s84fx~ ziZM7mcH`E>^t49&?+kKYfz!C+ngi*f7EK2JB@=QCyn*Ggd#VxVM(%7Y1Q-gQ8fU0aF_okFHI>bWt zHd$zPi6=EWNLlW@_n(Vm^p}Xl3?odD7pxHq#o%UP;3okvVFzC;ot$jGI6OW+&Z{^u zFfb6LRo}ost+>19z`8Dn3{)@35 zgETb24}x==fAFP@?w(Um?BX66>+|^_O`SRfB}-@(;)7~ZX4co9o>Qpv@a4;w@KCTv zk}6GydX{$&H5${?lW$Puc(i4K*u^F$Xs85DV%`svTui}d{76lb;p1r1Tl9L1ZR6W@ zJ)1@Cb6k!SfJ8=Fr~=dv+IXT!PBPWS4?enp4`0|!0u+#J$GQUyuUu|uAT$uLDRZ25 z1ke*xp&ULjA*F!yL2UI>+2&=LmBp8P+iMW8s#KwSFDx|(7Mo0sOawYd7%lJeQ*amC z%Iw17^)7I&BfR_gB7xVt%u9D(wH>wclU!sMMRt=hMMn2N=dz<{RT|t>fL*^Q2#Hr- zN(`P9g#|ORi*INfF_atxZ{!}s+*8mWNr>7+pu!(53qlb&N(vT)PtZTd3`5=lq3GWv z{(o9Ymu{Nd`a|pHaB6FR5O4G;sMhphbr}sNY&*LX=5k+u-&6DIzCtANM<9@8G=Jd< zo%?<+HgDRc;FaJ8J)GGEDrXfEZc3^Ox+i1W_{_C_0*=t(W@gx2_Yd~5<#okQLROQJ zh#>qKK^U;Nd7suU=f`)krMWJWp6UX(T);c#w)q=;Wud}8oJ2EE5u5vOIoA(7?Bs^9 zG1+l^<}!WY&Qwix^544q10-_%hX6jz*}#Sm+J;AZD7ZoA7HI=P7A6ww6*((OX)ra= zk0+q=9TX;Mx-+7=duY=j{~5tUPT2;zA}t*BbCpBL&kff}-n*7rc#_dw!&lWaonpY; z%%qM_>*^{<$!1!v*8%#CbGUeiXgyEMS(+BDjMXY+M*x1G~m|Pm`0hD*5W=KMIjN!PyI-Khg^JH4j zU&0yu{EEHp1g>`()%C8`#m;4?)7n%_xk5RcElb6s1bX^#O=i}fz0%XfX^BD!OOiJm z4rk#B>6XllPE0~8*qd*^FWjDI>c3dSIKog7@`BG?wgJxp1D;iLxvF1P{R&57Ea>uD zypKP)dH-y8cef8p$mMb#hC+u5M}jPIDgf`2EvUaWBT^x)onz&;E+;^B zfwNtoZ;LLn&FCTp(Z!CGrnbw?OPu~znQG}EQ_aqN%yn4tC0d2M5l|7jMkJw?@9VQS z@|zpH1vkohC}-tLrEFUKey@Y2ptVoW0J9%MCZxY!Etk}?6Yc?fC=&tKW0cziHf>(1 zp=nwcHjAd;WjD*2%}wQ69iGsu#bOnKY}IuG(JU0sLem&Gs+Drh)N9}wPy&P_1Wth+ z$rgrTbnwvXvWJ2JDdcuRA?`Z#gz=rM0qy}}g;zI?Zj$(X6rlhM(FGPa&d$yn*a=3s z6BohIEs}JUVd6N2O+&V=Fc59@*VS({F?R3%@*yqkw#6h|Sa z1*8|{bhhTY9>wT3;Z6rUe|{euW2g?@_OgCi2d#503@PkQ%t(j&NSy);^5bclpeUeq-iN!hSrL{M1=Fm+Kq`Jt>;u%== zWN{WRp^hAGyykEbVW@~@Fa?FFPLcl2`=JbTpNv5-AsD68vuAF2mO1Dp&yHbumI)rg zvv1rN=ZaMbf7hX0zrMK0UBAAvv~>3ig(3gDNXwY~JLcicOnURnhlean}r~I>4-@gcb{~8(DA$nXZ zt681z1tHjPtH{xcH~`cWwwdbAh7@qKW}^flw4KBB{t6YPApVgiv7xF4nE(@`jN=Uj6dRFJBZ)_teee zSy314HptJ{YPALppMoeTazya?qJXq3UQ0a(J}3B64*g_*74E5R9UrTZ{WJ}|UX@u3 zM_X8&xctAJiHW%xLW=rJq&zvkWou#F_^6R&EPTFjD}o!CJq znGEbCJ39*>GyIR4nQ_lj+cUez%*@R9@y^cd4u-*T5;I%2n57o<|5pM#@?_xnDk-bg z>MpKVuipE;SJ+y?@( zuX8<3o<5yicKy23+F$4z^&RSJZgzgRrJy-cfvk>6?jJvR@OabQ9G7cljlXh*)ZegI zV<}J{tM&fn>qB9B|HRIq zwpUU;fm6X1aWuNMv9?xgWr#8PUYIJv8;-5rSTeQ0wliit4W2#iZft4NIfM%^#V5Za zOnab2yZm%3odvYr1W?O_k1hjm6ejO#yxL>sBV08T3(J#JpkmV#6K#aEvxSGo z62rBEymz+TTb!P}N^V5>8{`I&?YB)2#gA53$hioAj+`S$droW1PP0Y-Ec!PUNb{=(elBS%tYKF zesuFAmOwMtW*d9Z#_qvmd(PdSmC>Y&OQEbs8qn>5p>>o3rEQgT>c~!qKD#bh)|j1+ zXH9UQJ?jzpt~J3sIeBEM6Njy$-m=xvX65HC2Hiboe)#axG+<)Wm&{-JwZHb)e&rIr zpDh-F7#AUgj1}t<<;HeVgv|8DjW_-Ai3x#%nWRGe$-nz||L%!^@613JPlL-G@d^>; z+%V)vg~GXWZ+_NFmvEE=4oBc@x&O@9zIL|%V=G-|d^~gN6i+2pRVB(N5~og8*D!Y0 zs-Lyeb!;qVhuORZgv@5!d~knplh~d-&X%yol(IG-#+gZI0DCRn$@I zoubgJwKh`UjV9vj)6?m+cVx^+)YH>bLjg&W0z>Hb_5%7^AyYYci7 zw8o%UZnj3dWS84G>K-@rcKg^+?kC*LFbX2SsQSVSFQ`RqRkW~xQXCZDwB&N9PTklm za;<{&80XIqIT;Fd$S6)u7O!TrS92&p4idm%s|$L)mNzVZe>9425L+2{VV{R&6Jyn6 zl27N(OxPe$gFtF6k40rVm&y}e$4;wbfasFk?xB{QRDKzqvKEV#!_6g78|s)#K?Z;O zexhR~MH2UJnoT_6`CP7LAz#rWE-+!cSW;jpWf=yI3d*t)=A$U2M!L&paatFavUm#J zIcy=>rw^?T3#pWt2apPxk)#>uQp&Lyv$J2$w~V-k+-|93+Qp-2C|kW$ynNn$WWnV= zH&e{ljtsl3^|}?wD6$+xVUSI36@}YHAtQob!CVdVto=R%ef~nHAAz%o#xlint=dxT z_HtzgxAZVWat7(3RO4i)J1o0TW0QK?En#zeMKfVV>*?!p*~~)33aYoBS4JT{D3bH% z=fZqpH(QTzqTL&opFBqYEIfXy(fjw0d-C!iAtOa_*u`81*=BOhA@t5WQDG2GHz?#b z-}`U>?Z3UZnZqjzsYJL6QRdyOb#ASdh%$n98#a+L+EH^k8DXa!VoT_XKVYFnx%xu< zN3%}q!<_@)aLWCq0?)s9dviW9E`-Ojj;K~jqQpTl|R+h z4ZXp>fH~q)y#4)|x8Htyy{wEp+ZQ?TL4qs^To`7RKEf=}@87@M?2uy$cjdVh?k2ql zwP9MiR}=>arJ}gz>85bv#Dq9DX4E-wWL(`iI2ao%ErDxWDrpw0Ro9LY7-*diHNu8G~6{QU@DbNRaBpkL=X4lU^n-+*4IDFc(XqqJJ{db z+1glN-%pQvy}n>i@4z5JlzfI&=L_EcfX#8Z6J1@|*-h;xOIwOMbaujH6F$q-v!8dk zJ+8sA@$rclUsv+^bZTRLb#>|8pDB~iWdl0c;Tokoaq05;fW2BRHi+~jq=osVr7MFG z0r|Z4%jV_UOK!{K)r=`D2sXEW0Hf{eUth{b1dR4an=Nj;2Wj=Qb@~NLU-+q^yZl%# zH&%Mb`#s;|d8Z`Y9r`Kl@AwzMZ2kLE*}2#nD$rfA7K|Y_|wYWox#DK`^rxbvbX-y5q5GMZ@Ddtix$}H zI;nHj^Gek36Qk(lv#gshZf#xstRZhw z)s+?U-|00#If4B84fy4^G_jk73Sd!YtIOu``PSDr*S0^p{b2LSmM(C0(2fQtcqTw$ zCq0V33-)EZ0!v%7&Fhj$2D_TP5H{I7-q8Nd$B$OC^B|~U`<>-1v5n!KF&oK3C8=Gg z9!3+`D3_|agY9jf&(4PiFP;xLO}wEv-3TgQ+JddjX0C36to_WO1&!RVx_maNCi~m~ zyxR&pTbb>&1a1fc>lR1D_UR#;phsb&eoz%`gGVy@R|Z=girYnaDssHQ2z@JX)a6Ma zkckPhM%>ubyXhL8tp=V}l-z?vC)@kC-s+%JI1P#~bf$KDO`$vf}7^LX#oSNGO% zv6_DM)wE`5!s1Ofg{yIVE#ka560*R``{G46$wkppZujx-)-gzk)Y7BHN4sV=*BH`qx>%Ufcx)51bISBIsUI91 zEH8)Q1CGV{9yJC8{I04#c;GoT<#(&qS1(noK40~gDBjW}4DeT=RSSbOed(&t=X>d; zdi~O+Fn{S%z5ZEf^Uubx``c0}_m2c_3T!ov{)gJ-3+4Y1Rqh6U1TvrZ5@*XheSJIb zmz4*1gqPj5i;4F%DvDu>BC$_QGf`ym*jL0)GHV7~U*GP2wrXOyzaoNy3v(m8v(?wH zHqszFyW87)_((x24Zt5^2&Mg+6^Oq?JXYkHdfrbOhDLcKf}Vc!RC#xIWXLJxAu&Hp zQ<^@+MV6|;UZ7bdCy+NjyWI!Lt3%di$MJm>Eb36eT&>k@c86GJ7{s*R^rEL)BwmyN zr;(54JU)yulY4b_gu&<*FwDq5)5ve0XM0yR1H|~)zGpcont#2S{PR!Noa)-Kt!^)q z$?W{Yr-Olwjlkg2Kiq*##`S~F#Z`}IbLs*qO}4 zL?V$YNdqlm$-c%~v>$XJ^B1UtDwsf({eaB$yLTo@SXWF7i@aQW9*JZdU!7 z>h)6T%$dgnx0)_#en}&LDop;^yyehW-LP05KCJ0uXYx!>{Th-We?3h8@_c8ve~fL$ z4DqaO_YKFx^w1YRk^l^@7xP0KqDuN>X3~7iKFH>BM=s=v55rD-x^0Bd4y0-ROn`<86t&kmCdD_T>aOE4cMYWQU%_nKk z-d@kKV-cPw^?F#nu}^|nD1u}kLV$rRBfJSL3T`O%+*ZP@gff)bXgTOkPtT6lqnE0p z-3?j1+b&j1x<2d>bxdzvbPNx_c_jB`9{+rh7%4SfYGFx|y5W9SU_^^-$z8`JSWfG2 z`W91(I2bzclF$nFxa!*=@aR^};}~+w45^<3m|_?x{mH?Qxr0=8ASc(e5+iYKIPUpw zB}^6~`~q1ZGXKbSL%RL``|>3-F<&Axt$y*NUwQ|hl^A)~*z4U3 z9QJO@W=J^A_}6-W6z@+Co|GVU(%1?N46t-q3GfW%jsw7}rPan_>3#CS+i$C#L@(86 zj-~51@~ljW)rTvhI%40B|6q7cq=ePvNCP*;C>eH2iB|An%P}S<@Esxp#un5d<9QUT zS<&*39%=6MsZ$d{^lWeEb9%Nk%VL8`xepU^mmNsb-)SpI5nOBuQ+yE%x+JO-(X72-lRvE<&Zcp9bHT z*&nsQ8;NBf-@E9}+;Q6;)afCT|V%$&^BlYOf zxasuiiPL5RA|-}RC?b!RRif}+U9;YW5>5}TDYGv`_MxU#k~y;QBKEMsdcGc%b^vJ9Io@#0|1w$bGj1ln$P z7VtLbbXAfQqa?kw#Jm?yBrDZ;*e+Z80GW(2jBPD~S>zdu3R7ri&I;%+LuW!Q5#|quhYz$C;`^v1#)45q#q5sDCM!SNuIOv7r?bCEHA32?g}H|3lEID~d(Icgdj z84CG4zTR`i>ts&(<&Bk<#*4q~m%ZrbB*m-<95IuD__PP8;(~X&S*i)N+yI+CgwmFj zqBV=G7Tgfq-v!Phn@n4Q8#hc+pm4iD%lf>aPff)ZY`UU&$p@ixx#S1Rm%gNg1>H=N z$*`zDeym#ukNs#eyNA(!NIrJcgf>-r7Y58_0I2)>?V}eEa8DNdF-7MfpLui`A+?Ak zHLWzIu!(Jd_ld(n3XzuO>6rB^U%CFmg)5`zAdvi|Y4j^!`HFRKdFcth;U2B-F$*Tm zWwqAt?lCKP>C0c!Z#4rG-ey`Ix`T{*+;BfI;zu)Grr!xmn-+z>7C=HMO)a5UH`3J9knkm4T z6OiWqQ|D)1xOR<`jA9!6+sc!>_g&=EOazYo6k_5Ln|Ha~AL5Jg_(AkAx(MM5_dzdg zKBp1J=56|mmIqHVswhf|%|4*Bt=DgPl0nLl&E0#@p2a;KY&H}>m!7v5fb@m!N8Z_< zEHB$^%i=`(?QbO}#Ol=cI~t`l{3&|^cLzsnfBMwE`;V4}f}5Mcq2+(H3z^JrfB&xg zhg^@>yxz6Pt{-wY)9U7o2}>hz%%e2PKPOk;YjK?#<2s*VQY;UBkK%{^MVXQo@7XMa zx8o7g{gg~3AWUdVV#s$jy0*Y-V$(BOu2)V%ARJa+qS*N~7c6lTLQ|OVBSAB9yX8tO z0Zz1BWMek|fNkz{h`Sh%5g~k7Xv86nh+wGoU@yM4w6(ppy`9NGO93w|PM5>$CEJ4| z+pxWtRi#(l*hBz`D&>V%SAcT3ZcVnYNy*nQH6dT_25A^m7 z;uFR&g@b)X^1*&P1!ApF-EY9~;vVD_GvtS{#f<=hg zQw#O<5@_+G4I4jyzEl7TO6NpT$RQLfRB$I#hU8_+tZ|1_DoJj33581IAPLk|1)z2+ z$|jjqD%onSVMO}s>F?ga6kFIhsHou3u_z^p#XpG^;?fr!^869kfQa?7HGD2e{d8lGUbUjl)Fh5PKFnG~CO6^R*nrw<*zTsSd@C9 z<#99;3-=VW+$d*3d!jqhh4@$`;zl;zv z?XsHhJ;*jK5{9itK5zJ-BlViN-Hkx6*F@Q&4ba@A*nW-&P9{_>IvL2^7qH>Z+HU!S7)j4i{+9(xgE`+2MgCcMRWc+MJ1}=3 z;AMuDRtZVVUO%(+8nV$8%*pU;{cxS>st?eTW^`=@gNq|v+wZfhv&$!~tq_$b&1d0$ zbMlt#-6ZQ?@$+s zc<^w)Tw`XtRUR@lM?){>wwqo!-I(+J4o6tIa%E>FY9NGZ4Q|0IIMrf$%Ee_sOb&>t zZ#Wto8}s#g0#5jIh2X`la!7}P8hTN`kizyCyQy5*^5B6<;#uJ(nWx7+gGk7f%Y$Gl zMb|chK2pl>FM~WK3xy0UV{(S*f$HB`E$p=%nL&SAZd8qkn-fg|=6}DixX842RYqaM z)?2#`H&(Av7##HALo`V9oQ?SA<^dau4Z@tz zIZ2A?oQV_HK5~fb?WS(flxLY)-1Hb4%LzqA6V`AIVFm;G++aGnUi_i)r^AwZ(DG2QZ`gp>Q6nLIM z{=-Nu+TDJR(b#o{GGsLN2pc04ibx1Qm|3%GZ}OXTprN%jX8&K?AJ94LR$-9E6oimf z>>NmH_u>6iJ7iO-t@l5~h27;V=k=L;*fRf#0~+F?M<2UKo0|fdsyu4 zW6Jk8&qYoC;-2iy8>K=a1sYr>s>f#-)Ziox8LQRl^GcGDN+x5;T+U)iX>ZyjWFcUs z!qbqh)Zvr2S_efEZJ-KbEXHImEotZPMd^PBA>^e_>CsT}WZfKu9Mf;cs_)0_@|j60 zVMZ_^a#U!_~JZ6Q_fV38i#8It= zI<=yd`h6CWVVY|^rF<2lm>LI*b_`5T!~lTY1%D-;K2yVQ1S!ueShLL%1?9)@VERzm zLZwoVNR$|qP=2nfrhkJ_^4FPnwoXk2Ns1m;Brg*&gXT$Y2p?TiEp{Lwh=`3kVGXQE z2BwM%?;{SQu)S&6jaC3}m|c8=3+=z7{-4y_^Vd4VyX%bx z;ZY!-vcd_}D5VmKeTXh{W!_>d*-Mp@4h*>=iYA-2(I|b+M*6g|(wdL25=vfV^Rd%% zQYKS{mz&J~J_>U8FQ^7pXW1GU`S!f&W&kkE~*WNHM z1CEXj;*R`m@BPWPef_oPmjP>ZDnqQjY=N}8T-Feik6HO_+KOO76a^W7ZFZ~n@j?nH zb5PKgPr=zsyTL$<5dV{tb8SQD9d5<;nr%d$q0m{kNt5T2ciNZ2By77A|w)>mu*&6G~N zR2hNixg&DZs>h!ol>9M5h|;MCnnp33&`5-faHV275}?G!EE`CMSvEAUZ6wRCKVBz= zBXvsZk}O6PQI_h2Hc*jR>nY^wRxfU$;|qC^4|6`gUzdak=B!!!)RqZ;QpuYYR$kA8Cdn|!@soLMk^ zdi(Z#V*7?*WI!F>H~xp)u$)a+5E`7#R(^gn^?Xt@m9c<^xwtOOAKR5o3=-1AjsoCF zqsENGRLm}wFb`7&A_pr6+Mls+{2B|SgVs(E}piRag*EUQ*Bl&oX2P#YHq66YLyzLp-^4xro!ji2pI6(VTE}?agyTB z)|-S6bGgS)-}odRWmW|{oo4(QwRrtuD@S-_q}XgQpq1s%!Abl8^8F!#&RyH6py zv!6jcXFnG`{85zU#|R-*6oDc(V=@^%K9T5&t(~1BWMC01C06u-MPN>53LJB!TW8kE z<|^SVtoJh;@d)3jBR6%sNX)pU5{8kcke-eRA`whNDpwa&Ur$fKrYOzAH46zKb~+$9MZ2L2>%@%#oX-kDUAP@$^6 zL_+?Iys_bMu&DhRIS|<0Wl=lE=vkk^hBP<>|HKUk`$yC;DTGD;4*S=ABG@db3%T}6 zozz~@Oj}zHM+G#k!2Gq`yh+~rjzH*lG*ck3v(o^2lhPBGkxJ`LVzbSeS}(FBG^O<- zxp{NW)OwGl@W0^Q(~RabYTSPJ$A28c)HxF2zVwyXu9JvnKT4=m4^un2xjAy(_!GkH zciwt?RR=+_9vMaO$g+oh4!aYH!8oLdNYvCjWtFpA z@I-AbXCLj9BF@{lZ@%|osnQTYK$NR5UY?oxX1CovS0u2z=Rmu(ZktWQVKvsM&o{?m zW2Vu=!@1V)0-=b6%#*;}Ji*;AITnQyg4pJ$$)pj}+_9983h=Vi#aHk{$-Us8p_uq` zG#Uu7sPT!x(B7W`Um1o}VtpNOsnRp@)EV|xe{9?L7uZ{Btu{T4WA}QOmn|0UOSL)f zTl}A_e@Xii|C{Q+ruMhFfB5DX8-KL%N9okmSIK|FzrToo6;d%ghKHY=6a?+#NMUNz zJ3a!MZDU-x-D#Dv_WW~y!R!6P`02B!U-kK3WuL)EkAj-UGq(CQIV&%n|9CO@+hwOHcN;wotCKV-@YuD^*=L}|E(EV^R z6k60ctb}0>M0Ni8`LmV{F}1cB7DUfZy!TD=9BcGY5X9ByiUa&mdujV z8$w}Eq|Qp7O2iIYE>Qg*7Zy2Xa*_y~A%r|((GwI5PSBjJ%DzCb7ilAhoxSJ*o_q3y zY{KhKr3lugoQmyjwp0Id$NN4jdymf^7+^dIJW{L&ePUftLydHJxV?`on^m#VLXn3> z0JDbk^9Fb)-sU8Cdict%&f9uKrQzF=?fUbCLI{-Iu< zMIt#c2yw!3nu!vy4T8zx@n~J`K1TqVKxV&WZH{zsW5L0e6^tx3F>C^r+%q$7ayu>! zb5DQq7x`gxmLa)`4VxDGocdrZU4@lGEsev7PqZbq2f|XoULfXlG%Q5ZW>V0c4X-zs zGnd!P=3LI}Z8%OlG-okcuP2KZk~6t@-et;RcsMKZnAubn-D1^bj>RkKt+YnExDDBS zbJKA)EnNn)A&!qoPxaEW_Ggauq0AD;=Efwfp^~iK@j2Hf0X&bu)RGiZaseQy~jy&0bO4pDlB`{Ikjf;^aHEh?=jVCC+7^+n@)EYwG))QUTjiw z1C#9W+=*4gXc%nOXdJB?m)cfE0k_xJnm>oJMB2ePeG4nrc79GcNXB;)VIi>_PaZ^+ zB+7|`ZYAdfj~?BD@`Ro52Ds^yXA3Tbq+p;o?CK2!C8)}}s?o8yXyuzu#130C%jb1F z^3BapGxxb5MWK2JJEf8Z%HV{nQhHhyd(&nwZCKG5bX2&LZAdHiEr-oh8&_;Wjx3xn2`PbpcTW} zN{i5{6{u!68G4m7nR}VujWa|c;^AepYVQkr>~1$XZj@7NPoCa}y69ev`p=$ArSmmW zbue^!@2SDQzO^ip%hnZGfhcv&KGhe1{HU~t=MN1k@S3+)sx@S{Yv_4xCbefL0Sjkn zWD-;K#HDlz8J+egKK5JDOxJAGT*Pl(na%!ANs(;#aP(65{j$9g1A84GF9W7QOremGFpS{x`@C5o(JIgyM zZJw(Van4j&y|r36>lgjZNvnyJAQ2(fxz4T(k&v+#7ini)q`l2WZf+iKAnY9;?y%3p z%}uH~IAU-nhd#ER2hR@m7LBJ}!v zJ?zsrFksXRX@pF^Sj=bGRiSQZD)(R^&vAlGDa?^M>zVTrC&yz~8;kDug!~Q@XAo9a z!$_nM42#8Jp9$!|q@i;N!&XJH46~~tDT}hYUBO_bl!+BmhtUt;zkNI6EbTnnK4{o% z3lF!;4NDzOq&?4e8NFlqwYH^uy#d(yq8eUo(mj!}fsh~E=W62q3^&hN@#>-Q!a&YTE~*(|kKsP@f| z|LVpXUnm$ho56lP>BA`h)I3Yizr@LXU}m-q(njJ@GRNj}w;z~RSzCW$bM)xjc~kz| z&g%IupRa0v;Thh1V7tSccTQde50Ok~5*7`-qcG&zTd8SsK3_1oTuMQU@UgtbJ9qSk zgT3LlJ6w=_|0+70pEzHZfPOOa%gh%?1#JUm?Vwm-B8V3Ko)^Va?S{+XHn{oA+UtwXqtAEJRd#BM7`B25PZFv3iL zeefN=DXo3<(Hhdiw?OpG6HmI`3(@F;yP3s2eAEF*H5|jYqcq(ex>ow&gN4G?tBUEg z7AEE}Q6UV*(%0DDrgTRO^Ln9B4O8qJj&pFd<_)0n4vk1*BF%T5%6RnbOvhi6qUglQ z#6@}{L5tg)n_Dr?o=Dg=nZh_H%adwE!LHm*coU^fpt#RuDnkSqi`A*BjzjN`6Y>K@ zRp(}zi=a!Fv)PDrAK`(`8s?+X|NNh|E(G4Vy0M{}D-7zD2a+ib*`OerL(tc_V3)}` zk%qmnupnt~m<568Wfn>xk~h{%9GGJmz~rSqun}u(+Bh4GD^2S{r>)U&;8Q8AY=FVo z$Oi)XHC(J^1A#1(QY6tN6RxJ~`G^xpnHnH-=g<3u;x0faKHtZzHn9&N6~qC=#!2}D zyaKxh5Q1)ZkbSzm%gb$goMrSl+os34+&k|8&~)$KgG^ZEMZ>668^m_@{P~ET;~^9| z+}jNXJQf)o{Wp8v?!?*(LcCImv(MFp+r3e+_aQiqu*Gn)D|=yMX^C{m>BIMKf;QVho3mvrwlZ5;**ev0`sT6CB(u{yG4l>>mpli|#uH;8#bmbc-W>?XKG$ripyQ$+}P?_MM zBSZjs92%-2JbrAqg9GTcyYEQsMn=MPWMt0T60tEPEQ?2yJBDq&e}B#jA)7%dnrfr3 z@8IBnLt5wBGo_Q(ulY4$?$`Vp2;aiO*RQ?y>en?l3=m7X{QA1x&SJIEsFun{Y5)Dd zALjo4-zQ%*{+RJ~?(JV{O5fZNJl754a;>fP^hBeiRwEp*wXC2BMLd=c9_9Ae=}*1J zWPM@!+E3w|=B?Ih)k2}2Dzg;xrmS%XQpa{~qa7QCR@>GpzwoV}uVk)V$#i6_ z&xma8tp?TW*IxcYeROegRI@XYH@KbV-~Rrik<`?NV z0%x%f{8{yTt~BDIb7E-3zMen!mXCPU+p&N9cG&#Rzm08-jBK!|c{@X>P^{IQ&XYsQ z`D53^=GT7I;kb}ov|?p`$*RrG4xx%@EW@4>&73Kf1%li zx;&pGJc!pEi?y{y*-!;7)*8yrcT%Ws$UhREPnYXzX<%*9Q}zef04XF{)XnIgbk%N z45cWB5{49wVkl|dqe2!4|L!~QX0z>4QEZM1*&wx7UwifP-c9x#lPW2GUYDb=o5fSQPrQS+8lL0H2L`q@=ha|g(K@w7wx+C$h2T|U zwH|wvXY`O7Mi@+87@za%!1A)K)<_KW#twTmjdI*KRq_L6UhA?*XwSse z)i7OMowv67xkLOqGxA)^HL8_1m(dL@qX$?9ENb3XYoT&Q=QB%&=56Ki_P8D^*!RQgnlMYZ&CPlH7AK6RH^+Qqo9R)3+wx(F zljX3WCSuv#RvT6_{tw)-j&0C{6Z(B3?8Sd%)aq8_Ai2u%8??kQ}e~LsjcaE`7 z`Oex?V(e47lgY39bzzFgz4rR`*GPoC!Jao5^F%s}4#$|MHt!T66p@fulV?s(Cu4UX zZyg-&uid|S_tE-JG@UDE4_6i*FYg|fnT_g$<-=U11ZC##@}v8YcjD>9;nv#I+c(~S z|EBh8i-yNy$xMtL*Pcm1znMrLUqja!Hw3t1_p_TJH^k(mwG4tCA7q}8$kxy?RPldkM!n%AqiUfPM3J96hcgd!4h?acX1 zN?+SfWb*N~#Rrd`Z0sE5D)kb8EE~J=bioi5T1Xtk;qHi-9WJNpc(8Ea;a)Oo#cV29 zRcs?>K`&$u_Rx+s&d^hbduz*2kZUQI*j`&%xPR-`?aT%38f&#KwQ%=!@|o*=&7fR! zp2Pjnh0`PbOm{reRv!EC#nZm_9x0Wv`wRAfE?iq%>ivQ5pMXEm@u2{Oi5>_qO;(## zfTSGFRw|V%rF85NB1gEo+1h-1XJ=w~bmzgs%Erd##^zo!GXhJrH1@)|g3dALgv_qM zWU~1Kez!N!+uz^YHvl!lHLTIh?(X!kAF2`W;3-_68umT+`s}G8zrV>ZFfYq+I?VHY zVdQWNt{!&cWqc{MuS>Wt9&WSiM3K2iIN4K9o8!Tg2lp11cMcMTaP=P0S=o*CK6=Jn?r@gqk=9$!4T_O-9s{r-{Du)YJWxVF2$ zJ$C)&7hZnll@~8xnz?l8+{D=UTug-Jzs7pR`8@ltQU@3K8Regd3Z~!5a%dNS%T$lp{FMnJKTC2IHMV=`CL|#WMVWSUX&8aEY=S;clWlo_Y*~GVnAW1T5kwau~62_DNquqk~a_h zv3M+=f{9B8Xu}dTSJ|q>+$lh^!cY!WSL07Iffm41p>irMX!|0qoY=knushZ zSg$3K$-(`24SO8qjYmU*P=dUu1gtfRktihW&9&qvL>Kfde zZ$krha0ovcP*fTE;mV55CiA3GuN4!~DD+a>8|yH}e!770@b1s-pBkIk-_l+!$99(5 z7^Ds!X{C8xuC}JfXs@FUTk1fVtRY-aH4#;vHTZY5ZL?-Wm&EvQV84wLF4k?HxBq zv|K*9eqAW{1)Vn4?jJopKIn5=MGos#pufkbN*wsSGO@auUbX~uMn*TeY__GPI2y$2 zQ1omvldsJVi*|1i=H8VWRV>b)!O=daNmNv~A5{GO*~zo%Z0amH4J_?$y# z^;+YlcNJZZwFO*q=m9&+ghlUesiYKzjugv<vlkLcG0hB#eZ63kYBa^}o zJI0Z$Zs({CB)i9})xNP;baCKSJGG%bRLV%3R_>nmd+Ih=jas3IKXAcK*yjkHunXBx74o){@oimc!LM znvBLXd!tTMqb!eIF*9Z&Qz?5;phkM<>60f30CoGgMzLf_oJ(@}or1wDp|dlmLiUBl z@BI8P-N}~1G-wO^9_-|&LbMoPe(=DM?L#lVaQSr5-q_P#&Zc40luE3uF$Ka#qNEeE zD=<8|aO?dK>a|8gy7A=kZvOE*Z&mE4&zu{qZ^dA{yp`op0*8RSMVNtFETjf{P^;;c zie9f*i`k#}zF~`O@p{5EQw{qro*r9?72%iR(u}!q2><^dt-v3orz5dzOJuCq;F#^& z>mPlT%LRk4zm6uV5#i5S7t$pv^sTov>ahH2()LpG7xCs_W^|)2!*S=Mcu@iq z;Va6_PJeJ_5P!J}Kv+B5eh;Z-)^Hrxdb*fmPRW-(TEX8^rD(+)eY|*x`N1H?0S239 z#~^N343ooZ)QP0jbNe3lQmOG)g8e3KIw3r$N@ieEOy%U(fp$#? ziJUp_rb*UTIp~6u(MPwI(RcA;L$Rrr4{k&aB{V)UIXTjAQ7|xjr-B$X7@kq&oundj zX5`ehYhEvq6I0i(Uq93D7HVK9O4$ll=xWvAnbmT&n!vcO5GU z@e!wyK_(f)IXZ3_yrKOC&(pm!kwYkANFtTJr%#DN7=@r=vl};UBnyuoi7+wdU#{1Y zQqx^y(>V+>fQlO#2zIF7?E(>+ldT5F64{m2Y|Rdwti6_9TghhYHRk9MPclc3C}}dF*;Zx0eufgBlKp?x-hs6@@e{ z%3EG}`g%{6zLR>h2EE;7=LHJASe-jSL+}UuiIQt(RMnyGqS>3hX^DupkQt zmEcKB_v)JSsIWD?UCxddZbU--<>jQ|%Qs1P(;GglU zAxA!1;z*3rSfNxZ6fKq_i+F_6Z{o2(LrBMu;^bhBj91 z9%lW`B53@fT|ESD?*zsm0j*@tt<9hC1Hgo}0825UEZ*tHCHfBz{44^O2>>^cwT=oA+JLB^J`!67V9rp2|M$+e-!Vg9&92L>*QZBUOwE@ zC`F&%_(dGb@QXK|MoW#xJ#fCj<*hwkymwDKWsr>xT?b7zAb$YKEEJel$)KP>)Tosq zvMARKSW+1^ElhqyBY!hY`}@N^9+H34Z1qd_w%6vCu1OWbHjTNoc))kZ7^f-JZH zYFM3FoC{OPHF-e*So7%Wjcz|WnmRG@^rO#rOSkkGZF`ui`87B!(TB zR0W0*Uw!y4%b0$WR6C*T0S+K+9hjKl7P+2jbGf%{n%3qlNRAw*$IgVa8i$7#pK8QP zDpgByJcC4u&son(*_u;6A;S&ZH_7Jd#?z;b;=-;{Qg#-!`DT%O%KPU1Qje;I?Uc~N zyw6uKd1=8^Fg$pI6+2sZO3qqVZui1#XxZz7#Oon#;?fQ+lHhT`;W7fJ6ns~Z9;4W@EQ+?({gmaR!9ye)uyX*??MkdpTWhN%X>ak3$z9%FE!5!1@ z#FUl8N_IuxUWt(ySs`29RzG|q>2gPiS>u?ip*Jb4^bzN0c||FgBc!Hr=r!C&{~@06 zB0Sii%k^_AgnlYVtC@Ime9%ra%ub5hhDPIu6{^h%l0mp9hRqnfVa5mE(^V9B!ek%>_G0COi6aBr;`6Dlz zzhMygg#kzMPDbr#K5A4_*v2jZkXL*9cH*2pZNKQqxU|18khz<3u-j@M9_wp8W>32= zrthWg&Wz)NHaI}Ic4%(2g|=hS<1kQ#)uZTeh&q*^X)%RHMnWcbts9cT;y~-?YMR|M z7gzU6cn0^6o@uq=ZzdFxkW0Z-D#-DY<>9SG2yT6o;8y%jhYeN6vw9_aI6OJ1=uz-E zk2iLcd2nf|Tuqzva->|yt-}q`(`1cz_yazt!)4|oo>~JtF?K#&pM@(VlZhli2aWkl zHASgqa(eaR#bHzV-~oKv-P+;A26Jje1x`}c`w!Q10`o3@woho19j;zx*~qFbbP7#= zs?TL6>7CWhWWLgfc#LYX5L-s6qQwTR68n4H4pp2#mW8kr493iL-fXV%W|dXPhC!0a zPEYx{>JHx9sdBE#scfdoX;wC0SR|Aq4I|ga&rK&{xyGDre?KK! zeUq$}DMn00F$55n{e6h(TrfROrFwe6pe?bo*BF+4ruOLed+&YtBwjG!Q#lsRfS4ml z7R)Ztc{oaAR>xD9E?yWmSF@`NlHDbiH3*Hw+};NB61NH2s~#BuW0n;y7F{R2#cL7- zpHC31-u}}N8%+-M1)uSe{6fb^GDb0fuy+aH2otBLd!G*)Yht-3wfS5 zBzA~r*)~fZjyL#hHcgJtLH)Iakh2bU3fk!Kkg86NjUx=WKxb0%vooV|Et5omA5~R7 z%;pa_DOFX?e!oH_N%625fFVl^Ed-fR)7jgEgBf2}+05|f?tbt=o!r*WuCFsQnC)HY zM<7FHm6F-%QcpI^yeV{Q`pm_dS1tqs;{&~umzn8|X6d(*S~-*4-^Wm>g;Ae~zr3@s za1X7voG4Y$&Xn%&7o7kJhDrN;$g->7~;)l`enm*`XzzP%*-8e@7CipL^KQpF&bF2 z6^mkhp}ugJ<3oFa-4@FHcjMXLgY^6DCX3P_<>;O#U?$9_zrhnZ5Q;~O#Hrd%VR!o{ zy)F>i`DyO5-)nb(f+LF9aYG_|m|(LeQT6+SUMrJ5!n#am$55^99)iQh^sK=dn^Lb6 z(H0m5S|T7hBuV6re024}14?UIqru7c=1+FXfpv}6vz?!`%VIgfjAG)3L7_K*8mJd+ z28LNf6s2-}3zR2e7+kel2@2IStnyxrHE%-UQ#S`(vh9ATG#8J_=Dt&tHy z3^O~CFfrx^K&2~0!~pFH^mqu9+$4#EdG4zpY(=*Z>hJ|pNaiDizQI{t*0BFUjKE3! zITw5MeuB6!oIB$o@rMtzH<=jFXndou-e`7tDwC2Oy{KWYV+&Q=PL%9+M-dWp=CxX2 zUaX-9!(WTg@@1Vk#38#wR+3*|Tg?#WoS(U_U1N;G@Nl~pQ*G>@+h!w@KZxMYW{G~V zzaQNPjGTW6w}>F9LYN1Nz!j#A+MN68S{#NqK>imdh9DyC86LKRT1ZzAE@#sb3G3<2 zn>NP@T&7a&+XkO8!NBnUAdLUqy>s_8r55vJhCilL8aab*33Jom?wm(t?LGq{%q%7{)t6%-^%E=c$=_)q=PU*WQeRjGb{psas3xz9jI~Jq(6+a$Os&Xs+l{PjKy-< zd)Z>iXxt@oD~w~v2=GGPxKq`#v}Ca^FIz3;vPJtQTdh^=7r*8yo*qdJo6Wl|6 zlt0||uQ0B%V6~~%(HAaVIptUNs)^n4ow|JGm6?!Q+j+F`aI?y`Xf(`RW0;N1!gn(h zXGyiv(CiN$t!!p}=Pz8uidf!Wc&LrnYs`C$D3?}m-T3z798@Hp{(z}gS-*Yz?s{4F zOuhKh%jW{JHqPYF4TBQuoce~MMNTMJ?ogfJ!^K4>>7LXE)SksxTtOh|d zQh>lY-}G`s(OI;ry`gmWoy>NRqeN$rBFw~?({z_X!L$fzc&%of%r zR`FUDjiBV>JD|7g@p9PvbU&U!=IJ;b9g}i=9rt(Qx$wx-z2p0*dOb{3Vew%5$JsqW z#`k;d90wJKYHBc*gwqa{9H?gV5EEB`F_mEwtkU#Z4EVyHCNo@|@SU4CPuS^@v^Gb)h+R8>(0nT>vqHR_PY`%yj#6b>%x9CnYi}Xy0U1(1ePgo(DSWZ*;CYp?7vvZ~zVWmVF z_dwE`s4;T+^2v9hXWZP}ZREZET38kyKU{D~dnwJ7DV4^?22JP8JGiZ%I(shRzUtCW z)J5i{58nNNc?;B@#UYz&4gHntuUxz+idq*Ex%+L0!?VA=Gw3TC8mWb$-8kh4RnnR% z7Tfg%Lr)qbb!Mj{VFRB0FyTHv;Smx2VmX`s*FWjN(f9VB{MVUtnw6eCdw6*69DVR0 z5P+q&)kvxr?iJj`UATKegU~su?EBGwv5j(Ai^W8u2`O~B%w|Kgn#RxFeq1mLkMEuxR~jcU!2=$L&1x|VGA(2V zCIWh97bc95>6%O%dz@<9da4bKpPo8>dVGBB)Oq-0S4(xlWRZA*RC4f4Je6LxYj#@K zL4Rt3ZD71XL`4Z(IgzX852Fq%SB+At4RDo0D!O|6!|y)W+)TjiC@;AO&R)23=9J6I zOMO%JXWBc6N}3bzzwg=E@!X8ZZ)zO3GO6**EKidq(h})QaQ*c!5 zH#R-yvu)cRJrGUO17|{Z1$N`a&E``x!}<|7j!1}t1s-nPRZLo*S%yUD(zvE9T)(a; z3*@DjG=2}{B0?|R)joczAF>o7ZR{=df+;6UWLzx2J^em;UkvS$3*>HhKI1l9p)fuZ zwK0cUi3GL)OLNKx1_;;(?--k!eET+~7cY*E%{@P#gt>1=-4O#(GESC6<@&-)O?c8;z?pz>YOuDe?0oiT;a~br5wV@XosWlc* z?eg?=`8v@A$9Jz>{E&fK4>V`qn(@wjwWTgo0jZb6x(;h%{0gsrUESHEE4M6^~;jmTm|)s_(p0 z)uid#O|N%r>m-d$Aq_KPw+|3HzTBKHvjP^nwY9lf@$LmS6ma9Em&ljCbTVI;V}%}q zE0c^HhQ0harAfuwYsys^bWwm?cHe(h8UMb)I*l`Ge-i6Snh zZ*HNeC*LqFn1bA91u1e@oRdmglk~69eg7*K+|mDQ@~v&RcGBC_Qzn{cl61|)t;Aw0 z+(a-q0gBC}2tv~>zsWlRL9ZA4CGMohsByo4oIumNJZF0HWMH5?F!1Dwp(#u~$L585 z&gAt*qm5|P>owZ)cVFjZJ|~X}Es7)Ot*iHlxN1E&V!bbk4opzo&MjDmriaAo+`_tb zsF~*n$n!(SyGVStM1aVnrEJ}1tyZ#}V3i7mvc+61=aqUnZ!nQo!i$Re765$qy8Cs|sznVo@yRe9>H1l}1jNZS_)4wVd8il}bL#n^+-;Y~%Ae3CWlWEz9LRD2=KV zkg3$jRzxc(R-V{2e@*8J;1m!8m_=g9R#lLy1}{tDYi5%Q>MJsrSiHpq08qmazzjmV z%S&}$0=HKyl_*!w*CmOsS4#zhl42bYB@x#1HA1CIg~^g@+BFqP*90P{%+H%>YH+m% zry@mcc7=M?tWtxR>mtRwirFI64H+5bi&c)6i-j5|OPpLa!aYUgP~#cr*UFX{f>ES__dceMs1Kv;k2PdRm%u`3xCj_%;{G=3UPbUR>a3TeEBtJ`lDMX477rK-i`b)>UZBHA43SZU5`S9o5BKuPC$#ctOuKv!5)p41C@n@yRs7V6mA z$<0_V6xvj1vUOsgMP<$kJBPTbkZ2IJ4_^naK-KqjTd`DcH0q_I%}QufJKuiNT7xCF z+1#|=k!5PFa~7wCQ)N_MmesBk`DX=Dv6-Z>In?XGwBs1kB#foM$Y}v6jJ-e>`FsrC zisnJUUPOY?asU7$YGCt`FO&%<2&7TdL4d4sLkrZZwGy7J*Cm$=sBj-r@H!kavm1M! z_mh1$^M0bnPFVa~v7jYSt{F%QNPWVgCM_-H^MH7^-?-E{ zjf+$5H9*igMsqovRnMf@zOmNO{8q_GW`IURM_Ft}gA}U<0j;!ZLOr@C@L@+8KbHAQ z$rWVhd^;sx^Y3T!4ktV7LJ_JJi6_vNRr0a@{gd`XRv&`jx|K-6sYNQA&w&lDaGKX8 zp?$duF)6iT3O^kjs8+0CUZ%Fk#@>$h_Ie?GVjE0>YF@no9-5A)JQi~ zXlg z#=^oz-i&COni{m=E5jaP%twT#>)tR(UBtw&VJ&3T++VO$bRgG08;XGfwf`R&XuC!L z004La49P=a9#9Yj;F3JM z6;K#LUsp*GWl-NXLKEA}k7$7&wiia&F_>m&V7Xn1wRSyr*j>11AK-<3g?IJ?3hgia z107{;c~-VnS}Za&6FA9E=Qnow|#k}$Dp3+ zndet}1?i36gZiqkHd2u`N>ToeQLIf;lFd*Cf&m5y2FeEh*Gv{idjmlbZLyh|nXf(@ zLU43nI1b}yHZzH(_8Y^hdTNK>Qt1{im>}sGx`rMoRhk{oPD|O@?6L}_R9?xhOUyEQ z{%6YUCjE!$SG+j(5|%BzRE(#5S_BOz@q`$Xzeg=9ysD$#)y;@93Pc7kc6HCobmsVj zTW{0dlRw~D6|6G2{uME1bb2OwAP8|D52~;`Itn58PdBKBdc>{7OvEetN9q#1eKxa` z{zwf~u#Qs6X<`L;Ds618BYNo0CYtIXnMS3~6F=uZXcB&?@DCMyu}TB!HqpaWd`Gnh z)QWr5ekHJHTZuRQUT6FTzm9YIC$YgFbt?WSo3*px#@V6|Rh&3MnR2)-^dYi*r5=0F zqxR_-XW8!&?n$h@qub1nlM%|?(>GC*DM8#gO8o*2P>%Xn><@aU!<_mEUJW<6G@*ZE} zeszlc9oIUAF5@3%orF913jaB=g5HGe>)#f!N9A|{Op^t0Tt^ayzki;!Cq1op*H0@5 znNeImGt11(%uXT*Gcz+YGc$8yI%ej}F*ECCTJo#xRQGhhrmt#x5fIbKt%}U5S*&C`i`mKh zY~n-q`uhERk$3qr-)0}*<>!2fUrKyWk(Tf`eNR8r4E@`mMQ)@!PK(_M?gU-s9(GUY zYWI|TS~t4q+)KLIz2&~4JKVS2clEOSzWb$KcYlqX_C&p-{`zV(F#5DU#(jcO#wcTy zG0GTaj507J%F3+9gM6DFziG#0zg0_NWfjqN!SXNLpobm3=>|ZQWZjnJQ>HPlJf7qE*YaN~^U-Yqee*v{75MRok>(yR=(J zt4;0d(CIouXX-4St#fp~F4kqbTvzByU90PLgKpGKx>dL7cHN=7bhqx&{dzzT>LER> z$Muw+(X)C>@9I6huMhN*_Up6yvc96P>TCMCzCmm5cu)b9vD+m6M|rMnP`m0&NPl<&)K^Q|+7Yd$33D%G{lL z8T2IBy$5o8a^EfgRqngtb~7M|z7F~!=vPp6qo4C+?&bU}2vX5ru`S!_?JQ)^_A(Om zFBgYAcc}MgVC=5Wjr6^&KGYFuR&;gz&5B*Ya(m*>+qWU%e}h@k)x;HZfI;@gqb*`q z`r36CIXvBl`tDs#{RZ>v-JZ%nVHRXBHLD@b8E~%oY0rV?x41nO-CMrceVbzOQnM1` z;xM4aa=QImV1)UN?%QP}iet@6C|3Rt`{r}z0b?y^NvNs(DbQ;E*mUl+ZVroo2uwGB zpi6ScR=()1A-J+{Tkhm;A& zWxj)!K;OVOjMK<6$d29{Dj}>bNo)~=o|bl^O;N!gnpqvSQddt5Mc*XU&ng5HMppf6=t590n(@~=A1c_;D+sC z2boWHkkm0RlGlk;_ac8}IE&{=1?Q8(G&_e&*g4^r1I$ITb{LT+qP|co^6}gw(a|_ZQHiGYwGkWzgpDS^{;j(-EnuY@E5_L zvRkd!G2BlSv;?NcIQHM2(}lZ(@(ke_K0Z@;o{!HG9u)pENJ+_T;ep`+OL<_9Wtdx~ zGEa%BMV#C_i$N-Ps`V;ef6VWIg%Y_p`~`K(3eNK_w@YpYKuerg&qo#|k*|wHxp}~1 z$NbXPack-^8yRXNcjbl<@;9HeOmZfH@^ax0Hs`|B$R>1hvOb+Yo7PmfwkFZS!2t&0Js#T;{QuP)pl zlv^ch8r-5;%_S?HlzLT#upc|~687==+IynEaO_T86AOFgTD=)Q7Iup6P_Je5H|w1i zh zGHi-f6}%*>URC$G)W0CPWt=r>EeoohM!6tGpeGN>IK$X@8zxB?g)^<&1w@+v3G1D^J(s^GOP2=?S)|(zY zMj`9!t**VYWm3<{z=0SSalK0a4rr_U&*o&FaGuZUBstrFzKKS1mH_>P7XbxyuEUm@ zF|JHB1As%KX=VHOtIQ(xevsKGd*U(3Z1LU@H!d69lUbnNrc8(A1z-+ItsUIFX9A$( zai?-;!Vp}jd#g5e(^oqWRI@)u>m8E*Oub&|+pSk&y$R`;)Ekz*I9VUfEW}`>Ejd}i z25=q(%Sg^hZ9CR!KqqOTfp4+1o(k8OZqDs&bHpMciM=@;dXoadFd67X%|dOrRgU8$dH$@ddx7})xbe)rVIFo8K3Ojsl!%V35B%UMks-?tWV9v6_~ zNuH&KF{X?<_I>g#8k+uQFpb6){fuuJ1Y4Df20F{w$_P% za2lQE71*CUc#u)1+~k>JTA6;#w__N>Rx`{DXPX&m#<0VTH{;o3CYvej#mG19em*H> zCR4&1o?yjNrrAk+PD$%#)|9Ye=1>XyMM?WdNjtlw&5_!DeNIOh^zb`;Y>eglp2rDi zoQL(yPkiKuvE!#b|H!iZ5}+$S*)sfC@>_e=c*(k$hN_w%s)?fN;#HGG^@-=7NId2F zr^3}d|IG67yJ-lsWH;3(Ag!nG`_{_j+?C6@%gVW{A?L1+oV&Vu;zFKrp8~-c;Eyph zVuV@``*()575qhQ2j4@@(&=iK>!(#D{r-iFsG(!?0r2x=UWH!(et8r>0Q^ey{}a9u z_>J(qV2#e(Z!N>`r1V#!`Umi9;lBv~0{Fe~pM?(rf3RFm9z%qYnW~SWDKiK#VZoj} zFwP?d)YiWZfwmaa0lA<1S#K(}FZ0~YvLTh+0e_5fW|S(FiyWmB8C7)BF%-n08L_iyaI@PX0k^0EkiBYn-Ps|&Jg|H$1)7iem$o8 z2BPmRrGb>XS{n+dysD9?y2gA1y=Y^8004LajM4*a1qmF);hFzF)#jmWjHd#D@07ChilML(X8CnsMvy+?6BNi) zCucXqQPb0Ni#TEZrO9cWHoMUVlQ?H~VR{yq{AaKFLvL_<+rrY!Jnq?aqxtpm$flc? zmE$S30cdr=0gZk)A5g#(Hh#*~6Rao$~JHy&!Nw;JUzLf%if@AtfO_p`Os>(6Z10 zIKNy=+Yi&Y4-ernJcZ}*5?;ewcn=@p3w(ngX!J3ZcQBH%Ok^sTX9javz!Fxlh7D|C z4~ICxRk=3T=PZ}F6?fon+>871ARfkJcmhx189a{{@iJb;8+eQEb`KxmBYc9-@CClY zH~0=e;1~SP%mNl^@s?_7mSaU$W>r>aP1a^z)@MUDW-HpNwx+FXGq$14+M;b{TiJHD zlkH}EfgA^MupA?ixn0Wchh!?g~QBjiYFklkeuIZF1Fy<~6MMLd|2Pn$IdYEMPU;U@T;fTEtqln00Ci>(x>=fNYlz>69)Q z9%i>zkMv3(3{SCNt5KSy8OBVuXthd~OvnI;A3=I$P=;h!Mr2gR;F#ZH_$~B3TdW#l zacZc=t6`R)hFhWCsD@cV@f|!QEk9aJH<&ljX&AuVGtu&6{}%&tbui~K4!5c zw#TkG5GUY7oP?8c3QomoI2~u;Oq_*_a5b*M9qvE;r?$!g# znBzWTHiZ&*E^X+}YPNeuC;GcHy&24CCfi?RTIt>WJFr>=)<}W1$^siO3ic0SgJ?@v zS+XqbvQV4cyKU*+Ce5$b>fMv5ZZsLj=n3ZD9j418gejp>6$V}$5R6{95T}2He3moBCbQf{vdG&1MQbb4S>ry%X6Gmy*9#3M(H{tRb4(<8$#o#W9z)m`>}OC;VWH38!gb5psOjQ_w_{8PB&ACoQt|AswnD;^nY_@ z%IT`Wa$QFj9yg@E+?1-lCFOi;V7YFOYPaZ)z%t$C_^Ipf#?k5WsO4JZQErTm+!ph? zGbR;%VK5^Z&s05>eD4jP`;Z>h{o(UK_&ive?!!ox7+qsuF3=*a&`S5&GiF)zOg;_$ zu5anGRy)o!alDtup_TmLkXKOiANjP9@5=!>x#;PdtGJqLxR&dukMku#L9KHrp24YTInP zR%?ycYMs_=gEnfDHfN)<(b>$naFa^+ZDL%tt+@;K(EnVkAM>|q_d66f$1hH+s)k~i zRbX_-=m;S-Cwb&AO15&HSjbnQS&-Ajb+H|`)BJ}~h&^~OE&l>0;q(`H0Zodv6#_v3 zME~sKZaErW0hBHOz6o*a=wfh8txO1xk3- zY0zT8h7&#lkeI+XTdpn#jM^nasUV(f%*)S z000000RR91000313BUlr0M%91RqCtis{jB101V9x%^8{*nkHr@W-~K0Ge7`90002Q CLkb=M literal 0 HcmV?d00001 diff --git a/app/app/fonts/GeistVF.woff b/app/app/fonts/GeistVF.woff new file mode 100644 index 0000000000000000000000000000000000000000..1b62daacff96dad6584e71cd962051b82957c313 GIT binary patch literal 66268 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 >-Aun5A4Gp>4U0IQJ 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 G)cz05(PHWV literal 0 HcmV?d00001 diff --git a/app/app/globals.css b/app/app/globals.css new file mode 100644 index 00000000..e3734be1 --- /dev/null +++ b/app/app/globals.css @@ -0,0 +1,42 @@ +:root { + --background: #ffffff; + --foreground: #171717; +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} + +html, +body { + max-width: 100vw; + overflow-x: hidden; +} + +body { + color: var(--foreground); + background: var(--background); + font-family: Arial, Helvetica, sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +* { + box-sizing: border-box; + padding: 0; + margin: 0; +} + +a { + color: inherit; + text-decoration: none; +} + +@media (prefers-color-scheme: dark) { + html { + color-scheme: dark; + } +} diff --git a/app/app/layout.js b/app/app/layout.js new file mode 100644 index 00000000..08210cca --- /dev/null +++ b/app/app/layout.js @@ -0,0 +1,28 @@ +import localFont from "next/font/local"; +import "./globals.css"; + +const geistSans = localFont({ + src: "./fonts/GeistVF.woff", + variable: "--font-geist-sans", + weight: "100 900", +}); +const geistMono = localFont({ + src: "./fonts/GeistMonoVF.woff", + variable: "--font-geist-mono", + weight: "100 900", +}); + +export const metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ children }) { + return ( + + + {children} + + + ); +} diff --git a/app/app/page.js b/app/app/page.js new file mode 100644 index 00000000..a9c3e29c --- /dev/null +++ b/app/app/page.js @@ -0,0 +1,95 @@ +import Image from "next/image"; +import styles from "./page.module.css"; + +export default function Home() { + return ( + + ); +} diff --git a/app/app/page.module.css b/app/app/page.module.css new file mode 100644 index 00000000..ee9b8e63 --- /dev/null +++ b/app/app/page.module.css @@ -0,0 +1,168 @@ +.page { + --gray-rgb: 0, 0, 0; + --gray-alpha-200: rgba(var(--gray-rgb), 0.08); + --gray-alpha-100: rgba(var(--gray-rgb), 0.05); + + --button-primary-hover: #383838; + --button-secondary-hover: #f2f2f2; + + display: grid; + grid-template-rows: 20px 1fr 20px; + align-items: center; + justify-items: center; + min-height: 100svh; + padding: 80px; + gap: 64px; + font-family: var(--font-geist-sans); +} + +@media (prefers-color-scheme: dark) { + .page { + --gray-rgb: 255, 255, 255; + --gray-alpha-200: rgba(var(--gray-rgb), 0.145); + --gray-alpha-100: rgba(var(--gray-rgb), 0.06); + + --button-primary-hover: #ccc; + --button-secondary-hover: #1a1a1a; + } +} + +.main { + display: flex; + flex-direction: column; + gap: 32px; + grid-row-start: 2; +} + +.main ol { + font-family: var(--font-geist-mono); + padding-left: 0; + margin: 0; + font-size: 14px; + line-height: 24px; + letter-spacing: -0.01em; + list-style-position: inside; +} + +.main li:not(:last-of-type) { + margin-bottom: 8px; +} + +.main code { + font-family: inherit; + background: var(--gray-alpha-100); + padding: 2px 4px; + border-radius: 4px; + font-weight: 600; +} + +.ctas { + display: flex; + gap: 16px; +} + +.ctas a { + appearance: none; + border-radius: 128px; + height: 48px; + padding: 0 20px; + border: none; + border: 1px solid transparent; + transition: + background 0.2s, + color 0.2s, + border-color 0.2s; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + font-size: 16px; + line-height: 20px; + font-weight: 500; +} + +a.primary { + background: var(--foreground); + color: var(--background); + gap: 8px; +} + +a.secondary { + border-color: var(--gray-alpha-200); + min-width: 180px; +} + +.footer { + grid-row-start: 3; + display: flex; + gap: 24px; +} + +.footer a { + display: flex; + align-items: center; + gap: 8px; +} + +.footer img { + flex-shrink: 0; +} + +/* Enable hover only on non-touch devices */ +@media (hover: hover) and (pointer: fine) { + a.primary:hover { + background: var(--button-primary-hover); + border-color: transparent; + } + + a.secondary:hover { + background: var(--button-secondary-hover); + border-color: transparent; + } + + .footer a:hover { + text-decoration: underline; + text-underline-offset: 4px; + } +} + +@media (max-width: 600px) { + .page { + padding: 32px; + padding-bottom: 80px; + } + + .main { + align-items: center; + } + + .main ol { + text-align: center; + } + + .ctas { + flex-direction: column; + } + + .ctas a { + font-size: 14px; + height: 40px; + padding: 0 16px; + } + + a.secondary { + min-width: auto; + } + + .footer { + flex-wrap: wrap; + align-items: center; + justify-content: center; + } +} + +@media (prefers-color-scheme: dark) { + .logo { + filter: invert(); + } +} diff --git a/app/eslint.config.js b/app/eslint.config.js deleted file mode 100644 index 80869df8..00000000 --- a/app/eslint.config.js +++ /dev/null @@ -1,19 +0,0 @@ -import globals from "globals"; -import pluginJs from "@eslint/js"; -import pluginReactConfig from "eslint-plugin-react/configs/recommended.js"; - -export default [ - { languageOptions: { globals: globals.browser } }, - { - ignores: ["dist", "vite.config.js"], - }, - pluginJs.configs.recommended, - pluginReactConfig, - { - settings: { - react: { - version: "detect", - }, - }, - }, -]; diff --git a/app/index.html b/app/index.html deleted file mode 100644 index 0a1a8b61..00000000 --- a/app/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - HackYourFuture - - -
- - - diff --git a/app/jsconfig.json b/app/jsconfig.json new file mode 100644 index 00000000..2a2e4b3b --- /dev/null +++ b/app/jsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./*"] + } + } +} diff --git a/app/next.config.mjs b/app/next.config.mjs new file mode 100644 index 00000000..4678774e --- /dev/null +++ b/app/next.config.mjs @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {}; + +export default nextConfig; diff --git a/app/package-lock.json b/app/package-lock.json index e0c6ce38..f5111826 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -1,908 +1,1191 @@ { "name": "app", - "version": "1.0.0", + "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "app", - "version": "1.0.0", + "version": "0.1.0", "dependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router-dom": "^6.22.3" + "@emotion/react": "^11.13.3", + "@emotion/styled": "^11.13.0", + "@mui/material": "^6.1.6", + "next": "15.0.2", + "react": "^18.3.1", + "react-dom": "^18.3.1" }, "devDependencies": { - "@eslint/js": "^9.0.0", - "@vitejs/plugin-react": "^4.2.1", - "eslint": "^8.57.0", - "eslint-plugin-react": "^7.34.1", - "globals": "^15.0.0", - "prettier": "^3.2.5", - "vite": "^5.2.0" - }, - "engines": { - "node": "^20.12.1", - "npm": "^10.5.0" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" + "eslint": "^8", + "eslint-config-next": "15.0.2" } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", - "dev": true, + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", - "dev": true, + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.0", + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, + "node_modules/@babel/parser": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.26.0" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", - "dev": true, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.0" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", - "dev": true, + "node_modules/@babel/traverse": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=4" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, + "node_modules/@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" + "node_modules/@emnapi/runtime": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "engines": { - "node": ">=6.9.0" + "node_modules/@emotion/babel-plugin": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", + "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.2.0", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.13.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", + "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", + "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.13.3", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz", + "integrity": "sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/cache": "^11.13.0", + "@emotion/serialize": "^1.3.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", - "dev": true, + "node_modules/@emotion/serialize": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.2.tgz", + "integrity": "sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==", + "license": "MIT", "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.1", + "csstype": "^3.0.2" } }, - "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", + "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", + "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" } }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz", - "integrity": "sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==", + "node_modules/@emotion/utils": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.1.tgz", + "integrity": "sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">=6.9.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz", - "integrity": "sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==", + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", - "debug": "^4.3.1", - "globals": "^11.1.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">=6.9.0" + "node": ">=10.10.0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", - "cpu": [ - "ppc64" - ], + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "optional": true, - "os": [ - "aix" - ], + "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "cpu": [ - "arm" - ], + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } + "license": "BSD-3-Clause" }, - "node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", "cpu": [ "arm64" ], - "dev": true, + "license": "Apache-2.0", "optional": true, "os": [ - "android" + "darwin" ], "engines": { - "node": ">=12" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", "cpu": [ "x64" ], - "dev": true, + "license": "Apache-2.0", "optional": true, "os": [ - "android" + "darwin" ], "engines": { - "node": ">=12" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", "cpu": [ "arm64" ], - "dev": true, + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "darwin" ], - "engines": { - "node": ">=12" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", "cpu": [ "x64" ], - "dev": true, + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "darwin" ], - "engines": { - "node": ">=12" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", "cpu": [ - "arm64" + "arm" ], - "dev": true, + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "freebsd" + "linux" ], - "engines": { - "node": ">=12" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", "cpu": [ - "x64" + "arm64" ], - "dev": true, + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "freebsd" + "linux" ], - "engines": { - "node": ">=12" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", "cpu": [ - "arm" + "s390x" ], - "dev": true, + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">=12" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", "cpu": [ - "arm64" + "x64" ], - "dev": true, + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">=12" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", "cpu": [ - "ia32" + "arm64" ], - "dev": true, + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">=12" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", "cpu": [ - "loong64" + "x64" ], - "dev": true, + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", "cpu": [ - "ppc64" + "arm" ], - "dev": true, + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", "cpu": [ - "riscv64" + "arm64" ], - "dev": true, + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", "cpu": [ "s390x" ], - "dev": true, + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", "cpu": [ "x64" ], - "dev": true, + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", "cpu": [ - "x64" + "arm64" ], - "dev": true, + "license": "Apache-2.0", "optional": true, "os": [ - "netbsd" + "linux" ], "engines": { - "node": ">=12" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", "cpu": [ "x64" ], - "dev": true, + "license": "Apache-2.0", "optional": true, "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" + "linux" ], "engines": { - "node": ">=12" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", "cpu": [ - "arm64" + "wasm32" ], - "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, "engines": { - "node": ">=12" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", "cpu": [ "ia32" ], - "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", "cpu": [ "x64" ], - "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=6.0.0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=6.0.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.6.tgz", + "integrity": "sha512-nz1SlR9TdBYYPz4qKoNasMPRiGb4PaIHFkzLzhju0YVYS5QSuFF2+n7CsiHMIDcHv3piPu/xDWI53ruhOqvZwQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/material": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.6.tgz", + "integrity": "sha512-1yvejiQ/601l5AK3uIdUlAVElyCxoqKnl7QA+2oFB/2qYPWfRwDgavW/MoywS5Y2gZEslcJKhe0s2F3IthgFgw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mui/core-downloads-tracker": "^6.1.6", + "@mui/system": "^6.1.6", + "@mui/types": "^7.2.19", + "@mui/utils": "^6.1.6", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.11", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^18.3.1", + "react-transition-group": "^4.4.5" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=14.0.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^6.1.6", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, + "node_modules/@mui/material/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/@mui/private-theming": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.6.tgz", + "integrity": "sha512-ioAiFckaD/fJSnTrUMWgjl9HYBWt7ixCh7zZw7gDZ+Tae7NuprNV6QJK95EidDT7K0GetR2rU3kAeIR61Myttw==", + "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "@babel/runtime": "^7.26.0", + "@mui/utils": "^6.1.6", + "prop-types": "^15.8.1" }, "engines": { - "node": ">=8" + "node": ">=14.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@eslint/js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.0.0.tgz", - "integrity": "sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ==", - "dev": true, + "node_modules/@mui/styled-engine": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.6.tgz", + "integrity": "sha512-I+yS1cSuSvHnZDBO7e7VHxTWpj+R7XlSZvTC4lS/OIbUNJOMMSd3UDP6V2sfwzAdmdDNBi7NGCRv2SZ6O9hGDA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@emotion/cache": "^11.13.1", + "@emotion/serialize": "^1.3.2", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, + "node_modules/@mui/system": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.1.6.tgz", + "integrity": "sha512-qOf1VUE9wK8syiB0BBCp82oNBAVPYdj4Trh+G1s+L+ImYiKlubWhhqlnvWt3xqMevR+D2h1CXzA1vhX2FvA+VQ==", + "license": "MIT", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@babel/runtime": "^7.26.0", + "@mui/private-theming": "^6.1.6", + "@mui/styled-engine": "^6.1.6", + "@mui/types": "^7.2.19", + "@mui/utils": "^6.1.6", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" }, "engines": { - "node": ">=10.10.0" + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, + "node_modules/@mui/types": { + "version": "7.2.19", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.19.tgz", + "integrity": "sha512-6XpZEM/Q3epK9RN8ENoXuygnqUQxE+siN/6rGRi2iwJPgBUR25mphYQ9ZI87plGh58YoZ5pp40bFvKYOCDJ3tA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.6.tgz", + "integrity": "sha512-sBS6D9mJECtELASLM+18WUcXF6RH3zNxBRFeyCRg8wad6NbyNrdxLuwK+Ikvc38sTZwBzAz691HmSofLqHd9sQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mui/types": "^7.2.19", + "@types/prop-types": "^15.7.13", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, "engines": { - "node": ">=12.22" + "node": ">=14.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true + "node_modules/@mui/utils/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "node_modules/@next/env": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.0.2.tgz", + "integrity": "sha512-c0Zr0ModK5OX7D4ZV8Jt/wqoXtitLNPwUfG9zElCZztdaZyNVnN40rDXVZ/+FGuR4CcNV5AEfM6N8f+Ener7Dg==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.0.2.tgz", + "integrity": "sha512-R9Jc7T6Ge0txjmqpPwqD8vx6onQjynO9JT73ArCYiYPvSrwYXepH/UY/WdKDY8JPWJl72sAE4iGMHPeQ5xdEWg==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.0.2.tgz", + "integrity": "sha512-GK+8w88z+AFlmt+ondytZo2xpwlfAR8U6CRwXancHImh6EdGfHMIrTSCcx5sOSBei00GyLVL0ioo1JLKTfprgg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.0.0" + "node": ">= 10" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, + "node_modules/@next/swc-darwin-x64": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.0.2.tgz", + "integrity": "sha512-KUpBVxIbjzFiUZhiLIpJiBoelqzQtVZbdNNsehhUn36e2YzKHphnK8eTUW1s/4aPy5kH/UTid8IuVbaOpedhpw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.0.0" + "node": ">= 10" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.0.2.tgz", + "integrity": "sha512-9J7TPEcHNAZvwxXRzOtiUvwtTD+fmuY0l7RErf8Yyc7kMpE47MIQakl+3jecmkhOoIyi/Rp+ddq7j4wG6JDskQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.0.0" + "node": ">= 10" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.0.2.tgz", + "integrity": "sha512-BjH4ZSzJIoTTZRh6rG+a/Ry4SW0HlizcPorqNBixBWc3wtQtj4Sn9FnRZe22QqrPnzoaW0ctvSz4FaH4eGKMww==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.0.2.tgz", + "integrity": "sha512-i3U2TcHgo26sIhcwX/Rshz6avM6nizrZPvrDVDY1bXcLH1ndjbO8zuC7RoHp0NSK7wjJMPYzm7NYL1ksSKFreA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.0.2.tgz", + "integrity": "sha512-AMfZfSVOIR8fa+TXlAooByEF4OB00wqnms1sJ1v+iu8ivwvtPvnkwdzzFMpsK5jA2S9oNeeQ04egIWVb4QWmtQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.0.2.tgz", + "integrity": "sha512-JkXysDT0/hEY47O+Hvs8PbZAeiCQVxKfGtr4GUpNAhlG2E0Mkjibuo8ryGD29Qb5a3IOnKYNoZlh/MyKd2Nbww==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.0.2.tgz", + "integrity": "sha512-foaUL0NqJY/dX0Pi/UcZm5zsmSk5MtP/gxx3xOPyREkMFN+CTjctPfu3QaqrQHinaKdPnMWPJDKt4VjDfTBe/Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" } }, "node_modules/@nodelib/fs.scandir": { @@ -910,6 +1193,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -923,6 +1207,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -932,294 +1217,361 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { "node": ">= 8" - } - }, - "node_modules/@remix-run/router": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", - "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.0.tgz", - "integrity": "sha512-jwXtxYbRt1V+CdQSy6Z+uZti7JF5irRKF8hlKfEnF/xJpcNGuuiZMBvuoYM+x9sr9iWGnzrlM0+9hvQ1kgkf1w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.0.tgz", - "integrity": "sha512-fI9nduZhCccjzlsA/OuAwtFGWocxA4gqXGTLvOyiF8d+8o0fZUeSztixkYjcGq1fGZY3Tkq4yRvHPFxU+jdZ9Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.0.tgz", - "integrity": "sha512-BcnSPRM76/cD2gQC+rQNGBN6GStBs2pl/FpweW8JYuz5J/IEa0Fr4AtrPv766DB/6b2MZ/AfSIOSGw3nEIP8SA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.0.tgz", - "integrity": "sha512-LDyFB9GRolGN7XI6955aFeI3wCdCUszFWumWU0deHA8VpR3nWRrjG6GtGjBrQxQKFevnUTHKCfPR4IvrW3kCgQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] + } }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.0.tgz", - "integrity": "sha512-ygrGVhQP47mRh0AAD0zl6QqCbNsf0eTo+vgwkY6LunBcg0f2Jv365GXlDUECIyoXp1kKwL5WW6rsO429DBY/bA==", - "cpu": [ - "arm" - ], + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.0.tgz", - "integrity": "sha512-x+uJ6MAYRlHGe9wi4HQjxpaKHPM3d3JjqqCkeC5gpnnI6OWovLdXTpfa8trjxPLnWKyBsSi5kne+146GAxFt4A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.0.tgz", - "integrity": "sha512-nrRw8ZTQKg6+Lttwqo6a2VxR9tOroa2m91XbdQ2sUUzHoedXlsyvY1fN4xWdqz8PKmf4orDwejxXHjh7YBGUCA==", - "cpu": [ - "arm64" - ], + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "license": "MIT" }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.0.tgz", - "integrity": "sha512-xV0d5jDb4aFu84XKr+lcUJ9y3qpIWhttO3Qev97z8DKLXR62LC3cXT/bMZXrjLF9X+P5oSmJTzAhqwUbY96PnA==", - "cpu": [ - "ppc64le" - ], + "node_modules/@rushstack/eslint-patch": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", + "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "license": "MIT" }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.0.tgz", - "integrity": "sha512-SDDhBQwZX6LPRoPYjAZWyL27LbcBo7WdBFWJi5PI9RPCzU8ijzkQn7tt8NXiXRiFMJCVpkuMkBf4OxSxVMizAw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.0.tgz", - "integrity": "sha512-RxB/qez8zIDshNJDufYlTT0ZTVut5eCpAZ3bdXDU9yTxBzui3KhbGjROK2OYTTor7alM7XBhssgoO3CZ0XD3qA==", - "cpu": [ - "s390x" - ], + "node_modules/@swc/helpers": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", + "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "license": "MIT" }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.0.tgz", - "integrity": "sha512-C6y6z2eCNCfhZxT9u+jAM2Fup89ZjiG5pIzZIDycs1IwESviLxwkQcFRGLjnDrP+PT+v5i4YFvlcfAs+LnreXg==", - "cpu": [ - "x64" - ], + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", + "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", + "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.13.0.tgz", + "integrity": "sha512-nQtBLiZYMUPkclSeC3id+x4uVd1SGtHuElTxL++SfP47jR0zfkZBJHc+gL4qPsgTuypz0k8Y2GheaDYn6Gy3rg==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.13.0", + "@typescript-eslint/type-utils": "8.13.0", + "@typescript-eslint/utils": "8.13.0", + "@typescript-eslint/visitor-keys": "8.13.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.0.tgz", - "integrity": "sha512-i0QwbHYfnOMYsBEyjxcwGu5SMIi9sImDVjDg087hpzXqhBSosxkE7gyIYFHgfFl4mr7RrXksIBZ4DoLoP4FhJg==", - "cpu": [ - "x64" - ], + "node_modules/@typescript-eslint/parser": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.13.0.tgz", + "integrity": "sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ] + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "8.13.0", + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/typescript-estree": "8.13.0", + "@typescript-eslint/visitor-keys": "8.13.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.0.tgz", - "integrity": "sha512-Fq52EYb0riNHLBTAcL0cun+rRwyZ10S9vKzhGKKgeD+XbwunszSY0rVMco5KbOsTlwovP2rTOkiII/fQ4ih/zQ==", - "cpu": [ - "arm64" - ], + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.13.0.tgz", + "integrity": "sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/visitor-keys": "8.13.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.0.tgz", - "integrity": "sha512-e/PBHxPdJ00O9p5Ui43+vixSgVf4NlLsmV6QneGERJ3lnjIua/kim6PRFe3iDueT1rQcgSkYP8ZBBXa/h4iPvw==", - "cpu": [ - "ia32" - ], + "node_modules/@typescript-eslint/type-utils": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.13.0.tgz", + "integrity": "sha512-Rqnn6xXTR316fP4D2pohZenJnp+NwQ1mo7/JM+J1LWZENSLkJI8ID8QNtlvFeb0HnFSK94D6q0cnMX6SbE5/vA==", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.13.0", + "@typescript-eslint/utils": "8.13.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.0.tgz", - "integrity": "sha512-aGg7iToJjdklmxlUlJh/PaPNa4PmqHfyRMLunbL3eaMO0gp656+q1zOKkpJ/CVe9CryJv6tAN1HDoR8cNGzkag==", - "cpu": [ - "x64" - ], + "node_modules/@typescript-eslint/types": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.13.0.tgz", + "integrity": "sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.13.0.tgz", + "integrity": "sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/visitor-keys": "8.13.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.0.0" + "balanced-match": "^1.0.0" } }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" } }, - "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { - "@babel/types": "^7.20.7" + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/@vitejs/plugin-react": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", - "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", + "node_modules/@typescript-eslint/utils": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.13.0.tgz", + "integrity": "sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.23.5", - "@babel/plugin-transform-react-jsx-self": "^7.23.3", - "@babel/plugin-transform-react-jsx-source": "^7.23.3", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.0" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.13.0", + "@typescript-eslint/types": "8.13.0", + "@typescript-eslint/typescript-estree": "8.13.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz", + "integrity": "sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.13.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "license": "ISC" + }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -1232,6 +1584,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -1241,6 +1594,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1257,33 +1611,50 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "is-array-buffer": "^3.0.4" @@ -1300,6 +1671,7 @@ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -1320,6 +1692,28 @@ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -1340,6 +1734,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -1358,6 +1753,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -1371,29 +1767,21 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.toreversed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", - "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, "node_modules/array.prototype.tosorted": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", - "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/arraybuffer.prototype.slice": { @@ -1401,6 +1789,7 @@ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.5", @@ -1418,67 +1807,104 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, "engines": { "node": ">= 0.4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", + "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" } }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "fill-range": "^7.1.1" }, - "bin": { - "browserslist": "cli.js" + "engines": { + "node": ">=8" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=10.16.0" } }, "node_modules/call-bind": { @@ -1486,6 +1912,7 @@ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -1504,16 +1931,15 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001606", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz", - "integrity": "sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg==", - "dev": true, + "version": "1.0.30001677", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001677.tgz", + "integrity": "sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==", "funding": [ { "type": "opencollective", @@ -1527,54 +1953,121 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" } }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "devOptional": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1584,11 +2077,25 @@ "node": ">= 8" } }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/data-view-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -1606,6 +2113,7 @@ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -1623,6 +2131,7 @@ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -1636,12 +2145,12 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -1656,13 +2165,15 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -1680,6 +2191,7 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -1692,11 +2204,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -1704,17 +2227,58 @@ "node": ">=6.0.0" } }, - "node_modules/electron-to-chromium": { - "version": "1.4.729", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.729.tgz", - "integrity": "sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA==", - "dev": true + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-ex/node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" }, "node_modules/es-abstract": { "version": "1.23.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", @@ -1775,6 +2339,7 @@ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -1787,29 +2352,32 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-iterator-helpers": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", - "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz", + "integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", + "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", + "globalthis": "^1.0.4", + "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", + "iterator.prototype": "^1.1.3", "safe-array-concat": "^1.1.2" }, "engines": { @@ -1821,6 +2389,7 @@ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -1833,6 +2402,7 @@ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.4", "has-tostringtag": "^1.0.2", @@ -1847,6 +2417,7 @@ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.0" } @@ -1856,6 +2427,7 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -1868,73 +2440,31 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -1979,43 +2509,200 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-plugin-react": { - "version": "7.34.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", - "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "node_modules/eslint-config-next": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.0.2.tgz", + "integrity": "sha512-N8o6cyUXzlMmQbdc2Kc83g1qomFi3ITqrAZfubipVKET2uR2mCStyGRcx/r8WiAIVMul2KfwRiCHBkTpBvGBmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "15.0.2", + "@rushstack/eslint-patch": "^1.10.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.35.0", + "eslint-plugin-react-hooks": "^5.0.0" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz", + "integrity": "sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.3.5", + "enhanced-resolve": "^5.15.0", + "eslint-module-utils": "^2.8.1", + "fast-glob": "^3.3.2", + "get-tsconfig": "^4.7.5", + "is-bun-module": "^1.0.2", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, + "license": "MIT", "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlast": "^1.2.4", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.17", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7", - "object.hasown": "^1.1.3", - "object.values": "^1.1.7", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.10" + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -2023,138 +2710,161 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/eslint-plugin-react": { + "version": "7.37.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", + "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.1.0", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/eslint-plugin-react-hooks": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0.tgz", + "integrity": "sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "license": "MIT", "engines": { "node": ">=10" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "color-name": "~1.1.4" + "esutils": "^2.0.2" }, "engines": { - "node": ">=7.0.0" + "node": ">=0.10.0" } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "type-fest": "^0.20.2" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/espree": { @@ -2162,6 +2872,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -2175,10 +2886,11 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -2191,6 +2903,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -2203,6 +2916,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -2212,6 +2926,7 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -2220,25 +2935,59 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -2248,6 +2997,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -2255,11 +3005,31 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -2276,6 +3046,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -2289,13 +3060,15 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.1.3" } @@ -2304,27 +3077,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } + "license": "ISC" }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2334,6 +3094,7 @@ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -2352,24 +3113,17 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -2389,6 +3143,7 @@ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "es-errors": "^1.3.0", @@ -2401,11 +3156,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2426,6 +3196,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -2434,24 +3205,30 @@ } }, "node_modules/globals": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.0.0.tgz", - "integrity": "sha512-m/C/yR4mjO6pXDTm9/R/SpYTAIyaUB4EOzcaaMEl7mds7Mshct9GfejiJNQGjHHbdMPey13Kpu4TMbYi9ex1pw==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=18" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -2465,6 +3242,7 @@ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -2472,28 +3250,38 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { @@ -2501,6 +3289,7 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -2513,6 +3302,7 @@ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2525,6 +3315,7 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2537,6 +3328,7 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -2551,7 +3343,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -2559,11 +3351,21 @@ "node": ">= 0.4" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -2572,7 +3374,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2589,6 +3391,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -2597,7 +3400,9 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2607,13 +3412,15 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.0", @@ -2628,6 +3435,7 @@ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1" @@ -2639,11 +3447,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT", + "optional": true + }, "node_modules/is-async-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -2659,6 +3475,7 @@ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, + "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -2671,6 +3488,7 @@ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -2682,11 +3500,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-bun-module": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.2.1.tgz", + "integrity": "sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2695,12 +3524,15 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2711,6 +3543,7 @@ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, + "license": "MIT", "dependencies": { "is-typed-array": "^1.1.13" }, @@ -2726,6 +3559,7 @@ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -2741,6 +3575,7 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2750,6 +3585,7 @@ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -2762,6 +3598,7 @@ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -2777,6 +3614,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -2789,6 +3627,7 @@ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2801,6 +3640,7 @@ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2808,11 +3648,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-number-object": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -2828,6 +3679,7 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2837,6 +3689,7 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -2853,6 +3706,7 @@ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2865,6 +3719,7 @@ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7" }, @@ -2880,6 +3735,7 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -2895,6 +3751,7 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -2910,6 +3767,7 @@ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, + "license": "MIT", "dependencies": { "which-typed-array": "^1.1.14" }, @@ -2925,6 +3783,7 @@ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2937,6 +3796,7 @@ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -2949,6 +3809,7 @@ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4" @@ -2964,37 +3825,45 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", + "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", "reflect.getprototypeof": "^1.0.4", "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -3003,45 +3872,55 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, "bin": { "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" } }, "node_modules/jsx-ast-utils": { @@ -3049,6 +3928,7 @@ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", @@ -3064,15 +3944,37 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -3081,11 +3983,18 @@ "node": ">= 0.8.0" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -3100,12 +4009,14 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -3113,13 +4024,28 @@ "loose-envify": "cli.js" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^3.0.2" + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, "node_modules/minimatch": { @@ -3127,6 +4053,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3134,23 +4061,33 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -3162,28 +4099,81 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "node_modules/next": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/next/-/next-15.0.2.tgz", + "integrity": "sha512-rxIWHcAu4gGSDmwsELXacqAPUk+j8dV/A9cDF5fsiCMpkBDYkO2AEaL1dfD+nNmDiU6QMCFN8Q30VEKapT9UHQ==", + "license": "MIT", + "dependencies": { + "@next/env": "15.0.2", + "@swc/counter": "0.1.3", + "@swc/helpers": "0.5.13", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.18.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.0.2", + "@next/swc-darwin-x64": "15.0.2", + "@next/swc-linux-arm64-gnu": "15.0.2", + "@next/swc-linux-arm64-musl": "15.0.2", + "@next/swc-linux-x64-gnu": "15.0.2", + "@next/swc-linux-x64-musl": "15.0.2", + "@next/swc-win32-arm64-msvc": "15.0.2", + "@next/swc-win32-x64-msvc": "15.0.2", + "sharp": "^0.33.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-02c0e824-20241028", + "react-dom": "^18.2.0 || 19.0.0-rc-02c0e824-20241028", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3193,6 +4183,7 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -3202,6 +4193,7 @@ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -3220,6 +4212,7 @@ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -3234,6 +4227,7 @@ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -3247,21 +4241,19 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.hasown": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", - "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, + "license": "MIT", "dependencies": { + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.2" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { @@ -3269,6 +4261,7 @@ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -3286,22 +4279,24 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -3312,6 +4307,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -3327,6 +4323,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -3341,7 +4338,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -3349,11 +4346,30 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3363,6 +4379,7 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3372,6 +4389,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3380,28 +4398,50 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", - "dev": true, + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -3416,10 +4456,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "source-map-js": "^1.0.2" }, "engines": { "node": "^10 || ^12 || >=14" @@ -3430,30 +4471,16 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, - "node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, + "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -3465,6 +4492,7 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3487,12 +4515,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -3501,60 +4531,38 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-router": { - "version": "6.22.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", - "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==", - "dependencies": { - "@remix-run/router": "1.15.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8" - } + "license": "MIT" }, - "node_modules/react-router-dom": { - "version": "6.22.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz", - "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==", + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", "dependencies": { - "@remix-run/router": "1.15.3", - "react-router": "6.22.3" - }, - "engines": { - "node": ">=14.0.0" + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" }, "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" + "react": ">=16.6.0", + "react-dom": ">=16.6.0" } }, "node_modules/reflect.getprototypeof": { @@ -3562,6 +4570,7 @@ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -3578,16 +4587,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -3597,10 +4613,10 @@ } }, "node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -3617,16 +4633,27 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -3636,7 +4663,9 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -3647,40 +4676,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rollup": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.0.tgz", - "integrity": "sha512-Qe7w62TyawbDzB4yt32R0+AbIo6m1/sqO7UPzFS8Z/ksL5mrfhA0v4CavfdmFav3D+ub4QeAgsGEe84DoWe/nQ==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.14.0", - "@rollup/rollup-android-arm64": "4.14.0", - "@rollup/rollup-darwin-arm64": "4.14.0", - "@rollup/rollup-darwin-x64": "4.14.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.14.0", - "@rollup/rollup-linux-arm64-gnu": "4.14.0", - "@rollup/rollup-linux-arm64-musl": "4.14.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.14.0", - "@rollup/rollup-linux-riscv64-gnu": "4.14.0", - "@rollup/rollup-linux-s390x-gnu": "4.14.0", - "@rollup/rollup-linux-x64-gnu": "4.14.0", - "@rollup/rollup-linux-x64-musl": "4.14.0", - "@rollup/rollup-win32-arm64-msvc": "4.14.0", - "@rollup/rollup-win32-ia32-msvc": "4.14.0", - "@rollup/rollup-win32-x64-msvc": "4.14.0", - "fsevents": "~2.3.2" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -3700,6 +4695,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -3709,6 +4705,7 @@ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4", @@ -3727,6 +4724,7 @@ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -3740,20 +4738,25 @@ } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } }, "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "devOptional": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/set-function-length": { @@ -3761,6 +4764,7 @@ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -3778,6 +4782,7 @@ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -3788,11 +4793,52 @@ "node": ">= 0.4" } }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -3805,6 +4851,7 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3814,6 +4861,7 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -3827,20 +4875,63 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -3862,11 +4953,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -3885,6 +4988,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -3899,6 +5003,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -3916,6 +5021,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -3923,11 +5029,22 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -3935,23 +5052,53 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3959,26 +5106,74 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz", + "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -3991,6 +5186,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -4003,6 +5199,7 @@ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -4017,6 +5214,7 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -4036,6 +5234,7 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -4056,6 +5255,7 @@ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -4071,11 +5271,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -4086,105 +5302,22 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, - "node_modules/vite": { - "version": "5.2.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.8.tgz", - "integrity": "sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==", - "dev": true, - "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.38", - "rollup": "^4.13.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -4200,6 +5333,7 @@ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, + "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -4212,13 +5346,14 @@ } }, "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", "dev": true, + "license": "MIT", "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", "is-finalizationregistry": "^1.0.2", @@ -4227,8 +5362,8 @@ "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -4242,6 +5377,7 @@ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, + "license": "MIT", "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -4260,6 +5396,7 @@ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -4274,23 +5411,38 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, diff --git a/app/package.json b/app/package.json index a529c17b..03c4ad04 100644 --- a/app/package.json +++ b/app/package.json @@ -1,31 +1,23 @@ { "name": "app", + "version": "0.1.0", "private": true, - "version": "1.0.0", - "main": "src/main.jsx", - "type": "module", - "engines": { - "node": "^20.12.1", - "npm": "^10.5.0" - }, "scripts": { - "dev": "vite", - "build": "vite build", - "format": "npx prettier . --write", - "check": "npx eslint . --fix" + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" }, "dependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router-dom": "^6.22.3" + "@emotion/react": "^11.13.3", + "@emotion/styled": "^11.13.0", + "@mui/material": "^6.1.6", + "next": "15.0.2", + "react": "^18.3.1", + "react-dom": "^18.3.1" }, "devDependencies": { - "@eslint/js": "^9.0.0", - "@vitejs/plugin-react": "^4.2.1", - "eslint": "^8.57.0", - "eslint-plugin-react": "^7.34.1", - "globals": "^15.0.0", - "prettier": "^3.2.5", - "vite": "^5.2.0" + "eslint": "^8", + "eslint-config-next": "15.0.2" } } diff --git a/app/public/favicon.ico b/app/public/favicon.ico deleted file mode 100644 index 6917c87b2dd52739c1a7d36681eeb3d3544f6b4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 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 \ No newline at end of file diff --git a/app/public/globe.svg b/app/public/globe.svg new file mode 100644 index 00000000..567f17b0 --- /dev/null +++ b/app/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/public/next.svg b/app/public/next.svg new file mode 100644 index 00000000..5174b28c --- /dev/null +++ b/app/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/public/vercel.svg b/app/public/vercel.svg new file mode 100644 index 00000000..77053960 --- /dev/null +++ b/app/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/public/window.svg b/app/public/window.svg new file mode 100644 index 00000000..b2b2a44f --- /dev/null +++ b/app/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/api.js b/app/src/api.js deleted file mode 100644 index 6588cbd9..00000000 --- a/app/src/api.js +++ /dev/null @@ -1,3 +0,0 @@ -export default function api(route) { - return `${import.meta.env.VITE_API_URL}/api${route}`; -} diff --git a/app/src/assets/hyf.svg b/app/src/assets/hyf.svg deleted file mode 100644 index 4c681348..00000000 --- a/app/src/assets/hyf.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/components/HomePage/HomePage.css b/app/src/components/HomePage/HomePage.css deleted file mode 100644 index 21b50ed1..00000000 --- a/app/src/components/HomePage/HomePage.css +++ /dev/null @@ -1,9 +0,0 @@ -.link { - display: flex; - margin: 5vh 0; -} - -.logo, -.message { - margin: auto; -} diff --git a/app/src/components/HomePage/HomePage.jsx b/app/src/components/HomePage/HomePage.jsx deleted file mode 100644 index daeb8c17..00000000 --- a/app/src/components/HomePage/HomePage.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from "react"; -import hyfLogo from "../../assets/hyf.svg"; -import "./HomePage.css"; - -// Feel free to replace the content of this component with your own -function HomePage() { - return ( - <> - - HackYourFuture logo - - - Go to the nested page - - - ); -} - -export default HomePage; diff --git a/app/src/components/TestPage/TestPage.jsx b/app/src/components/TestPage/TestPage.jsx deleted file mode 100644 index 1c85357a..00000000 --- a/app/src/components/TestPage/TestPage.jsx +++ /dev/null @@ -1,21 +0,0 @@ -import React, { useEffect, useState } from "react"; -import api from "../../api"; - -// This page can be deleted once you add your own page -function TestPage() { - const [message, setMessage] = useState(""); - - useEffect(() => { - async function fetchMessage() { - const response = await fetch(api("/nested")); - const { message } = await response.json(); - setMessage(message); - } - - fetchMessage(); - }, []); - - return {message}; -} - -export default TestPage; diff --git a/app/src/main.css b/app/src/main.css deleted file mode 100644 index 49066e3f..00000000 --- a/app/src/main.css +++ /dev/null @@ -1,8 +0,0 @@ -html, -body, -#root { - margin: 0; - padding: 0; - height: 100%; - width: 100%; -} diff --git a/app/src/main.jsx b/app/src/main.jsx deleted file mode 100644 index df380eba..00000000 --- a/app/src/main.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from "react"; -import ReactDOM from "react-dom/client"; -import { createBrowserRouter, RouterProvider } from "react-router-dom"; -import HomePage from "./components/HomePage/HomePage.jsx"; -import TestPage from "./components/TestPage/TestPage.jsx"; -import "./main.css"; - -const router = createBrowserRouter([ - { - path: "/", - element: , - }, - // This route can be removed and replaced with your own page - { - path: "/nested", - element: , - }, -]); - -ReactDOM.createRoot(document.getElementById("root")).render( - - - , -); diff --git a/app/vite.config.js b/app/vite.config.js deleted file mode 100644 index 88d9c69b..00000000 --- a/app/vite.config.js +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig, loadEnv } from "vite"; -import react from "@vitejs/plugin-react"; - -export default defineConfig(({ mode }) => { - const env = loadEnv(mode, process.cwd(), ""); - return { - plugins: [react()], - server: { - port: env.PORT, - }, - }; -}); diff --git a/node_modules/.bin/loose-envify b/node_modules/.bin/loose-envify new file mode 100644 index 00000000..076f91b1 --- /dev/null +++ b/node_modules/.bin/loose-envify @@ -0,0 +1,16 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) + if command -v cygpath > /dev/null 2>&1; then + basedir=`cygpath -w "$basedir"` + fi + ;; +esac + +if [ -x "$basedir/node" ]; then + exec "$basedir/node" "$basedir/../loose-envify/cli.js" "$@" +else + exec node "$basedir/../loose-envify/cli.js" "$@" +fi diff --git a/node_modules/.bin/loose-envify.cmd b/node_modules/.bin/loose-envify.cmd new file mode 100644 index 00000000..599576f9 --- /dev/null +++ b/node_modules/.bin/loose-envify.cmd @@ -0,0 +1,17 @@ +@ECHO off +GOTO start +:find_dp0 +SET dp0=%~dp0 +EXIT /b +:start +SETLOCAL +CALL :find_dp0 + +IF EXIST "%dp0%\node.exe" ( + SET "_prog=%dp0%\node.exe" +) ELSE ( + SET "_prog=node" + SET PATHEXT=%PATHEXT:;.JS;=;% +) + +endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\loose-envify\cli.js" %* diff --git a/node_modules/.bin/loose-envify.ps1 b/node_modules/.bin/loose-envify.ps1 new file mode 100644 index 00000000..eb866fca --- /dev/null +++ b/node_modules/.bin/loose-envify.ps1 @@ -0,0 +1,28 @@ +#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +} +$ret=0 +if (Test-Path "$basedir/node$exe") { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "$basedir/node$exe" "$basedir/../loose-envify/cli.js" $args + } else { + & "$basedir/node$exe" "$basedir/../loose-envify/cli.js" $args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & "node$exe" "$basedir/../loose-envify/cli.js" $args + } else { + & "node$exe" "$basedir/../loose-envify/cli.js" $args + } + $ret=$LASTEXITCODE +} +exit $ret diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json new file mode 100644 index 00000000..8d81f322 --- /dev/null +++ b/node_modules/.package-lock.json @@ -0,0 +1,59 @@ +{ + "name": "LeafNotes", + "lockfileVersion": 3, + "requires": true, + "packages": { + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + } + } +} diff --git a/node_modules/js-tokens/CHANGELOG.md b/node_modules/js-tokens/CHANGELOG.md new file mode 100644 index 00000000..755e6f6e --- /dev/null +++ b/node_modules/js-tokens/CHANGELOG.md @@ -0,0 +1,151 @@ +### Version 4.0.0 (2018-01-28) ### + +- Added: Support for ES2018. The only change needed was recognizing the `s` + regex flag. +- Changed: _All_ tokens returned by the `matchToToken` function now have a + `closed` property. It is set to `undefined` for the tokens where “closed” + doesn’t make sense. This means that all tokens objects have the same shape, + which might improve performance. + +These are the breaking changes: + +- `'/a/s'.match(jsTokens)` no longer returns `['/', 'a', '/', 's']`, but + `['/a/s']`. (There are of course other variations of this.) +- Code that rely on some token objects not having the `closed` property could + now behave differently. + + +### Version 3.0.2 (2017-06-28) ### + +- No code changes. Just updates to the readme. + + +### Version 3.0.1 (2017-01-30) ### + +- Fixed: ES2015 unicode escapes with more than 6 hex digits are now matched + correctly. + + +### Version 3.0.0 (2017-01-11) ### + +This release contains one breaking change, that should [improve performance in +V8][v8-perf]: + +> So how can you, as a JavaScript developer, ensure that your RegExps are fast? +> If you are not interested in hooking into RegExp internals, make sure that +> neither the RegExp instance, nor its prototype is modified in order to get the +> best performance: +> +> ```js +> var re = /./g; +> re.exec(''); // Fast path. +> re.new_property = 'slow'; +> ``` + +This module used to export a single regex, with `.matchToToken` bolted +on, just like in the above example. This release changes the exports of +the module to avoid this issue. + +Before: + +```js +import jsTokens from "js-tokens" +// or: +var jsTokens = require("js-tokens") +var matchToToken = jsTokens.matchToToken +``` + +After: + +```js +import jsTokens, {matchToToken} from "js-tokens" +// or: +var jsTokens = require("js-tokens").default +var matchToToken = require("js-tokens").matchToToken +``` + +[v8-perf]: http://v8project.blogspot.se/2017/01/speeding-up-v8-regular-expressions.html + + +### Version 2.0.0 (2016-06-19) ### + +- Added: Support for ES2016. In other words, support for the `**` exponentiation + operator. + +These are the breaking changes: + +- `'**'.match(jsTokens)` no longer returns `['*', '*']`, but `['**']`. +- `'**='.match(jsTokens)` no longer returns `['*', '*=']`, but `['**=']`. + + +### Version 1.0.3 (2016-03-27) ### + +- Improved: Made the regex ever so slightly smaller. +- Updated: The readme. + + +### Version 1.0.2 (2015-10-18) ### + +- Improved: Limited npm package contents for a smaller download. Thanks to + @zertosh! + + +### Version 1.0.1 (2015-06-20) ### + +- Fixed: Declared an undeclared variable. + + +### Version 1.0.0 (2015-02-26) ### + +- Changed: Merged the 'operator' and 'punctuation' types into 'punctuator'. That + type is now equivalent to the Punctuator token in the ECMAScript + specification. (Backwards-incompatible change.) +- Fixed: A `-` followed by a number is now correctly matched as a punctuator + followed by a number. It used to be matched as just a number, but there is no + such thing as negative number literals. (Possibly backwards-incompatible + change.) + + +### Version 0.4.1 (2015-02-21) ### + +- Added: Support for the regex `u` flag. + + +### Version 0.4.0 (2015-02-21) ### + +- Improved: `jsTokens.matchToToken` performance. +- Added: Support for octal and binary number literals. +- Added: Support for template strings. + + +### Version 0.3.1 (2015-01-06) ### + +- Fixed: Support for unicode spaces. They used to be allowed in names (which is + very confusing), and some unicode newlines were wrongly allowed in strings and + regexes. + + +### Version 0.3.0 (2014-12-19) ### + +- Changed: The `jsTokens.names` array has been replaced with the + `jsTokens.matchToToken` function. The capturing groups of `jsTokens` are no + longer part of the public API; instead use said function. See this [gist] for + an example. (Backwards-incompatible change.) +- Changed: The empty string is now considered an “invalid” token, instead an + “empty” token (its own group). (Backwards-incompatible change.) +- Removed: component support. (Backwards-incompatible change.) + +[gist]: https://gist.github.com/lydell/be49dbf80c382c473004 + + +### Version 0.2.0 (2014-06-19) ### + +- Changed: Match ES6 function arrows (`=>`) as an operator, instead of its own + category (“functionArrow”), for simplicity. (Backwards-incompatible change.) +- Added: ES6 splats (`...`) are now matched as an operator (instead of three + punctuations). (Backwards-incompatible change.) + + +### Version 0.1.0 (2014-03-08) ### + +- Initial release. diff --git a/node_modules/js-tokens/LICENSE b/node_modules/js-tokens/LICENSE new file mode 100644 index 00000000..54aef52f --- /dev/null +++ b/node_modules/js-tokens/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/js-tokens/README.md b/node_modules/js-tokens/README.md new file mode 100644 index 00000000..00cdf163 --- /dev/null +++ b/node_modules/js-tokens/README.md @@ -0,0 +1,240 @@ +Overview [![Build Status](https://travis-ci.org/lydell/js-tokens.svg?branch=master)](https://travis-ci.org/lydell/js-tokens) +======== + +A regex that tokenizes JavaScript. + +```js +var jsTokens = require("js-tokens").default + +var jsString = "var foo=opts.foo;\n..." + +jsString.match(jsTokens) +// ["var", " ", "foo", "=", "opts", ".", "foo", ";", "\n", ...] +``` + + +Installation +============ + +`npm install js-tokens` + +```js +import jsTokens from "js-tokens" +// or: +var jsTokens = require("js-tokens").default +``` + + +Usage +===== + +### `jsTokens` ### + +A regex with the `g` flag that matches JavaScript tokens. + +The regex _always_ matches, even invalid JavaScript and the empty string. + +The next match is always directly after the previous. + +### `var token = matchToToken(match)` ### + +```js +import {matchToToken} from "js-tokens" +// or: +var matchToToken = require("js-tokens").matchToToken +``` + +Takes a `match` returned by `jsTokens.exec(string)`, and returns a `{type: +String, value: String}` object. The following types are available: + +- string +- comment +- regex +- number +- name +- punctuator +- whitespace +- invalid + +Multi-line comments and strings also have a `closed` property indicating if the +token was closed or not (see below). + +Comments and strings both come in several flavors. To distinguish them, check if +the token starts with `//`, `/*`, `'`, `"` or `` ` ``. + +Names are ECMAScript IdentifierNames, that is, including both identifiers and +keywords. You may use [is-keyword-js] to tell them apart. + +Whitespace includes both line terminators and other whitespace. + +[is-keyword-js]: https://github.com/crissdev/is-keyword-js + + +ECMAScript support +================== + +The intention is to always support the latest ECMAScript version whose feature +set has been finalized. + +If adding support for a newer version requires changes, a new version with a +major verion bump will be released. + +Currently, ECMAScript 2018 is supported. + + +Invalid code handling +===================== + +Unterminated strings are still matched as strings. JavaScript strings cannot +contain (unescaped) newlines, so unterminated strings simply end at the end of +the line. Unterminated template strings can contain unescaped newlines, though, +so they go on to the end of input. + +Unterminated multi-line comments are also still matched as comments. They +simply go on to the end of the input. + +Unterminated regex literals are likely matched as division and whatever is +inside the regex. + +Invalid ASCII characters have their own capturing group. + +Invalid non-ASCII characters are treated as names, to simplify the matching of +names (except unicode spaces which are treated as whitespace). Note: See also +the [ES2018](#es2018) section. + +Regex literals may contain invalid regex syntax. They are still matched as +regex literals. They may also contain repeated regex flags, to keep the regex +simple. + +Strings may contain invalid escape sequences. + + +Limitations +=========== + +Tokenizing JavaScript using regexes—in fact, _one single regex_—won’t be +perfect. But that’s not the point either. + +You may compare jsTokens with [esprima] by using `esprima-compare.js`. +See `npm run esprima-compare`! + +[esprima]: http://esprima.org/ + +### Template string interpolation ### + +Template strings are matched as single tokens, from the starting `` ` `` to the +ending `` ` ``, including interpolations (whose tokens are not matched +individually). + +Matching template string interpolations requires recursive balancing of `{` and +`}`—something that JavaScript regexes cannot do. Only one level of nesting is +supported. + +### Division and regex literals collision ### + +Consider this example: + +```js +var g = 9.82 +var number = bar / 2/g + +var regex = / 2/g +``` + +A human can easily understand that in the `number` line we’re dealing with +division, and in the `regex` line we’re dealing with a regex literal. How come? +Because humans can look at the whole code to put the `/` characters in context. +A JavaScript regex cannot. It only sees forwards. (Well, ES2018 regexes can also +look backwards. See the [ES2018](#es2018) section). + +When the `jsTokens` regex scans throught the above, it will see the following +at the end of both the `number` and `regex` rows: + +```js +/ 2/g +``` + +It is then impossible to know if that is a regex literal, or part of an +expression dealing with division. + +Here is a similar case: + +```js +foo /= 2/g +foo(/= 2/g) +``` + +The first line divides the `foo` variable with `2/g`. The second line calls the +`foo` function with the regex literal `/= 2/g`. Again, since `jsTokens` only +sees forwards, it cannot tell the two cases apart. + +There are some cases where we _can_ tell division and regex literals apart, +though. + +First off, we have the simple cases where there’s only one slash in the line: + +```js +var foo = 2/g +foo /= 2 +``` + +Regex literals cannot contain newlines, so the above cases are correctly +identified as division. Things are only problematic when there are more than +one non-comment slash in a single line. + +Secondly, not every character is a valid regex flag. + +```js +var number = bar / 2/e +``` + +The above example is also correctly identified as division, because `e` is not a +valid regex flag. I initially wanted to future-proof by allowing `[a-zA-Z]*` +(any letter) as flags, but it is not worth it since it increases the amount of +ambigous cases. So only the standard `g`, `m`, `i`, `y` and `u` flags are +allowed. This means that the above example will be identified as division as +long as you don’t rename the `e` variable to some permutation of `gmiyus` 1 to 6 +characters long. + +Lastly, we can look _forward_ for information. + +- If the token following what looks like a regex literal is not valid after a + regex literal, but is valid in a division expression, then the regex literal + is treated as division instead. For example, a flagless regex cannot be + followed by a string, number or name, but all of those three can be the + denominator of a division. +- Generally, if what looks like a regex literal is followed by an operator, the + regex literal is treated as division instead. This is because regexes are + seldomly used with operators (such as `+`, `*`, `&&` and `==`), but division + could likely be part of such an expression. + +Please consult the regex source and the test cases for precise information on +when regex or division is matched (should you need to know). In short, you +could sum it up as: + +If the end of a statement looks like a regex literal (even if it isn’t), it +will be treated as one. Otherwise it should work as expected (if you write sane +code). + +### ES2018 ### + +ES2018 added some nice regex improvements to the language. + +- [Unicode property escapes] should allow telling names and invalid non-ASCII + characters apart without blowing up the regex size. +- [Lookbehind assertions] should allow matching telling division and regex + literals apart in more cases. +- [Named capture groups] might simplify some things. + +These things would be nice to do, but are not critical. They probably have to +wait until the oldest maintained Node.js LTS release supports those features. + +[Unicode property escapes]: http://2ality.com/2017/07/regexp-unicode-property-escapes.html +[Lookbehind assertions]: http://2ality.com/2017/05/regexp-lookbehind-assertions.html +[Named capture groups]: http://2ality.com/2017/05/regexp-named-capture-groups.html + + +License +======= + +[MIT](LICENSE). diff --git a/node_modules/js-tokens/index.js b/node_modules/js-tokens/index.js new file mode 100644 index 00000000..b23a4a0e --- /dev/null +++ b/node_modules/js-tokens/index.js @@ -0,0 +1,23 @@ +// Copyright 2014, 2015, 2016, 2017, 2018 Simon Lydell +// License: MIT. (See LICENSE.) + +Object.defineProperty(exports, "__esModule", { + value: true +}) + +// This regex comes from regex.coffee, and is inserted here by generate-index.js +// (run `npm run build`). +exports.default = /((['"])(?:(?!\2|\\).|\\(?:\r\n|[\s\S]))*(\2)?|`(?:[^`\\$]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{[^}]*\}?)*\}?)*(`)?)|(\/\/.*)|(\/\*(?:[^*]|\*(?!\/))*(\*\/)?)|(\/(?!\*)(?:\[(?:(?![\]\\]).|\\.)*\]|(?![\/\]\\]).|\\.)+\/(?:(?!\s*(?:\b|[\u0080-\uFFFF$\\'"~({]|[+\-!](?!=)|\.?\d))|[gmiyus]{1,6}\b(?![\u0080-\uFFFF$\\]|\s*(?:[+\-*%&|^<>!=?({]|\/(?![\/*])))))|(0[xX][\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?)|((?!\d)(?:(?!\s)[$\w\u0080-\uFFFF]|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]+\})+)|(--|\+\+|&&|\|\||=>|\.{3}|(?:[+\-\/%&|^]|\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\](){}])|(\s+)|(^$|[\s\S])/g + +exports.matchToToken = function(match) { + var token = {type: "invalid", value: match[0], closed: undefined} + if (match[ 1]) token.type = "string" , token.closed = !!(match[3] || match[4]) + else if (match[ 5]) token.type = "comment" + else if (match[ 6]) token.type = "comment", token.closed = !!match[7] + else if (match[ 8]) token.type = "regex" + else if (match[ 9]) token.type = "number" + else if (match[10]) token.type = "name" + else if (match[11]) token.type = "punctuator" + else if (match[12]) token.type = "whitespace" + return token +} diff --git a/node_modules/js-tokens/package.json b/node_modules/js-tokens/package.json new file mode 100644 index 00000000..66752fab --- /dev/null +++ b/node_modules/js-tokens/package.json @@ -0,0 +1,30 @@ +{ + "name": "js-tokens", + "version": "4.0.0", + "author": "Simon Lydell", + "license": "MIT", + "description": "A regex that tokenizes JavaScript.", + "keywords": [ + "JavaScript", + "js", + "token", + "tokenize", + "regex" + ], + "files": [ + "index.js" + ], + "repository": "lydell/js-tokens", + "scripts": { + "test": "mocha --ui tdd", + "esprima-compare": "node esprima-compare ./index.js everything.js/es5.js", + "build": "node generate-index.js", + "dev": "npm run build && npm test" + }, + "devDependencies": { + "coffeescript": "2.1.1", + "esprima": "4.0.0", + "everything.js": "1.0.3", + "mocha": "5.0.0" + } +} diff --git a/node_modules/loose-envify/LICENSE b/node_modules/loose-envify/LICENSE new file mode 100644 index 00000000..fbafb487 --- /dev/null +++ b/node_modules/loose-envify/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Andres Suarez + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/loose-envify/README.md b/node_modules/loose-envify/README.md new file mode 100644 index 00000000..7f4e07b0 --- /dev/null +++ b/node_modules/loose-envify/README.md @@ -0,0 +1,45 @@ +# loose-envify + +[![Build Status](https://travis-ci.org/zertosh/loose-envify.svg?branch=master)](https://travis-ci.org/zertosh/loose-envify) + +Fast (and loose) selective `process.env` replacer using [js-tokens](https://github.com/lydell/js-tokens) instead of an AST. Works just like [envify](https://github.com/hughsk/envify) but much faster. + +## Gotchas + +* Doesn't handle broken syntax. +* Doesn't look inside embedded expressions in template strings. + - **this won't work:** + ```js + console.log(`the current env is ${process.env.NODE_ENV}`); + ``` +* Doesn't replace oddly-spaced or oddly-commented expressions. + - **this won't work:** + ```js + console.log(process./*won't*/env./*work*/NODE_ENV); + ``` + +## Usage/Options + +loose-envify has the exact same interface as [envify](https://github.com/hughsk/envify), including the CLI. + +## Benchmark + +``` +envify: + + $ for i in {1..5}; do node bench/bench.js 'envify'; done + 708ms + 727ms + 791ms + 719ms + 720ms + +loose-envify: + + $ for i in {1..5}; do node bench/bench.js '../'; done + 51ms + 52ms + 52ms + 52ms + 52ms +``` diff --git a/node_modules/loose-envify/cli.js b/node_modules/loose-envify/cli.js new file mode 100644 index 00000000..c0b63cb1 --- /dev/null +++ b/node_modules/loose-envify/cli.js @@ -0,0 +1,16 @@ +#!/usr/bin/env node +'use strict'; + +var looseEnvify = require('./'); +var fs = require('fs'); + +if (process.argv[2]) { + fs.createReadStream(process.argv[2], {encoding: 'utf8'}) + .pipe(looseEnvify(process.argv[2])) + .pipe(process.stdout); +} else { + process.stdin.resume() + process.stdin + .pipe(looseEnvify(__filename)) + .pipe(process.stdout); +} diff --git a/node_modules/loose-envify/custom.js b/node_modules/loose-envify/custom.js new file mode 100644 index 00000000..6389bfac --- /dev/null +++ b/node_modules/loose-envify/custom.js @@ -0,0 +1,4 @@ +// envify compatibility +'use strict'; + +module.exports = require('./loose-envify'); diff --git a/node_modules/loose-envify/index.js b/node_modules/loose-envify/index.js new file mode 100644 index 00000000..8cd8305d --- /dev/null +++ b/node_modules/loose-envify/index.js @@ -0,0 +1,3 @@ +'use strict'; + +module.exports = require('./loose-envify')(process.env); diff --git a/node_modules/loose-envify/loose-envify.js b/node_modules/loose-envify/loose-envify.js new file mode 100644 index 00000000..b5a5be22 --- /dev/null +++ b/node_modules/loose-envify/loose-envify.js @@ -0,0 +1,36 @@ +'use strict'; + +var stream = require('stream'); +var util = require('util'); +var replace = require('./replace'); + +var jsonExtRe = /\.json$/; + +module.exports = function(rootEnv) { + rootEnv = rootEnv || process.env; + return function (file, trOpts) { + if (jsonExtRe.test(file)) { + return stream.PassThrough(); + } + var envs = trOpts ? [rootEnv, trOpts] : [rootEnv]; + return new LooseEnvify(envs); + }; +}; + +function LooseEnvify(envs) { + stream.Transform.call(this); + this._data = ''; + this._envs = envs; +} +util.inherits(LooseEnvify, stream.Transform); + +LooseEnvify.prototype._transform = function(buf, enc, cb) { + this._data += buf; + cb(); +}; + +LooseEnvify.prototype._flush = function(cb) { + var replaced = replace(this._data, this._envs); + this.push(replaced); + cb(); +}; diff --git a/node_modules/loose-envify/package.json b/node_modules/loose-envify/package.json new file mode 100644 index 00000000..5e3d0e27 --- /dev/null +++ b/node_modules/loose-envify/package.json @@ -0,0 +1,36 @@ +{ + "name": "loose-envify", + "version": "1.4.0", + "description": "Fast (and loose) selective `process.env` replacer using js-tokens instead of an AST", + "keywords": [ + "environment", + "variables", + "browserify", + "browserify-transform", + "transform", + "source", + "configuration" + ], + "homepage": "https://github.com/zertosh/loose-envify", + "license": "MIT", + "author": "Andres Suarez ", + "main": "index.js", + "bin": { + "loose-envify": "cli.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/zertosh/loose-envify.git" + }, + "scripts": { + "test": "tap test/*.js" + }, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "devDependencies": { + "browserify": "^13.1.1", + "envify": "^3.4.0", + "tap": "^8.0.0" + } +} diff --git a/node_modules/loose-envify/replace.js b/node_modules/loose-envify/replace.js new file mode 100644 index 00000000..ec15e81c --- /dev/null +++ b/node_modules/loose-envify/replace.js @@ -0,0 +1,65 @@ +'use strict'; + +var jsTokens = require('js-tokens').default; + +var processEnvRe = /\bprocess\.env\.[_$a-zA-Z][$\w]+\b/; +var spaceOrCommentRe = /^(?:\s|\/[/*])/; + +function replace(src, envs) { + if (!processEnvRe.test(src)) { + return src; + } + + var out = []; + var purge = envs.some(function(env) { + return env._ && env._.indexOf('purge') !== -1; + }); + + jsTokens.lastIndex = 0 + var parts = src.match(jsTokens); + + for (var i = 0; i < parts.length; i++) { + if (parts[i ] === 'process' && + parts[i + 1] === '.' && + parts[i + 2] === 'env' && + parts[i + 3] === '.') { + var prevCodeToken = getAdjacentCodeToken(-1, parts, i); + var nextCodeToken = getAdjacentCodeToken(1, parts, i + 4); + var replacement = getReplacementString(envs, parts[i + 4], purge); + if (prevCodeToken !== '.' && + nextCodeToken !== '.' && + nextCodeToken !== '=' && + typeof replacement === 'string') { + out.push(replacement); + i += 4; + continue; + } + } + out.push(parts[i]); + } + + return out.join(''); +} + +function getAdjacentCodeToken(dir, parts, i) { + while (true) { + var part = parts[i += dir]; + if (!spaceOrCommentRe.test(part)) { + return part; + } + } +} + +function getReplacementString(envs, name, purge) { + for (var j = 0; j < envs.length; j++) { + var env = envs[j]; + if (typeof env[name] !== 'undefined') { + return JSON.stringify(env[name]); + } + } + if (purge) { + return 'undefined'; + } +} + +module.exports = replace; diff --git a/node_modules/react-dom/LICENSE b/node_modules/react-dom/LICENSE new file mode 100644 index 00000000..b96dcb04 --- /dev/null +++ b/node_modules/react-dom/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Facebook, Inc. and its affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/react-dom/README.md b/node_modules/react-dom/README.md new file mode 100644 index 00000000..ecba5cfb --- /dev/null +++ b/node_modules/react-dom/README.md @@ -0,0 +1,60 @@ +# `react-dom` + +This package serves as the entry point to the DOM and server renderers for React. It is intended to be paired with the generic React package, which is shipped as `react` to npm. + +## Installation + +```sh +npm install react react-dom +``` + +## Usage + +### In the browser + +```js +import { createRoot } from 'react-dom/client'; + +function App() { + return
Hello World
; +} + +const root = createRoot(document.getElementById('root')); +root.render(); +``` + +### On the server + +```js +import { renderToPipeableStream } from 'react-dom/server'; + +function App() { + return
Hello World
; +} + +function handleRequest(res) { + // ... in your server handler ... + const stream = renderToPipeableStream(, { + onShellReady() { + res.statusCode = 200; + res.setHeader('Content-type', 'text/html'); + stream.pipe(res); + }, + // ... + }); +} +``` + +## API + +### `react-dom` + +See https://reactjs.org/docs/react-dom.html + +### `react-dom/client` + +See https://reactjs.org/docs/react-dom-client.html + +### `react-dom/server` + +See https://reactjs.org/docs/react-dom-server.html diff --git a/node_modules/react-dom/cjs/react-dom-server-legacy.browser.development.js b/node_modules/react-dom/cjs/react-dom-server-legacy.browser.development.js new file mode 100644 index 00000000..102e3ef6 --- /dev/null +++ b/node_modules/react-dom/cjs/react-dom-server-legacy.browser.development.js @@ -0,0 +1,7029 @@ +/** + * @license React + * react-dom-server-legacy.browser.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +'use strict'; + +if (process.env.NODE_ENV !== "production") { + (function() { +'use strict'; + +var React = require('react'); + +var ReactVersion = '18.3.1'; + +var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; + +// by calls to these methods by a Babel plugin. +// +// In PROD (or in packages without access to React internals), +// they are left as they are instead. + +function warn(format) { + { + { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + printWarning('warn', format, args); + } + } +} +function error(format) { + { + { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + + printWarning('error', format, args); + } + } +} + +function printWarning(level, format, args) { + // When changing this logic, you might want to also + // update consoleWithStackDev.www.js as well. + { + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame.getStackAddendum(); + + if (stack !== '') { + format += '%s'; + args = args.concat([stack]); + } // eslint-disable-next-line react-internal/safe-string-coercion + + + var argsWithFormat = args.map(function (item) { + return String(item); + }); // Careful: RN currently depends on this prefix + + argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it + // breaks IE9: https://github.com/facebook/react/issues/13610 + // eslint-disable-next-line react-internal/no-production-logging + + Function.prototype.apply.call(console[level], console, argsWithFormat); + } +} + +function scheduleWork(callback) { + callback(); +} +function beginWriting(destination) {} +function writeChunk(destination, chunk) { + writeChunkAndReturn(destination, chunk); +} +function writeChunkAndReturn(destination, chunk) { + return destination.push(chunk); +} +function completeWriting(destination) {} +function close(destination) { + destination.push(null); +} +function stringToChunk(content) { + return content; +} +function stringToPrecomputedChunk(content) { + return content; +} +function closeWithError(destination, error) { + // $FlowFixMe: This is an Error object or the destination accepts other types. + destination.destroy(error); +} + +/* + * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol + * and Temporal.* types. See https://github.com/facebook/react/pull/22064. + * + * The functions in this module will throw an easier-to-understand, + * easier-to-debug exception with a clear errors message message explaining the + * problem. (Instead of a confusing exception thrown inside the implementation + * of the `value` object). + */ +// $FlowFixMe only called in DEV, so void return is not possible. +function typeName(value) { + { + // toStringTag is needed for namespaced types like Temporal.Instant + var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag; + var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object'; + return type; + } +} // $FlowFixMe only called in DEV, so void return is not possible. + + +function willCoercionThrow(value) { + { + try { + testStringCoercion(value); + return false; + } catch (e) { + return true; + } + } +} + +function testStringCoercion(value) { + // If you ended up here by following an exception call stack, here's what's + // happened: you supplied an object or symbol value to React (as a prop, key, + // DOM attribute, CSS property, string ref, etc.) and when React tried to + // coerce it to a string using `'' + value`, an exception was thrown. + // + // The most common types that will cause this exception are `Symbol` instances + // and Temporal objects like `Temporal.Instant`. But any object that has a + // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this + // exception. (Library authors do this to prevent users from using built-in + // numeric operators like `+` or comparison operators like `>=` because custom + // methods are needed to perform accurate arithmetic or comparison.) + // + // To fix the problem, coerce this object or symbol value to a string before + // passing it to React. The most reliable way is usually `String(value)`. + // + // To find which value is throwing, check the browser or debugger console. + // Before this exception was thrown, there should be `console.error` output + // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the + // problem and how that type was used: key, atrribute, input value prop, etc. + // In most cases, this console output also shows the component and its + // ancestor components where the exception happened. + // + // eslint-disable-next-line react-internal/safe-string-coercion + return '' + value; +} + +function checkAttributeStringCoercion(value, attributeName) { + { + if (willCoercionThrow(value)) { + error('The provided `%s` attribute is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', attributeName, typeName(value)); + + return testStringCoercion(value); // throw (to help callers find troubleshooting comments) + } + } +} +function checkCSSPropertyStringCoercion(value, propName) { + { + if (willCoercionThrow(value)) { + error('The provided `%s` CSS property is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', propName, typeName(value)); + + return testStringCoercion(value); // throw (to help callers find troubleshooting comments) + } + } +} +function checkHtmlStringCoercion(value) { + { + if (willCoercionThrow(value)) { + error('The provided HTML markup uses a value of unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value)); + + return testStringCoercion(value); // throw (to help callers find troubleshooting comments) + } + } +} + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +// A reserved attribute. +// It is handled by React separately and shouldn't be written to the DOM. +var RESERVED = 0; // A simple string attribute. +// Attributes that aren't in the filter are presumed to have this type. + +var STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called +// "enumerated" attributes with "true" and "false" as possible values. +// When true, it should be set to a "true" string. +// When false, it should be set to a "false" string. + +var BOOLEANISH_STRING = 2; // A real boolean attribute. +// When true, it should be present (set either to an empty string or its name). +// When false, it should be omitted. + +var BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value. +// When true, it should be present (set either to an empty string or its name). +// When false, it should be omitted. +// For any other value, should be present with that value. + +var OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric. +// When falsy, it should be removed. + +var NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric. +// When falsy, it should be removed. + +var POSITIVE_NUMERIC = 6; + +/* eslint-disable max-len */ +var ATTRIBUTE_NAME_START_CHAR = ":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD"; +/* eslint-enable max-len */ + +var ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + "\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040"; +var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$'); +var illegalAttributeNameCache = {}; +var validatedAttributeNameCache = {}; +function isAttributeNameSafe(attributeName) { + if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) { + return true; + } + + if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) { + return false; + } + + if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) { + validatedAttributeNameCache[attributeName] = true; + return true; + } + + illegalAttributeNameCache[attributeName] = true; + + { + error('Invalid attribute name: `%s`', attributeName); + } + + return false; +} +function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) { + if (propertyInfo !== null && propertyInfo.type === RESERVED) { + return false; + } + + switch (typeof value) { + case 'function': // $FlowIssue symbol is perfectly valid here + + case 'symbol': + // eslint-disable-line + return true; + + case 'boolean': + { + if (isCustomComponentTag) { + return false; + } + + if (propertyInfo !== null) { + return !propertyInfo.acceptsBooleans; + } else { + var prefix = name.toLowerCase().slice(0, 5); + return prefix !== 'data-' && prefix !== 'aria-'; + } + } + + default: + return false; + } +} +function getPropertyInfo(name) { + return properties.hasOwnProperty(name) ? properties[name] : null; +} + +function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL, removeEmptyString) { + this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN; + this.attributeName = attributeName; + this.attributeNamespace = attributeNamespace; + this.mustUseProperty = mustUseProperty; + this.propertyName = name; + this.type = type; + this.sanitizeURL = sanitizeURL; + this.removeEmptyString = removeEmptyString; +} // When adding attributes to this list, be sure to also add them to +// the `possibleStandardNames` module to ensure casing and incorrect +// name warnings. + + +var properties = {}; // These props are reserved by React. They shouldn't be written to the DOM. + +var reservedProps = ['children', 'dangerouslySetInnerHTML', // TODO: This prevents the assignment of defaultValue to regular +// elements (not just inputs). Now that ReactDOMInput assigns to the +// defaultValue property -- do we need this? +'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style']; + +reservedProps.forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty + name, // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // A few React string attributes have a different name. +// This is a mapping from React prop names to the attribute names. + +[['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) { + var name = _ref[0], + attributeName = _ref[1]; + properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty + attributeName, // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are "enumerated" HTML attributes that accept "true" and "false". +// In React, we let users pass `true` and `false` even though technically +// these aren't boolean attributes (they are coerced to strings). + +['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty + name.toLowerCase(), // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are "enumerated" SVG attributes that accept "true" and "false". +// In React, we let users pass `true` and `false` even though technically +// these aren't boolean attributes (they are coerced to strings). +// Since these are SVG attributes, their attribute names are case-sensitive. + +['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty + name, // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are HTML boolean attributes. + +['allowFullScreen', 'async', // Note: there is a special case that prevents it from being written to the DOM +// on the client side because the browsers are inconsistent. Instead we call focus(). +'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'disablePictureInPicture', 'disableRemotePlayback', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata +'itemScope'].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty + name.toLowerCase(), // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are the few React props that we set as DOM properties +// rather than attributes. These are all booleans. + +['checked', // Note: `option.selected` is not updated if `select.multiple` is +// disabled with `removeAttribute`. We have special logic for handling this. +'multiple', 'muted', 'selected' // NOTE: if you add a camelCased prop to this list, +// you'll need to set attributeName to name.toLowerCase() +// instead in the assignment below. +].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty + name, // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are HTML attributes that are "overloaded booleans": they behave like +// booleans, but can also accept a string value. + +['capture', 'download' // NOTE: if you add a camelCased prop to this list, +// you'll need to set attributeName to name.toLowerCase() +// instead in the assignment below. +].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty + name, // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are HTML attributes that must be positive numbers. + +['cols', 'rows', 'size', 'span' // NOTE: if you add a camelCased prop to this list, +// you'll need to set attributeName to name.toLowerCase() +// instead in the assignment below. +].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty + name, // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are HTML attributes that must be numbers. + +['rowSpan', 'start'].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty + name.toLowerCase(), // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); +var CAMELIZE = /[\-\:]([a-z])/g; + +var capitalize = function (token) { + return token[1].toUpperCase(); +}; // This is a list of all SVG attributes that need special casing, namespacing, +// or boolean value assignment. Regular attributes that just accept strings +// and have the same names are omitted, just like in the HTML attribute filter. +// Some of these attributes can be hard to find. This list was created by +// scraping the MDN documentation. + + +['accent-height', 'alignment-baseline', 'arabic-form', 'baseline-shift', 'cap-height', 'clip-path', 'clip-rule', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'dominant-baseline', 'enable-background', 'fill-opacity', 'fill-rule', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-name', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'horiz-adv-x', 'horiz-origin-x', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', 'overline-position', 'overline-thickness', 'paint-order', 'panose-1', 'pointer-events', 'rendering-intent', 'shape-rendering', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-rendering', 'underline-position', 'underline-thickness', 'unicode-bidi', 'unicode-range', 'units-per-em', 'v-alphabetic', 'v-hanging', 'v-ideographic', 'v-mathematical', 'vector-effect', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'word-spacing', 'writing-mode', 'xmlns:xlink', 'x-height' // NOTE: if you add a camelCased prop to this list, +// you'll need to set attributeName to name.toLowerCase() +// instead in the assignment below. +].forEach(function (attributeName) { + var name = attributeName.replace(CAMELIZE, capitalize); + properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty + attributeName, null, // attributeNamespace + false, // sanitizeURL + false); +}); // String SVG attributes with the xlink namespace. + +['xlink:actuate', 'xlink:arcrole', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type' // NOTE: if you add a camelCased prop to this list, +// you'll need to set attributeName to name.toLowerCase() +// instead in the assignment below. +].forEach(function (attributeName) { + var name = attributeName.replace(CAMELIZE, capitalize); + properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty + attributeName, 'http://www.w3.org/1999/xlink', false, // sanitizeURL + false); +}); // String SVG attributes with the xml namespace. + +['xml:base', 'xml:lang', 'xml:space' // NOTE: if you add a camelCased prop to this list, +// you'll need to set attributeName to name.toLowerCase() +// instead in the assignment below. +].forEach(function (attributeName) { + var name = attributeName.replace(CAMELIZE, capitalize); + properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty + attributeName, 'http://www.w3.org/XML/1998/namespace', false, // sanitizeURL + false); +}); // These attribute exists both in HTML and SVG. +// The attribute name is case-sensitive in SVG so we can't just use +// the React name like we do for attributes that exist only in HTML. + +['tabIndex', 'crossOrigin'].forEach(function (attributeName) { + properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty + attributeName.toLowerCase(), // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These attributes accept URLs. These must not allow javascript: URLS. +// These will also need to accept Trusted Types object in the future. + +var xlinkHref = 'xlinkHref'; +properties[xlinkHref] = new PropertyInfoRecord('xlinkHref', STRING, false, // mustUseProperty +'xlink:href', 'http://www.w3.org/1999/xlink', true, // sanitizeURL +false); +['src', 'href', 'action', 'formAction'].forEach(function (attributeName) { + properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty + attributeName.toLowerCase(), // attributeName + null, // attributeNamespace + true, // sanitizeURL + true); +}); + +/** + * CSS properties which accept numbers but are not in units of "px". + */ +var isUnitlessNumber = { + animationIterationCount: true, + aspectRatio: true, + borderImageOutset: true, + borderImageSlice: true, + borderImageWidth: true, + boxFlex: true, + boxFlexGroup: true, + boxOrdinalGroup: true, + columnCount: true, + columns: true, + flex: true, + flexGrow: true, + flexPositive: true, + flexShrink: true, + flexNegative: true, + flexOrder: true, + gridArea: true, + gridRow: true, + gridRowEnd: true, + gridRowSpan: true, + gridRowStart: true, + gridColumn: true, + gridColumnEnd: true, + gridColumnSpan: true, + gridColumnStart: true, + fontWeight: true, + lineClamp: true, + lineHeight: true, + opacity: true, + order: true, + orphans: true, + tabSize: true, + widows: true, + zIndex: true, + zoom: true, + // SVG-related properties + fillOpacity: true, + floodOpacity: true, + stopOpacity: true, + strokeDasharray: true, + strokeDashoffset: true, + strokeMiterlimit: true, + strokeOpacity: true, + strokeWidth: true +}; +/** + * @param {string} prefix vendor-specific prefix, eg: Webkit + * @param {string} key style name, eg: transitionDuration + * @return {string} style name prefixed with `prefix`, properly camelCased, eg: + * WebkitTransitionDuration + */ + +function prefixKey(prefix, key) { + return prefix + key.charAt(0).toUpperCase() + key.substring(1); +} +/** + * Support style names that may come passed in prefixed by adding permutations + * of vendor prefixes. + */ + + +var prefixes = ['Webkit', 'ms', 'Moz', 'O']; // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an +// infinite loop, because it iterates over the newly added props too. + +Object.keys(isUnitlessNumber).forEach(function (prop) { + prefixes.forEach(function (prefix) { + isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop]; + }); +}); + +var hasReadOnlyValue = { + button: true, + checkbox: true, + image: true, + hidden: true, + radio: true, + reset: true, + submit: true +}; +function checkControlledValueProps(tagName, props) { + { + if (!(hasReadOnlyValue[props.type] || props.onChange || props.onInput || props.readOnly || props.disabled || props.value == null)) { + error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.'); + } + + if (!(props.onChange || props.readOnly || props.disabled || props.checked == null)) { + error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.'); + } + } +} + +function isCustomComponent(tagName, props) { + if (tagName.indexOf('-') === -1) { + return typeof props.is === 'string'; + } + + switch (tagName) { + // These are reserved SVG and MathML elements. + // We don't mind this list too much because we expect it to never grow. + // The alternative is to track the namespace in a few places which is convoluted. + // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts + case 'annotation-xml': + case 'color-profile': + case 'font-face': + case 'font-face-src': + case 'font-face-uri': + case 'font-face-format': + case 'font-face-name': + case 'missing-glyph': + return false; + + default: + return true; + } +} + +var ariaProperties = { + 'aria-current': 0, + // state + 'aria-description': 0, + 'aria-details': 0, + 'aria-disabled': 0, + // state + 'aria-hidden': 0, + // state + 'aria-invalid': 0, + // state + 'aria-keyshortcuts': 0, + 'aria-label': 0, + 'aria-roledescription': 0, + // Widget Attributes + 'aria-autocomplete': 0, + 'aria-checked': 0, + 'aria-expanded': 0, + 'aria-haspopup': 0, + 'aria-level': 0, + 'aria-modal': 0, + 'aria-multiline': 0, + 'aria-multiselectable': 0, + 'aria-orientation': 0, + 'aria-placeholder': 0, + 'aria-pressed': 0, + 'aria-readonly': 0, + 'aria-required': 0, + 'aria-selected': 0, + 'aria-sort': 0, + 'aria-valuemax': 0, + 'aria-valuemin': 0, + 'aria-valuenow': 0, + 'aria-valuetext': 0, + // Live Region Attributes + 'aria-atomic': 0, + 'aria-busy': 0, + 'aria-live': 0, + 'aria-relevant': 0, + // Drag-and-Drop Attributes + 'aria-dropeffect': 0, + 'aria-grabbed': 0, + // Relationship Attributes + 'aria-activedescendant': 0, + 'aria-colcount': 0, + 'aria-colindex': 0, + 'aria-colspan': 0, + 'aria-controls': 0, + 'aria-describedby': 0, + 'aria-errormessage': 0, + 'aria-flowto': 0, + 'aria-labelledby': 0, + 'aria-owns': 0, + 'aria-posinset': 0, + 'aria-rowcount': 0, + 'aria-rowindex': 0, + 'aria-rowspan': 0, + 'aria-setsize': 0 +}; + +var warnedProperties = {}; +var rARIA = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$'); +var rARIACamel = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$'); + +function validateProperty(tagName, name) { + { + if (hasOwnProperty.call(warnedProperties, name) && warnedProperties[name]) { + return true; + } + + if (rARIACamel.test(name)) { + var ariaName = 'aria-' + name.slice(4).toLowerCase(); + var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null; // If this is an aria-* attribute, but is not listed in the known DOM + // DOM properties, then it is an invalid aria-* attribute. + + if (correctName == null) { + error('Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', name); + + warnedProperties[name] = true; + return true; + } // aria-* attributes should be lowercase; suggest the lowercase version. + + + if (name !== correctName) { + error('Invalid ARIA attribute `%s`. Did you mean `%s`?', name, correctName); + + warnedProperties[name] = true; + return true; + } + } + + if (rARIA.test(name)) { + var lowerCasedName = name.toLowerCase(); + var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null; // If this is an aria-* attribute, but is not listed in the known DOM + // DOM properties, then it is an invalid aria-* attribute. + + if (standardName == null) { + warnedProperties[name] = true; + return false; + } // aria-* attributes should be lowercase; suggest the lowercase version. + + + if (name !== standardName) { + error('Unknown ARIA attribute `%s`. Did you mean `%s`?', name, standardName); + + warnedProperties[name] = true; + return true; + } + } + } + + return true; +} + +function warnInvalidARIAProps(type, props) { + { + var invalidProps = []; + + for (var key in props) { + var isValid = validateProperty(type, key); + + if (!isValid) { + invalidProps.push(key); + } + } + + var unknownPropString = invalidProps.map(function (prop) { + return '`' + prop + '`'; + }).join(', '); + + if (invalidProps.length === 1) { + error('Invalid aria prop %s on <%s> tag. ' + 'For details, see https://reactjs.org/link/invalid-aria-props', unknownPropString, type); + } else if (invalidProps.length > 1) { + error('Invalid aria props %s on <%s> tag. ' + 'For details, see https://reactjs.org/link/invalid-aria-props', unknownPropString, type); + } + } +} + +function validateProperties(type, props) { + if (isCustomComponent(type, props)) { + return; + } + + warnInvalidARIAProps(type, props); +} + +var didWarnValueNull = false; +function validateProperties$1(type, props) { + { + if (type !== 'input' && type !== 'textarea' && type !== 'select') { + return; + } + + if (props != null && props.value === null && !didWarnValueNull) { + didWarnValueNull = true; + + if (type === 'select' && props.multiple) { + error('`value` prop on `%s` should not be null. ' + 'Consider using an empty array when `multiple` is set to `true` ' + 'to clear the component or `undefined` for uncontrolled components.', type); + } else { + error('`value` prop on `%s` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.', type); + } + } + } +} + +// When adding attributes to the HTML or SVG allowed attribute list, be sure to +// also add them to this module to ensure casing and incorrect name +// warnings. +var possibleStandardNames = { + // HTML + accept: 'accept', + acceptcharset: 'acceptCharset', + 'accept-charset': 'acceptCharset', + accesskey: 'accessKey', + action: 'action', + allowfullscreen: 'allowFullScreen', + alt: 'alt', + as: 'as', + async: 'async', + autocapitalize: 'autoCapitalize', + autocomplete: 'autoComplete', + autocorrect: 'autoCorrect', + autofocus: 'autoFocus', + autoplay: 'autoPlay', + autosave: 'autoSave', + capture: 'capture', + cellpadding: 'cellPadding', + cellspacing: 'cellSpacing', + challenge: 'challenge', + charset: 'charSet', + checked: 'checked', + children: 'children', + cite: 'cite', + class: 'className', + classid: 'classID', + classname: 'className', + cols: 'cols', + colspan: 'colSpan', + content: 'content', + contenteditable: 'contentEditable', + contextmenu: 'contextMenu', + controls: 'controls', + controlslist: 'controlsList', + coords: 'coords', + crossorigin: 'crossOrigin', + dangerouslysetinnerhtml: 'dangerouslySetInnerHTML', + data: 'data', + datetime: 'dateTime', + default: 'default', + defaultchecked: 'defaultChecked', + defaultvalue: 'defaultValue', + defer: 'defer', + dir: 'dir', + disabled: 'disabled', + disablepictureinpicture: 'disablePictureInPicture', + disableremoteplayback: 'disableRemotePlayback', + download: 'download', + draggable: 'draggable', + enctype: 'encType', + enterkeyhint: 'enterKeyHint', + for: 'htmlFor', + form: 'form', + formmethod: 'formMethod', + formaction: 'formAction', + formenctype: 'formEncType', + formnovalidate: 'formNoValidate', + formtarget: 'formTarget', + frameborder: 'frameBorder', + headers: 'headers', + height: 'height', + hidden: 'hidden', + high: 'high', + href: 'href', + hreflang: 'hrefLang', + htmlfor: 'htmlFor', + httpequiv: 'httpEquiv', + 'http-equiv': 'httpEquiv', + icon: 'icon', + id: 'id', + imagesizes: 'imageSizes', + imagesrcset: 'imageSrcSet', + innerhtml: 'innerHTML', + inputmode: 'inputMode', + integrity: 'integrity', + is: 'is', + itemid: 'itemID', + itemprop: 'itemProp', + itemref: 'itemRef', + itemscope: 'itemScope', + itemtype: 'itemType', + keyparams: 'keyParams', + keytype: 'keyType', + kind: 'kind', + label: 'label', + lang: 'lang', + list: 'list', + loop: 'loop', + low: 'low', + manifest: 'manifest', + marginwidth: 'marginWidth', + marginheight: 'marginHeight', + max: 'max', + maxlength: 'maxLength', + media: 'media', + mediagroup: 'mediaGroup', + method: 'method', + min: 'min', + minlength: 'minLength', + multiple: 'multiple', + muted: 'muted', + name: 'name', + nomodule: 'noModule', + nonce: 'nonce', + novalidate: 'noValidate', + open: 'open', + optimum: 'optimum', + pattern: 'pattern', + placeholder: 'placeholder', + playsinline: 'playsInline', + poster: 'poster', + preload: 'preload', + profile: 'profile', + radiogroup: 'radioGroup', + readonly: 'readOnly', + referrerpolicy: 'referrerPolicy', + rel: 'rel', + required: 'required', + reversed: 'reversed', + role: 'role', + rows: 'rows', + rowspan: 'rowSpan', + sandbox: 'sandbox', + scope: 'scope', + scoped: 'scoped', + scrolling: 'scrolling', + seamless: 'seamless', + selected: 'selected', + shape: 'shape', + size: 'size', + sizes: 'sizes', + span: 'span', + spellcheck: 'spellCheck', + src: 'src', + srcdoc: 'srcDoc', + srclang: 'srcLang', + srcset: 'srcSet', + start: 'start', + step: 'step', + style: 'style', + summary: 'summary', + tabindex: 'tabIndex', + target: 'target', + title: 'title', + type: 'type', + usemap: 'useMap', + value: 'value', + width: 'width', + wmode: 'wmode', + wrap: 'wrap', + // SVG + about: 'about', + accentheight: 'accentHeight', + 'accent-height': 'accentHeight', + accumulate: 'accumulate', + additive: 'additive', + alignmentbaseline: 'alignmentBaseline', + 'alignment-baseline': 'alignmentBaseline', + allowreorder: 'allowReorder', + alphabetic: 'alphabetic', + amplitude: 'amplitude', + arabicform: 'arabicForm', + 'arabic-form': 'arabicForm', + ascent: 'ascent', + attributename: 'attributeName', + attributetype: 'attributeType', + autoreverse: 'autoReverse', + azimuth: 'azimuth', + basefrequency: 'baseFrequency', + baselineshift: 'baselineShift', + 'baseline-shift': 'baselineShift', + baseprofile: 'baseProfile', + bbox: 'bbox', + begin: 'begin', + bias: 'bias', + by: 'by', + calcmode: 'calcMode', + capheight: 'capHeight', + 'cap-height': 'capHeight', + clip: 'clip', + clippath: 'clipPath', + 'clip-path': 'clipPath', + clippathunits: 'clipPathUnits', + cliprule: 'clipRule', + 'clip-rule': 'clipRule', + color: 'color', + colorinterpolation: 'colorInterpolation', + 'color-interpolation': 'colorInterpolation', + colorinterpolationfilters: 'colorInterpolationFilters', + 'color-interpolation-filters': 'colorInterpolationFilters', + colorprofile: 'colorProfile', + 'color-profile': 'colorProfile', + colorrendering: 'colorRendering', + 'color-rendering': 'colorRendering', + contentscripttype: 'contentScriptType', + contentstyletype: 'contentStyleType', + cursor: 'cursor', + cx: 'cx', + cy: 'cy', + d: 'd', + datatype: 'datatype', + decelerate: 'decelerate', + descent: 'descent', + diffuseconstant: 'diffuseConstant', + direction: 'direction', + display: 'display', + divisor: 'divisor', + dominantbaseline: 'dominantBaseline', + 'dominant-baseline': 'dominantBaseline', + dur: 'dur', + dx: 'dx', + dy: 'dy', + edgemode: 'edgeMode', + elevation: 'elevation', + enablebackground: 'enableBackground', + 'enable-background': 'enableBackground', + end: 'end', + exponent: 'exponent', + externalresourcesrequired: 'externalResourcesRequired', + fill: 'fill', + fillopacity: 'fillOpacity', + 'fill-opacity': 'fillOpacity', + fillrule: 'fillRule', + 'fill-rule': 'fillRule', + filter: 'filter', + filterres: 'filterRes', + filterunits: 'filterUnits', + floodopacity: 'floodOpacity', + 'flood-opacity': 'floodOpacity', + floodcolor: 'floodColor', + 'flood-color': 'floodColor', + focusable: 'focusable', + fontfamily: 'fontFamily', + 'font-family': 'fontFamily', + fontsize: 'fontSize', + 'font-size': 'fontSize', + fontsizeadjust: 'fontSizeAdjust', + 'font-size-adjust': 'fontSizeAdjust', + fontstretch: 'fontStretch', + 'font-stretch': 'fontStretch', + fontstyle: 'fontStyle', + 'font-style': 'fontStyle', + fontvariant: 'fontVariant', + 'font-variant': 'fontVariant', + fontweight: 'fontWeight', + 'font-weight': 'fontWeight', + format: 'format', + from: 'from', + fx: 'fx', + fy: 'fy', + g1: 'g1', + g2: 'g2', + glyphname: 'glyphName', + 'glyph-name': 'glyphName', + glyphorientationhorizontal: 'glyphOrientationHorizontal', + 'glyph-orientation-horizontal': 'glyphOrientationHorizontal', + glyphorientationvertical: 'glyphOrientationVertical', + 'glyph-orientation-vertical': 'glyphOrientationVertical', + glyphref: 'glyphRef', + gradienttransform: 'gradientTransform', + gradientunits: 'gradientUnits', + hanging: 'hanging', + horizadvx: 'horizAdvX', + 'horiz-adv-x': 'horizAdvX', + horizoriginx: 'horizOriginX', + 'horiz-origin-x': 'horizOriginX', + ideographic: 'ideographic', + imagerendering: 'imageRendering', + 'image-rendering': 'imageRendering', + in2: 'in2', + in: 'in', + inlist: 'inlist', + intercept: 'intercept', + k1: 'k1', + k2: 'k2', + k3: 'k3', + k4: 'k4', + k: 'k', + kernelmatrix: 'kernelMatrix', + kernelunitlength: 'kernelUnitLength', + kerning: 'kerning', + keypoints: 'keyPoints', + keysplines: 'keySplines', + keytimes: 'keyTimes', + lengthadjust: 'lengthAdjust', + letterspacing: 'letterSpacing', + 'letter-spacing': 'letterSpacing', + lightingcolor: 'lightingColor', + 'lighting-color': 'lightingColor', + limitingconeangle: 'limitingConeAngle', + local: 'local', + markerend: 'markerEnd', + 'marker-end': 'markerEnd', + markerheight: 'markerHeight', + markermid: 'markerMid', + 'marker-mid': 'markerMid', + markerstart: 'markerStart', + 'marker-start': 'markerStart', + markerunits: 'markerUnits', + markerwidth: 'markerWidth', + mask: 'mask', + maskcontentunits: 'maskContentUnits', + maskunits: 'maskUnits', + mathematical: 'mathematical', + mode: 'mode', + numoctaves: 'numOctaves', + offset: 'offset', + opacity: 'opacity', + operator: 'operator', + order: 'order', + orient: 'orient', + orientation: 'orientation', + origin: 'origin', + overflow: 'overflow', + overlineposition: 'overlinePosition', + 'overline-position': 'overlinePosition', + overlinethickness: 'overlineThickness', + 'overline-thickness': 'overlineThickness', + paintorder: 'paintOrder', + 'paint-order': 'paintOrder', + panose1: 'panose1', + 'panose-1': 'panose1', + pathlength: 'pathLength', + patterncontentunits: 'patternContentUnits', + patterntransform: 'patternTransform', + patternunits: 'patternUnits', + pointerevents: 'pointerEvents', + 'pointer-events': 'pointerEvents', + points: 'points', + pointsatx: 'pointsAtX', + pointsaty: 'pointsAtY', + pointsatz: 'pointsAtZ', + prefix: 'prefix', + preservealpha: 'preserveAlpha', + preserveaspectratio: 'preserveAspectRatio', + primitiveunits: 'primitiveUnits', + property: 'property', + r: 'r', + radius: 'radius', + refx: 'refX', + refy: 'refY', + renderingintent: 'renderingIntent', + 'rendering-intent': 'renderingIntent', + repeatcount: 'repeatCount', + repeatdur: 'repeatDur', + requiredextensions: 'requiredExtensions', + requiredfeatures: 'requiredFeatures', + resource: 'resource', + restart: 'restart', + result: 'result', + results: 'results', + rotate: 'rotate', + rx: 'rx', + ry: 'ry', + scale: 'scale', + security: 'security', + seed: 'seed', + shaperendering: 'shapeRendering', + 'shape-rendering': 'shapeRendering', + slope: 'slope', + spacing: 'spacing', + specularconstant: 'specularConstant', + specularexponent: 'specularExponent', + speed: 'speed', + spreadmethod: 'spreadMethod', + startoffset: 'startOffset', + stddeviation: 'stdDeviation', + stemh: 'stemh', + stemv: 'stemv', + stitchtiles: 'stitchTiles', + stopcolor: 'stopColor', + 'stop-color': 'stopColor', + stopopacity: 'stopOpacity', + 'stop-opacity': 'stopOpacity', + strikethroughposition: 'strikethroughPosition', + 'strikethrough-position': 'strikethroughPosition', + strikethroughthickness: 'strikethroughThickness', + 'strikethrough-thickness': 'strikethroughThickness', + string: 'string', + stroke: 'stroke', + strokedasharray: 'strokeDasharray', + 'stroke-dasharray': 'strokeDasharray', + strokedashoffset: 'strokeDashoffset', + 'stroke-dashoffset': 'strokeDashoffset', + strokelinecap: 'strokeLinecap', + 'stroke-linecap': 'strokeLinecap', + strokelinejoin: 'strokeLinejoin', + 'stroke-linejoin': 'strokeLinejoin', + strokemiterlimit: 'strokeMiterlimit', + 'stroke-miterlimit': 'strokeMiterlimit', + strokewidth: 'strokeWidth', + 'stroke-width': 'strokeWidth', + strokeopacity: 'strokeOpacity', + 'stroke-opacity': 'strokeOpacity', + suppresscontenteditablewarning: 'suppressContentEditableWarning', + suppresshydrationwarning: 'suppressHydrationWarning', + surfacescale: 'surfaceScale', + systemlanguage: 'systemLanguage', + tablevalues: 'tableValues', + targetx: 'targetX', + targety: 'targetY', + textanchor: 'textAnchor', + 'text-anchor': 'textAnchor', + textdecoration: 'textDecoration', + 'text-decoration': 'textDecoration', + textlength: 'textLength', + textrendering: 'textRendering', + 'text-rendering': 'textRendering', + to: 'to', + transform: 'transform', + typeof: 'typeof', + u1: 'u1', + u2: 'u2', + underlineposition: 'underlinePosition', + 'underline-position': 'underlinePosition', + underlinethickness: 'underlineThickness', + 'underline-thickness': 'underlineThickness', + unicode: 'unicode', + unicodebidi: 'unicodeBidi', + 'unicode-bidi': 'unicodeBidi', + unicoderange: 'unicodeRange', + 'unicode-range': 'unicodeRange', + unitsperem: 'unitsPerEm', + 'units-per-em': 'unitsPerEm', + unselectable: 'unselectable', + valphabetic: 'vAlphabetic', + 'v-alphabetic': 'vAlphabetic', + values: 'values', + vectoreffect: 'vectorEffect', + 'vector-effect': 'vectorEffect', + version: 'version', + vertadvy: 'vertAdvY', + 'vert-adv-y': 'vertAdvY', + vertoriginx: 'vertOriginX', + 'vert-origin-x': 'vertOriginX', + vertoriginy: 'vertOriginY', + 'vert-origin-y': 'vertOriginY', + vhanging: 'vHanging', + 'v-hanging': 'vHanging', + videographic: 'vIdeographic', + 'v-ideographic': 'vIdeographic', + viewbox: 'viewBox', + viewtarget: 'viewTarget', + visibility: 'visibility', + vmathematical: 'vMathematical', + 'v-mathematical': 'vMathematical', + vocab: 'vocab', + widths: 'widths', + wordspacing: 'wordSpacing', + 'word-spacing': 'wordSpacing', + writingmode: 'writingMode', + 'writing-mode': 'writingMode', + x1: 'x1', + x2: 'x2', + x: 'x', + xchannelselector: 'xChannelSelector', + xheight: 'xHeight', + 'x-height': 'xHeight', + xlinkactuate: 'xlinkActuate', + 'xlink:actuate': 'xlinkActuate', + xlinkarcrole: 'xlinkArcrole', + 'xlink:arcrole': 'xlinkArcrole', + xlinkhref: 'xlinkHref', + 'xlink:href': 'xlinkHref', + xlinkrole: 'xlinkRole', + 'xlink:role': 'xlinkRole', + xlinkshow: 'xlinkShow', + 'xlink:show': 'xlinkShow', + xlinktitle: 'xlinkTitle', + 'xlink:title': 'xlinkTitle', + xlinktype: 'xlinkType', + 'xlink:type': 'xlinkType', + xmlbase: 'xmlBase', + 'xml:base': 'xmlBase', + xmllang: 'xmlLang', + 'xml:lang': 'xmlLang', + xmlns: 'xmlns', + 'xml:space': 'xmlSpace', + xmlnsxlink: 'xmlnsXlink', + 'xmlns:xlink': 'xmlnsXlink', + xmlspace: 'xmlSpace', + y1: 'y1', + y2: 'y2', + y: 'y', + ychannelselector: 'yChannelSelector', + z: 'z', + zoomandpan: 'zoomAndPan' +}; + +var validateProperty$1 = function () {}; + +{ + var warnedProperties$1 = {}; + var EVENT_NAME_REGEX = /^on./; + var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/; + var rARIA$1 = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$'); + var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$'); + + validateProperty$1 = function (tagName, name, value, eventRegistry) { + if (hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) { + return true; + } + + var lowerCasedName = name.toLowerCase(); + + if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') { + error('React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.'); + + warnedProperties$1[name] = true; + return true; + } // We can't rely on the event system being injected on the server. + + + if (eventRegistry != null) { + var registrationNameDependencies = eventRegistry.registrationNameDependencies, + possibleRegistrationNames = eventRegistry.possibleRegistrationNames; + + if (registrationNameDependencies.hasOwnProperty(name)) { + return true; + } + + var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null; + + if (registrationName != null) { + error('Invalid event handler property `%s`. Did you mean `%s`?', name, registrationName); + + warnedProperties$1[name] = true; + return true; + } + + if (EVENT_NAME_REGEX.test(name)) { + error('Unknown event handler property `%s`. It will be ignored.', name); + + warnedProperties$1[name] = true; + return true; + } + } else if (EVENT_NAME_REGEX.test(name)) { + // If no event plugins have been injected, we are in a server environment. + // So we can't tell if the event name is correct for sure, but we can filter + // out known bad ones like `onclick`. We can't suggest a specific replacement though. + if (INVALID_EVENT_NAME_REGEX.test(name)) { + error('Invalid event handler property `%s`. ' + 'React events use the camelCase naming convention, for example `onClick`.', name); + } + + warnedProperties$1[name] = true; + return true; + } // Let the ARIA attribute hook validate ARIA attributes + + + if (rARIA$1.test(name) || rARIACamel$1.test(name)) { + return true; + } + + if (lowerCasedName === 'innerhtml') { + error('Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.'); + + warnedProperties$1[name] = true; + return true; + } + + if (lowerCasedName === 'aria') { + error('The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.'); + + warnedProperties$1[name] = true; + return true; + } + + if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') { + error('Received a `%s` for a string attribute `is`. If this is expected, cast ' + 'the value to a string.', typeof value); + + warnedProperties$1[name] = true; + return true; + } + + if (typeof value === 'number' && isNaN(value)) { + error('Received NaN for the `%s` attribute. If this is expected, cast ' + 'the value to a string.', name); + + warnedProperties$1[name] = true; + return true; + } + + var propertyInfo = getPropertyInfo(name); + var isReserved = propertyInfo !== null && propertyInfo.type === RESERVED; // Known attributes should match the casing specified in the property config. + + if (possibleStandardNames.hasOwnProperty(lowerCasedName)) { + var standardName = possibleStandardNames[lowerCasedName]; + + if (standardName !== name) { + error('Invalid DOM property `%s`. Did you mean `%s`?', name, standardName); + + warnedProperties$1[name] = true; + return true; + } + } else if (!isReserved && name !== lowerCasedName) { + // Unknown attributes should have lowercase casing since that's how they + // will be cased anyway with server rendering. + error('React does not recognize the `%s` prop on a DOM element. If you ' + 'intentionally want it to appear in the DOM as a custom ' + 'attribute, spell it as lowercase `%s` instead. ' + 'If you accidentally passed it from a parent component, remove ' + 'it from the DOM element.', name, lowerCasedName); + + warnedProperties$1[name] = true; + return true; + } + + if (typeof value === 'boolean' && shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) { + if (value) { + error('Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.', value, name, name, value, name); + } else { + error('Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', value, name, name, value, name, name, name); + } + + warnedProperties$1[name] = true; + return true; + } // Now that we've validated casing, do not validate + // data types for reserved props + + + if (isReserved) { + return true; + } // Warn when a known attribute is a bad type + + + if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) { + warnedProperties$1[name] = true; + return false; + } // Warn when passing the strings 'false' or 'true' into a boolean prop + + + if ((value === 'false' || value === 'true') && propertyInfo !== null && propertyInfo.type === BOOLEAN) { + error('Received the string `%s` for the boolean attribute `%s`. ' + '%s ' + 'Did you mean %s={%s}?', value, name, value === 'false' ? 'The browser will interpret it as a truthy value.' : 'Although this works, it will not work as expected if you pass the string "false".', name, value); + + warnedProperties$1[name] = true; + return true; + } + + return true; + }; +} + +var warnUnknownProperties = function (type, props, eventRegistry) { + { + var unknownProps = []; + + for (var key in props) { + var isValid = validateProperty$1(type, key, props[key], eventRegistry); + + if (!isValid) { + unknownProps.push(key); + } + } + + var unknownPropString = unknownProps.map(function (prop) { + return '`' + prop + '`'; + }).join(', '); + + if (unknownProps.length === 1) { + error('Invalid value for prop %s on <%s> tag. Either remove it from the element, ' + 'or pass a string or number value to keep it in the DOM. ' + 'For details, see https://reactjs.org/link/attribute-behavior ', unknownPropString, type); + } else if (unknownProps.length > 1) { + error('Invalid values for props %s on <%s> tag. Either remove them from the element, ' + 'or pass a string or number value to keep them in the DOM. ' + 'For details, see https://reactjs.org/link/attribute-behavior ', unknownPropString, type); + } + } +}; + +function validateProperties$2(type, props, eventRegistry) { + if (isCustomComponent(type, props)) { + return; + } + + warnUnknownProperties(type, props, eventRegistry); +} + +var warnValidStyle = function () {}; + +{ + // 'msTransform' is correct, but the other prefixes should be capitalized + var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/; + var msPattern = /^-ms-/; + var hyphenPattern = /-(.)/g; // style values shouldn't contain a semicolon + + var badStyleValueWithSemicolonPattern = /;\s*$/; + var warnedStyleNames = {}; + var warnedStyleValues = {}; + var warnedForNaNValue = false; + var warnedForInfinityValue = false; + + var camelize = function (string) { + return string.replace(hyphenPattern, function (_, character) { + return character.toUpperCase(); + }); + }; + + var warnHyphenatedStyleName = function (name) { + if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { + return; + } + + warnedStyleNames[name] = true; + + error('Unsupported style property %s. Did you mean %s?', name, // As Andi Smith suggests + // (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix + // is converted to lowercase `ms`. + camelize(name.replace(msPattern, 'ms-'))); + }; + + var warnBadVendoredStyleName = function (name) { + if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { + return; + } + + warnedStyleNames[name] = true; + + error('Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1)); + }; + + var warnStyleValueWithSemicolon = function (name, value) { + if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) { + return; + } + + warnedStyleValues[value] = true; + + error("Style property values shouldn't contain a semicolon. " + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, '')); + }; + + var warnStyleValueIsNaN = function (name, value) { + if (warnedForNaNValue) { + return; + } + + warnedForNaNValue = true; + + error('`NaN` is an invalid value for the `%s` css style property.', name); + }; + + var warnStyleValueIsInfinity = function (name, value) { + if (warnedForInfinityValue) { + return; + } + + warnedForInfinityValue = true; + + error('`Infinity` is an invalid value for the `%s` css style property.', name); + }; + + warnValidStyle = function (name, value) { + if (name.indexOf('-') > -1) { + warnHyphenatedStyleName(name); + } else if (badVendoredStyleNamePattern.test(name)) { + warnBadVendoredStyleName(name); + } else if (badStyleValueWithSemicolonPattern.test(value)) { + warnStyleValueWithSemicolon(name, value); + } + + if (typeof value === 'number') { + if (isNaN(value)) { + warnStyleValueIsNaN(name, value); + } else if (!isFinite(value)) { + warnStyleValueIsInfinity(name, value); + } + } + }; +} + +var warnValidStyle$1 = warnValidStyle; + +// code copied and modified from escape-html +var matchHtmlRegExp = /["'&<>]/; +/** + * Escapes special characters and HTML entities in a given html string. + * + * @param {string} string HTML string to escape for later insertion + * @return {string} + * @public + */ + +function escapeHtml(string) { + { + checkHtmlStringCoercion(string); + } + + var str = '' + string; + var match = matchHtmlRegExp.exec(str); + + if (!match) { + return str; + } + + var escape; + var html = ''; + var index; + var lastIndex = 0; + + for (index = match.index; index < str.length; index++) { + switch (str.charCodeAt(index)) { + case 34: + // " + escape = '"'; + break; + + case 38: + // & + escape = '&'; + break; + + case 39: + // ' + escape = '''; // modified from escape-html; used to be ''' + + break; + + case 60: + // < + escape = '<'; + break; + + case 62: + // > + escape = '>'; + break; + + default: + continue; + } + + if (lastIndex !== index) { + html += str.substring(lastIndex, index); + } + + lastIndex = index + 1; + html += escape; + } + + return lastIndex !== index ? html + str.substring(lastIndex, index) : html; +} // end code copied and modified from escape-html + +/** + * Escapes text to prevent scripting attacks. + * + * @param {*} text Text value to escape. + * @return {string} An escaped string. + */ + + +function escapeTextForBrowser(text) { + if (typeof text === 'boolean' || typeof text === 'number') { + // this shortcircuit helps perf for types that we know will never have + // special characters, especially given that this function is used often + // for numeric dom ids. + return '' + text; + } + + return escapeHtml(text); +} + +var uppercasePattern = /([A-Z])/g; +var msPattern$1 = /^ms-/; +/** + * Hyphenates a camelcased CSS property name, for example: + * + * > hyphenateStyleName('backgroundColor') + * < "background-color" + * > hyphenateStyleName('MozTransition') + * < "-moz-transition" + * > hyphenateStyleName('msTransition') + * < "-ms-transition" + * + * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix + * is converted to `-ms-`. + */ + +function hyphenateStyleName(name) { + return name.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern$1, '-ms-'); +} + +// and any newline or tab are filtered out as if they're not part of the URL. +// https://url.spec.whatwg.org/#url-parsing +// Tab or newline are defined as \r\n\t: +// https://infra.spec.whatwg.org/#ascii-tab-or-newline +// A C0 control is a code point in the range \u0000 NULL to \u001F +// INFORMATION SEPARATOR ONE, inclusive: +// https://infra.spec.whatwg.org/#c0-control-or-space + +/* eslint-disable max-len */ + +var isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i; +var didWarn = false; + +function sanitizeURL(url) { + { + if (!didWarn && isJavaScriptProtocol.test(url)) { + didWarn = true; + + error('A future version of React will block javascript: URLs as a security precaution. ' + 'Use event handlers instead if you can. If you need to generate unsafe HTML try ' + 'using dangerouslySetInnerHTML instead. React was passed %s.', JSON.stringify(url)); + } + } +} + +var isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare + +function isArray(a) { + return isArrayImpl(a); +} + +var startInlineScript = stringToPrecomputedChunk(''); +var startScriptSrc = stringToPrecomputedChunk(''); +/** + * This escaping function is designed to work with bootstrapScriptContent only. + * because we know we are escaping the entire script. We can avoid for instance + * escaping html comment string sequences that are valid javascript as well because + * if there are no sebsequent '); +function writeCompletedSegmentInstruction(destination, responseState, contentSegmentID) { + writeChunk(destination, responseState.startInlineScript); + + if (!responseState.sentCompleteSegmentFunction) { + // The first time we write this, we'll need to include the full implementation. + responseState.sentCompleteSegmentFunction = true; + writeChunk(destination, completeSegmentScript1Full); + } else { + // Future calls can just reuse the same function. + writeChunk(destination, completeSegmentScript1Partial); + } + + writeChunk(destination, responseState.segmentPrefix); + var formattedID = stringToChunk(contentSegmentID.toString(16)); + writeChunk(destination, formattedID); + writeChunk(destination, completeSegmentScript2); + writeChunk(destination, responseState.placeholderPrefix); + writeChunk(destination, formattedID); + return writeChunkAndReturn(destination, completeSegmentScript3); +} +var completeBoundaryScript1Full = stringToPrecomputedChunk(completeBoundaryFunction + ';$RC("'); +var completeBoundaryScript1Partial = stringToPrecomputedChunk('$RC("'); +var completeBoundaryScript2 = stringToPrecomputedChunk('","'); +var completeBoundaryScript3 = stringToPrecomputedChunk('")'); +function writeCompletedBoundaryInstruction(destination, responseState, boundaryID, contentSegmentID) { + writeChunk(destination, responseState.startInlineScript); + + if (!responseState.sentCompleteBoundaryFunction) { + // The first time we write this, we'll need to include the full implementation. + responseState.sentCompleteBoundaryFunction = true; + writeChunk(destination, completeBoundaryScript1Full); + } else { + // Future calls can just reuse the same function. + writeChunk(destination, completeBoundaryScript1Partial); + } + + if (boundaryID === null) { + throw new Error('An ID must have been assigned before we can complete the boundary.'); + } + + var formattedContentID = stringToChunk(contentSegmentID.toString(16)); + writeChunk(destination, boundaryID); + writeChunk(destination, completeBoundaryScript2); + writeChunk(destination, responseState.segmentPrefix); + writeChunk(destination, formattedContentID); + return writeChunkAndReturn(destination, completeBoundaryScript3); +} +var clientRenderScript1Full = stringToPrecomputedChunk(clientRenderFunction + ';$RX("'); +var clientRenderScript1Partial = stringToPrecomputedChunk('$RX("'); +var clientRenderScript1A = stringToPrecomputedChunk('"'); +var clientRenderScript2 = stringToPrecomputedChunk(')'); +var clientRenderErrorScriptArgInterstitial = stringToPrecomputedChunk(','); +function writeClientRenderBoundaryInstruction(destination, responseState, boundaryID, errorDigest, errorMessage, errorComponentStack) { + writeChunk(destination, responseState.startInlineScript); + + if (!responseState.sentClientRenderFunction) { + // The first time we write this, we'll need to include the full implementation. + responseState.sentClientRenderFunction = true; + writeChunk(destination, clientRenderScript1Full); + } else { + // Future calls can just reuse the same function. + writeChunk(destination, clientRenderScript1Partial); + } + + if (boundaryID === null) { + throw new Error('An ID must have been assigned before we can complete the boundary.'); + } + + writeChunk(destination, boundaryID); + writeChunk(destination, clientRenderScript1A); + + if (errorDigest || errorMessage || errorComponentStack) { + writeChunk(destination, clientRenderErrorScriptArgInterstitial); + writeChunk(destination, stringToChunk(escapeJSStringsForInstructionScripts(errorDigest || ''))); + } + + if (errorMessage || errorComponentStack) { + writeChunk(destination, clientRenderErrorScriptArgInterstitial); + writeChunk(destination, stringToChunk(escapeJSStringsForInstructionScripts(errorMessage || ''))); + } + + if (errorComponentStack) { + writeChunk(destination, clientRenderErrorScriptArgInterstitial); + writeChunk(destination, stringToChunk(escapeJSStringsForInstructionScripts(errorComponentStack))); + } + + return writeChunkAndReturn(destination, clientRenderScript2); +} +var regexForJSStringsInScripts = /[<\u2028\u2029]/g; + +function escapeJSStringsForInstructionScripts(input) { + var escaped = JSON.stringify(input); + return escaped.replace(regexForJSStringsInScripts, function (match) { + switch (match) { + // santizing breaking out of strings and script tags + case '<': + return "\\u003c"; + + case "\u2028": + return "\\u2028"; + + case "\u2029": + return "\\u2029"; + + default: + { + // eslint-disable-next-line react-internal/prod-error-codes + throw new Error('escapeJSStringsForInstructionScripts encountered a match it does not know how to replace. this means the match regex and the replacement characters are no longer in sync. This is a bug in React'); + } + } + }); +} + +function createResponseState$1(generateStaticMarkup, identifierPrefix) { + var responseState = createResponseState(identifierPrefix, undefined); + return { + // Keep this in sync with ReactDOMServerFormatConfig + bootstrapChunks: responseState.bootstrapChunks, + startInlineScript: responseState.startInlineScript, + placeholderPrefix: responseState.placeholderPrefix, + segmentPrefix: responseState.segmentPrefix, + boundaryPrefix: responseState.boundaryPrefix, + idPrefix: responseState.idPrefix, + nextSuspenseID: responseState.nextSuspenseID, + sentCompleteSegmentFunction: responseState.sentCompleteSegmentFunction, + sentCompleteBoundaryFunction: responseState.sentCompleteBoundaryFunction, + sentClientRenderFunction: responseState.sentClientRenderFunction, + // This is an extra field for the legacy renderer + generateStaticMarkup: generateStaticMarkup + }; +} +function createRootFormatContext() { + return { + insertionMode: HTML_MODE, + // We skip the root mode because we don't want to emit the DOCTYPE in legacy mode. + selectedValue: null + }; +} +function pushTextInstance$1(target, text, responseState, textEmbedded) { + if (responseState.generateStaticMarkup) { + target.push(stringToChunk(escapeTextForBrowser(text))); + return false; + } else { + return pushTextInstance(target, text, responseState, textEmbedded); + } +} +function pushSegmentFinale$1(target, responseState, lastPushedText, textEmbedded) { + if (responseState.generateStaticMarkup) { + return; + } else { + return pushSegmentFinale(target, responseState, lastPushedText, textEmbedded); + } +} +function writeStartCompletedSuspenseBoundary$1(destination, responseState) { + if (responseState.generateStaticMarkup) { + // A completed boundary is done and doesn't need a representation in the HTML + // if we're not going to be hydrating it. + return true; + } + + return writeStartCompletedSuspenseBoundary(destination); +} +function writeStartClientRenderedSuspenseBoundary$1(destination, responseState, // flushing these error arguments are not currently supported in this legacy streaming format. +errorDigest, errorMessage, errorComponentStack) { + if (responseState.generateStaticMarkup) { + // A client rendered boundary is done and doesn't need a representation in the HTML + // since we'll never hydrate it. This is arguably an error in static generation. + return true; + } + + return writeStartClientRenderedSuspenseBoundary(destination, responseState, errorDigest, errorMessage, errorComponentStack); +} +function writeEndCompletedSuspenseBoundary$1(destination, responseState) { + if (responseState.generateStaticMarkup) { + return true; + } + + return writeEndCompletedSuspenseBoundary(destination); +} +function writeEndClientRenderedSuspenseBoundary$1(destination, responseState) { + if (responseState.generateStaticMarkup) { + return true; + } + + return writeEndClientRenderedSuspenseBoundary(destination); +} + +var assign = Object.assign; + +// ATTENTION +// When adding new symbols to this file, +// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' +// The Symbol used to tag the ReactElement-like types. +var REACT_ELEMENT_TYPE = Symbol.for('react.element'); +var REACT_PORTAL_TYPE = Symbol.for('react.portal'); +var REACT_FRAGMENT_TYPE = Symbol.for('react.fragment'); +var REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode'); +var REACT_PROFILER_TYPE = Symbol.for('react.profiler'); +var REACT_PROVIDER_TYPE = Symbol.for('react.provider'); +var REACT_CONTEXT_TYPE = Symbol.for('react.context'); +var REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref'); +var REACT_SUSPENSE_TYPE = Symbol.for('react.suspense'); +var REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list'); +var REACT_MEMO_TYPE = Symbol.for('react.memo'); +var REACT_LAZY_TYPE = Symbol.for('react.lazy'); +var REACT_SCOPE_TYPE = Symbol.for('react.scope'); +var REACT_DEBUG_TRACING_MODE_TYPE = Symbol.for('react.debug_trace_mode'); +var REACT_LEGACY_HIDDEN_TYPE = Symbol.for('react.legacy_hidden'); +var REACT_SERVER_CONTEXT_DEFAULT_VALUE_NOT_LOADED = Symbol.for('react.default_value'); +var MAYBE_ITERATOR_SYMBOL = Symbol.iterator; +var FAUX_ITERATOR_SYMBOL = '@@iterator'; +function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== 'object') { + return null; + } + + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + + if (typeof maybeIterator === 'function') { + return maybeIterator; + } + + return null; +} + +function getWrappedName(outerType, innerType, wrapperName) { + var displayName = outerType.displayName; + + if (displayName) { + return displayName; + } + + var functionName = innerType.displayName || innerType.name || ''; + return functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName; +} // Keep in sync with react-reconciler/getComponentNameFromFiber + + +function getContextName(type) { + return type.displayName || 'Context'; +} // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead. + + +function getComponentNameFromType(type) { + if (type == null) { + // Host root, text node or just invalid type. + return null; + } + + { + if (typeof type.tag === 'number') { + error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.'); + } + } + + if (typeof type === 'function') { + return type.displayName || type.name || null; + } + + if (typeof type === 'string') { + return type; + } + + switch (type) { + case REACT_FRAGMENT_TYPE: + return 'Fragment'; + + case REACT_PORTAL_TYPE: + return 'Portal'; + + case REACT_PROFILER_TYPE: + return 'Profiler'; + + case REACT_STRICT_MODE_TYPE: + return 'StrictMode'; + + case REACT_SUSPENSE_TYPE: + return 'Suspense'; + + case REACT_SUSPENSE_LIST_TYPE: + return 'SuspenseList'; + + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + var context = type; + return getContextName(context) + '.Consumer'; + + case REACT_PROVIDER_TYPE: + var provider = type; + return getContextName(provider._context) + '.Provider'; + + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, 'ForwardRef'); + + case REACT_MEMO_TYPE: + var outerName = type.displayName || null; + + if (outerName !== null) { + return outerName; + } + + return getComponentNameFromType(type.type) || 'Memo'; + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + return getComponentNameFromType(init(payload)); + } catch (x) { + return null; + } + } + + // eslint-disable-next-line no-fallthrough + } + } + + return null; +} + +// Helpers to patch console.logs to avoid logging during side-effect free +// replaying on render function. This currently only patches the object +// lazily which won't cover if the log function was extracted eagerly. +// We could also eagerly patch the method. +var disabledDepth = 0; +var prevLog; +var prevInfo; +var prevWarn; +var prevError; +var prevGroup; +var prevGroupCollapsed; +var prevGroupEnd; + +function disabledLog() {} + +disabledLog.__reactDisabledLog = true; +function disableLogs() { + { + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099 + + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props + }); + /* eslint-enable react-internal/no-production-logging */ + } + + disabledDepth++; + } +} +function reenableLogs() { + { + disabledDepth--; + + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + var props = { + configurable: true, + enumerable: true, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + log: assign({}, props, { + value: prevLog + }), + info: assign({}, props, { + value: prevInfo + }), + warn: assign({}, props, { + value: prevWarn + }), + error: assign({}, props, { + value: prevError + }), + group: assign({}, props, { + value: prevGroup + }), + groupCollapsed: assign({}, props, { + value: prevGroupCollapsed + }), + groupEnd: assign({}, props, { + value: prevGroupEnd + }) + }); + /* eslint-enable react-internal/no-production-logging */ + } + + if (disabledDepth < 0) { + error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.'); + } + } +} + +var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; +var prefix; +function describeBuiltInComponentFrame(name, source, ownerFn) { + { + if (prefix === undefined) { + // Extract the VM specific prefix used by each line. + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = match && match[1] || ''; + } + } // We use the prefix to ensure our stacks line up with native stack frames. + + + return '\n' + prefix + name; + } +} +var reentry = false; +var componentFrameCache; + +{ + var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; + componentFrameCache = new PossiblyWeakMap(); +} + +function describeNativeComponentFrame(fn, construct) { + // If something asked for a stack inside a fake render, it should get ignored. + if ( !fn || reentry) { + return ''; + } + + { + var frame = componentFrameCache.get(fn); + + if (frame !== undefined) { + return frame; + } + } + + var control; + reentry = true; + var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined. + + Error.prepareStackTrace = undefined; + var previousDispatcher; + + { + previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function + // for warnings. + + ReactCurrentDispatcher.current = null; + disableLogs(); + } + + try { + // This should throw. + if (construct) { + // Something should be setting the props in the constructor. + var Fake = function () { + throw Error(); + }; // $FlowFixMe + + + Object.defineProperty(Fake.prototype, 'props', { + set: function () { + // We use a throwing setter instead of frozen or non-writable props + // because that won't throw in a non-strict mode function. + throw Error(); + } + }); + + if (typeof Reflect === 'object' && Reflect.construct) { + // We construct a different control for this case to include any extra + // frames added by the construct call. + try { + Reflect.construct(Fake, []); + } catch (x) { + control = x; + } + + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x) { + control = x; + } + + fn.call(Fake.prototype); + } + } else { + try { + throw Error(); + } catch (x) { + control = x; + } + + fn(); + } + } catch (sample) { + // This is inlined manually because closure doesn't do it for us. + if (sample && control && typeof sample.stack === 'string') { + // This extracts the first frame from the sample that isn't also in the control. + // Skipping one frame that we assume is the frame that calls the two. + var sampleLines = sample.stack.split('\n'); + var controlLines = control.stack.split('\n'); + var s = sampleLines.length - 1; + var c = controlLines.length - 1; + + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { + // We expect at least one stack frame to be shared. + // Typically this will be the root most one. However, stack frames may be + // cut off due to maximum stack limits. In this case, one maybe cut off + // earlier than the other. We assume that the sample is longer or the same + // and there for cut off earlier. So we should find the root most frame in + // the sample somewhere in the control. + c--; + } + + for (; s >= 1 && c >= 0; s--, c--) { + // Next we find the first one that isn't the same which should be the + // frame that called our sample function and the control. + if (sampleLines[s] !== controlLines[c]) { + // In V8, the first line is describing the message but other VMs don't. + // If we're about to return the first line, and the control is also on the same + // line, that's a pretty good indicator that our sample threw at same line as + // the control. I.e. before we entered the sample frame. So we ignore this result. + // This can happen if you passed a class to function component, or non-function. + if (s !== 1 || c !== 1) { + do { + s--; + c--; // We may still have similar intermediate frames from the construct call. + // The next one that isn't the same should be our match though. + + if (c < 0 || sampleLines[s] !== controlLines[c]) { + // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier. + var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled "" + // but we have a user-provided "displayName" + // splice it in to make the stack more readable. + + + if (fn.displayName && _frame.includes('')) { + _frame = _frame.replace('', fn.displayName); + } + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, _frame); + } + } // Return the line we found. + + + return _frame; + } + } while (s >= 1 && c >= 0); + } + + break; + } + } + } + } finally { + reentry = false; + + { + ReactCurrentDispatcher.current = previousDispatcher; + reenableLogs(); + } + + Error.prepareStackTrace = previousPrepareStackTrace; + } // Fallback to just using the name if we couldn't make it throw. + + + var name = fn ? fn.displayName || fn.name : ''; + var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ''; + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, syntheticFrame); + } + } + + return syntheticFrame; +} + +function describeClassComponentFrame(ctor, source, ownerFn) { + { + return describeNativeComponentFrame(ctor, true); + } +} +function describeFunctionComponentFrame(fn, source, ownerFn) { + { + return describeNativeComponentFrame(fn, false); + } +} + +function shouldConstruct(Component) { + var prototype = Component.prototype; + return !!(prototype && prototype.isReactComponent); +} + +function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { + + if (type == null) { + return ''; + } + + if (typeof type === 'function') { + { + return describeNativeComponentFrame(type, shouldConstruct(type)); + } + } + + if (typeof type === 'string') { + return describeBuiltInComponentFrame(type); + } + + switch (type) { + case REACT_SUSPENSE_TYPE: + return describeBuiltInComponentFrame('Suspense'); + + case REACT_SUSPENSE_LIST_TYPE: + return describeBuiltInComponentFrame('SuspenseList'); + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + return describeFunctionComponentFrame(type.render); + + case REACT_MEMO_TYPE: + // Memo may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + // Lazy may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); + } catch (x) {} + } + } + } + + return ''; +} + +var loggedTypeFailures = {}; +var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + +function setCurrentlyValidatingElement(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame.setExtraStackFrame(null); + } + } +} + +function checkPropTypes(typeSpecs, values, location, componentName, element) { + { + // $FlowFixMe This is okay but Flow doesn't know it. + var has = Function.call.bind(hasOwnProperty); + + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + if (typeof typeSpecs[typeSpecName] !== 'function') { + // eslint-disable-next-line react-internal/prod-error-codes + var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'); + err.name = 'Invariant Violation'; + throw err; + } + + error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'); + } catch (ex) { + error$1 = ex; + } + + if (error$1 && !(error$1 instanceof Error)) { + setCurrentlyValidatingElement(element); + + error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1); + + setCurrentlyValidatingElement(null); + } + + if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error$1.message] = true; + setCurrentlyValidatingElement(element); + + error('Failed %s type: %s', location, error$1.message); + + setCurrentlyValidatingElement(null); + } + } + } + } +} + +var warnedAboutMissingGetChildContext; + +{ + warnedAboutMissingGetChildContext = {}; +} + +var emptyContextObject = {}; + +{ + Object.freeze(emptyContextObject); +} + +function getMaskedContext(type, unmaskedContext) { + { + var contextTypes = type.contextTypes; + + if (!contextTypes) { + return emptyContextObject; + } + + var context = {}; + + for (var key in contextTypes) { + context[key] = unmaskedContext[key]; + } + + { + var name = getComponentNameFromType(type) || 'Unknown'; + checkPropTypes(contextTypes, context, 'context', name); + } + + return context; + } +} +function processChildContext(instance, type, parentContext, childContextTypes) { + { + // TODO (bvaughn) Replace this behavior with an invariant() in the future. + // It has only been added in Fiber to match the (unintentional) behavior in Stack. + if (typeof instance.getChildContext !== 'function') { + { + var componentName = getComponentNameFromType(type) || 'Unknown'; + + if (!warnedAboutMissingGetChildContext[componentName]) { + warnedAboutMissingGetChildContext[componentName] = true; + + error('%s.childContextTypes is specified but there is no getChildContext() method ' + 'on the instance. You can either define getChildContext() on %s or remove ' + 'childContextTypes from it.', componentName, componentName); + } + } + + return parentContext; + } + + var childContext = instance.getChildContext(); + + for (var contextKey in childContext) { + if (!(contextKey in childContextTypes)) { + throw new Error((getComponentNameFromType(type) || 'Unknown') + ".getChildContext(): key \"" + contextKey + "\" is not defined in childContextTypes."); + } + } + + { + var name = getComponentNameFromType(type) || 'Unknown'; + checkPropTypes(childContextTypes, childContext, 'child context', name); + } + + return assign({}, parentContext, childContext); + } +} + +var rendererSigil; + +{ + // Use this to detect multiple renderers using the same context + rendererSigil = {}; +} // Used to store the parent path of all context overrides in a shared linked list. +// Forming a reverse tree. + + +var rootContextSnapshot = null; // We assume that this runtime owns the "current" field on all ReactContext instances. +// This global (actually thread local) state represents what state all those "current", +// fields are currently in. + +var currentActiveSnapshot = null; + +function popNode(prev) { + { + prev.context._currentValue2 = prev.parentValue; + } +} + +function pushNode(next) { + { + next.context._currentValue2 = next.value; + } +} + +function popToNearestCommonAncestor(prev, next) { + if (prev === next) ; else { + popNode(prev); + var parentPrev = prev.parent; + var parentNext = next.parent; + + if (parentPrev === null) { + if (parentNext !== null) { + throw new Error('The stacks must reach the root at the same time. This is a bug in React.'); + } + } else { + if (parentNext === null) { + throw new Error('The stacks must reach the root at the same time. This is a bug in React.'); + } + + popToNearestCommonAncestor(parentPrev, parentNext); + } // On the way back, we push the new ones that weren't common. + + + pushNode(next); + } +} + +function popAllPrevious(prev) { + popNode(prev); + var parentPrev = prev.parent; + + if (parentPrev !== null) { + popAllPrevious(parentPrev); + } +} + +function pushAllNext(next) { + var parentNext = next.parent; + + if (parentNext !== null) { + pushAllNext(parentNext); + } + + pushNode(next); +} + +function popPreviousToCommonLevel(prev, next) { + popNode(prev); + var parentPrev = prev.parent; + + if (parentPrev === null) { + throw new Error('The depth must equal at least at zero before reaching the root. This is a bug in React.'); + } + + if (parentPrev.depth === next.depth) { + // We found the same level. Now we just need to find a shared ancestor. + popToNearestCommonAncestor(parentPrev, next); + } else { + // We must still be deeper. + popPreviousToCommonLevel(parentPrev, next); + } +} + +function popNextToCommonLevel(prev, next) { + var parentNext = next.parent; + + if (parentNext === null) { + throw new Error('The depth must equal at least at zero before reaching the root. This is a bug in React.'); + } + + if (prev.depth === parentNext.depth) { + // We found the same level. Now we just need to find a shared ancestor. + popToNearestCommonAncestor(prev, parentNext); + } else { + // We must still be deeper. + popNextToCommonLevel(prev, parentNext); + } + + pushNode(next); +} // Perform context switching to the new snapshot. +// To make it cheap to read many contexts, while not suspending, we make the switch eagerly by +// updating all the context's current values. That way reads, always just read the current value. +// At the cost of updating contexts even if they're never read by this subtree. + + +function switchContext(newSnapshot) { + // The basic algorithm we need to do is to pop back any contexts that are no longer on the stack. + // We also need to update any new contexts that are now on the stack with the deepest value. + // The easiest way to update new contexts is to just reapply them in reverse order from the + // perspective of the backpointers. To avoid allocating a lot when switching, we use the stack + // for that. Therefore this algorithm is recursive. + // 1) First we pop which ever snapshot tree was deepest. Popping old contexts as we go. + // 2) Then we find the nearest common ancestor from there. Popping old contexts as we go. + // 3) Then we reapply new contexts on the way back up the stack. + var prev = currentActiveSnapshot; + var next = newSnapshot; + + if (prev !== next) { + if (prev === null) { + // $FlowFixMe: This has to be non-null since it's not equal to prev. + pushAllNext(next); + } else if (next === null) { + popAllPrevious(prev); + } else if (prev.depth === next.depth) { + popToNearestCommonAncestor(prev, next); + } else if (prev.depth > next.depth) { + popPreviousToCommonLevel(prev, next); + } else { + popNextToCommonLevel(prev, next); + } + + currentActiveSnapshot = next; + } +} +function pushProvider(context, nextValue) { + var prevValue; + + { + prevValue = context._currentValue2; + context._currentValue2 = nextValue; + + { + if (context._currentRenderer2 !== undefined && context._currentRenderer2 !== null && context._currentRenderer2 !== rendererSigil) { + error('Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.'); + } + + context._currentRenderer2 = rendererSigil; + } + } + + var prevNode = currentActiveSnapshot; + var newNode = { + parent: prevNode, + depth: prevNode === null ? 0 : prevNode.depth + 1, + context: context, + parentValue: prevValue, + value: nextValue + }; + currentActiveSnapshot = newNode; + return newNode; +} +function popProvider(context) { + var prevSnapshot = currentActiveSnapshot; + + if (prevSnapshot === null) { + throw new Error('Tried to pop a Context at the root of the app. This is a bug in React.'); + } + + { + if (prevSnapshot.context !== context) { + error('The parent context is not the expected context. This is probably a bug in React.'); + } + } + + { + var _value = prevSnapshot.parentValue; + + if (_value === REACT_SERVER_CONTEXT_DEFAULT_VALUE_NOT_LOADED) { + prevSnapshot.context._currentValue2 = prevSnapshot.context._defaultValue; + } else { + prevSnapshot.context._currentValue2 = _value; + } + + { + if (context._currentRenderer2 !== undefined && context._currentRenderer2 !== null && context._currentRenderer2 !== rendererSigil) { + error('Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.'); + } + + context._currentRenderer2 = rendererSigil; + } + } + + return currentActiveSnapshot = prevSnapshot.parent; +} +function getActiveContext() { + return currentActiveSnapshot; +} +function readContext(context) { + var value = context._currentValue2; + return value; +} + +/** + * `ReactInstanceMap` maintains a mapping from a public facing stateful + * instance (key) and the internal representation (value). This allows public + * methods to accept the user facing instance as an argument and map them back + * to internal methods. + * + * Note that this module is currently shared and assumed to be stateless. + * If this becomes an actual Map, that will break. + */ +function get(key) { + return key._reactInternals; +} +function set(key, value) { + key._reactInternals = value; +} + +var didWarnAboutNoopUpdateForComponent = {}; +var didWarnAboutDeprecatedWillMount = {}; +var didWarnAboutUninitializedState; +var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate; +var didWarnAboutLegacyLifecyclesAndDerivedState; +var didWarnAboutUndefinedDerivedState; +var warnOnUndefinedDerivedState; +var warnOnInvalidCallback; +var didWarnAboutDirectlyAssigningPropsToState; +var didWarnAboutContextTypeAndContextTypes; +var didWarnAboutInvalidateContextType; + +{ + didWarnAboutUninitializedState = new Set(); + didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set(); + didWarnAboutLegacyLifecyclesAndDerivedState = new Set(); + didWarnAboutDirectlyAssigningPropsToState = new Set(); + didWarnAboutUndefinedDerivedState = new Set(); + didWarnAboutContextTypeAndContextTypes = new Set(); + didWarnAboutInvalidateContextType = new Set(); + var didWarnOnInvalidCallback = new Set(); + + warnOnInvalidCallback = function (callback, callerName) { + if (callback === null || typeof callback === 'function') { + return; + } + + var key = callerName + '_' + callback; + + if (!didWarnOnInvalidCallback.has(key)) { + didWarnOnInvalidCallback.add(key); + + error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback); + } + }; + + warnOnUndefinedDerivedState = function (type, partialState) { + if (partialState === undefined) { + var componentName = getComponentNameFromType(type) || 'Component'; + + if (!didWarnAboutUndefinedDerivedState.has(componentName)) { + didWarnAboutUndefinedDerivedState.add(componentName); + + error('%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. ' + 'You have returned undefined.', componentName); + } + } + }; +} + +function warnNoop(publicInstance, callerName) { + { + var _constructor = publicInstance.constructor; + var componentName = _constructor && getComponentNameFromType(_constructor) || 'ReactClass'; + var warningKey = componentName + '.' + callerName; + + if (didWarnAboutNoopUpdateForComponent[warningKey]) { + return; + } + + error('%s(...): Can only update a mounting component. ' + 'This usually means you called %s() outside componentWillMount() on the server. ' + 'This is a no-op.\n\nPlease check the code for the %s component.', callerName, callerName, componentName); + + didWarnAboutNoopUpdateForComponent[warningKey] = true; + } +} + +var classComponentUpdater = { + isMounted: function (inst) { + return false; + }, + enqueueSetState: function (inst, payload, callback) { + var internals = get(inst); + + if (internals.queue === null) { + warnNoop(inst, 'setState'); + } else { + internals.queue.push(payload); + + { + if (callback !== undefined && callback !== null) { + warnOnInvalidCallback(callback, 'setState'); + } + } + } + }, + enqueueReplaceState: function (inst, payload, callback) { + var internals = get(inst); + internals.replace = true; + internals.queue = [payload]; + + { + if (callback !== undefined && callback !== null) { + warnOnInvalidCallback(callback, 'setState'); + } + } + }, + enqueueForceUpdate: function (inst, callback) { + var internals = get(inst); + + if (internals.queue === null) { + warnNoop(inst, 'forceUpdate'); + } else { + { + if (callback !== undefined && callback !== null) { + warnOnInvalidCallback(callback, 'setState'); + } + } + } + } +}; + +function applyDerivedStateFromProps(instance, ctor, getDerivedStateFromProps, prevState, nextProps) { + var partialState = getDerivedStateFromProps(nextProps, prevState); + + { + warnOnUndefinedDerivedState(ctor, partialState); + } // Merge the partial state and the previous state. + + + var newState = partialState === null || partialState === undefined ? prevState : assign({}, prevState, partialState); + return newState; +} + +function constructClassInstance(ctor, props, maskedLegacyContext) { + var context = emptyContextObject; + var contextType = ctor.contextType; + + { + if ('contextType' in ctor) { + var isValid = // Allow null for conditional declaration + contextType === null || contextType !== undefined && contextType.$$typeof === REACT_CONTEXT_TYPE && contextType._context === undefined; // Not a + + if (!isValid && !didWarnAboutInvalidateContextType.has(ctor)) { + didWarnAboutInvalidateContextType.add(ctor); + var addendum = ''; + + if (contextType === undefined) { + addendum = ' However, it is set to undefined. ' + 'This can be caused by a typo or by mixing up named and default imports. ' + 'This can also happen due to a circular dependency, so ' + 'try moving the createContext() call to a separate file.'; + } else if (typeof contextType !== 'object') { + addendum = ' However, it is set to a ' + typeof contextType + '.'; + } else if (contextType.$$typeof === REACT_PROVIDER_TYPE) { + addendum = ' Did you accidentally pass the Context.Provider instead?'; + } else if (contextType._context !== undefined) { + // + addendum = ' Did you accidentally pass the Context.Consumer instead?'; + } else { + addendum = ' However, it is set to an object with keys {' + Object.keys(contextType).join(', ') + '}.'; + } + + error('%s defines an invalid contextType. ' + 'contextType should point to the Context object returned by React.createContext().%s', getComponentNameFromType(ctor) || 'Component', addendum); + } + } + } + + if (typeof contextType === 'object' && contextType !== null) { + context = readContext(contextType); + } else { + context = maskedLegacyContext; + } + + var instance = new ctor(props, context); + + { + if (typeof ctor.getDerivedStateFromProps === 'function' && (instance.state === null || instance.state === undefined)) { + var componentName = getComponentNameFromType(ctor) || 'Component'; + + if (!didWarnAboutUninitializedState.has(componentName)) { + didWarnAboutUninitializedState.add(componentName); + + error('`%s` uses `getDerivedStateFromProps` but its initial state is ' + '%s. This is not recommended. Instead, define the initial state by ' + 'assigning an object to `this.state` in the constructor of `%s`. ' + 'This ensures that `getDerivedStateFromProps` arguments have a consistent shape.', componentName, instance.state === null ? 'null' : 'undefined', componentName); + } + } // If new component APIs are defined, "unsafe" lifecycles won't be called. + // Warn about these lifecycles if they are present. + // Don't warn about react-lifecycles-compat polyfilled methods though. + + + if (typeof ctor.getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function') { + var foundWillMountName = null; + var foundWillReceivePropsName = null; + var foundWillUpdateName = null; + + if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) { + foundWillMountName = 'componentWillMount'; + } else if (typeof instance.UNSAFE_componentWillMount === 'function') { + foundWillMountName = 'UNSAFE_componentWillMount'; + } + + if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) { + foundWillReceivePropsName = 'componentWillReceiveProps'; + } else if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') { + foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps'; + } + + if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) { + foundWillUpdateName = 'componentWillUpdate'; + } else if (typeof instance.UNSAFE_componentWillUpdate === 'function') { + foundWillUpdateName = 'UNSAFE_componentWillUpdate'; + } + + if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) { + var _componentName = getComponentNameFromType(ctor) || 'Component'; + + var newApiName = typeof ctor.getDerivedStateFromProps === 'function' ? 'getDerivedStateFromProps()' : 'getSnapshotBeforeUpdate()'; + + if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) { + didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName); + + error('Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n' + '%s uses %s but also contains the following legacy lifecycles:%s%s%s\n\n' + 'The above lifecycles should be removed. Learn more about this warning here:\n' + 'https://reactjs.org/link/unsafe-component-lifecycles', _componentName, newApiName, foundWillMountName !== null ? "\n " + foundWillMountName : '', foundWillReceivePropsName !== null ? "\n " + foundWillReceivePropsName : '', foundWillUpdateName !== null ? "\n " + foundWillUpdateName : ''); + } + } + } + } + + return instance; +} + +function checkClassInstance(instance, ctor, newProps) { + { + var name = getComponentNameFromType(ctor) || 'Component'; + var renderPresent = instance.render; + + if (!renderPresent) { + if (ctor.prototype && typeof ctor.prototype.render === 'function') { + error('%s(...): No `render` method found on the returned component ' + 'instance: did you accidentally return an object from the constructor?', name); + } else { + error('%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', name); + } + } + + if (instance.getInitialState && !instance.getInitialState.isReactClassApproved && !instance.state) { + error('getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', name); + } + + if (instance.getDefaultProps && !instance.getDefaultProps.isReactClassApproved) { + error('getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', name); + } + + if (instance.propTypes) { + error('propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', name); + } + + if (instance.contextType) { + error('contextType was defined as an instance property on %s. Use a static ' + 'property to define contextType instead.', name); + } + + { + if (instance.contextTypes) { + error('contextTypes was defined as an instance property on %s. Use a static ' + 'property to define contextTypes instead.', name); + } + + if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) { + didWarnAboutContextTypeAndContextTypes.add(ctor); + + error('%s declares both contextTypes and contextType static properties. ' + 'The legacy contextTypes property will be ignored.', name); + } + } + + if (typeof instance.componentShouldUpdate === 'function') { + error('%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', name); + } + + if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== 'undefined') { + error('%s has a method called shouldComponentUpdate(). ' + 'shouldComponentUpdate should not be used when extending React.PureComponent. ' + 'Please extend React.Component if shouldComponentUpdate is used.', getComponentNameFromType(ctor) || 'A pure component'); + } + + if (typeof instance.componentDidUnmount === 'function') { + error('%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', name); + } + + if (typeof instance.componentDidReceiveProps === 'function') { + error('%s has a method called ' + 'componentDidReceiveProps(). But there is no such lifecycle method. ' + 'If you meant to update the state in response to changing props, ' + 'use componentWillReceiveProps(). If you meant to fetch data or ' + 'run side-effects or mutations after React has updated the UI, use componentDidUpdate().', name); + } + + if (typeof instance.componentWillRecieveProps === 'function') { + error('%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', name); + } + + if (typeof instance.UNSAFE_componentWillRecieveProps === 'function') { + error('%s has a method called ' + 'UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?', name); + } + + var hasMutatedProps = instance.props !== newProps; + + if (instance.props !== undefined && hasMutatedProps) { + error('%s(...): When calling super() in `%s`, make sure to pass ' + "up the same props that your component's constructor was passed.", name, name); + } + + if (instance.defaultProps) { + error('Setting defaultProps as an instance property on %s is not supported and will be ignored.' + ' Instead, define defaultProps as a static property on %s.', name, name); + } + + if (typeof instance.getSnapshotBeforeUpdate === 'function' && typeof instance.componentDidUpdate !== 'function' && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) { + didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor); + + error('%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). ' + 'This component defines getSnapshotBeforeUpdate() only.', getComponentNameFromType(ctor)); + } + + if (typeof instance.getDerivedStateFromProps === 'function') { + error('%s: getDerivedStateFromProps() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name); + } + + if (typeof instance.getDerivedStateFromError === 'function') { + error('%s: getDerivedStateFromError() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name); + } + + if (typeof ctor.getSnapshotBeforeUpdate === 'function') { + error('%s: getSnapshotBeforeUpdate() is defined as a static method ' + 'and will be ignored. Instead, declare it as an instance method.', name); + } + + var _state = instance.state; + + if (_state && (typeof _state !== 'object' || isArray(_state))) { + error('%s.state: must be set to an object or null', name); + } + + if (typeof instance.getChildContext === 'function' && typeof ctor.childContextTypes !== 'object') { + error('%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', name); + } + } +} + +function callComponentWillMount(type, instance) { + var oldState = instance.state; + + if (typeof instance.componentWillMount === 'function') { + { + if ( instance.componentWillMount.__suppressDeprecationWarning !== true) { + var componentName = getComponentNameFromType(type) || 'Unknown'; + + if (!didWarnAboutDeprecatedWillMount[componentName]) { + warn( // keep this warning in sync with ReactStrictModeWarning.js + 'componentWillMount has been renamed, and is not recommended for use. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move code from componentWillMount to componentDidMount (preferred in most cases) ' + 'or the constructor.\n' + '\nPlease update the following components: %s', componentName); + + didWarnAboutDeprecatedWillMount[componentName] = true; + } + } + } + + instance.componentWillMount(); + } + + if (typeof instance.UNSAFE_componentWillMount === 'function') { + instance.UNSAFE_componentWillMount(); + } + + if (oldState !== instance.state) { + { + error('%s.componentWillMount(): Assigning directly to this.state is ' + "deprecated (except inside a component's " + 'constructor). Use setState instead.', getComponentNameFromType(type) || 'Component'); + } + + classComponentUpdater.enqueueReplaceState(instance, instance.state, null); + } +} + +function processUpdateQueue(internalInstance, inst, props, maskedLegacyContext) { + if (internalInstance.queue !== null && internalInstance.queue.length > 0) { + var oldQueue = internalInstance.queue; + var oldReplace = internalInstance.replace; + internalInstance.queue = null; + internalInstance.replace = false; + + if (oldReplace && oldQueue.length === 1) { + inst.state = oldQueue[0]; + } else { + var nextState = oldReplace ? oldQueue[0] : inst.state; + var dontMutate = true; + + for (var i = oldReplace ? 1 : 0; i < oldQueue.length; i++) { + var partial = oldQueue[i]; + var partialState = typeof partial === 'function' ? partial.call(inst, nextState, props, maskedLegacyContext) : partial; + + if (partialState != null) { + if (dontMutate) { + dontMutate = false; + nextState = assign({}, nextState, partialState); + } else { + assign(nextState, partialState); + } + } + } + + inst.state = nextState; + } + } else { + internalInstance.queue = null; + } +} // Invokes the mount life-cycles on a previously never rendered instance. + + +function mountClassInstance(instance, ctor, newProps, maskedLegacyContext) { + { + checkClassInstance(instance, ctor, newProps); + } + + var initialState = instance.state !== undefined ? instance.state : null; + instance.updater = classComponentUpdater; + instance.props = newProps; + instance.state = initialState; // We don't bother initializing the refs object on the server, since we're not going to resolve them anyway. + // The internal instance will be used to manage updates that happen during this mount. + + var internalInstance = { + queue: [], + replace: false + }; + set(instance, internalInstance); + var contextType = ctor.contextType; + + if (typeof contextType === 'object' && contextType !== null) { + instance.context = readContext(contextType); + } else { + instance.context = maskedLegacyContext; + } + + { + if (instance.state === newProps) { + var componentName = getComponentNameFromType(ctor) || 'Component'; + + if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) { + didWarnAboutDirectlyAssigningPropsToState.add(componentName); + + error('%s: It is not recommended to assign props directly to state ' + "because updates to props won't be reflected in state. " + 'In most cases, it is better to use props directly.', componentName); + } + } + } + + var getDerivedStateFromProps = ctor.getDerivedStateFromProps; + + if (typeof getDerivedStateFromProps === 'function') { + instance.state = applyDerivedStateFromProps(instance, ctor, getDerivedStateFromProps, initialState, newProps); + } // In order to support react-lifecycles-compat polyfilled components, + // Unsafe lifecycles should not be invoked for components using the new APIs. + + + if (typeof ctor.getDerivedStateFromProps !== 'function' && typeof instance.getSnapshotBeforeUpdate !== 'function' && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) { + callComponentWillMount(ctor, instance); // If we had additional state updates during this life-cycle, let's + // process them now. + + processUpdateQueue(internalInstance, instance, newProps, maskedLegacyContext); + } +} + +// Ids are base 32 strings whose binary representation corresponds to the +// position of a node in a tree. +// Every time the tree forks into multiple children, we add additional bits to +// the left of the sequence that represent the position of the child within the +// current level of children. +// +// 00101 00010001011010101 +// ╰─┬─╯ ╰───────┬───────╯ +// Fork 5 of 20 Parent id +// +// The leading 0s are important. In the above example, you only need 3 bits to +// represent slot 5. However, you need 5 bits to represent all the forks at +// the current level, so we must account for the empty bits at the end. +// +// For this same reason, slots are 1-indexed instead of 0-indexed. Otherwise, +// the zeroth id at a level would be indistinguishable from its parent. +// +// If a node has only one child, and does not materialize an id (i.e. does not +// contain a useId hook), then we don't need to allocate any space in the +// sequence. It's treated as a transparent indirection. For example, these two +// trees produce the same ids: +// +// <> <> +// +// +// +// +// +// +// However, we cannot skip any node that materializes an id. Otherwise, a parent +// id that does not fork would be indistinguishable from its child id. For +// example, this tree does not fork, but the parent and child must have +// different ids. +// +// +// +// +// +// To handle this scenario, every time we materialize an id, we allocate a +// new level with a single slot. You can think of this as a fork with only one +// prong, or an array of children with length 1. +// +// It's possible for the size of the sequence to exceed 32 bits, the max +// size for bitwise operations. When this happens, we make more room by +// converting the right part of the id to a string and storing it in an overflow +// variable. We use a base 32 string representation, because 32 is the largest +// power of 2 that is supported by toString(). We want the base to be large so +// that the resulting ids are compact, and we want the base to be a power of 2 +// because every log2(base) bits corresponds to a single character, i.e. every +// log2(32) = 5 bits. That means we can lop bits off the end 5 at a time without +// affecting the final result. +var emptyTreeContext = { + id: 1, + overflow: '' +}; +function getTreeId(context) { + var overflow = context.overflow; + var idWithLeadingBit = context.id; + var id = idWithLeadingBit & ~getLeadingBit(idWithLeadingBit); + return id.toString(32) + overflow; +} +function pushTreeContext(baseContext, totalChildren, index) { + var baseIdWithLeadingBit = baseContext.id; + var baseOverflow = baseContext.overflow; // The leftmost 1 marks the end of the sequence, non-inclusive. It's not part + // of the id; we use it to account for leading 0s. + + var baseLength = getBitLength(baseIdWithLeadingBit) - 1; + var baseId = baseIdWithLeadingBit & ~(1 << baseLength); + var slot = index + 1; + var length = getBitLength(totalChildren) + baseLength; // 30 is the max length we can store without overflowing, taking into + // consideration the leading 1 we use to mark the end of the sequence. + + if (length > 30) { + // We overflowed the bitwise-safe range. Fall back to slower algorithm. + // This branch assumes the length of the base id is greater than 5; it won't + // work for smaller ids, because you need 5 bits per character. + // + // We encode the id in multiple steps: first the base id, then the + // remaining digits. + // + // Each 5 bit sequence corresponds to a single base 32 character. So for + // example, if the current id is 23 bits long, we can convert 20 of those + // bits into a string of 4 characters, with 3 bits left over. + // + // First calculate how many bits in the base id represent a complete + // sequence of characters. + var numberOfOverflowBits = baseLength - baseLength % 5; // Then create a bitmask that selects only those bits. + + var newOverflowBits = (1 << numberOfOverflowBits) - 1; // Select the bits, and convert them to a base 32 string. + + var newOverflow = (baseId & newOverflowBits).toString(32); // Now we can remove those bits from the base id. + + var restOfBaseId = baseId >> numberOfOverflowBits; + var restOfBaseLength = baseLength - numberOfOverflowBits; // Finally, encode the rest of the bits using the normal algorithm. Because + // we made more room, this time it won't overflow. + + var restOfLength = getBitLength(totalChildren) + restOfBaseLength; + var restOfNewBits = slot << restOfBaseLength; + var id = restOfNewBits | restOfBaseId; + var overflow = newOverflow + baseOverflow; + return { + id: 1 << restOfLength | id, + overflow: overflow + }; + } else { + // Normal path + var newBits = slot << baseLength; + + var _id = newBits | baseId; + + var _overflow = baseOverflow; + return { + id: 1 << length | _id, + overflow: _overflow + }; + } +} + +function getBitLength(number) { + return 32 - clz32(number); +} + +function getLeadingBit(id) { + return 1 << getBitLength(id) - 1; +} // TODO: Math.clz32 is supported in Node 12+. Maybe we can drop the fallback. + + +var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback; // Count leading zeros. +// Based on: +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 + +var log = Math.log; +var LN2 = Math.LN2; + +function clz32Fallback(x) { + var asUint = x >>> 0; + + if (asUint === 0) { + return 32; + } + + return 31 - (log(asUint) / LN2 | 0) | 0; +} + +/** + * inlined Object.is polyfill to avoid requiring consumers ship their own + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is + */ +function is(x, y) { + return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare + ; +} + +var objectIs = typeof Object.is === 'function' ? Object.is : is; + +var currentlyRenderingComponent = null; +var currentlyRenderingTask = null; +var firstWorkInProgressHook = null; +var workInProgressHook = null; // Whether the work-in-progress hook is a re-rendered hook + +var isReRender = false; // Whether an update was scheduled during the currently executing render pass. + +var didScheduleRenderPhaseUpdate = false; // Counts the number of useId hooks in this component + +var localIdCounter = 0; // Lazily created map of render-phase updates + +var renderPhaseUpdates = null; // Counter to prevent infinite loops. + +var numberOfReRenders = 0; +var RE_RENDER_LIMIT = 25; +var isInHookUserCodeInDev = false; // In DEV, this is the name of the currently executing primitive hook + +var currentHookNameInDev; + +function resolveCurrentlyRenderingComponent() { + if (currentlyRenderingComponent === null) { + throw new Error('Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for' + ' one of the following reasons:\n' + '1. You might have mismatching versions of React and the renderer (such as React DOM)\n' + '2. You might be breaking the Rules of Hooks\n' + '3. You might have more than one copy of React in the same app\n' + 'See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.'); + } + + { + if (isInHookUserCodeInDev) { + error('Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. ' + 'You can only call Hooks at the top level of your React function. ' + 'For more information, see ' + 'https://reactjs.org/link/rules-of-hooks'); + } + } + + return currentlyRenderingComponent; +} + +function areHookInputsEqual(nextDeps, prevDeps) { + if (prevDeps === null) { + { + error('%s received a final argument during this render, but not during ' + 'the previous render. Even though the final argument is optional, ' + 'its type cannot change between renders.', currentHookNameInDev); + } + + return false; + } + + { + // Don't bother comparing lengths in prod because these arrays should be + // passed inline. + if (nextDeps.length !== prevDeps.length) { + error('The final argument passed to %s changed size between renders. The ' + 'order and size of this array must remain constant.\n\n' + 'Previous: %s\n' + 'Incoming: %s', currentHookNameInDev, "[" + nextDeps.join(', ') + "]", "[" + prevDeps.join(', ') + "]"); + } + } + + for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) { + if (objectIs(nextDeps[i], prevDeps[i])) { + continue; + } + + return false; + } + + return true; +} + +function createHook() { + if (numberOfReRenders > 0) { + throw new Error('Rendered more hooks than during the previous render'); + } + + return { + memoizedState: null, + queue: null, + next: null + }; +} + +function createWorkInProgressHook() { + if (workInProgressHook === null) { + // This is the first hook in the list + if (firstWorkInProgressHook === null) { + isReRender = false; + firstWorkInProgressHook = workInProgressHook = createHook(); + } else { + // There's already a work-in-progress. Reuse it. + isReRender = true; + workInProgressHook = firstWorkInProgressHook; + } + } else { + if (workInProgressHook.next === null) { + isReRender = false; // Append to the end of the list + + workInProgressHook = workInProgressHook.next = createHook(); + } else { + // There's already a work-in-progress. Reuse it. + isReRender = true; + workInProgressHook = workInProgressHook.next; + } + } + + return workInProgressHook; +} + +function prepareToUseHooks(task, componentIdentity) { + currentlyRenderingComponent = componentIdentity; + currentlyRenderingTask = task; + + { + isInHookUserCodeInDev = false; + } // The following should have already been reset + // didScheduleRenderPhaseUpdate = false; + // localIdCounter = 0; + // firstWorkInProgressHook = null; + // numberOfReRenders = 0; + // renderPhaseUpdates = null; + // workInProgressHook = null; + + + localIdCounter = 0; +} +function finishHooks(Component, props, children, refOrContext) { + // This must be called after every function component to prevent hooks from + // being used in classes. + while (didScheduleRenderPhaseUpdate) { + // Updates were scheduled during the render phase. They are stored in + // the `renderPhaseUpdates` map. Call the component again, reusing the + // work-in-progress hooks and applying the additional updates on top. Keep + // restarting until no more updates are scheduled. + didScheduleRenderPhaseUpdate = false; + localIdCounter = 0; + numberOfReRenders += 1; // Start over from the beginning of the list + + workInProgressHook = null; + children = Component(props, refOrContext); + } + + resetHooksState(); + return children; +} +function checkDidRenderIdHook() { + // This should be called immediately after every finishHooks call. + // Conceptually, it's part of the return value of finishHooks; it's only a + // separate function to avoid using an array tuple. + var didRenderIdHook = localIdCounter !== 0; + return didRenderIdHook; +} // Reset the internal hooks state if an error occurs while rendering a component + +function resetHooksState() { + { + isInHookUserCodeInDev = false; + } + + currentlyRenderingComponent = null; + currentlyRenderingTask = null; + didScheduleRenderPhaseUpdate = false; + firstWorkInProgressHook = null; + numberOfReRenders = 0; + renderPhaseUpdates = null; + workInProgressHook = null; +} + +function readContext$1(context) { + { + if (isInHookUserCodeInDev) { + error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().'); + } + } + + return readContext(context); +} + +function useContext(context) { + { + currentHookNameInDev = 'useContext'; + } + + resolveCurrentlyRenderingComponent(); + return readContext(context); +} + +function basicStateReducer(state, action) { + // $FlowFixMe: Flow doesn't like mixed types + return typeof action === 'function' ? action(state) : action; +} + +function useState(initialState) { + { + currentHookNameInDev = 'useState'; + } + + return useReducer(basicStateReducer, // useReducer has a special case to support lazy useState initializers + initialState); +} +function useReducer(reducer, initialArg, init) { + { + if (reducer !== basicStateReducer) { + currentHookNameInDev = 'useReducer'; + } + } + + currentlyRenderingComponent = resolveCurrentlyRenderingComponent(); + workInProgressHook = createWorkInProgressHook(); + + if (isReRender) { + // This is a re-render. Apply the new render phase updates to the previous + // current hook. + var queue = workInProgressHook.queue; + var dispatch = queue.dispatch; + + if (renderPhaseUpdates !== null) { + // Render phase updates are stored in a map of queue -> linked list + var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue); + + if (firstRenderPhaseUpdate !== undefined) { + renderPhaseUpdates.delete(queue); + var newState = workInProgressHook.memoizedState; + var update = firstRenderPhaseUpdate; + + do { + // Process this render phase update. We don't have to check the + // priority because it will always be the same as the current + // render's. + var action = update.action; + + { + isInHookUserCodeInDev = true; + } + + newState = reducer(newState, action); + + { + isInHookUserCodeInDev = false; + } + + update = update.next; + } while (update !== null); + + workInProgressHook.memoizedState = newState; + return [newState, dispatch]; + } + } + + return [workInProgressHook.memoizedState, dispatch]; + } else { + { + isInHookUserCodeInDev = true; + } + + var initialState; + + if (reducer === basicStateReducer) { + // Special case for `useState`. + initialState = typeof initialArg === 'function' ? initialArg() : initialArg; + } else { + initialState = init !== undefined ? init(initialArg) : initialArg; + } + + { + isInHookUserCodeInDev = false; + } + + workInProgressHook.memoizedState = initialState; + + var _queue = workInProgressHook.queue = { + last: null, + dispatch: null + }; + + var _dispatch = _queue.dispatch = dispatchAction.bind(null, currentlyRenderingComponent, _queue); + + return [workInProgressHook.memoizedState, _dispatch]; + } +} + +function useMemo(nextCreate, deps) { + currentlyRenderingComponent = resolveCurrentlyRenderingComponent(); + workInProgressHook = createWorkInProgressHook(); + var nextDeps = deps === undefined ? null : deps; + + if (workInProgressHook !== null) { + var prevState = workInProgressHook.memoizedState; + + if (prevState !== null) { + if (nextDeps !== null) { + var prevDeps = prevState[1]; + + if (areHookInputsEqual(nextDeps, prevDeps)) { + return prevState[0]; + } + } + } + } + + { + isInHookUserCodeInDev = true; + } + + var nextValue = nextCreate(); + + { + isInHookUserCodeInDev = false; + } + + workInProgressHook.memoizedState = [nextValue, nextDeps]; + return nextValue; +} + +function useRef(initialValue) { + currentlyRenderingComponent = resolveCurrentlyRenderingComponent(); + workInProgressHook = createWorkInProgressHook(); + var previousRef = workInProgressHook.memoizedState; + + if (previousRef === null) { + var ref = { + current: initialValue + }; + + { + Object.seal(ref); + } + + workInProgressHook.memoizedState = ref; + return ref; + } else { + return previousRef; + } +} + +function useLayoutEffect(create, inputs) { + { + currentHookNameInDev = 'useLayoutEffect'; + + error('useLayoutEffect does nothing on the server, because its effect cannot ' + "be encoded into the server renderer's output format. This will lead " + 'to a mismatch between the initial, non-hydrated UI and the intended ' + 'UI. To avoid this, useLayoutEffect should only be used in ' + 'components that render exclusively on the client. ' + 'See https://reactjs.org/link/uselayouteffect-ssr for common fixes.'); + } +} + +function dispatchAction(componentIdentity, queue, action) { + if (numberOfReRenders >= RE_RENDER_LIMIT) { + throw new Error('Too many re-renders. React limits the number of renders to prevent ' + 'an infinite loop.'); + } + + if (componentIdentity === currentlyRenderingComponent) { + // This is a render phase update. Stash it in a lazily-created map of + // queue -> linked list of updates. After this render pass, we'll restart + // and apply the stashed updates on top of the work-in-progress hook. + didScheduleRenderPhaseUpdate = true; + var update = { + action: action, + next: null + }; + + if (renderPhaseUpdates === null) { + renderPhaseUpdates = new Map(); + } + + var firstRenderPhaseUpdate = renderPhaseUpdates.get(queue); + + if (firstRenderPhaseUpdate === undefined) { + renderPhaseUpdates.set(queue, update); + } else { + // Append the update to the end of the list. + var lastRenderPhaseUpdate = firstRenderPhaseUpdate; + + while (lastRenderPhaseUpdate.next !== null) { + lastRenderPhaseUpdate = lastRenderPhaseUpdate.next; + } + + lastRenderPhaseUpdate.next = update; + } + } +} + +function useCallback(callback, deps) { + return useMemo(function () { + return callback; + }, deps); +} // TODO Decide on how to implement this hook for server rendering. +// If a mutation occurs during render, consider triggering a Suspense boundary +// and falling back to client rendering. + +function useMutableSource(source, getSnapshot, subscribe) { + resolveCurrentlyRenderingComponent(); + return getSnapshot(source._source); +} + +function useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) { + if (getServerSnapshot === undefined) { + throw new Error('Missing getServerSnapshot, which is required for ' + 'server-rendered content. Will revert to client rendering.'); + } + + return getServerSnapshot(); +} + +function useDeferredValue(value) { + resolveCurrentlyRenderingComponent(); + return value; +} + +function unsupportedStartTransition() { + throw new Error('startTransition cannot be called during server rendering.'); +} + +function useTransition() { + resolveCurrentlyRenderingComponent(); + return [false, unsupportedStartTransition]; +} + +function useId() { + var task = currentlyRenderingTask; + var treeId = getTreeId(task.treeContext); + var responseState = currentResponseState; + + if (responseState === null) { + throw new Error('Invalid hook call. Hooks can only be called inside of the body of a function component.'); + } + + var localId = localIdCounter++; + return makeId(responseState, treeId, localId); +} + +function noop() {} + +var Dispatcher = { + readContext: readContext$1, + useContext: useContext, + useMemo: useMemo, + useReducer: useReducer, + useRef: useRef, + useState: useState, + useInsertionEffect: noop, + useLayoutEffect: useLayoutEffect, + useCallback: useCallback, + // useImperativeHandle is not run in the server environment + useImperativeHandle: noop, + // Effects are not run in the server environment. + useEffect: noop, + // Debugging effect + useDebugValue: noop, + useDeferredValue: useDeferredValue, + useTransition: useTransition, + useId: useId, + // Subscriptions are not setup in a server environment. + useMutableSource: useMutableSource, + useSyncExternalStore: useSyncExternalStore +}; + +var currentResponseState = null; +function setCurrentResponseState(responseState) { + currentResponseState = responseState; +} + +function getStackByComponentStackNode(componentStack) { + try { + var info = ''; + var node = componentStack; + + do { + switch (node.tag) { + case 0: + info += describeBuiltInComponentFrame(node.type, null, null); + break; + + case 1: + info += describeFunctionComponentFrame(node.type, null, null); + break; + + case 2: + info += describeClassComponentFrame(node.type, null, null); + break; + } + + node = node.parent; + } while (node); + + return info; + } catch (x) { + return '\nError generating stack: ' + x.message + '\n' + x.stack; + } +} + +var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher; +var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; +var PENDING = 0; +var COMPLETED = 1; +var FLUSHED = 2; +var ABORTED = 3; +var ERRORED = 4; +var OPEN = 0; +var CLOSING = 1; +var CLOSED = 2; +// This is a default heuristic for how to split up the HTML content into progressive +// loading. Our goal is to be able to display additional new content about every 500ms. +// Faster than that is unnecessary and should be throttled on the client. It also +// adds unnecessary overhead to do more splits. We don't know if it's a higher or lower +// end device but higher end suffer less from the overhead than lower end does from +// not getting small enough pieces. We error on the side of low end. +// We base this on low end 3G speeds which is about 500kbits per second. We assume +// that there can be a reasonable drop off from max bandwidth which leaves you with +// as little as 80%. We can receive half of that each 500ms - at best. In practice, +// a little bandwidth is lost to processing and contention - e.g. CSS and images that +// are downloaded along with the main content. So we estimate about half of that to be +// the lower end throughput. In other words, we expect that you can at least show +// about 12.5kb of content per 500ms. Not counting starting latency for the first +// paint. +// 500 * 1024 / 8 * .8 * 0.5 / 2 +var DEFAULT_PROGRESSIVE_CHUNK_SIZE = 12800; + +function defaultErrorHandler(error) { + console['error'](error); // Don't transform to our wrapper + + return null; +} + +function noop$1() {} + +function createRequest(children, responseState, rootFormatContext, progressiveChunkSize, onError, onAllReady, onShellReady, onShellError, onFatalError) { + var pingedTasks = []; + var abortSet = new Set(); + var request = { + destination: null, + responseState: responseState, + progressiveChunkSize: progressiveChunkSize === undefined ? DEFAULT_PROGRESSIVE_CHUNK_SIZE : progressiveChunkSize, + status: OPEN, + fatalError: null, + nextSegmentId: 0, + allPendingTasks: 0, + pendingRootTasks: 0, + completedRootSegment: null, + abortableTasks: abortSet, + pingedTasks: pingedTasks, + clientRenderedBoundaries: [], + completedBoundaries: [], + partialBoundaries: [], + onError: onError === undefined ? defaultErrorHandler : onError, + onAllReady: onAllReady === undefined ? noop$1 : onAllReady, + onShellReady: onShellReady === undefined ? noop$1 : onShellReady, + onShellError: onShellError === undefined ? noop$1 : onShellError, + onFatalError: onFatalError === undefined ? noop$1 : onFatalError + }; // This segment represents the root fallback. + + var rootSegment = createPendingSegment(request, 0, null, rootFormatContext, // Root segments are never embedded in Text on either edge + false, false); // There is no parent so conceptually, we're unblocked to flush this segment. + + rootSegment.parentFlushed = true; + var rootTask = createTask(request, children, null, rootSegment, abortSet, emptyContextObject, rootContextSnapshot, emptyTreeContext); + pingedTasks.push(rootTask); + return request; +} + +function pingTask(request, task) { + var pingedTasks = request.pingedTasks; + pingedTasks.push(task); + + if (pingedTasks.length === 1) { + scheduleWork(function () { + return performWork(request); + }); + } +} + +function createSuspenseBoundary(request, fallbackAbortableTasks) { + return { + id: UNINITIALIZED_SUSPENSE_BOUNDARY_ID, + rootSegmentID: -1, + parentFlushed: false, + pendingTasks: 0, + forceClientRender: false, + completedSegments: [], + byteSize: 0, + fallbackAbortableTasks: fallbackAbortableTasks, + errorDigest: null + }; +} + +function createTask(request, node, blockedBoundary, blockedSegment, abortSet, legacyContext, context, treeContext) { + request.allPendingTasks++; + + if (blockedBoundary === null) { + request.pendingRootTasks++; + } else { + blockedBoundary.pendingTasks++; + } + + var task = { + node: node, + ping: function () { + return pingTask(request, task); + }, + blockedBoundary: blockedBoundary, + blockedSegment: blockedSegment, + abortSet: abortSet, + legacyContext: legacyContext, + context: context, + treeContext: treeContext + }; + + { + task.componentStack = null; + } + + abortSet.add(task); + return task; +} + +function createPendingSegment(request, index, boundary, formatContext, lastPushedText, textEmbedded) { + return { + status: PENDING, + id: -1, + // lazily assigned later + index: index, + parentFlushed: false, + chunks: [], + children: [], + formatContext: formatContext, + boundary: boundary, + lastPushedText: lastPushedText, + textEmbedded: textEmbedded + }; +} // DEV-only global reference to the currently executing task + + +var currentTaskInDEV = null; + +function getCurrentStackInDEV() { + { + if (currentTaskInDEV === null || currentTaskInDEV.componentStack === null) { + return ''; + } + + return getStackByComponentStackNode(currentTaskInDEV.componentStack); + } +} + +function pushBuiltInComponentStackInDEV(task, type) { + { + task.componentStack = { + tag: 0, + parent: task.componentStack, + type: type + }; + } +} + +function pushFunctionComponentStackInDEV(task, type) { + { + task.componentStack = { + tag: 1, + parent: task.componentStack, + type: type + }; + } +} + +function pushClassComponentStackInDEV(task, type) { + { + task.componentStack = { + tag: 2, + parent: task.componentStack, + type: type + }; + } +} + +function popComponentStackInDEV(task) { + { + if (task.componentStack === null) { + error('Unexpectedly popped too many stack frames. This is a bug in React.'); + } else { + task.componentStack = task.componentStack.parent; + } + } +} // stash the component stack of an unwinding error until it is processed + + +var lastBoundaryErrorComponentStackDev = null; + +function captureBoundaryErrorDetailsDev(boundary, error) { + { + var errorMessage; + + if (typeof error === 'string') { + errorMessage = error; + } else if (error && typeof error.message === 'string') { + errorMessage = error.message; + } else { + // eslint-disable-next-line react-internal/safe-string-coercion + errorMessage = String(error); + } + + var errorComponentStack = lastBoundaryErrorComponentStackDev || getCurrentStackInDEV(); + lastBoundaryErrorComponentStackDev = null; + boundary.errorMessage = errorMessage; + boundary.errorComponentStack = errorComponentStack; + } +} + +function logRecoverableError(request, error) { + // If this callback errors, we intentionally let that error bubble up to become a fatal error + // so that someone fixes the error reporting instead of hiding it. + var errorDigest = request.onError(error); + + if (errorDigest != null && typeof errorDigest !== 'string') { + // eslint-disable-next-line react-internal/prod-error-codes + throw new Error("onError returned something with a type other than \"string\". onError should return a string and may return null or undefined but must not return anything else. It received something of type \"" + typeof errorDigest + "\" instead"); + } + + return errorDigest; +} + +function fatalError(request, error) { + // This is called outside error handling code such as if the root errors outside + // a suspense boundary or if the root suspense boundary's fallback errors. + // It's also called if React itself or its host configs errors. + var onShellError = request.onShellError; + onShellError(error); + var onFatalError = request.onFatalError; + onFatalError(error); + + if (request.destination !== null) { + request.status = CLOSED; + closeWithError(request.destination, error); + } else { + request.status = CLOSING; + request.fatalError = error; + } +} + +function renderSuspenseBoundary(request, task, props) { + pushBuiltInComponentStackInDEV(task, 'Suspense'); + var parentBoundary = task.blockedBoundary; + var parentSegment = task.blockedSegment; // Each time we enter a suspense boundary, we split out into a new segment for + // the fallback so that we can later replace that segment with the content. + // This also lets us split out the main content even if it doesn't suspend, + // in case it ends up generating a large subtree of content. + + var fallback = props.fallback; + var content = props.children; + var fallbackAbortSet = new Set(); + var newBoundary = createSuspenseBoundary(request, fallbackAbortSet); + var insertionIndex = parentSegment.chunks.length; // The children of the boundary segment is actually the fallback. + + var boundarySegment = createPendingSegment(request, insertionIndex, newBoundary, parentSegment.formatContext, // boundaries never require text embedding at their edges because comment nodes bound them + false, false); + parentSegment.children.push(boundarySegment); // The parentSegment has a child Segment at this index so we reset the lastPushedText marker on the parent + + parentSegment.lastPushedText = false; // This segment is the actual child content. We can start rendering that immediately. + + var contentRootSegment = createPendingSegment(request, 0, null, parentSegment.formatContext, // boundaries never require text embedding at their edges because comment nodes bound them + false, false); // We mark the root segment as having its parent flushed. It's not really flushed but there is + // no parent segment so there's nothing to wait on. + + contentRootSegment.parentFlushed = true; // Currently this is running synchronously. We could instead schedule this to pingedTasks. + // I suspect that there might be some efficiency benefits from not creating the suspended task + // and instead just using the stack if possible. + // TODO: Call this directly instead of messing with saving and restoring contexts. + // We can reuse the current context and task to render the content immediately without + // context switching. We just need to temporarily switch which boundary and which segment + // we're writing to. If something suspends, it'll spawn new suspended task with that context. + + task.blockedBoundary = newBoundary; + task.blockedSegment = contentRootSegment; + + try { + // We use the safe form because we don't handle suspending here. Only error handling. + renderNode(request, task, content); + pushSegmentFinale$1(contentRootSegment.chunks, request.responseState, contentRootSegment.lastPushedText, contentRootSegment.textEmbedded); + contentRootSegment.status = COMPLETED; + queueCompletedSegment(newBoundary, contentRootSegment); + + if (newBoundary.pendingTasks === 0) { + // This must have been the last segment we were waiting on. This boundary is now complete. + // Therefore we won't need the fallback. We early return so that we don't have to create + // the fallback. + popComponentStackInDEV(task); + return; + } + } catch (error) { + contentRootSegment.status = ERRORED; + newBoundary.forceClientRender = true; + newBoundary.errorDigest = logRecoverableError(request, error); + + { + captureBoundaryErrorDetailsDev(newBoundary, error); + } // We don't need to decrement any task numbers because we didn't spawn any new task. + // We don't need to schedule any task because we know the parent has written yet. + // We do need to fallthrough to create the fallback though. + + } finally { + task.blockedBoundary = parentBoundary; + task.blockedSegment = parentSegment; + } // We create suspended task for the fallback because we don't want to actually work + // on it yet in case we finish the main content, so we queue for later. + + + var suspendedFallbackTask = createTask(request, fallback, parentBoundary, boundarySegment, fallbackAbortSet, task.legacyContext, task.context, task.treeContext); + + { + suspendedFallbackTask.componentStack = task.componentStack; + } // TODO: This should be queued at a separate lower priority queue so that we only work + // on preparing fallbacks if we don't have any more main content to task on. + + + request.pingedTasks.push(suspendedFallbackTask); + popComponentStackInDEV(task); +} + +function renderHostElement(request, task, type, props) { + pushBuiltInComponentStackInDEV(task, type); + var segment = task.blockedSegment; + var children = pushStartInstance(segment.chunks, type, props, request.responseState, segment.formatContext); + segment.lastPushedText = false; + var prevContext = segment.formatContext; + segment.formatContext = getChildFormatContext(prevContext, type, props); // We use the non-destructive form because if something suspends, we still + // need to pop back up and finish this subtree of HTML. + + renderNode(request, task, children); // We expect that errors will fatal the whole task and that we don't need + // the correct context. Therefore this is not in a finally. + + segment.formatContext = prevContext; + pushEndInstance(segment.chunks, type); + segment.lastPushedText = false; + popComponentStackInDEV(task); +} + +function shouldConstruct$1(Component) { + return Component.prototype && Component.prototype.isReactComponent; +} + +function renderWithHooks(request, task, Component, props, secondArg) { + var componentIdentity = {}; + prepareToUseHooks(task, componentIdentity); + var result = Component(props, secondArg); + return finishHooks(Component, props, result, secondArg); +} + +function finishClassComponent(request, task, instance, Component, props) { + var nextChildren = instance.render(); + + { + if (instance.props !== props) { + if (!didWarnAboutReassigningProps) { + error('It looks like %s is reassigning its own `this.props` while rendering. ' + 'This is not supported and can lead to confusing bugs.', getComponentNameFromType(Component) || 'a component'); + } + + didWarnAboutReassigningProps = true; + } + } + + { + var childContextTypes = Component.childContextTypes; + + if (childContextTypes !== null && childContextTypes !== undefined) { + var previousContext = task.legacyContext; + var mergedContext = processChildContext(instance, Component, previousContext, childContextTypes); + task.legacyContext = mergedContext; + renderNodeDestructive(request, task, nextChildren); + task.legacyContext = previousContext; + return; + } + } + + renderNodeDestructive(request, task, nextChildren); +} + +function renderClassComponent(request, task, Component, props) { + pushClassComponentStackInDEV(task, Component); + var maskedContext = getMaskedContext(Component, task.legacyContext) ; + var instance = constructClassInstance(Component, props, maskedContext); + mountClassInstance(instance, Component, props, maskedContext); + finishClassComponent(request, task, instance, Component, props); + popComponentStackInDEV(task); +} + +var didWarnAboutBadClass = {}; +var didWarnAboutModulePatternComponent = {}; +var didWarnAboutContextTypeOnFunctionComponent = {}; +var didWarnAboutGetDerivedStateOnFunctionComponent = {}; +var didWarnAboutReassigningProps = false; +var didWarnAboutDefaultPropsOnFunctionComponent = {}; +var didWarnAboutGenerators = false; +var didWarnAboutMaps = false; +var hasWarnedAboutUsingContextAsConsumer = false; // This would typically be a function component but we still support module pattern +// components for some reason. + +function renderIndeterminateComponent(request, task, Component, props) { + var legacyContext; + + { + legacyContext = getMaskedContext(Component, task.legacyContext); + } + + pushFunctionComponentStackInDEV(task, Component); + + { + if (Component.prototype && typeof Component.prototype.render === 'function') { + var componentName = getComponentNameFromType(Component) || 'Unknown'; + + if (!didWarnAboutBadClass[componentName]) { + error("The <%s /> component appears to have a render method, but doesn't extend React.Component. " + 'This is likely to cause errors. Change %s to extend React.Component instead.', componentName, componentName); + + didWarnAboutBadClass[componentName] = true; + } + } + } + + var value = renderWithHooks(request, task, Component, props, legacyContext); + var hasId = checkDidRenderIdHook(); + + { + // Support for module components is deprecated and is removed behind a flag. + // Whether or not it would crash later, we want to show a good message in DEV first. + if (typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) { + var _componentName = getComponentNameFromType(Component) || 'Unknown'; + + if (!didWarnAboutModulePatternComponent[_componentName]) { + error('The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + "If you can't use a class try assigning the prototype on the function as a workaround. " + "`%s.prototype = React.Component.prototype`. Don't use an arrow function since it " + 'cannot be called with `new` by React.', _componentName, _componentName, _componentName); + + didWarnAboutModulePatternComponent[_componentName] = true; + } + } + } + + if ( // Run these checks in production only if the flag is off. + // Eventually we'll delete this branch altogether. + typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) { + { + var _componentName2 = getComponentNameFromType(Component) || 'Unknown'; + + if (!didWarnAboutModulePatternComponent[_componentName2]) { + error('The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + "If you can't use a class try assigning the prototype on the function as a workaround. " + "`%s.prototype = React.Component.prototype`. Don't use an arrow function since it " + 'cannot be called with `new` by React.', _componentName2, _componentName2, _componentName2); + + didWarnAboutModulePatternComponent[_componentName2] = true; + } + } + + mountClassInstance(value, Component, props, legacyContext); + finishClassComponent(request, task, value, Component, props); + } else { + + { + validateFunctionComponentInDev(Component); + } // We're now successfully past this task, and we don't have to pop back to + // the previous task every again, so we can use the destructive recursive form. + + + if (hasId) { + // This component materialized an id. We treat this as its own level, with + // a single "child" slot. + var prevTreeContext = task.treeContext; + var totalChildren = 1; + var index = 0; + task.treeContext = pushTreeContext(prevTreeContext, totalChildren, index); + + try { + renderNodeDestructive(request, task, value); + } finally { + task.treeContext = prevTreeContext; + } + } else { + renderNodeDestructive(request, task, value); + } + } + + popComponentStackInDEV(task); +} + +function validateFunctionComponentInDev(Component) { + { + if (Component) { + if (Component.childContextTypes) { + error('%s(...): childContextTypes cannot be defined on a function component.', Component.displayName || Component.name || 'Component'); + } + } + + if ( Component.defaultProps !== undefined) { + var componentName = getComponentNameFromType(Component) || 'Unknown'; + + if (!didWarnAboutDefaultPropsOnFunctionComponent[componentName]) { + error('%s: Support for defaultProps will be removed from function components ' + 'in a future major release. Use JavaScript default parameters instead.', componentName); + + didWarnAboutDefaultPropsOnFunctionComponent[componentName] = true; + } + } + + if (typeof Component.getDerivedStateFromProps === 'function') { + var _componentName3 = getComponentNameFromType(Component) || 'Unknown'; + + if (!didWarnAboutGetDerivedStateOnFunctionComponent[_componentName3]) { + error('%s: Function components do not support getDerivedStateFromProps.', _componentName3); + + didWarnAboutGetDerivedStateOnFunctionComponent[_componentName3] = true; + } + } + + if (typeof Component.contextType === 'object' && Component.contextType !== null) { + var _componentName4 = getComponentNameFromType(Component) || 'Unknown'; + + if (!didWarnAboutContextTypeOnFunctionComponent[_componentName4]) { + error('%s: Function components do not support contextType.', _componentName4); + + didWarnAboutContextTypeOnFunctionComponent[_componentName4] = true; + } + } + } +} + +function resolveDefaultProps(Component, baseProps) { + if (Component && Component.defaultProps) { + // Resolve default props. Taken from ReactElement + var props = assign({}, baseProps); + var defaultProps = Component.defaultProps; + + for (var propName in defaultProps) { + if (props[propName] === undefined) { + props[propName] = defaultProps[propName]; + } + } + + return props; + } + + return baseProps; +} + +function renderForwardRef(request, task, type, props, ref) { + pushFunctionComponentStackInDEV(task, type.render); + var children = renderWithHooks(request, task, type.render, props, ref); + var hasId = checkDidRenderIdHook(); + + if (hasId) { + // This component materialized an id. We treat this as its own level, with + // a single "child" slot. + var prevTreeContext = task.treeContext; + var totalChildren = 1; + var index = 0; + task.treeContext = pushTreeContext(prevTreeContext, totalChildren, index); + + try { + renderNodeDestructive(request, task, children); + } finally { + task.treeContext = prevTreeContext; + } + } else { + renderNodeDestructive(request, task, children); + } + + popComponentStackInDEV(task); +} + +function renderMemo(request, task, type, props, ref) { + var innerType = type.type; + var resolvedProps = resolveDefaultProps(innerType, props); + renderElement(request, task, innerType, resolvedProps, ref); +} + +function renderContextConsumer(request, task, context, props) { + // The logic below for Context differs depending on PROD or DEV mode. In + // DEV mode, we create a separate object for Context.Consumer that acts + // like a proxy to Context. This proxy object adds unnecessary code in PROD + // so we use the old behaviour (Context.Consumer references Context) to + // reduce size and overhead. The separate object references context via + // a property called "_context", which also gives us the ability to check + // in DEV mode if this property exists or not and warn if it does not. + { + if (context._context === undefined) { + // This may be because it's a Context (rather than a Consumer). + // Or it may be because it's older React where they're the same thing. + // We only want to warn if we're sure it's a new React. + if (context !== context.Consumer) { + if (!hasWarnedAboutUsingContextAsConsumer) { + hasWarnedAboutUsingContextAsConsumer = true; + + error('Rendering directly is not supported and will be removed in ' + 'a future major release. Did you mean to render instead?'); + } + } + } else { + context = context._context; + } + } + + var render = props.children; + + { + if (typeof render !== 'function') { + error('A context consumer was rendered with multiple children, or a child ' + "that isn't a function. A context consumer expects a single child " + 'that is a function. If you did pass a function, make sure there ' + 'is no trailing or leading whitespace around it.'); + } + } + + var newValue = readContext(context); + var newChildren = render(newValue); + renderNodeDestructive(request, task, newChildren); +} + +function renderContextProvider(request, task, type, props) { + var context = type._context; + var value = props.value; + var children = props.children; + var prevSnapshot; + + { + prevSnapshot = task.context; + } + + task.context = pushProvider(context, value); + renderNodeDestructive(request, task, children); + task.context = popProvider(context); + + { + if (prevSnapshot !== task.context) { + error('Popping the context provider did not return back to the original snapshot. This is a bug in React.'); + } + } +} + +function renderLazyComponent(request, task, lazyComponent, props, ref) { + pushBuiltInComponentStackInDEV(task, 'Lazy'); + var payload = lazyComponent._payload; + var init = lazyComponent._init; + var Component = init(payload); + var resolvedProps = resolveDefaultProps(Component, props); + renderElement(request, task, Component, resolvedProps, ref); + popComponentStackInDEV(task); +} + +function renderElement(request, task, type, props, ref) { + if (typeof type === 'function') { + if (shouldConstruct$1(type)) { + renderClassComponent(request, task, type, props); + return; + } else { + renderIndeterminateComponent(request, task, type, props); + return; + } + } + + if (typeof type === 'string') { + renderHostElement(request, task, type, props); + return; + } + + switch (type) { + // TODO: LegacyHidden acts the same as a fragment. This only works + // because we currently assume that every instance of LegacyHidden is + // accompanied by a host component wrapper. In the hidden mode, the host + // component is given a `hidden` attribute, which ensures that the + // initial HTML is not visible. To support the use of LegacyHidden as a + // true fragment, without an extra DOM node, we would have to hide the + // initial HTML in some other way. + // TODO: Add REACT_OFFSCREEN_TYPE here too with the same capability. + case REACT_LEGACY_HIDDEN_TYPE: + case REACT_DEBUG_TRACING_MODE_TYPE: + case REACT_STRICT_MODE_TYPE: + case REACT_PROFILER_TYPE: + case REACT_FRAGMENT_TYPE: + { + renderNodeDestructive(request, task, props.children); + return; + } + + case REACT_SUSPENSE_LIST_TYPE: + { + pushBuiltInComponentStackInDEV(task, 'SuspenseList'); // TODO: SuspenseList should control the boundaries. + + renderNodeDestructive(request, task, props.children); + popComponentStackInDEV(task); + return; + } + + case REACT_SCOPE_TYPE: + { + + throw new Error('ReactDOMServer does not yet support scope components.'); + } + // eslint-disable-next-line-no-fallthrough + + case REACT_SUSPENSE_TYPE: + { + { + renderSuspenseBoundary(request, task, props); + } + + return; + } + } + + if (typeof type === 'object' && type !== null) { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + { + renderForwardRef(request, task, type, props, ref); + return; + } + + case REACT_MEMO_TYPE: + { + renderMemo(request, task, type, props, ref); + return; + } + + case REACT_PROVIDER_TYPE: + { + renderContextProvider(request, task, type, props); + return; + } + + case REACT_CONTEXT_TYPE: + { + renderContextConsumer(request, task, type, props); + return; + } + + case REACT_LAZY_TYPE: + { + renderLazyComponent(request, task, type, props); + return; + } + } + } + + var info = ''; + + { + if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { + info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and " + 'named imports.'; + } + } + + throw new Error('Element type is invalid: expected a string (for built-in ' + 'components) or a class/function (for composite components) ' + ("but got: " + (type == null ? type : typeof type) + "." + info)); +} + +function validateIterable(iterable, iteratorFn) { + { + // We don't support rendering Generators because it's a mutation. + // See https://github.com/facebook/react/issues/12995 + if (typeof Symbol === 'function' && // $FlowFixMe Flow doesn't know about toStringTag + iterable[Symbol.toStringTag] === 'Generator') { + if (!didWarnAboutGenerators) { + error('Using Generators as children is unsupported and will likely yield ' + 'unexpected results because enumerating a generator mutates it. ' + 'You may convert it to an array with `Array.from()` or the ' + '`[...spread]` operator before rendering. Keep in mind ' + 'you might need to polyfill these features for older browsers.'); + } + + didWarnAboutGenerators = true; + } // Warn about using Maps as children + + + if (iterable.entries === iteratorFn) { + if (!didWarnAboutMaps) { + error('Using Maps as children is not supported. ' + 'Use an array of keyed ReactElements instead.'); + } + + didWarnAboutMaps = true; + } + } +} + +function renderNodeDestructive(request, task, node) { + { + // In Dev we wrap renderNodeDestructiveImpl in a try / catch so we can capture + // a component stack at the right place in the tree. We don't do this in renderNode + // becuase it is not called at every layer of the tree and we may lose frames + try { + return renderNodeDestructiveImpl(request, task, node); + } catch (x) { + if (typeof x === 'object' && x !== null && typeof x.then === 'function') ; else { + // This is an error, stash the component stack if it is null. + lastBoundaryErrorComponentStackDev = lastBoundaryErrorComponentStackDev !== null ? lastBoundaryErrorComponentStackDev : getCurrentStackInDEV(); + } // rethrow so normal suspense logic can handle thrown value accordingly + + + throw x; + } + } +} // This function by it self renders a node and consumes the task by mutating it +// to update the current execution state. + + +function renderNodeDestructiveImpl(request, task, node) { + // Stash the node we're working on. We'll pick up from this task in case + // something suspends. + task.node = node; // Handle object types + + if (typeof node === 'object' && node !== null) { + switch (node.$$typeof) { + case REACT_ELEMENT_TYPE: + { + var element = node; + var type = element.type; + var props = element.props; + var ref = element.ref; + renderElement(request, task, type, props, ref); + return; + } + + case REACT_PORTAL_TYPE: + throw new Error('Portals are not currently supported by the server renderer. ' + 'Render them conditionally so that they only appear on the client render.'); + // eslint-disable-next-line-no-fallthrough + + case REACT_LAZY_TYPE: + { + var lazyNode = node; + var payload = lazyNode._payload; + var init = lazyNode._init; + var resolvedNode; + + { + try { + resolvedNode = init(payload); + } catch (x) { + if (typeof x === 'object' && x !== null && typeof x.then === 'function') { + // this Lazy initializer is suspending. push a temporary frame onto the stack so it can be + // popped off in spawnNewSuspendedTask. This aligns stack behavior between Lazy in element position + // vs Component position. We do not want the frame for Errors so we exclusively do this in + // the wakeable branch + pushBuiltInComponentStackInDEV(task, 'Lazy'); + } + + throw x; + } + } + + renderNodeDestructive(request, task, resolvedNode); + return; + } + } + + if (isArray(node)) { + renderChildrenArray(request, task, node); + return; + } + + var iteratorFn = getIteratorFn(node); + + if (iteratorFn) { + { + validateIterable(node, iteratorFn); + } + + var iterator = iteratorFn.call(node); + + if (iterator) { + // We need to know how many total children are in this set, so that we + // can allocate enough id slots to acommodate them. So we must exhaust + // the iterator before we start recursively rendering the children. + // TODO: This is not great but I think it's inherent to the id + // generation algorithm. + var step = iterator.next(); // If there are not entries, we need to push an empty so we start by checking that. + + if (!step.done) { + var children = []; + + do { + children.push(step.value); + step = iterator.next(); + } while (!step.done); + + renderChildrenArray(request, task, children); + return; + } + + return; + } + } + + var childString = Object.prototype.toString.call(node); + throw new Error("Objects are not valid as a React child (found: " + (childString === '[object Object]' ? 'object with keys {' + Object.keys(node).join(', ') + '}' : childString) + "). " + 'If you meant to render a collection of children, use an array ' + 'instead.'); + } + + if (typeof node === 'string') { + var segment = task.blockedSegment; + segment.lastPushedText = pushTextInstance$1(task.blockedSegment.chunks, node, request.responseState, segment.lastPushedText); + return; + } + + if (typeof node === 'number') { + var _segment = task.blockedSegment; + _segment.lastPushedText = pushTextInstance$1(task.blockedSegment.chunks, '' + node, request.responseState, _segment.lastPushedText); + return; + } + + { + if (typeof node === 'function') { + error('Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of from render. ' + 'Or maybe you meant to call this function rather than return it.'); + } + } +} + +function renderChildrenArray(request, task, children) { + var totalChildren = children.length; + + for (var i = 0; i < totalChildren; i++) { + var prevTreeContext = task.treeContext; + task.treeContext = pushTreeContext(prevTreeContext, totalChildren, i); + + try { + // We need to use the non-destructive form so that we can safely pop back + // up and render the sibling if something suspends. + renderNode(request, task, children[i]); + } finally { + task.treeContext = prevTreeContext; + } + } +} + +function spawnNewSuspendedTask(request, task, x) { + // Something suspended, we'll need to create a new segment and resolve it later. + var segment = task.blockedSegment; + var insertionIndex = segment.chunks.length; + var newSegment = createPendingSegment(request, insertionIndex, null, segment.formatContext, // Adopt the parent segment's leading text embed + segment.lastPushedText, // Assume we are text embedded at the trailing edge + true); + segment.children.push(newSegment); // Reset lastPushedText for current Segment since the new Segment "consumed" it + + segment.lastPushedText = false; + var newTask = createTask(request, task.node, task.blockedBoundary, newSegment, task.abortSet, task.legacyContext, task.context, task.treeContext); + + { + if (task.componentStack !== null) { + // We pop one task off the stack because the node that suspended will be tried again, + // which will add it back onto the stack. + newTask.componentStack = task.componentStack.parent; + } + } + + var ping = newTask.ping; + x.then(ping, ping); +} // This is a non-destructive form of rendering a node. If it suspends it spawns +// a new task and restores the context of this task to what it was before. + + +function renderNode(request, task, node) { + // TODO: Store segment.children.length here and reset it in case something + // suspended partially through writing something. + // Snapshot the current context in case something throws to interrupt the + // process. + var previousFormatContext = task.blockedSegment.formatContext; + var previousLegacyContext = task.legacyContext; + var previousContext = task.context; + var previousComponentStack = null; + + { + previousComponentStack = task.componentStack; + } + + try { + return renderNodeDestructive(request, task, node); + } catch (x) { + resetHooksState(); + + if (typeof x === 'object' && x !== null && typeof x.then === 'function') { + spawnNewSuspendedTask(request, task, x); // Restore the context. We assume that this will be restored by the inner + // functions in case nothing throws so we don't use "finally" here. + + task.blockedSegment.formatContext = previousFormatContext; + task.legacyContext = previousLegacyContext; + task.context = previousContext; // Restore all active ReactContexts to what they were before. + + switchContext(previousContext); + + { + task.componentStack = previousComponentStack; + } + + return; + } else { + // Restore the context. We assume that this will be restored by the inner + // functions in case nothing throws so we don't use "finally" here. + task.blockedSegment.formatContext = previousFormatContext; + task.legacyContext = previousLegacyContext; + task.context = previousContext; // Restore all active ReactContexts to what they were before. + + switchContext(previousContext); + + { + task.componentStack = previousComponentStack; + } // We assume that we don't need the correct context. + // Let's terminate the rest of the tree and don't render any siblings. + + + throw x; + } + } +} + +function erroredTask(request, boundary, segment, error) { + // Report the error to a global handler. + var errorDigest = logRecoverableError(request, error); + + if (boundary === null) { + fatalError(request, error); + } else { + boundary.pendingTasks--; + + if (!boundary.forceClientRender) { + boundary.forceClientRender = true; + boundary.errorDigest = errorDigest; + + { + captureBoundaryErrorDetailsDev(boundary, error); + } // Regardless of what happens next, this boundary won't be displayed, + // so we can flush it, if the parent already flushed. + + + if (boundary.parentFlushed) { + // We don't have a preference where in the queue this goes since it's likely + // to error on the client anyway. However, intentionally client-rendered + // boundaries should be flushed earlier so that they can start on the client. + // We reuse the same queue for errors. + request.clientRenderedBoundaries.push(boundary); + } + } + } + + request.allPendingTasks--; + + if (request.allPendingTasks === 0) { + var onAllReady = request.onAllReady; + onAllReady(); + } +} + +function abortTaskSoft(task) { + // This aborts task without aborting the parent boundary that it blocks. + // It's used for when we didn't need this task to complete the tree. + // If task was needed, then it should use abortTask instead. + var request = this; + var boundary = task.blockedBoundary; + var segment = task.blockedSegment; + segment.status = ABORTED; + finishedTask(request, boundary, segment); +} + +function abortTask(task, request, reason) { + // This aborts the task and aborts the parent that it blocks, putting it into + // client rendered mode. + var boundary = task.blockedBoundary; + var segment = task.blockedSegment; + segment.status = ABORTED; + + if (boundary === null) { + request.allPendingTasks--; // We didn't complete the root so we have nothing to show. We can close + // the request; + + if (request.status !== CLOSED) { + request.status = CLOSED; + + if (request.destination !== null) { + close(request.destination); + } + } + } else { + boundary.pendingTasks--; + + if (!boundary.forceClientRender) { + boundary.forceClientRender = true; + + var _error = reason === undefined ? new Error('The render was aborted by the server without a reason.') : reason; + + boundary.errorDigest = request.onError(_error); + + { + var errorPrefix = 'The server did not finish this Suspense boundary: '; + + if (_error && typeof _error.message === 'string') { + _error = errorPrefix + _error.message; + } else { + // eslint-disable-next-line react-internal/safe-string-coercion + _error = errorPrefix + String(_error); + } + + var previousTaskInDev = currentTaskInDEV; + currentTaskInDEV = task; + + try { + captureBoundaryErrorDetailsDev(boundary, _error); + } finally { + currentTaskInDEV = previousTaskInDev; + } + } + + if (boundary.parentFlushed) { + request.clientRenderedBoundaries.push(boundary); + } + } // If this boundary was still pending then we haven't already cancelled its fallbacks. + // We'll need to abort the fallbacks, which will also error that parent boundary. + + + boundary.fallbackAbortableTasks.forEach(function (fallbackTask) { + return abortTask(fallbackTask, request, reason); + }); + boundary.fallbackAbortableTasks.clear(); + request.allPendingTasks--; + + if (request.allPendingTasks === 0) { + var onAllReady = request.onAllReady; + onAllReady(); + } + } +} + +function queueCompletedSegment(boundary, segment) { + if (segment.chunks.length === 0 && segment.children.length === 1 && segment.children[0].boundary === null) { + // This is an empty segment. There's nothing to write, so we can instead transfer the ID + // to the child. That way any existing references point to the child. + var childSegment = segment.children[0]; + childSegment.id = segment.id; + childSegment.parentFlushed = true; + + if (childSegment.status === COMPLETED) { + queueCompletedSegment(boundary, childSegment); + } + } else { + var completedSegments = boundary.completedSegments; + completedSegments.push(segment); + } +} + +function finishedTask(request, boundary, segment) { + if (boundary === null) { + if (segment.parentFlushed) { + if (request.completedRootSegment !== null) { + throw new Error('There can only be one root segment. This is a bug in React.'); + } + + request.completedRootSegment = segment; + } + + request.pendingRootTasks--; + + if (request.pendingRootTasks === 0) { + // We have completed the shell so the shell can't error anymore. + request.onShellError = noop$1; + var onShellReady = request.onShellReady; + onShellReady(); + } + } else { + boundary.pendingTasks--; + + if (boundary.forceClientRender) ; else if (boundary.pendingTasks === 0) { + // This must have been the last segment we were waiting on. This boundary is now complete. + if (segment.parentFlushed) { + // Our parent segment already flushed, so we need to schedule this segment to be emitted. + // If it is a segment that was aborted, we'll write other content instead so we don't need + // to emit it. + if (segment.status === COMPLETED) { + queueCompletedSegment(boundary, segment); + } + } + + if (boundary.parentFlushed) { + // The segment might be part of a segment that didn't flush yet, but if the boundary's + // parent flushed, we need to schedule the boundary to be emitted. + request.completedBoundaries.push(boundary); + } // We can now cancel any pending task on the fallback since we won't need to show it anymore. + // This needs to happen after we read the parentFlushed flags because aborting can finish + // work which can trigger user code, which can start flushing, which can change those flags. + + + boundary.fallbackAbortableTasks.forEach(abortTaskSoft, request); + boundary.fallbackAbortableTasks.clear(); + } else { + if (segment.parentFlushed) { + // Our parent already flushed, so we need to schedule this segment to be emitted. + // If it is a segment that was aborted, we'll write other content instead so we don't need + // to emit it. + if (segment.status === COMPLETED) { + queueCompletedSegment(boundary, segment); + var completedSegments = boundary.completedSegments; + + if (completedSegments.length === 1) { + // This is the first time since we last flushed that we completed anything. + // We can schedule this boundary to emit its partially completed segments early + // in case the parent has already been flushed. + if (boundary.parentFlushed) { + request.partialBoundaries.push(boundary); + } + } + } + } + } + } + + request.allPendingTasks--; + + if (request.allPendingTasks === 0) { + // This needs to be called at the very end so that we can synchronously write the result + // in the callback if needed. + var onAllReady = request.onAllReady; + onAllReady(); + } +} + +function retryTask(request, task) { + var segment = task.blockedSegment; + + if (segment.status !== PENDING) { + // We completed this by other means before we had a chance to retry it. + return; + } // We restore the context to what it was when we suspended. + // We don't restore it after we leave because it's likely that we'll end up + // needing a very similar context soon again. + + + switchContext(task.context); + var prevTaskInDEV = null; + + { + prevTaskInDEV = currentTaskInDEV; + currentTaskInDEV = task; + } + + try { + // We call the destructive form that mutates this task. That way if something + // suspends again, we can reuse the same task instead of spawning a new one. + renderNodeDestructive(request, task, task.node); + pushSegmentFinale$1(segment.chunks, request.responseState, segment.lastPushedText, segment.textEmbedded); + task.abortSet.delete(task); + segment.status = COMPLETED; + finishedTask(request, task.blockedBoundary, segment); + } catch (x) { + resetHooksState(); + + if (typeof x === 'object' && x !== null && typeof x.then === 'function') { + // Something suspended again, let's pick it back up later. + var ping = task.ping; + x.then(ping, ping); + } else { + task.abortSet.delete(task); + segment.status = ERRORED; + erroredTask(request, task.blockedBoundary, segment, x); + } + } finally { + { + currentTaskInDEV = prevTaskInDEV; + } + } +} + +function performWork(request) { + if (request.status === CLOSED) { + return; + } + + var prevContext = getActiveContext(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = Dispatcher; + var prevGetCurrentStackImpl; + + { + prevGetCurrentStackImpl = ReactDebugCurrentFrame$1.getCurrentStack; + ReactDebugCurrentFrame$1.getCurrentStack = getCurrentStackInDEV; + } + + var prevResponseState = currentResponseState; + setCurrentResponseState(request.responseState); + + try { + var pingedTasks = request.pingedTasks; + var i; + + for (i = 0; i < pingedTasks.length; i++) { + var task = pingedTasks[i]; + retryTask(request, task); + } + + pingedTasks.splice(0, i); + + if (request.destination !== null) { + flushCompletedQueues(request, request.destination); + } + } catch (error) { + logRecoverableError(request, error); + fatalError(request, error); + } finally { + setCurrentResponseState(prevResponseState); + ReactCurrentDispatcher$1.current = prevDispatcher; + + { + ReactDebugCurrentFrame$1.getCurrentStack = prevGetCurrentStackImpl; + } + + if (prevDispatcher === Dispatcher) { + // This means that we were in a reentrant work loop. This could happen + // in a renderer that supports synchronous work like renderToString, + // when it's called from within another renderer. + // Normally we don't bother switching the contexts to their root/default + // values when leaving because we'll likely need the same or similar + // context again. However, when we're inside a synchronous loop like this + // we'll to restore the context to what it was before returning. + switchContext(prevContext); + } + } +} + +function flushSubtree(request, destination, segment) { + segment.parentFlushed = true; + + switch (segment.status) { + case PENDING: + { + // We're emitting a placeholder for this segment to be filled in later. + // Therefore we'll need to assign it an ID - to refer to it by. + var segmentID = segment.id = request.nextSegmentId++; // When this segment finally completes it won't be embedded in text since it will flush separately + + segment.lastPushedText = false; + segment.textEmbedded = false; + return writePlaceholder(destination, request.responseState, segmentID); + } + + case COMPLETED: + { + segment.status = FLUSHED; + var r = true; + var chunks = segment.chunks; + var chunkIdx = 0; + var children = segment.children; + + for (var childIdx = 0; childIdx < children.length; childIdx++) { + var nextChild = children[childIdx]; // Write all the chunks up until the next child. + + for (; chunkIdx < nextChild.index; chunkIdx++) { + writeChunk(destination, chunks[chunkIdx]); + } + + r = flushSegment(request, destination, nextChild); + } // Finally just write all the remaining chunks + + + for (; chunkIdx < chunks.length - 1; chunkIdx++) { + writeChunk(destination, chunks[chunkIdx]); + } + + if (chunkIdx < chunks.length) { + r = writeChunkAndReturn(destination, chunks[chunkIdx]); + } + + return r; + } + + default: + { + throw new Error('Aborted, errored or already flushed boundaries should not be flushed again. This is a bug in React.'); + } + } +} + +function flushSegment(request, destination, segment) { + var boundary = segment.boundary; + + if (boundary === null) { + // Not a suspense boundary. + return flushSubtree(request, destination, segment); + } + + boundary.parentFlushed = true; // This segment is a Suspense boundary. We need to decide whether to + // emit the content or the fallback now. + + if (boundary.forceClientRender) { + // Emit a client rendered suspense boundary wrapper. + // We never queue the inner boundary so we'll never emit its content or partial segments. + writeStartClientRenderedSuspenseBoundary$1(destination, request.responseState, boundary.errorDigest, boundary.errorMessage, boundary.errorComponentStack); // Flush the fallback. + + flushSubtree(request, destination, segment); + return writeEndClientRenderedSuspenseBoundary$1(destination, request.responseState); + } else if (boundary.pendingTasks > 0) { + // This boundary is still loading. Emit a pending suspense boundary wrapper. + // Assign an ID to refer to the future content by. + boundary.rootSegmentID = request.nextSegmentId++; + + if (boundary.completedSegments.length > 0) { + // If this is at least partially complete, we can queue it to be partially emitted early. + request.partialBoundaries.push(boundary); + } /// This is the first time we should have referenced this ID. + + + var id = boundary.id = assignSuspenseBoundaryID(request.responseState); + writeStartPendingSuspenseBoundary(destination, request.responseState, id); // Flush the fallback. + + flushSubtree(request, destination, segment); + return writeEndPendingSuspenseBoundary(destination, request.responseState); + } else if (boundary.byteSize > request.progressiveChunkSize) { + // This boundary is large and will be emitted separately so that we can progressively show + // other content. We add it to the queue during the flush because we have to ensure that + // the parent flushes first so that there's something to inject it into. + // We also have to make sure that it's emitted into the queue in a deterministic slot. + // I.e. we can't insert it here when it completes. + // Assign an ID to refer to the future content by. + boundary.rootSegmentID = request.nextSegmentId++; + request.completedBoundaries.push(boundary); // Emit a pending rendered suspense boundary wrapper. + + writeStartPendingSuspenseBoundary(destination, request.responseState, boundary.id); // Flush the fallback. + + flushSubtree(request, destination, segment); + return writeEndPendingSuspenseBoundary(destination, request.responseState); + } else { + // We can inline this boundary's content as a complete boundary. + writeStartCompletedSuspenseBoundary$1(destination, request.responseState); + var completedSegments = boundary.completedSegments; + + if (completedSegments.length !== 1) { + throw new Error('A previously unvisited boundary must have exactly one root segment. This is a bug in React.'); + } + + var contentSegment = completedSegments[0]; + flushSegment(request, destination, contentSegment); + return writeEndCompletedSuspenseBoundary$1(destination, request.responseState); + } +} + +function flushClientRenderedBoundary(request, destination, boundary) { + return writeClientRenderBoundaryInstruction(destination, request.responseState, boundary.id, boundary.errorDigest, boundary.errorMessage, boundary.errorComponentStack); +} + +function flushSegmentContainer(request, destination, segment) { + writeStartSegment(destination, request.responseState, segment.formatContext, segment.id); + flushSegment(request, destination, segment); + return writeEndSegment(destination, segment.formatContext); +} + +function flushCompletedBoundary(request, destination, boundary) { + var completedSegments = boundary.completedSegments; + var i = 0; + + for (; i < completedSegments.length; i++) { + var segment = completedSegments[i]; + flushPartiallyCompletedSegment(request, destination, boundary, segment); + } + + completedSegments.length = 0; + return writeCompletedBoundaryInstruction(destination, request.responseState, boundary.id, boundary.rootSegmentID); +} + +function flushPartialBoundary(request, destination, boundary) { + var completedSegments = boundary.completedSegments; + var i = 0; + + for (; i < completedSegments.length; i++) { + var segment = completedSegments[i]; + + if (!flushPartiallyCompletedSegment(request, destination, boundary, segment)) { + i++; + completedSegments.splice(0, i); // Only write as much as the buffer wants. Something higher priority + // might want to write later. + + return false; + } + } + + completedSegments.splice(0, i); + return true; +} + +function flushPartiallyCompletedSegment(request, destination, boundary, segment) { + if (segment.status === FLUSHED) { + // We've already flushed this inline. + return true; + } + + var segmentID = segment.id; + + if (segmentID === -1) { + // This segment wasn't previously referred to. This happens at the root of + // a boundary. We make kind of a leap here and assume this is the root. + var rootSegmentID = segment.id = boundary.rootSegmentID; + + if (rootSegmentID === -1) { + throw new Error('A root segment ID must have been assigned by now. This is a bug in React.'); + } + + return flushSegmentContainer(request, destination, segment); + } else { + flushSegmentContainer(request, destination, segment); + return writeCompletedSegmentInstruction(destination, request.responseState, segmentID); + } +} + +function flushCompletedQueues(request, destination) { + + try { + // The structure of this is to go through each queue one by one and write + // until the sink tells us to stop. When we should stop, we still finish writing + // that item fully and then yield. At that point we remove the already completed + // items up until the point we completed them. + // TODO: Emit preloading. + // TODO: It's kind of unfortunate to keep checking this array after we've already + // emitted the root. + var completedRootSegment = request.completedRootSegment; + + if (completedRootSegment !== null && request.pendingRootTasks === 0) { + flushSegment(request, destination, completedRootSegment); + request.completedRootSegment = null; + writeCompletedRoot(destination, request.responseState); + } // We emit client rendering instructions for already emitted boundaries first. + // This is so that we can signal to the client to start client rendering them as + // soon as possible. + + + var clientRenderedBoundaries = request.clientRenderedBoundaries; + var i; + + for (i = 0; i < clientRenderedBoundaries.length; i++) { + var boundary = clientRenderedBoundaries[i]; + + if (!flushClientRenderedBoundary(request, destination, boundary)) { + request.destination = null; + i++; + clientRenderedBoundaries.splice(0, i); + return; + } + } + + clientRenderedBoundaries.splice(0, i); // Next we emit any complete boundaries. It's better to favor boundaries + // that are completely done since we can actually show them, than it is to emit + // any individual segments from a partially complete boundary. + + var completedBoundaries = request.completedBoundaries; + + for (i = 0; i < completedBoundaries.length; i++) { + var _boundary = completedBoundaries[i]; + + if (!flushCompletedBoundary(request, destination, _boundary)) { + request.destination = null; + i++; + completedBoundaries.splice(0, i); + return; + } + } + + completedBoundaries.splice(0, i); // Allow anything written so far to flush to the underlying sink before + // we continue with lower priorities. + + completeWriting(destination); + beginWriting(destination); // TODO: Here we'll emit data used by hydration. + // Next we emit any segments of any boundaries that are partially complete + // but not deeply complete. + + var partialBoundaries = request.partialBoundaries; + + for (i = 0; i < partialBoundaries.length; i++) { + var _boundary2 = partialBoundaries[i]; + + if (!flushPartialBoundary(request, destination, _boundary2)) { + request.destination = null; + i++; + partialBoundaries.splice(0, i); + return; + } + } + + partialBoundaries.splice(0, i); // Next we check the completed boundaries again. This may have had + // boundaries added to it in case they were too larged to be inlined. + // New ones might be added in this loop. + + var largeBoundaries = request.completedBoundaries; + + for (i = 0; i < largeBoundaries.length; i++) { + var _boundary3 = largeBoundaries[i]; + + if (!flushCompletedBoundary(request, destination, _boundary3)) { + request.destination = null; + i++; + largeBoundaries.splice(0, i); + return; + } + } + + largeBoundaries.splice(0, i); + } finally { + + if (request.allPendingTasks === 0 && request.pingedTasks.length === 0 && request.clientRenderedBoundaries.length === 0 && request.completedBoundaries.length === 0 // We don't need to check any partially completed segments because + // either they have pending task or they're complete. + ) { + { + if (request.abortableTasks.size !== 0) { + error('There was still abortable task at the root when we closed. This is a bug in React.'); + } + } // We're done. + + + close(destination); + } + } +} + +function startWork(request) { + scheduleWork(function () { + return performWork(request); + }); +} +function startFlowing(request, destination) { + if (request.status === CLOSING) { + request.status = CLOSED; + closeWithError(destination, request.fatalError); + return; + } + + if (request.status === CLOSED) { + return; + } + + if (request.destination !== null) { + // We're already flowing. + return; + } + + request.destination = destination; + + try { + flushCompletedQueues(request, destination); + } catch (error) { + logRecoverableError(request, error); + fatalError(request, error); + } +} // This is called to early terminate a request. It puts all pending boundaries in client rendered state. + +function abort(request, reason) { + try { + var abortableTasks = request.abortableTasks; + abortableTasks.forEach(function (task) { + return abortTask(task, request, reason); + }); + abortableTasks.clear(); + + if (request.destination !== null) { + flushCompletedQueues(request, request.destination); + } + } catch (error) { + logRecoverableError(request, error); + fatalError(request, error); + } +} + +function onError() {// Non-fatal errors are ignored. +} + +function renderToStringImpl(children, options, generateStaticMarkup, abortReason) { + var didFatal = false; + var fatalError = null; + var result = ''; + var destination = { + push: function (chunk) { + if (chunk !== null) { + result += chunk; + } + + return true; + }, + destroy: function (error) { + didFatal = true; + fatalError = error; + } + }; + var readyToStream = false; + + function onShellReady() { + readyToStream = true; + } + + var request = createRequest(children, createResponseState$1(generateStaticMarkup, options ? options.identifierPrefix : undefined), createRootFormatContext(), Infinity, onError, undefined, onShellReady, undefined, undefined); + startWork(request); // If anything suspended and is still pending, we'll abort it before writing. + // That way we write only client-rendered boundaries from the start. + + abort(request, abortReason); + startFlowing(request, destination); + + if (didFatal) { + throw fatalError; + } + + if (!readyToStream) { + // Note: This error message is the one we use on the client. It doesn't + // really make sense here. But this is the legacy server renderer, anyway. + // We're going to delete it soon. + throw new Error('A component suspended while responding to synchronous input. This ' + 'will cause the UI to be replaced with a loading indicator. To fix, ' + 'updates that suspend should be wrapped with startTransition.'); + } + + return result; +} + +function renderToString(children, options) { + return renderToStringImpl(children, options, false, 'The server used "renderToString" which does not support Suspense. If you intended for this Suspense boundary to render the fallback content on the server consider throwing an Error somewhere within the Suspense boundary. If you intended to have the server wait for the suspended component please switch to "renderToReadableStream" which supports Suspense on the server'); +} + +function renderToStaticMarkup(children, options) { + return renderToStringImpl(children, options, true, 'The server used "renderToStaticMarkup" which does not support Suspense. If you intended to have the server wait for the suspended component please switch to "renderToReadableStream" which supports Suspense on the server'); +} + +function renderToNodeStream() { + throw new Error('ReactDOMServer.renderToNodeStream(): The streaming API is not available ' + 'in the browser. Use ReactDOMServer.renderToString() instead.'); +} + +function renderToStaticNodeStream() { + throw new Error('ReactDOMServer.renderToStaticNodeStream(): The streaming API is not available ' + 'in the browser. Use ReactDOMServer.renderToStaticMarkup() instead.'); +} + +exports.renderToNodeStream = renderToNodeStream; +exports.renderToStaticMarkup = renderToStaticMarkup; +exports.renderToStaticNodeStream = renderToStaticNodeStream; +exports.renderToString = renderToString; +exports.version = ReactVersion; + })(); +} diff --git a/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.min.js b/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.min.js new file mode 100644 index 00000000..15683656 --- /dev/null +++ b/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.min.js @@ -0,0 +1,93 @@ +/** + * @license React + * react-dom-server-legacy.browser.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +'use strict';var aa=require("react");function l(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;c + + + + ); +} diff --git a/app/app/profile/page.jsx b/app/app/profile/page.jsx new file mode 100644 index 00000000..8d9f419d --- /dev/null +++ b/app/app/profile/page.jsx @@ -0,0 +1,35 @@ +import React from "react"; +import AppLayoutContainer from "../components/AppLayoutContainer"; // Import the AppLayoutContainer +import ProfileDetails from "../components/ProfileDetails"; +import AboutUser from "../components/AboutUser"; +import Bookshelf from "../components/Bookshelf"; +import Quote from "../components/Quote"; +import UserProgress from "../components/UserProgress"; +import styles from "./ProfilePage.module.css"; // Styles for the ProfilePage + +export default function ProfilePage() { + return ( + + {" "} + {/* Wrap content inside AppLayoutContainer */} +
+
+ + +
+ +
+ +

Most Recent Quotes:

+ + +
+ +
+

Favorite Quotes:

+ +
+
+
+ ); +} From efd5c71134f98657da368441ebef277a53138117 Mon Sep 17 00:00:00 2001 From: Saikiruthiga Date: Sun, 10 Nov 2024 15:06:24 +0100 Subject: [PATCH 028/255] changed from inde.mjs to index.js --- api/package.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/api/package.json b/api/package.json index c07f066f..62cefe75 100644 --- a/api/package.json +++ b/api/package.json @@ -3,7 +3,6 @@ "private": true, "version": "1.0.0", "engineStrict": true, - "main": "src/index.js", "type": "module", "engines": { @@ -11,8 +10,8 @@ "npm": "^10.9.0" }, "scripts": { - "dev": "nodemon src/index.mjs", - "start": "node src/index.mjs", + "dev": "nodemon src/index.js", + "start": "node src/index.js", "format": "npx prettier . --write", "check": "npx eslint . --fix" }, From 992d209fd0bb461dded9cc304cfb9a057259b055 Mon Sep 17 00:00:00 2001 From: Moeen Heydari Date: Sun, 10 Nov 2024 20:40:27 +0100 Subject: [PATCH 029/255] 101124: profilePage added --- app/app/components/Bookshelf.module.css | 5 +- app/app/components/EditProfile.jsx | 119 ++++++++++++++++++ app/app/components/EditProfile.module.css | 47 +++++++ app/app/components/MostRecentQuote.jsx | 23 ++++ app/app/components/MostRecentQuote.module.css | 26 ++++ app/app/components/ProfileDetails.jsx | 15 ++- app/app/data/profileData.json | 22 +++- app/app/profile/page.jsx | 9 +- 8 files changed, 253 insertions(+), 13 deletions(-) create mode 100644 app/app/components/EditProfile.jsx create mode 100644 app/app/components/EditProfile.module.css create mode 100644 app/app/components/MostRecentQuote.jsx create mode 100644 app/app/components/MostRecentQuote.module.css diff --git a/app/app/components/Bookshelf.module.css b/app/app/components/Bookshelf.module.css index 4cb2950c..8aeebd45 100644 --- a/app/app/components/Bookshelf.module.css +++ b/app/app/components/Bookshelf.module.css @@ -21,13 +21,12 @@ } .bookImage { - width: 100px; /* Adjust size */ - height: 150px; /* Adjust size */ + width: 100px; + height: 150px; object-fit: cover; border-radius: 8px; } .bookshelf p { padding: 15px; - font-family: var(--font-lato), sans-serif; /* Default font */ font-size: 1.2em; } diff --git a/app/app/components/EditProfile.jsx b/app/app/components/EditProfile.jsx new file mode 100644 index 00000000..6e6c6214 --- /dev/null +++ b/app/app/components/EditProfile.jsx @@ -0,0 +1,119 @@ +import React, { useState } from "react"; +import styles from "./EditProfile.module.css"; +import Button from "./Button"; + +const EditProfile = ({ isOpen, onClose }) => { + const [formData, setFormData] = useState({ + profileImageUrl: "", + name: "", + gender: "", + favoriteBooks: "", + favoriteAuthor: "", + about: "", + }); + + // Handle input change + const handleChange = (e) => { + const { name, value } = e.target; + setFormData((prevData) => ({ + ...prevData, + [name]: value, + })); + }; + + // Handle form submit (you can implement actual save logic here) + const handleSubmit = (e) => { + e.preventDefault(); + console.log("Form submitted:", formData); + onClose(); // Close modal after submission + }; + + if (!isOpen) return null; + + return ( +
+
+ +

Edit Profile

+
+ {formData.profileImageUrl && ( +
+ Profile Preview +
+ )} +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + -
- -
-
- ); -} diff --git a/app/app/profile/edit-profile/EditProfile.module.css b/app/app/profile/edit-profile/EditProfile.module.css new file mode 100644 index 00000000..8e0d3b22 --- /dev/null +++ b/app/app/profile/edit-profile/EditProfile.module.css @@ -0,0 +1,57 @@ +.container { + display: flex; + gap: 30px; + padding: 20px; + max-width: 1000px; + min-height: 700px; + margin: 20px auto; + padding: 30px; +} + +.leftSide { + flex: 2; + display: flex; + flex-direction: column; + gap: 20px; + padding: 20px; +} + +.rightSide { + flex: 1; + display: flex; + flex-direction: column; + gap: 20px; + padding: 20px; +} + +.inputGroup { + margin-bottom: 15px; + background-color: #f5ebeb; +} + +.inputGroup label { + display: block; + margin-bottom: 5px; + font-weight: bold; +} + +.inputGroup input { + width: 100%; + padding: 10px; + margin-top: 5px; + font-size: 16px; + border: 1px solid #ccc; +} + +.bookshelf, +.mostRecentQuotes, +.favoriteQuotes { + background-color: #f5ebeb; + padding: 20px; +} + +.buttons { + display: flex; + justify-content: center; + margin: 20px; +} diff --git a/app/app/profile/edit-profile/page.jsx b/app/app/profile/edit-profile/page.jsx new file mode 100644 index 00000000..aa82d9e7 --- /dev/null +++ b/app/app/profile/edit-profile/page.jsx @@ -0,0 +1,156 @@ +"use client"; + +import React, { useState } from "react"; +import AppLayoutContainer from "../../components/AppLayoutContainer"; +import Button from "../../components/Button"; +import profileData from "../../data/profileData.json"; +import Quote from "../../components/Quote"; +import styles from "./EditProfile.module.css"; + +const EditProfile = () => { + const [bookRead, setBookRead] = useState(""); + const [currentlyReading, setCurrentlyReading] = useState(""); + const [wishToRead, setWishToRead] = useState(""); + const [quote, setQuote] = useState(""); + const [bookQuote, setBookQuote] = useState(""); + const [authorQuote, setAuthorQuote] = useState(""); + + const editFavoriteQuotes = profileData.editFavoriteQuote; + + const handleSave = () => { + console.log("Profile Saved"); + }; + + const handleDiscard = () => { + console.log("Changes Discarded"); + }; + + return ( + +
+
+
+

Bookshelf

+
+ + setBookRead(e.target.value)} + /> + +
+ +
+ + setCurrentlyReading(e.target.value)} + /> + +
+ +
+ + setWishToRead(e.target.value)} + /> + +
+
+ +
+

Most Recent Quotes

+
+ + setQuote(e.target.value)} + /> +
+ +
+ + setBookQuote(e.target.value)} + /> +
+ +
+ + setAuthorQuote(e.target.value)} + /> +
+ +
+
+ +
+
+

Favorite Quotes

+
+ + setQuote(e.target.value)} + /> +
+ +
+ + setBookQuote(e.target.value)} + /> +
+ +
+ + setAuthorQuote(e.target.value)} + /> +
+ + + +
+
+
+ +
+ + +
+
+ ); +}; + +export default EditProfile; diff --git a/app/app/profile/page.jsx b/app/app/profile/page.jsx index d1c66005..48e770d5 100644 --- a/app/app/profile/page.jsx +++ b/app/app/profile/page.jsx @@ -6,6 +6,7 @@ import Bookshelf from "../components/Bookshelf"; import Quote from "../components/Quote"; import MostRecentQuote from "../components/MostRecentQuote"; import UserProgress from "../components/UserProgress"; +import profileData from "../data/profileData.json"; import styles from "./ProfilePage.module.css"; export default function ProfilePage() { @@ -26,7 +27,7 @@ export default function ProfilePage() {

Favorite Quotes:

- +
From 01427fe0dd2dcaaad262bce66b682d1fb7b6875f Mon Sep 17 00:00:00 2001 From: Saikiruthiga Date: Mon, 11 Nov 2024 14:40:05 +0100 Subject: [PATCH 040/255] Remove unwanted files and clean up repository --- app/app/signup/page.jsx | 333 ---------------------------------------- app/public/books.jpg | Bin 155461 -> 0 bytes 2 files changed, 333 deletions(-) delete mode 100644 app/app/signup/page.jsx delete mode 100644 app/public/books.jpg diff --git a/app/app/signup/page.jsx b/app/app/signup/page.jsx deleted file mode 100644 index 5795c8d9..00000000 --- a/app/app/signup/page.jsx +++ /dev/null @@ -1,333 +0,0 @@ -"use client"; -import { - Container, - TextField, - Button, - Typography, - Grid2, - Box, - Divider, -} from "@mui/material"; -import { useRouter } from "next/navigation"; - -import { useState } from "react"; - -const SignUp = () => { - const [data, setData] = useState({ - firstName: "", - lastName: "", - email: "", - password: "", - }); - const handleChange = (e) => { - setErrors({ - firstName: "", - lastName: "", - email: "", - password: "", - }); - setData((prevData) => ({ ...prevData, [e.target.name]: e.target.value })); - }; - - const [errors, setErrors] = useState({ - firstName: "", - lastName: "", - email: "", - password: "", - }); - - const isValidate = () => { - let isValid = true; - let tempErrors = {}; - if (!data.firstName) { - tempErrors.firstName = "Firstname is required"; - isValid = false; - } - if (!data.lastName) { - tempErrors.lastName = "Lastname is required"; - isValid = false; - } - if (!data.email) { - tempErrors.email = "Email is required"; - isValid = false; - } else if (!/\S+@\S+\.\S+/.test(data.email)) { - tempErrors.email = "Email is not valid"; - isValid = false; - } - if (!data.password) { - tempErrors.password = "Password"; - isValid = false; - } - setErrors(tempErrors); - return isValid; - }; - - const router = useRouter(); - - const handleSubmit = (e) => { - e.preventDefault(); - if (isValidate()) { - setData({ - firstName: "", - lastName: "", - email: "", - password: "", - }); - alert("Welcome to LeafNotes"); - router.push("/profile"); - } - }; - - return ( - - - - - Welcome to LeafNotes {"\n"} - - Track what you've read and {"\n"}what's next. - - - - - - - - - Create Account{" "} - {" "} - - {" "} - - {" "} - - {" "} - {" "} - {" "} - - {" "} - {" "} - {" "} - {" "} - {" "} - {" "} - {" "} - {" "} - - Already have an account?{" "} -
- Login{" "} - {" "} - {" "} - -  {" "} - - OR{" "} - -  {" "} - {" "} - - {" "} - - {" "} - - {" "} - - {" "} - {" "} - {" "} - {" "} - - {" "} - - {" "} - {" "} - {" "} - {" "} - {" "} - {" "} - {" "} - - ); -}; - -export default SignUp; diff --git a/app/public/books.jpg b/app/public/books.jpg deleted file mode 100644 index 41e51d1baaf0c87169f3135eb2ef4537e27bdcbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155461 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

d0ooY4oCIEMl$F2HFp0GS#KTHR@-&` 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 z

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

#~?89vSe@^%+e%~aD~F_*$2 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 z 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 bDAMIW1-*_6y+BPomEOj(`Y-GG$LjwB8WBw2 From 3403a504e6646baa7c55ecc4e33a0fe2f900cf38 Mon Sep 17 00:00:00 2001 From: Tanya Dewland Date: Mon, 11 Nov 2024 17:14:01 +0100 Subject: [PATCH 041/255] Add pagination to limit results of external api call --- api/src/utils/pagination.js | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 api/src/utils/pagination.js diff --git a/api/src/utils/pagination.js b/api/src/utils/pagination.js new file mode 100644 index 00000000..e0feddfb --- /dev/null +++ b/api/src/utils/pagination.js @@ -0,0 +1,4 @@ +export const getPaginationParams = (page = 1, pageSize = 10) => { + const offset = (page - 1) * pageSize; + return { offset, pageSize }; +}; From ff9d2165557537aeb04402dbca5ccb87fd05b8b7 Mon Sep 17 00:00:00 2001 From: Saikiruthiga Date: Mon, 11 Nov 2024 17:44:32 +0100 Subject: [PATCH 042/255] endpoint changed from signin to signup --- app/app/signup/page.jsx | 326 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 326 insertions(+) create mode 100644 app/app/signup/page.jsx diff --git a/app/app/signup/page.jsx b/app/app/signup/page.jsx new file mode 100644 index 00000000..c4188d22 --- /dev/null +++ b/app/app/signup/page.jsx @@ -0,0 +1,326 @@ +"use client"; +import { + Container, + TextField, + Button, + Typography, + Grid2, + Box, +} from "@mui/material"; +import { useRouter } from "next/navigation"; + +import { useState } from "react"; + +const SignUp = () => { + const [data, setData] = useState({ + firstName: "", + lastName: "", + email: "", + username: "", + password: "", + }); + const handleChange = (e) => { + setErrors({ + firstName: "", + lastName: "", + email: "", + username: "", + password: "", + }); + setData((prevData) => ({ ...prevData, [e.target.name]: e.target.value })); + }; + + const [errors, setErrors] = useState({ + firstName: "", + lastName: "", + email: "", + username: "", + password: "", + }); + + const isValidate = () => { + let isValid = true; + let tempErrors = {}; + if (!data.firstName) { + tempErrors.firstName = "Firstname is required"; + isValid = false; + } + if (!data.lastName) { + tempErrors.lastName = "Lastname is required"; + isValid = false; + } + if (!data.email) { + tempErrors.email = "Email is required"; + isValid = false; + } else if (!/\S+@\S+\.\S+/.test(data.email)) { + tempErrors.email = "Email is not valid"; + isValid = false; + } + if (!data.username) { + tempErrors.username = "Username is required"; + } + if (!data.password) { + tempErrors.password = "Password"; + isValid = false; + } + setErrors(tempErrors); + return isValid; + }; + + const router = useRouter(); + + const handleSubmit = async (e) => { + e.preventDefault(); + + if (isValidate()) { + const userData = { + first_name: data.firstName, + last_name: data.lastName, + email: data.email, + username: data.username, + password: data.password, + }; + + try { + const response = await fetch("http://localhost:3001/auth/register", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(userData), + }); + + const result = await response.json(); + + if (response.ok) { + setData({ + firstName: "", + lastName: "", + email: "", + username: "", + password: "", + }); + alert("Welcome to LeafNotes"); + router.push("/profile"); + } else { + alert(result.error || "Something went wrong, please try again."); + } + } catch (error) { + console.error("Error registering user:", error); + alert("Network error, please try again later."); + } + } + }; + + return ( + + + + + + Welcome to LeafNotes {"\n"} + + Track what you've read and {"\n"}what's next. + + + + + + + + + Create Account{" "} + {" "} + + {" "} + + {" "} + + {" "} + {" "} + {" "} + + {" "} + {" "} + {" "} + {" "} + {" "} + {" "} + {" "} + {" "} + {" "} + + Already have an account?{" "} + + Login{" "} + {" "} + {" "} + {" "} + + + ); +}; + +export default SignUp; From b211b220268afd581e822014b4d6eaf7b9ea7e51 Mon Sep 17 00:00:00 2001 From: Saikiruthiga Date: Mon, 11 Nov 2024 18:18:59 +0100 Subject: [PATCH 043/255] implemented feedback - make separate fetch function --- app/app/utils/makeRequest.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 app/app/utils/makeRequest.js diff --git a/app/app/utils/makeRequest.js b/app/app/utils/makeRequest.js new file mode 100644 index 00000000..ecef274e --- /dev/null +++ b/app/app/utils/makeRequest.js @@ -0,0 +1,20 @@ +export const makeRequest = async (url, userData) => { + try { + const response = await fetch(url, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(userData), + }); + const result = await response.json(); + + if (!response.ok) { + throw new Error(result.error || "Something went wrong"); + } + + return result; + } catch (error) { + throw new Error(error.message || "Network error, please try again later."); + } +}; From b5a1ecc055d5024d26e30e70ba72f18ecca6f466 Mon Sep 17 00:00:00 2001 From: Saikiruthiga Date: Mon, 11 Nov 2024 18:22:51 +0100 Subject: [PATCH 044/255] Update redirect after registration: changed from '/profile' to 'localhost' --- app/app/signup/page.jsx | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/app/app/signup/page.jsx b/app/app/signup/page.jsx index c4188d22..fb2d7e88 100644 --- a/app/app/signup/page.jsx +++ b/app/app/signup/page.jsx @@ -10,6 +10,7 @@ import { import { useRouter } from "next/navigation"; import { useState } from "react"; +import { makeRequest } from "../utils/makeRequest"; const SignUp = () => { const [data, setData] = useState({ @@ -82,32 +83,23 @@ const SignUp = () => { }; try { - const response = await fetch("http://localhost:3001/auth/register", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(userData), - }); - - const result = await response.json(); + const result = await makeRequest( + "http://localhost:3001/auth/register", + userData + ); - if (response.ok) { - setData({ - firstName: "", - lastName: "", - email: "", - username: "", - password: "", - }); - alert("Welcome to LeafNotes"); - router.push("/profile"); - } else { - alert(result.error || "Something went wrong, please try again."); - } + setData({ + firstName: "", + lastName: "", + email: "", + username: "", + password: "", + }); + alert("Welcome to LeafNotes"); + router.push("http://localhost:3000/"); } catch (error) { console.error("Error registering user:", error); - alert("Network error, please try again later."); + alert(error.message || "Something went wrong, please try again."); } } }; From bbfb7e33e4ce0c772207389e91661179a55210d1 Mon Sep 17 00:00:00 2001 From: Saikiruthiga Date: Mon, 11 Nov 2024 18:37:45 +0100 Subject: [PATCH 045/255] remove app/signin/page.jsx --- app/app/signin/page.jsx | 326 ---------------------------------------- 1 file changed, 326 deletions(-) delete mode 100644 app/app/signin/page.jsx diff --git a/app/app/signin/page.jsx b/app/app/signin/page.jsx deleted file mode 100644 index c4188d22..00000000 --- a/app/app/signin/page.jsx +++ /dev/null @@ -1,326 +0,0 @@ -"use client"; -import { - Container, - TextField, - Button, - Typography, - Grid2, - Box, -} from "@mui/material"; -import { useRouter } from "next/navigation"; - -import { useState } from "react"; - -const SignUp = () => { - const [data, setData] = useState({ - firstName: "", - lastName: "", - email: "", - username: "", - password: "", - }); - const handleChange = (e) => { - setErrors({ - firstName: "", - lastName: "", - email: "", - username: "", - password: "", - }); - setData((prevData) => ({ ...prevData, [e.target.name]: e.target.value })); - }; - - const [errors, setErrors] = useState({ - firstName: "", - lastName: "", - email: "", - username: "", - password: "", - }); - - const isValidate = () => { - let isValid = true; - let tempErrors = {}; - if (!data.firstName) { - tempErrors.firstName = "Firstname is required"; - isValid = false; - } - if (!data.lastName) { - tempErrors.lastName = "Lastname is required"; - isValid = false; - } - if (!data.email) { - tempErrors.email = "Email is required"; - isValid = false; - } else if (!/\S+@\S+\.\S+/.test(data.email)) { - tempErrors.email = "Email is not valid"; - isValid = false; - } - if (!data.username) { - tempErrors.username = "Username is required"; - } - if (!data.password) { - tempErrors.password = "Password"; - isValid = false; - } - setErrors(tempErrors); - return isValid; - }; - - const router = useRouter(); - - const handleSubmit = async (e) => { - e.preventDefault(); - - if (isValidate()) { - const userData = { - first_name: data.firstName, - last_name: data.lastName, - email: data.email, - username: data.username, - password: data.password, - }; - - try { - const response = await fetch("http://localhost:3001/auth/register", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(userData), - }); - - const result = await response.json(); - - if (response.ok) { - setData({ - firstName: "", - lastName: "", - email: "", - username: "", - password: "", - }); - alert("Welcome to LeafNotes"); - router.push("/profile"); - } else { - alert(result.error || "Something went wrong, please try again."); - } - } catch (error) { - console.error("Error registering user:", error); - alert("Network error, please try again later."); - } - } - }; - - return ( - - - - - - Welcome to LeafNotes {"\n"} - - Track what you've read and {"\n"}what's next. - - - - - - - - - Create Account{" "} - {" "} - - {" "} - - {" "} - - {" "} - {" "} - {" "} - - {" "} - {" "} - {" "} - {" "} - {" "} - {" "} - {" "} - {" "} - {" "} - - Already have an account?{" "} - - Login{" "} - {" "} - {" "} - {" "} - - - ); -}; - -export default SignUp; From 2ea30b241b41a4b35222556ccc4d5e0714e1126f Mon Sep 17 00:00:00 2001 From: Moeen Heydari Date: Mon, 11 Nov 2024 19:30:08 +0100 Subject: [PATCH 046/255] 111124: MemorableLines is updated --- app/app/components/MemorableLines.jsx | 84 ++++++++++---------- app/app/components/MemorableLines.module.css | 64 +++++++-------- 2 files changed, 72 insertions(+), 76 deletions(-) diff --git a/app/app/components/MemorableLines.jsx b/app/app/components/MemorableLines.jsx index 3986f680..30a8dcb3 100644 --- a/app/app/components/MemorableLines.jsx +++ b/app/app/components/MemorableLines.jsx @@ -1,47 +1,51 @@ -import React from "react"; -import Image from "next/image"; +"use client"; + +import React, { useState, useEffect } from "react"; +import axios from "axios"; import styles from "./MemorableLines.module.css"; -const MemorableLines = () => { +const MemorableQuotes = () => { + const [quotes, setQuotes] = useState([]); // Store all quotes + const [currentQuoteIndex, setCurrentQuoteIndex] = useState(0); // Track the index of the current quote + const [loading, setLoading] = useState(true); // Loading state + + // Fetch quotes from the API + useEffect(() => { + axios + .get("https://api.allorigins.win/get?url=https://zenquotes.io/api/quotes") + .then((response) => { + const data = JSON.parse(response.data.contents); + setQuotes(data); // Store the quotes in state + setLoading(false); + + // Set interval to change quote every 20 seconds + const intervalId = setInterval(() => { + setCurrentQuoteIndex((prevIndex) => (prevIndex + 1) % data.length); // Loop through quotes + }, 20000); // Change every 20 seconds + + // Clear the interval when component unmounts + return () => clearInterval(intervalId); + }) + .catch((error) => { + console.error("Error fetching quotes:", error); + setLoading(false); + }); + }, []); + + if (loading) return

Loading quotes...

; + + // Get the current quote from the quotes array + const currentQuote = quotes[currentQuoteIndex]; + return ( -
-

Memorable Lines from Literature

-
-
-
- The Little Prince -
- “You become responsible, forever, for what you have tamed.” -
-
-

THE LITTLE PRINCE

-

ANTOINE DE SAINT-EXUPÉRY

-
-
-
- Don Quixote -
- “He who reads a lot and walks a lot sees a lot and knows a lot.” -
-
-

DON QUIXOTE

-

MIGUEL DE CERVANTES

-
+
+

Memorable Quotes

+
+
“{currentQuote.q}”
+

- {currentQuote.a}

-
+ ); }; -export default MemorableLines; +export default MemorableQuotes; diff --git a/app/app/components/MemorableLines.module.css b/app/app/components/MemorableLines.module.css index 5a92d9a1..4d9e28f0 100644 --- a/app/app/components/MemorableLines.module.css +++ b/app/app/components/MemorableLines.module.css @@ -1,53 +1,45 @@ -.memorableLines { - width: 100%; +.memorableContainer { + background-color: #f5ebeb; padding: 40px 20px; + border-radius: 10px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + max-width: 970px; + height: 300px; + margin: 20px auto; text-align: center; - margin: 50px 0 0 0; + font-family: "Arial", sans-serif; } -.linesContainer { - display: flex; - justify-content: space-evenly; - flex-wrap: wrap; +.title { + font-size: 2rem; + margin-bottom: 20px; } -.line { - max-width: 500px; - margin: 20px; - background-color: #ffffff; +.quoteContainer { + background-color: #fff; border-radius: 8px; padding: 20px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); - text-align: left; -} - -.blockquoteContainer { - display: flex; - justify-content: center; -} - -.quoteImage { - border-radius: 50%; - margin-bottom: 10px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + margin-bottom: 30px; } .blockquote { - font-size: 1.2rem; + font-size: 1.5rem; font-style: italic; - color: #555; - margin: 10px 0; - padding: 0 40px; + color: #333; + margin: 0 0 10px; } -.bookTitle { - font-size: 1rem; - color: #828282; - margin: 5px 0; - letter-spacing: 4px; +.author { + font-size: 1.1rem; + font-weight: bold; + color: #555; + text-transform: uppercase; + letter-spacing: 0.25em; } -.author { - font-size: 0.9rem; - color: #828282; - letter-spacing: 4px; +.loadingText { + text-align: center; + font-size: 1.2rem; + color: #888; } From ec274d1a8da70698cc5b69fbc69d2b916fc27d64 Mon Sep 17 00:00:00 2001 From: Tanya Dewland Date: Mon, 11 Nov 2024 20:25:27 +0100 Subject: [PATCH 047/255] Add pagination and move searchGoogleBooks to a different file --- .../searchGoogleBooksController.js | 42 +++++++++ api/src/controllers/userBooksController.js | 89 ++++++++++++------- api/src/index.js | 14 +++ api/src/routers/searchGoogleBooksRouter.js | 7 ++ api/src/routers/userBooksRouter.js | 6 +- api/src/utils/pagination.js | 3 +- 6 files changed, 125 insertions(+), 36 deletions(-) create mode 100644 api/src/controllers/searchGoogleBooksController.js create mode 100644 api/src/routers/searchGoogleBooksRouter.js diff --git a/api/src/controllers/searchGoogleBooksController.js b/api/src/controllers/searchGoogleBooksController.js new file mode 100644 index 00000000..63ab0aaa --- /dev/null +++ b/api/src/controllers/searchGoogleBooksController.js @@ -0,0 +1,42 @@ +import { getPaginationParams } from "../utils/pagination.js"; +import fetch from "node-fetch"; + +const googleBooksApiKey = process.env.GOOGLE_BOOKS_API_KEY; +console.log(googleBooksApiKey); +export const searchGoogleBooks = async (req, res) => { + const { query, page = 1, pageSize = 10 } = req.query; + console.log(query); + console.log(page); + console.log(pageSize); + + const { offset, limit } = getPaginationParams(page, pageSize); + console.log(offset, limit); + + try { + const response = await fetch( + `https://www.googleapis.com/books/v1/volumes?q=${encodeURIComponent(query)}&startIndex=${offset}&maxResults=${limit}&key=${googleBooksApiKey}` + ); + console.log(response.status); + + const data = await response.json(); + console.log(data); + + if (!data.items) { + return res.json([]); + } + + const books = data.items.map((item) => ({ + google_book_id: item.id, + title: item.volumeInfo.title, + authors: item.volumeInfo.authors ? item.volumeInfo.authors[0] : "Unknown", + description: item.volumeInfo.description || null, + genre: item.volumeInfo.categories ? item.volumeInfo.categories[0] : null, + cover_image: item.volumeInfo.imageLinks?.thumbnail || null, + })); + + return res.json(books); + } catch (error) { + console.error("Error searching Google Books:", error); + return res.status(500).json({ error: "Internal Server Error" }); + } +}; diff --git a/api/src/controllers/userBooksController.js b/api/src/controllers/userBooksController.js index e5601dad..acfee2ca 100644 --- a/api/src/controllers/userBooksController.js +++ b/api/src/controllers/userBooksController.js @@ -3,36 +3,6 @@ import fetch from "node-fetch"; const googleBooksApiKey = process.env.GOOGLE_BOOKS_API_KEY; -export const searchGoogleBooks = async (req, res) => { - const { query } = req.query; - - try { - const response = await fetch( - `https://www.googleapis.com/books/v1/volumes?q=${encodeURIComponent(query)}&maxResults=5&key=${googleBooksApiKey}` - ); - - const data = await response.json(); - - if (!data.items) { - return res.json([]); - } - - const books = data.items.map((item) => ({ - google_book_id: item.id, - title: item.volumeInfo.title, - authors: item.volumeInfo.authors ? item.volumeInfo.authors[0] : "Unknown", - description: item.volumeInfo.description || null, - genre: item.volumeInfo.categories ? item.volumeInfo.categories[0] : null, - cover_image: item.volumeInfo.imageLinks?.thumbnail || null, - })); - - return res.json(books); - } catch (error) { - console.error("Error searching Google Books:", error); - return res.status(500).json({ error: "Internal Server Error" }); - } -}; - export const addBookToUser = async (req, res) => { const userId = req.user.userId; const { @@ -142,3 +112,62 @@ export const addBookToUser = async (req, res) => { return res.status(500).json({ error: "Internal Server Error" }); } }; + +export const getUserBooks = async (req, res) => { + const userId = req.user.userId; + + try { + const userBooks = await knex("Books") + .join("UserBooks", "Books.book_id", "=", "UserBooks.book_id") + .where({ "UserBooks.user_id": userId }) + .select( + "Books.*", + "UserBooks.status", + "UserBooks.rating", + "UserBooks.start_date", + "UserBooks.end_date" + ); + + return res.status(200).json(userBooks); + } catch (error) { + console.error("Error fetching user books:", error); + return res.status(500).json({ error: "Internal Server Error" }); + } +}; + +export const updateUserBook = async (req, res) => { + const userId = req.user.userId; + const { bookId } = req.params; + const { status, rating, start_date, end_date } = req.body; + + try { + const userBook = await knex("UserBooks") + .where({ user_id: userId, book_id: bookId }) + .first(); + + if (!userBook) { + return res.status(404).json({ error: "User book not found" }); + } + + await knex("UserBooks") + .where({ user_id: userId, book_id: bookId }) + .update({ status, rating, start_date, end_date }); + + const updatedBook = await knex("Books") + .join("UserBooks", "Books.book_id", "=", "UserBooks.book_id") + .where({ "UserBooks.user_id": userId, "Books.book_id": bookId }) + .select( + "Books.*", + "UserBooks.status", + "UserBooks.rating", + "UserBooks.start_date", + "UserBooks.end_date" + ) + .first(); + + return res.status(200).json(updatedBook); + } catch (error) { + console.error("Error updating user book:", error); + return res.status(500).json({ error: "Internal Server Error" }); + } +}; diff --git a/api/src/index.js b/api/src/index.js index 8e4a84c4..f53c2df7 100644 --- a/api/src/index.js +++ b/api/src/index.js @@ -1,5 +1,7 @@ import "dotenv/config"; +console.log(process.env.GOOGLE_BOOKS_API_KEY); + import express from "express"; import cors from "cors"; import bodyParser from "body-parser"; @@ -8,17 +10,29 @@ import booksRouter from "./routers/booksRouter.js"; import usersRouter from "./routers/usersRouter.js"; import authRouter from "./routers/authRouter.js"; import userBooksRouter from "./routers/userBooksRouter.js"; +import searchRouter from "./routers/searchGoogleBooksRouter.js"; const app = express(); +app.use((req, res, next) => { + console.log("Incoming request:", req.method, req.url); + next(); +}); + app.use(cors()); app.use(bodyParser.json()); +app.use("/api/searchGoogleBooks", searchRouter); app.use("/api/books", booksRouter); app.use("/auth", authRouter); app.use("/users", usersRouter); app.use("/api/user-books", userBooksRouter); +app.use("*", (req, res) => { + console.log("No route matched:", req.method, req.originalUrl); + res.status(404).json({ error: "Route not found" }); +}); + app.listen(process.env.PORT, () => { console.log(`API listening on port ${process.env.PORT}`); }); diff --git a/api/src/routers/searchGoogleBooksRouter.js b/api/src/routers/searchGoogleBooksRouter.js new file mode 100644 index 00000000..a088a6ac --- /dev/null +++ b/api/src/routers/searchGoogleBooksRouter.js @@ -0,0 +1,7 @@ +import express from "express"; +import { searchGoogleBooks } from "../controllers/searchGoogleBooksController.js"; + +const router = express.Router(); +router.get("/", searchGoogleBooks); + +export default router; diff --git a/api/src/routers/userBooksRouter.js b/api/src/routers/userBooksRouter.js index a577854b..4802020a 100644 --- a/api/src/routers/userBooksRouter.js +++ b/api/src/routers/userBooksRouter.js @@ -1,12 +1,8 @@ import express from "express"; -import { - searchGoogleBooks, - addBookToUser, -} from "../controllers/userBooksController.js"; +import { addBookToUser } from "../controllers/userBooksController.js"; import { authenticate } from "../middlewares/authenticate.js"; const userBooksRouter = express.Router(); -userBooksRouter.get("/search", searchGoogleBooks); userBooksRouter.post("/add", authenticate, addBookToUser); diff --git a/api/src/utils/pagination.js b/api/src/utils/pagination.js index e0feddfb..7a0cc778 100644 --- a/api/src/utils/pagination.js +++ b/api/src/utils/pagination.js @@ -1,4 +1,5 @@ export const getPaginationParams = (page = 1, pageSize = 10) => { const offset = (page - 1) * pageSize; - return { offset, pageSize }; + const limit = pageSize; + return { offset, limit }; }; From 73b831b133e6934d27b7fbe8793ed175b4ce4904 Mon Sep 17 00:00:00 2001 From: Tanya Dewland Date: Mon, 11 Nov 2024 20:40:47 +0100 Subject: [PATCH 048/255] Clear out debugging console logs --- api/src/controllers/searchGoogleBooksController.js | 9 +-------- api/src/index.js | 12 ------------ 2 files changed, 1 insertion(+), 20 deletions(-) diff --git a/api/src/controllers/searchGoogleBooksController.js b/api/src/controllers/searchGoogleBooksController.js index 63ab0aaa..782bd62f 100644 --- a/api/src/controllers/searchGoogleBooksController.js +++ b/api/src/controllers/searchGoogleBooksController.js @@ -2,24 +2,17 @@ import { getPaginationParams } from "../utils/pagination.js"; import fetch from "node-fetch"; const googleBooksApiKey = process.env.GOOGLE_BOOKS_API_KEY; -console.log(googleBooksApiKey); + export const searchGoogleBooks = async (req, res) => { const { query, page = 1, pageSize = 10 } = req.query; - console.log(query); - console.log(page); - console.log(pageSize); - const { offset, limit } = getPaginationParams(page, pageSize); - console.log(offset, limit); try { const response = await fetch( `https://www.googleapis.com/books/v1/volumes?q=${encodeURIComponent(query)}&startIndex=${offset}&maxResults=${limit}&key=${googleBooksApiKey}` ); - console.log(response.status); const data = await response.json(); - console.log(data); if (!data.items) { return res.json([]); diff --git a/api/src/index.js b/api/src/index.js index f53c2df7..40e8e748 100644 --- a/api/src/index.js +++ b/api/src/index.js @@ -1,7 +1,5 @@ import "dotenv/config"; -console.log(process.env.GOOGLE_BOOKS_API_KEY); - import express from "express"; import cors from "cors"; import bodyParser from "body-parser"; @@ -14,11 +12,6 @@ import searchRouter from "./routers/searchGoogleBooksRouter.js"; const app = express(); -app.use((req, res, next) => { - console.log("Incoming request:", req.method, req.url); - next(); -}); - app.use(cors()); app.use(bodyParser.json()); @@ -28,11 +21,6 @@ app.use("/auth", authRouter); app.use("/users", usersRouter); app.use("/api/user-books", userBooksRouter); -app.use("*", (req, res) => { - console.log("No route matched:", req.method, req.originalUrl); - res.status(404).json({ error: "Route not found" }); -}); - app.listen(process.env.PORT, () => { console.log(`API listening on port ${process.env.PORT}`); }); From 14f2dad0d3382d82b1bb890a655047d3a8c437bc Mon Sep 17 00:00:00 2001 From: Tanya Dewland Date: Mon, 11 Nov 2024 21:16:32 +0100 Subject: [PATCH 049/255] Update book details --- api/src/controllers/userBooksController.js | 26 ++++++++++++++++++++++ api/src/routers/userBooksRouter.js | 7 ++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/api/src/controllers/userBooksController.js b/api/src/controllers/userBooksController.js index acfee2ca..e8a29bab 100644 --- a/api/src/controllers/userBooksController.js +++ b/api/src/controllers/userBooksController.js @@ -135,6 +135,32 @@ export const getUserBooks = async (req, res) => { } }; +export const updateBookDetails = async (req, res) => { + const userId = req.user.userId; + const { bookId, title, author, genre, description, cover_image } = req.body; + + try { + const book = await knex("Books").where({ book_id: bookId }).first(); + if (!book) { + return res.status(404).json({ error: "Book not found" }); + } + await knex("Books") + .where({ book_id: bookId }) + .update({ + title: title || book.title, + author: author || book.author, + genre: genre || book.genre, + description: description || book.description, + cover_image: cover_image || book.cover_image, + }); + const updatedBook = await knex("Books").where({ book_id: bookId }).first(); + return res.status(200).json(updatedBook); + } catch (error) { + console.error("Error updating book details:", error); + return res.status(500).json({ error: "Internal Server Error" }); + } +}; + export const updateUserBook = async (req, res) => { const userId = req.user.userId; const { bookId } = req.params; diff --git a/api/src/routers/userBooksRouter.js b/api/src/routers/userBooksRouter.js index 4802020a..067d192e 100644 --- a/api/src/routers/userBooksRouter.js +++ b/api/src/routers/userBooksRouter.js @@ -1,9 +1,12 @@ import express from "express"; -import { addBookToUser } from "../controllers/userBooksController.js"; +import { + addBookToUser, + updateBookDetails, +} from "../controllers/userBooksController.js"; import { authenticate } from "../middlewares/authenticate.js"; const userBooksRouter = express.Router(); userBooksRouter.post("/add", authenticate, addBookToUser); - +userBooksRouter.put("/update-details", authenticate, updateBookDetails); export default userBooksRouter; From 26250deed4ce7141a6b062b956c26a42340729cd Mon Sep 17 00:00:00 2001 From: Tanya Dewland Date: Mon, 11 Nov 2024 21:34:29 +0100 Subject: [PATCH 050/255] Update status,review, start_date, end_date for the user's book --- api/src/routers/userBooksRouter.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api/src/routers/userBooksRouter.js b/api/src/routers/userBooksRouter.js index 067d192e..df41ed69 100644 --- a/api/src/routers/userBooksRouter.js +++ b/api/src/routers/userBooksRouter.js @@ -2,6 +2,7 @@ import express from "express"; import { addBookToUser, updateBookDetails, + updateUserBook, } from "../controllers/userBooksController.js"; import { authenticate } from "../middlewares/authenticate.js"; @@ -9,4 +10,6 @@ const userBooksRouter = express.Router(); userBooksRouter.post("/add", authenticate, addBookToUser); userBooksRouter.put("/update-details", authenticate, updateBookDetails); +userBooksRouter.put("/update/:bookId", authenticate, updateUserBook); + export default userBooksRouter; From 2b5db8eccbf13eff91ad8faf8f3e893eac299819 Mon Sep 17 00:00:00 2001 From: Tanya Dewland Date: Mon, 11 Nov 2024 21:40:18 +0100 Subject: [PATCH 051/255] Delete user's book --- api/src/controllers/userBooksController.js | 22 ++++++++++++++++++++++ api/src/routers/userBooksRouter.js | 2 ++ 2 files changed, 24 insertions(+) diff --git a/api/src/controllers/userBooksController.js b/api/src/controllers/userBooksController.js index e8a29bab..e86b6701 100644 --- a/api/src/controllers/userBooksController.js +++ b/api/src/controllers/userBooksController.js @@ -197,3 +197,25 @@ export const updateUserBook = async (req, res) => { return res.status(500).json({ error: "Internal Server Error" }); } }; + +export const deleteUserBook = async (req, res) => { + const userId = req.user.userId; + const { bookId } = req.params; + + try { + const userBook = await knex("UserBooks") + .where({ user_id: userId, book_id: bookId }) + .first(); + + if (!userBook) { + return res.status(404).json({ error: "User book not found" }); + } + + await knex("UserBooks").where({ user_id: userId, book_id: bookId }).del(); + + return res.status(200).json({ message: "Book deleted successfully" }); + } catch (error) { + console.error("Error deleting user book:", error); + return res.status(500).json({ error: "Internal Server Error" }); + } +}; diff --git a/api/src/routers/userBooksRouter.js b/api/src/routers/userBooksRouter.js index df41ed69..787e1ec1 100644 --- a/api/src/routers/userBooksRouter.js +++ b/api/src/routers/userBooksRouter.js @@ -3,6 +3,7 @@ import { addBookToUser, updateBookDetails, updateUserBook, + deleteUserBook, } from "../controllers/userBooksController.js"; import { authenticate } from "../middlewares/authenticate.js"; @@ -11,5 +12,6 @@ const userBooksRouter = express.Router(); userBooksRouter.post("/add", authenticate, addBookToUser); userBooksRouter.put("/update-details", authenticate, updateBookDetails); userBooksRouter.put("/update/:bookId", authenticate, updateUserBook); +userBooksRouter.delete("/delete/:bookId", authenticate, deleteUserBook); export default userBooksRouter; From e773dd50bbc0e90450e3ea29a4de681980147700 Mon Sep 17 00:00:00 2001 From: NadaJrad Date: Mon, 11 Nov 2024 22:53:40 +0100 Subject: [PATCH 052/255] adding login component --- app/app/login/login.jsx | 153 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 app/app/login/login.jsx diff --git a/app/app/login/login.jsx b/app/app/login/login.jsx new file mode 100644 index 00000000..2148a6d5 --- /dev/null +++ b/app/app/login/login.jsx @@ -0,0 +1,153 @@ +"use client"; +import { useState } from "react"; +import { Box, Button, TextField, Typography, Link } from "@mui/material"; + +const Login = () => { + const [username, setUsername] = useState(""); + const [password, setPassword] = useState(""); + + const handleSubmit = (e) => { + e.preventDefault(); + console.log("Username:", username); + console.log("Password:", password); + }; + + return ( + + {/* Left Side: Book Stack Image */} + + + {/* Right Side: Form Container */} + + {/* Welcome Message */} + + Welcome to LeafNotes + + + Track what you've read and what's next in your literary journey. + + + {/* Login Form */} + + setUsername(e.target.value)} + sx={{ + "& .MuiOutlinedInput-root": { + borderRadius: "10px", + bgcolor: "#fffbe8", // Off-white, parchment look + color: "#3E2723", // Dark brown text + }, + "& .MuiInputLabel-root": { + color: "#5A4A42", + fontFamily: "serif", + }, + "& .MuiOutlinedInput-notchedOutline": { + borderColor: "#5A4A42", // Border color to match theme + }, + }} + /> + setPassword(e.target.value)} + sx={{ + "& .MuiOutlinedInput-root": { + borderRadius: "10px", + bgcolor: "#fffbe8", + color: "#3E2723", + }, + "& .MuiInputLabel-root": { + color: "#5A4A42", + fontFamily: "serif", + }, + "& .MuiOutlinedInput-notchedOutline": { + borderColor: "#5A4A42", + }, + }} + /> + + + + {/* Sign Up Link */} + + Don't have an account?{" "} + + Sign up + + + + + ); +}; + +export default Login; From 1afc73a9bfb4e2712faccc45efd6b0a12d7644b8 Mon Sep 17 00:00:00 2001 From: Moeen Heydari Date: Tue, 12 Nov 2024 00:32:52 +0100 Subject: [PATCH 053/255] 121124: RandomBooks.jsx is added --- app/app/components/MemorableLines.jsx | 14 +++- app/app/components/RandomBooks.jsx | 64 +++++++++++++++ app/app/components/RandomBooks.module.css | 97 +++++++++++++++++++++++ app/app/page.jsx | 2 + 4 files changed, 173 insertions(+), 4 deletions(-) create mode 100644 app/app/components/RandomBooks.jsx create mode 100644 app/app/components/RandomBooks.module.css diff --git a/app/app/components/MemorableLines.jsx b/app/app/components/MemorableLines.jsx index 30a8dcb3..5c87bf63 100644 --- a/app/app/components/MemorableLines.jsx +++ b/app/app/components/MemorableLines.jsx @@ -12,7 +12,7 @@ const MemorableQuotes = () => { // Fetch quotes from the API useEffect(() => { axios - .get("https://api.allorigins.win/get?url=https://zenquotes.io/api/quotes") + .get("https://cors-anywhere.herokuapp.com/https://zenquotes.io/api/quotes") // Using a different CORS proxy .then((response) => { const data = JSON.parse(response.data.contents); setQuotes(data); // Store the quotes in state @@ -34,15 +34,21 @@ const MemorableQuotes = () => { if (loading) return

Loading quotes...

; - // Get the current quote from the quotes array + // Check if quotes are available and currentQuote is defined const currentQuote = quotes[currentQuoteIndex]; return (

Memorable Quotes

-
“{currentQuote.q}”
-

- {currentQuote.a}

+ {currentQuote ? ( + <> +
“{currentQuote.q}”
+

- {currentQuote.a}

+ + ) : ( +

No quotes available at the moment.

+ )}
); diff --git a/app/app/components/RandomBooks.jsx b/app/app/components/RandomBooks.jsx new file mode 100644 index 00000000..123399da --- /dev/null +++ b/app/app/components/RandomBooks.jsx @@ -0,0 +1,64 @@ +"use client"; + +import React, { useState, useEffect } from "react"; +import axios from "axios"; +import styles from "./RandomBooks.module.css"; // Import the updated CSS for styling + +const RandomBooks = () => { + const [books, setBooks] = useState([]); // Store the books + const [loading, setLoading] = useState(true); // Loading state for API request + const [error, setError] = useState(""); // Store any potential errors + + useEffect(() => { + // Fetching random books from Google Books API + axios + .get("https://www.googleapis.com/books/v1/volumes?q=book&maxResults=30") + .then((response) => { + // Set the books from the API response + setBooks(response.data.items || []); + setLoading(false); // Data is fetched, stop loading + }) + .catch((err) => { + setError("Error fetching books"); // Set error message in case of failure + setLoading(false); // Stop loading on error + console.error(err); + }); + }, []); // Empty dependency array means this will run once when the component mounts + + if (loading) return

Loading books...

; // Display loading message while fetching data + + if (error) return

{error}

; // Display error message if there’s an issue fetching data + + return ( +
+ {/* Header */} +

Popular Books of the Week

+ +
+ {/* Map through books and display image */} + {books.map((book, index) => ( +
+ {/* Add a link around the book image */} + + {book.volumeInfo.title} + + {/* Book title displayed under the image */} +

{book.volumeInfo.title.slice(0, 40)}

+
+ ))} +
+
+ ); +}; + +export default RandomBooks; diff --git a/app/app/components/RandomBooks.module.css b/app/app/components/RandomBooks.module.css new file mode 100644 index 00000000..e7603d4b --- /dev/null +++ b/app/app/components/RandomBooks.module.css @@ -0,0 +1,97 @@ +.popularBooks { + text-align: center; + padding-top: 40px; +} + +.booksContainer { + display: flex; + flex-wrap: nowrap; + gap: 30px; + justify-content: flex-start; + padding: 20px 0; + margin: 0 auto; + animation: scrollBooks 40s linear infinite; /* Added animation for continuous scrolling */ +} + +/* Stop the animation on hover */ +.booksContainer:hover { + animation-play-state: paused; +} + +@keyframes scrollBooks { + 0% { + transform: translateX(0); + } + 100% { + transform: translateX(-100%); /* Scroll to the left until all books are off the screen */ + } +} + +/* Each individual book card styling */ +.bookCard { + background-color: #fdfdfd; + padding: 20px; + border-radius: 12px; + width: 200px; + height: 400px; + text-overflow: hidden; + text-align: center; + box-shadow: 0 6px 15px rgba(0, 0, 0, 0.1); + transition: + transform 0.3s ease, + box-shadow 0.3s ease; + scroll-snap-align: start; /* Ensures each card "snaps" to the start of the scroll container */ +} + +.bookCard:hover { + transform: scale(1.05); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.2); +} + +.bookImage { + width: 150px; + height: 225px; + object-fit: cover; + margin-bottom: 15px; + border-radius: 8px; + transition: transform 0.3s ease; +} + +.bookImage:hover { + transform: scale(1.1); +} + +/* Make sure the container scrolls horizontally */ +.booksContainer::-webkit-scrollbar { + height: 8px; /* Adds a scrollbar on the x-axis */ +} + +.booksContainer::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0.2); + border-radius: 5px; +} + +.bookTitle { + font-size: 16px; + font-weight: 500; + color: #333; + margin-top: 10px; + line-height: 1.3; + text-transform: uppercase; + letter-spacing: 0.25em; +} + +@media (max-width: 768px) { + .booksContainer { + gap: 15px; /* Smaller gap on mobile */ + } + + .bookCard { + width: 150px; /* Smaller book cards */ + } + + .bookImage { + width: 120px; + height: 180px; + } +} diff --git a/app/app/page.jsx b/app/app/page.jsx index 2d2fc097..8d9b25b5 100644 --- a/app/app/page.jsx +++ b/app/app/page.jsx @@ -3,6 +3,7 @@ import MainPart from "./components/MainPart"; import About from "./components/About"; import SignIn from "./components/SignIn"; import OurTeam from "./components/OurTeam"; +import RandomBooks from "./components/RandomBooks"; import MemorableLines from "./components/MemorableLines"; export default function Home() { @@ -11,6 +12,7 @@ export default function Home() { + From 55cc3d9dc72febeb95dcea4631cc66f67392cae5 Mon Sep 17 00:00:00 2001 From: Moeen Heydari Date: Tue, 12 Nov 2024 11:52:17 +0100 Subject: [PATCH 054/255] 121124: search page is updated --- app/app/search/page.jsx | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/app/app/search/page.jsx b/app/app/search/page.jsx index 7a18e6cc..026ce50a 100644 --- a/app/app/search/page.jsx +++ b/app/app/search/page.jsx @@ -1,10 +1,10 @@ -"use client"; // Ensure the component is a client component +"use client"; import { useState, useEffect } from "react"; -import { useSearchParams } from "next/navigation"; // Use next/navigation for client-side query params +import { useSearchParams } from "next/navigation"; import axios from "axios"; import AppLayoutContainer from "../components/AppLayoutContainer"; -import styles from "./SearchPage.module.css"; // Import the CSS styles +import styles from "./SearchPage.module.css"; const SearchPage = () => { const searchParams = useSearchParams(); // Use useSearchParams to get query params @@ -20,14 +20,17 @@ const SearchPage = () => { setLoading(true); setError(null); try { - const response = await axios.get("https://www.googleapis.com/customsearch/v1", { - params: { - key: "AIzaSyBjgopHT_chdiy-WJ6Vsv2wFUVyJ8Ahlhw", // Replace with your Google API key - cx: "b54c016a790c94e6d", // Replace with your Custom Search Engine ID - q: q, // The query parameter from URL - }, - }); - setSearchResults(response.data.items || []); + const response = await axios.get( + "http://localhost:3001/api/searchGoogleBooks", + { + params: { + query: q, // Pass the search query to the API + page: 1, // You can modify this to support pagination + pageSize: 10, // Define the page size (default to 10) + }, + } + ); + setSearchResults(response.data || []); } catch (err) { setError("An error occurred while fetching the search results."); console.error(err); @@ -57,16 +60,25 @@ const SearchPage = () => { rel="noopener noreferrer" className={styles.resultLink} > - {result.pagemap?.cse_image?.[0]?.src && ( + {result.cover_image && ( {result.title} )}

{result.title}

-

{result.snippet}

+ +

+ {result.authors + ? result.authors + : "Unknown Author"} +

+ +

+ {result.description} +

From c3fbff4aa5e6bd53409866d0ba1423fedfdb6c51 Mon Sep 17 00:00:00 2001 From: Moeen Heydari Date: Tue, 12 Nov 2024 12:49:38 +0100 Subject: [PATCH 055/255] 121124: AppLayoutContainer added to signup page --- app/app/components/MainPart.jsx | 9 +- app/app/signup/page.jsx | 556 +++++++++++++++----------------- 2 files changed, 265 insertions(+), 300 deletions(-) diff --git a/app/app/components/MainPart.jsx b/app/app/components/MainPart.jsx index bce02432..4ba03a59 100644 --- a/app/app/components/MainPart.jsx +++ b/app/app/components/MainPart.jsx @@ -1,6 +1,7 @@ import React from "react"; import styles from "./MainPart.module.css"; import Button from "./Button"; +import Link from "next/link"; const MainPart = () => { return ( @@ -15,8 +16,12 @@ const MainPart = () => { and set reading goals—all in one place.

- - + + + + + +
diff --git a/app/app/signup/page.jsx b/app/app/signup/page.jsx index fb2d7e88..59bc64bc 100644 --- a/app/app/signup/page.jsx +++ b/app/app/signup/page.jsx @@ -1,318 +1,278 @@ "use client"; -import { - Container, - TextField, - Button, - Typography, - Grid2, - Box, -} from "@mui/material"; +import { Container, TextField, Button, Typography, Grid2, Box } from "@mui/material"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { makeRequest } from "../utils/makeRequest"; +import AppLayoutContainer from "../components/AppLayoutContainer"; const SignUp = () => { - const [data, setData] = useState({ - firstName: "", - lastName: "", - email: "", - username: "", - password: "", - }); - const handleChange = (e) => { - setErrors({ - firstName: "", - lastName: "", - email: "", - username: "", - password: "", + const [data, setData] = useState({ + firstName: "", + lastName: "", + email: "", + username: "", + password: "", + }); + const handleChange = (e) => { + setErrors({ + firstName: "", + lastName: "", + email: "", + username: "", + password: "", + }); + setData((prevData) => ({ ...prevData, [e.target.name]: e.target.value })); + }; + + const [errors, setErrors] = useState({ + firstName: "", + lastName: "", + email: "", + username: "", + password: "", }); - setData((prevData) => ({ ...prevData, [e.target.name]: e.target.value })); - }; - const [errors, setErrors] = useState({ - firstName: "", - lastName: "", - email: "", - username: "", - password: "", - }); + const isValidate = () => { + let isValid = true; + let tempErrors = {}; + if (!data.firstName) { + tempErrors.firstName = "Firstname is required"; + isValid = false; + } + if (!data.lastName) { + tempErrors.lastName = "Lastname is required"; + isValid = false; + } + if (!data.email) { + tempErrors.email = "Email is required"; + isValid = false; + } else if (!/\S+@\S+\.\S+/.test(data.email)) { + tempErrors.email = "Email is not valid"; + isValid = false; + } + if (!data.username) { + tempErrors.username = "Username is required"; + } + if (!data.password) { + tempErrors.password = "Password"; + isValid = false; + } + setErrors(tempErrors); + return isValid; + }; - const isValidate = () => { - let isValid = true; - let tempErrors = {}; - if (!data.firstName) { - tempErrors.firstName = "Firstname is required"; - isValid = false; - } - if (!data.lastName) { - tempErrors.lastName = "Lastname is required"; - isValid = false; - } - if (!data.email) { - tempErrors.email = "Email is required"; - isValid = false; - } else if (!/\S+@\S+\.\S+/.test(data.email)) { - tempErrors.email = "Email is not valid"; - isValid = false; - } - if (!data.username) { - tempErrors.username = "Username is required"; - } - if (!data.password) { - tempErrors.password = "Password"; - isValid = false; - } - setErrors(tempErrors); - return isValid; - }; + const router = useRouter(); - const router = useRouter(); + const handleSubmit = async (e) => { + e.preventDefault(); - const handleSubmit = async (e) => { - e.preventDefault(); + if (isValidate()) { + const userData = { + first_name: data.firstName, + last_name: data.lastName, + email: data.email, + username: data.username, + password: data.password, + }; - if (isValidate()) { - const userData = { - first_name: data.firstName, - last_name: data.lastName, - email: data.email, - username: data.username, - password: data.password, - }; + try { + const result = await makeRequest("http://localhost:3001/auth/register", userData); - try { - const result = await makeRequest( - "http://localhost:3001/auth/register", - userData - ); + setData({ + firstName: "", + lastName: "", + email: "", + username: "", + password: "", + }); + alert("Welcome to LeafNotes"); + router.push("http://localhost:3000/"); + } catch (error) { + console.error("Error registering user:", error); + alert(error.message || "Something went wrong, please try again."); + } + } + }; - setData({ - firstName: "", - lastName: "", - email: "", - username: "", - password: "", - }); - alert("Welcome to LeafNotes"); - router.push("http://localhost:3000/"); - } catch (error) { - console.error("Error registering user:", error); - alert(error.message || "Something went wrong, please try again."); - } - } - }; + return ( + + + + + + + Welcome to LeafNotes {"\n"} + + Track what you've read and {"\n"}what's next. + - return ( - - - - - - Welcome to LeafNotes {"\n"} - - Track what you've read and {"\n"}what's next. - + + + + + - -
- - - - Create Account{" "} - {" "} - - {" "} - - {" "} - - {" "} - {" "} - {" "} - - {" "} - {" "} - {" "} - {" "} - {" "} - {" "} - {" "} - {" "} - {" "} - - Already have an account?{" "} - - Login{" "} - {" "} - {" "} - {" "} - - - ); + marginRight: "-25px", + }} + > + + Create Account{" "} + {" "} + + {" "} + + {" "} + + {" "} + {" "} + {" "} + + {" "} + {" "} + {" "} + {" "} + {" "} + {" "} + {" "} + {" "} + {" "} + + Already have an account?{" "} + + Login{" "} + {" "} + {" "} + {" "} + + + + ); }; export default SignUp; From 07744a0981a6ce9f090b3da8795bc5ee86768e26 Mon Sep 17 00:00:00 2001 From: Saikiruthiga Date: Tue, 12 Nov 2024 17:10:19 +0100 Subject: [PATCH 056/255] Added code for fetch the quotes from the Quotes table --- api/src/controllers/quotesController.js | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 api/src/controllers/quotesController.js diff --git a/api/src/controllers/quotesController.js b/api/src/controllers/quotesController.js new file mode 100644 index 00000000..4109b5ab --- /dev/null +++ b/api/src/controllers/quotesController.js @@ -0,0 +1,11 @@ +import knex from "../database_client.js"; + +export const getQuotes = async (req, res) => { + try { + const response = await knex("Quotes").select("*"); + res.status(200).json(response); + } catch (error) { + console.log("Error on fetching", error); + res.status(500).json({ message: "Failed to fetch quotes" }); + } +}; From 2cc735db145f20dc65f3aafbb7fd2e029c9bf4b2 Mon Sep 17 00:00:00 2001 From: Saikiruthiga Date: Tue, 12 Nov 2024 17:11:40 +0100 Subject: [PATCH 057/255] set the endpoint to fetch all the quotes --- api/src/routers/quotesRouter.js | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 api/src/routers/quotesRouter.js diff --git a/api/src/routers/quotesRouter.js b/api/src/routers/quotesRouter.js new file mode 100644 index 00000000..d8ddfcbf --- /dev/null +++ b/api/src/routers/quotesRouter.js @@ -0,0 +1,8 @@ +import express from "express"; +import { getQuotes } from "../controllers/quotesController.js"; + +const quotesRouter = express.Router(); + +quotesRouter.get("/all-quotes", getQuotes); + +export default quotesRouter; From fa98b58451e31c84f38af75775d9bf2cb23f99f9 Mon Sep 17 00:00:00 2001 From: Saikiruthiga Date: Tue, 12 Nov 2024 17:12:30 +0100 Subject: [PATCH 058/255] import the quotesrouter in index.js --- api/src/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/src/index.js b/api/src/index.js index 40e8e748..70c48022 100644 --- a/api/src/index.js +++ b/api/src/index.js @@ -9,6 +9,7 @@ import usersRouter from "./routers/usersRouter.js"; import authRouter from "./routers/authRouter.js"; import userBooksRouter from "./routers/userBooksRouter.js"; import searchRouter from "./routers/searchGoogleBooksRouter.js"; +import quotesRouter from "./routers/quotesRouter.js"; const app = express(); @@ -20,6 +21,7 @@ app.use("/api/books", booksRouter); app.use("/auth", authRouter); app.use("/users", usersRouter); app.use("/api/user-books", userBooksRouter); +app.use("/quotes", quotesRouter); app.listen(process.env.PORT, () => { console.log(`API listening on port ${process.env.PORT}`); From 0830006e6c7f6564a7666a7be1fecd73b2d9187a Mon Sep 17 00:00:00 2001 From: Saikiruthiga Date: Tue, 12 Nov 2024 17:15:05 +0100 Subject: [PATCH 059/255] fetch random quote from the Quotes table each time its rendered --- app/app/components/MemorableLines.jsx | 91 +++++++++++++-------------- 1 file changed, 43 insertions(+), 48 deletions(-) diff --git a/app/app/components/MemorableLines.jsx b/app/app/components/MemorableLines.jsx index 5c87bf63..17c0fd0c 100644 --- a/app/app/components/MemorableLines.jsx +++ b/app/app/components/MemorableLines.jsx @@ -1,57 +1,52 @@ "use client"; import React, { useState, useEffect } from "react"; -import axios from "axios"; import styles from "./MemorableLines.module.css"; const MemorableQuotes = () => { - const [quotes, setQuotes] = useState([]); // Store all quotes - const [currentQuoteIndex, setCurrentQuoteIndex] = useState(0); // Track the index of the current quote - const [loading, setLoading] = useState(true); // Loading state - - // Fetch quotes from the API - useEffect(() => { - axios - .get("https://cors-anywhere.herokuapp.com/https://zenquotes.io/api/quotes") // Using a different CORS proxy - .then((response) => { - const data = JSON.parse(response.data.contents); - setQuotes(data); // Store the quotes in state - setLoading(false); - - // Set interval to change quote every 20 seconds - const intervalId = setInterval(() => { - setCurrentQuoteIndex((prevIndex) => (prevIndex + 1) % data.length); // Loop through quotes - }, 20000); // Change every 20 seconds - - // Clear the interval when component unmounts - return () => clearInterval(intervalId); - }) - .catch((error) => { - console.error("Error fetching quotes:", error); - setLoading(false); - }); - }, []); - - if (loading) return

Loading quotes...

; - - // Check if quotes are available and currentQuote is defined - const currentQuote = quotes[currentQuoteIndex]; - - return ( -
-

Memorable Quotes

-
- {currentQuote ? ( - <> -
“{currentQuote.q}”
-

- {currentQuote.a}

- - ) : ( -

No quotes available at the moment.

- )} -
-
- ); + const [quotes, setQuotes] = useState([]); + const [currentQuote, setCurrentQuote] = useState(null); + + useEffect(() => { + const fetchQuotes = async () => { + try { + const response = await fetch("http://localhost:3001/quotes/all-quotes"); + const data = await response.json(); + setQuotes(data); + } catch (error) { + console.error("Error fetching quotes:", error); + } + }; + + fetchQuotes(); + }, []); + + useEffect(() => { + if (quotes.length > 0) { + const randomQuote = quotes[Math.floor(Math.random() * quotes.length)]; + setCurrentQuote({ + q: randomQuote.quote_text, + a: randomQuote.author || "Unknown", + }); + } + }, [quotes]); + return ( +
+

Memorable Quotes

+
+ {currentQuote ? ( + <> +
+ “{currentQuote.q}” +
+

- {currentQuote.a}

+ + ) : ( +

No quotes available at the moment.

+ )} +
+
+ ); }; export default MemorableQuotes; From c0c23e892df81e707171b0c03c3602d742f05ba1 Mon Sep 17 00:00:00 2001 From: Tanya Dewland Date: Tue, 12 Nov 2024 17:46:04 +0100 Subject: [PATCH 060/255] Minor adjustmnets to authcontroller --- api/src/controllers/authController.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/api/src/controllers/authController.js b/api/src/controllers/authController.js index a62c8432..b1d7d1d0 100644 --- a/api/src/controllers/authController.js +++ b/api/src/controllers/authController.js @@ -23,17 +23,20 @@ export const registerUser = async (req, res) => { return res.status(400).json({ error: "Username already exists" }); } - const result = await knex("Users").insert({ + const [userId] = await knex("Users").insert({ first_name, last_name, email, username, password: hashedPassword, }); - const userId = result[0]; - const token = jwt.sign({ userId: userId }, JWT_SECRET, { + + const token = jwt.sign({ userId }, JWT_SECRET, { expiresIn: "1h", }); + const user = await knex("Users") + .where({ user_id: userId }) + .select("user_id", "username", "email", "first_name", "last_name"); res.status(201).json({ message: "User registered successfully", token }); } catch (error) { console.error("Error registering user:", error.message); @@ -67,7 +70,16 @@ export const loginUser = async (req, res) => { expiresIn: "1h", }); - res.json({ token }); + res.json({ + token, + user: { + id: user.user_id, + username: user.username, + email: user.email, + firstName: user.first_name, + lastName: user.last_name, + }, + }); } catch (error) { console.error("Error logging in:", error); res.status(500).json({ error: "Internal Server Error" }); From e475112b7d813235370515f7abe4cf59e478481f Mon Sep 17 00:00:00 2001 From: Moeen Heydari Date: Tue, 12 Nov 2024 19:29:25 +0100 Subject: [PATCH 061/255] 121124: EditBio.jsx is updated --- app/app/components/EditBio.jsx | 50 ++++++--------------------- app/app/components/EditBio.module.css | 14 ++++++-- 2 files changed, 22 insertions(+), 42 deletions(-) diff --git a/app/app/components/EditBio.jsx b/app/app/components/EditBio.jsx index f12359e2..0b16b09c 100644 --- a/app/app/components/EditBio.jsx +++ b/app/app/components/EditBio.jsx @@ -2,14 +2,12 @@ import React, { useState } from "react"; import styles from "./EditBio.module.css"; import Button from "./Button"; -const EditProfile = ({ isOpen, onClose }) => { +const EditBio = ({ isOpen, onClose }) => { const [formData, setFormData] = useState({ profileImageUrl: "", - name: "", - gender: "", + username: "", + booksReadCount: "", favoriteBooks: "", - favoriteAuthor: "", - about: "", }); // Handle input change @@ -36,7 +34,7 @@ const EditProfile = ({ isOpen, onClose }) => { -

Edit Bio

+

Edit Profile

{formData.profileImageUrl && (
@@ -48,25 +46,16 @@ const EditProfile = ({ isOpen, onClose }) => {
)}
- + -
-
- -
+
{ placeholder="Enter Favorite Books..." />
-
- - -
-
- -