From 4ead88dcf47823a1185226d9c36b259372918afc Mon Sep 17 00:00:00 2001 From: Chris Najman Date: Sat, 25 May 2024 12:18:22 +0100 Subject: [PATCH] First commit --- .XXXgithub/workflows/deploy.yml | 51 + .gitignore | 28 + App.jsx | 108 ++ LICENSE | 21 + README.md | 98 ++ components/BtnTheme.jsx | 50 + components/Editor.jsx | 39 + components/Footer.jsx | 22 + components/Header.jsx | 19 + components/Sidebar.jsx | 52 + components/SkipLink.jsx | 12 + firebase.js | 14 + index.html | 34 + index.jsx | 11 + layout/Layout.jsx | 32 + package-lock.json | 2713 +++++++++++++++++++++++++++++ package.json | 24 + public/404.html | 30 + public/android-chrome-192x192.png | Bin 0 -> 5136 bytes public/android-chrome-512x512.png | Bin 0 -> 16993 bytes public/apple-touch-icon.png | Bin 0 -> 5074 bytes public/favicon-16x16.png | Bin 0 -> 336 bytes public/favicon-32x32.png | Bin 0 -> 592 bytes public/favicon.ico | Bin 0 -> 15406 bytes public/site.webmanifest | 1 + style.css | 395 +++++ vite.config.js | 7 + 27 files changed, 3761 insertions(+) create mode 100644 .XXXgithub/workflows/deploy.yml create mode 100644 .gitignore create mode 100644 App.jsx create mode 100644 LICENSE create mode 100644 README.md create mode 100644 components/BtnTheme.jsx create mode 100644 components/Editor.jsx create mode 100644 components/Footer.jsx create mode 100644 components/Header.jsx create mode 100644 components/Sidebar.jsx create mode 100644 components/SkipLink.jsx create mode 100644 firebase.js create mode 100644 index.html create mode 100644 index.jsx create mode 100644 layout/Layout.jsx create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/404.html create mode 100644 public/android-chrome-192x192.png create mode 100644 public/android-chrome-512x512.png create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon-16x16.png create mode 100644 public/favicon-32x32.png create mode 100644 public/favicon.ico create mode 100644 public/site.webmanifest create mode 100644 style.css create mode 100644 vite.config.js diff --git a/.XXXgithub/workflows/deploy.yml b/.XXXgithub/workflows/deploy.yml new file mode 100644 index 0000000..73ca466 --- /dev/null +++ b/.XXXgithub/workflows/deploy.yml @@ -0,0 +1,51 @@ +name: Deploy + +on: + push: + branches: + - main + +jobs: + build: + name: Build + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v4 # Ensure this is v4 to support Node.js 20 + + - name: Setup Node + uses: actions/setup-node@v4 # v4 is correct for Node.js 20 + with: + node-version: 20 + + - name: Install dependencies + run: npm install + + - name: Build project + run: npm run build + + - name: Upload production-ready build files + uses: actions/upload-artifact@v4 # Ensure this is v4 + with: + name: production-files + path: ./dist # Reverted to ./dist + + deploy: + name: Deploy + needs: build + runs-on: ubuntu-latest + if: github.ref == 'refs/heads/main' + + steps: + - name: Download artifact + uses: actions/download-artifact@v4 # Ensure this is v4 + with: + name: production-files + path: ./dist # Reverted to ./dist + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v4 # Ensure this is v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./dist # Reverted to ./dist diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d9cb8b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# mine +ref/ +*copy* diff --git a/App.jsx b/App.jsx new file mode 100644 index 0000000..479a939 --- /dev/null +++ b/App.jsx @@ -0,0 +1,108 @@ +import React, { useState, useEffect } from "react" +import Layout from "./layout/Layout" +import Sidebar from "./components/Sidebar" +import Editor from "./components/Editor" +import Split from "react-split" +import { onSnapshot, addDoc, doc, deleteDoc, setDoc } from "firebase/firestore" +import { notesCollection, db } from "./firebase" + +function App() { + const [notes, setNotes] = useState([]) + + const [currentNoteId, setCurrentNoteId] = useState("") + + const [tempNoteText, setTempNoteText] = useState("") + + const currentNote = + notes.find((note) => note.id === currentNoteId) || notes[0] + + const sortedNotes = notes.sort((a, b) => b.updatedAt - a.updatedAt) + + useEffect(() => { + const unsubscribe = onSnapshot(notesCollection, function (snapshot) { + // Sync local notes array with snapshot data (firestore) + + const notesArr = snapshot.docs.map((doc) => ({ + ...doc.data(), + id: doc.id, + })) + setNotes(notesArr) + }) + return unsubscribe + }, []) + + useEffect(() => { + if (!currentNoteId) { + setCurrentNoteId(notes[0]?.id) + } + }, [notes]) + + useEffect(() => { + if (currentNote) { + setTempNoteText(currentNote.body) + } + }, [currentNote]) + + useEffect(() => { + const timeoutId = setTimeout(() => { + updateNote(tempNoteText) + }, 500) + return () => clearTimeout(timeoutId) + }, [tempNoteText]) + + async function createNewNote() { + const newNote = { + body: "# Type your markdown note's title here", + createdAt: Date.now(), + updatedAt: Date.now(), + } + const newNoteRef = await addDoc(notesCollection, newNote) + setCurrentNoteId(newNoteRef.id) + } + + async function updateNote(text) { + const docRef = doc(db, "notes", currentNoteId) + await setDoc(docRef, { body: text, updatedAt: Date.now() }, { merge: true }) + } + + async function deleteNote(noteId) { + const docRef = doc(db, "notes", noteId) + await deleteDoc(docRef) + } + + return ( + + {notes.length > 0 ? ( + + + + + ) : ( +
+

You have no notes

+ +
+ )} +
+ ) +} + +export default App diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..304ebf7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Christopher. Najman + +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/README.md b/README.md new file mode 100644 index 0000000..950f5b1 --- /dev/null +++ b/README.md @@ -0,0 +1,98 @@ +# Markdown Notes App (Firestore) + +This is the result of the Scrimba Tutorial [Notes App (registration required)](https://v2.scrimba.com/learn-react-c0e), including the setting up of _Firebase / Firestore_. + +Much of the code was pre-written. The task was to add functionality to an existing codebase. + +## Functionality to Add + +1. Sync notes with _Firestore_. +2. Create note titles from a summary of the note. +3. Move modified notes to the top of the list. +4. Delete notes. + +--- + +### Firebase Config + +You will need add your own config code to `firebase.js`. + +> [!WARNING] +> If you do set up a _firestore_ database, then publish the app as a GitHub Page, anyone will be able to save notes to the database. +> If you decide to do this, make sure you rename the folder, `.XXXgithub` to `.github`. + +### Alternative Version using `localstorage` to Save Notes + +- [Markdown Notes App (Local Storage): Git Repository](https://github.com/chrisnajman/markdown-notes-app-localstorage) +- [Markdown Notes App (Local Storage): Git Page](https://chrisnajman.github.io/markdown-notes-app-localstorage/) + +## React Version + +> [!IMPORTANT] +> `react-mde` (the markdown editor) has not been updated for _React V.18_. +> Therefore, _React V.18_ has been used for this project. + +--- + +## Accessibility + +In the markdown editor, you can't tab through the toolbar buttons (apart from 'Write' and 'Preview'). +This is because `tabindex="-1"` is placed on these buttons, removing them from the tab order. + +_ChatGPT_ supplied a solution, which was to give ALL the buttons (including 'Write' and 'Preview') a `tabindex` of zero: + +```jsx + +function Editor({ currentNote, updateNote }) { + + ... + + useEffect(() => { + // Function to update tabindex of toolbar buttons + const updateTabindex = () => { + const toolbarButtons = document.querySelectorAll(".mde-header button") + toolbarButtons.forEach((button) => { + button.setAttribute("tabindex", "0") + }) + } + + // Call the function initially after the component mounts + updateTabindex() + + // Optional: observe changes to ensure tabindex stays updated + const observer = new MutationObserver(updateTabindex) + const toolbar = document.querySelector(".mde-header") + + if (toolbar) { + observer.observe(toolbar, { childList: true, subtree: true }) + } + + // Cleanup the observer on component unmount + return () => { + observer.disconnect() + } + }, []) // Empty dependency array to run only once on mount + + ... +} +``` + +On reflection, however, I have decided **not** to include the code. This is because: + +- In order to format the text, you first have to manually select it. +- Then you have to click a formatting button. +- But, if you reverse tab from the selected text to a toolbar button, the text selection disappears, so there is nothing for the button to format. + +**Conclusion**: the toolbar formatting buttons are inherently inaccessible to keyboard navigation. (But you can still write and preview markdown code.) + +--- + +## Testing + +Tested on Windows 10 with: + +- Chrome +- Firefox +- Microsoft Edge + +Page tested in both browser and device views. diff --git a/components/BtnTheme.jsx b/components/BtnTheme.jsx new file mode 100644 index 0000000..3903414 --- /dev/null +++ b/components/BtnTheme.jsx @@ -0,0 +1,50 @@ +import React, { useState, useEffect } from "react" + +function BtnTheme() { + function getStoredTheme() { + try { + const storedTheme = localStorage.getItem("theme") + return storedTheme ? JSON.parse(storedTheme) : false + } catch (error) { + console.error("Error parsing theme from localStorage:", error) + return false + } + } + + const [theme, setTheme] = useState(getStoredTheme) + + useEffect(() => { + document.documentElement.classList.toggle("lightmode", theme) + localStorage.setItem("theme", theme) + }, [theme]) + + function handleMode() { + setTheme((prevTheme) => !prevTheme) + } + return ( +
+

+ Light + + {theme ? " theme active" : " theme inactive"} + +

+ +

+ Dark + + {theme ? " theme inactive" : " theme active"} + +

+
+ ) +} + +export default BtnTheme diff --git a/components/Editor.jsx b/components/Editor.jsx new file mode 100644 index 0000000..08486be --- /dev/null +++ b/components/Editor.jsx @@ -0,0 +1,39 @@ +import React, { useState } from "react" +import PropTypes from "prop-types" +import ReactMde from "react-mde" +import "react-mde/lib/styles/css/react-mde-all.css" +import Showdown from "showdown" + +function Editor({ tempNoteText, setTempNoteText }) { + const [selectedTab, setSelectedTab] = useState("write") + + const converter = new Showdown.Converter({ + tables: true, + simplifiedAutoLink: true, + strikethrough: true, + tasklists: true, + }) + + return ( +
+ + Promise.resolve(converter.makeHtml(markdown)) + } + minEditorHeight={100} + heightUnits="vh" + /> +
+ ) +} + +Editor.propTypes = { + tempNoteText: PropTypes.string, + setTempNoteText: PropTypes.func, +} + +export default Editor diff --git a/components/Footer.jsx b/components/Footer.jsx new file mode 100644 index 0000000..b4fc999 --- /dev/null +++ b/components/Footer.jsx @@ -0,0 +1,22 @@ +import React from "react" +import PropTypes from "prop-types" + +function Footer({ gitRepo }) { + return ( + + ) +} + +Footer.propTypes = { + gitRepo: PropTypes.string, +} + +export default Footer diff --git a/components/Header.jsx b/components/Header.jsx new file mode 100644 index 0000000..639f5d0 --- /dev/null +++ b/components/Header.jsx @@ -0,0 +1,19 @@ +import React from "react" +import PropTypes from "prop-types" +import { IoLogoMarkdown } from "react-icons/io5" + +function Header({ title }) { + return ( +
+

+ {title} +

+
+ ) +} + +Header.propTypes = { + title: PropTypes.string, +} + +export default Header diff --git a/components/Sidebar.jsx b/components/Sidebar.jsx new file mode 100644 index 0000000..34d163d --- /dev/null +++ b/components/Sidebar.jsx @@ -0,0 +1,52 @@ +import PropTypes from "prop-types" +import { FaPlus, FaTrashAlt } from "react-icons/fa" +function Sidebar(props) { + const noteElements = props.notes.map((note) => ( +
  • props.setCurrentNoteId(note.id)} + > + {/* Populate note title with only first line of markdown file */} +

    {note.body.split("\n", 1)[0]}

    + +
  • + )) + + return ( +
    +
    +

    Notes

    + +
    + +
    + ) +} + +Sidebar.propTypes = { + notes: PropTypes.array, + newNote: PropTypes.func, + currentNote: PropTypes.object, + updateNote: PropTypes.func, + setCurrentNoteId: PropTypes.func, + deleteNote: PropTypes.func, +} + +export default Sidebar diff --git a/components/SkipLink.jsx b/components/SkipLink.jsx new file mode 100644 index 0000000..a409c13 --- /dev/null +++ b/components/SkipLink.jsx @@ -0,0 +1,12 @@ +import React from "react" + +export default function SkipLink() { + return ( + + Skip to main content + + ) +} diff --git a/firebase.js b/firebase.js new file mode 100644 index 0000000..0b8fe74 --- /dev/null +++ b/firebase.js @@ -0,0 +1,14 @@ +import { initializeApp } from "firebase/app" +import { getFirestore, collection } from "firebase/firestore" + +// BEGIN your firebaseConfig +const firebaseConfig = { + /* + config code + */ +} +// END your firebaseConfig + +const app = initializeApp(firebaseConfig) +export const db = getFirestore(app) +export const notesCollection = collection(db, "notes") diff --git a/index.html b/index.html new file mode 100644 index 0000000..d25d5e7 --- /dev/null +++ b/index.html @@ -0,0 +1,34 @@ + + + + + + + + + + + Markdown Notes App (Firestore) + + + + + +
    + + + + \ No newline at end of file diff --git a/index.jsx b/index.jsx new file mode 100644 index 0000000..8ea03e8 --- /dev/null +++ b/index.jsx @@ -0,0 +1,11 @@ +import React from "react" +import ReactDOM from "react-dom" + +import App from "./App" + +ReactDOM.render( + + + , + document.getElementById("root") +) diff --git a/layout/Layout.jsx b/layout/Layout.jsx new file mode 100644 index 0000000..7418008 --- /dev/null +++ b/layout/Layout.jsx @@ -0,0 +1,32 @@ +import React from "react" +import PropTypes from "prop-types" +import SkipLink from "../components/SkipLink" +import BtnTheme from "../components/BtnTheme" +import Header from "../components/Header" +import Footer from "../components/Footer" + +function Layout({ children }) { + return ( + <> + + +
    +
    +
    + {children} +
    +
    +
    + + ) +} + +Layout.propTypes = { + children: PropTypes.any, + // children: PropTypes.node, ?? +} + +export default Layout diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4d47da5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2713 @@ +{ + "name": "markdown-notes-app-firestore", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "markdown-notes-app-firestore", + "dependencies": { + "firebase": "^10.12.1", + "react": "17.0.2", + "react-dom": "17.0.2", + "react-icons": "^5.2.1", + "react-mde": "11.5.0", + "react-split": "2.0.13", + "showdown": "1.9.1", + "vite": "latest" + }, + "devDependencies": { + "@vitejs/plugin-react": "*" + } + }, + "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" + } + }, + "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, + "dependencies": { + "@babel/highlight": "^7.24.2", + "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.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", + "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.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "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, + "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" + }, + "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, + "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" + }, + "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, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.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, + "dependencies": { + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", + "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.5" + }, + "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.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "dev": true, + "engines": { + "node": ">=6.9.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/@babel/helpers": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.5.tgz", + "integrity": "sha512-RtCJoUO2oYrYwFPtR1/jkoBEcFuI1ae9a9IMxeyAVa3a1Ap4AnxmyIKG2b2FaJKqkidw/0cxRbWN+HOs6ZWd1w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@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.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.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" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "cpu": [ + "loong64" + ], + "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" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "cpu": [ + "x64" + ], + "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" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@firebase/analytics": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.4.tgz", + "integrity": "sha512-OJEl/8Oye/k+vJ1zV/1L6eGpc1XzAj+WG2TPznJ7PszL7sOFLBXkL9IjHfOCGDGpXeO3btozy/cYUqv4zgNeHg==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/installations": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/analytics-compat": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.10.tgz", + "integrity": "sha512-ia68RcLQLLMFWrM10JfmFod7eJGwqr4/uyrtzHpTDnxGX/6gNCBTOuxdAbyWIqXI5XmcMQdz9hDijGKOHgDfPw==", + "dependencies": { + "@firebase/analytics": "0.10.4", + "@firebase/analytics-types": "0.8.2", + "@firebase/component": "0.6.7", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/analytics-types": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.2.tgz", + "integrity": "sha512-EnzNNLh+9/sJsimsA/FGqzakmrAUKLeJvjRHlg8df1f97NLUlFidk9600y0ZgWOp3CAxn6Hjtk+08tixlUOWyw==" + }, + "node_modules/@firebase/app": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.10.4.tgz", + "integrity": "sha512-oKd5cT+fDbQ22X8Am3tBOrSFdDp8n4NJDqld4uo+H/PL9F+D3ogtTeiPyDWw1lZK7FsMbmtRrPRozlmJFzSKAQ==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "idb": "7.1.1", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-check": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.4.tgz", + "integrity": "sha512-2tjRDaxcM5G7BEpytiDcIl+NovV99q8yEqRMKDbn4J4i/XjjuThuB4S+4PkmTnZiCbdLXQiBhkVxNlUDcfog5Q==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/app-check-compat": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.11.tgz", + "integrity": "sha512-t01zaH3RJpKEey0nGduz3Is+uSz7Sj4U5nwOV6lWb+86s5xtxpIvBJzu/lKxJfYyfZ29eJwpdjEgT1/lm4iQyA==", + "dependencies": { + "@firebase/app-check": "0.8.4", + "@firebase/app-check-types": "0.5.2", + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.2.tgz", + "integrity": "sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==" + }, + "node_modules/@firebase/app-check-types": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.2.tgz", + "integrity": "sha512-FSOEzTzL5bLUbD2co3Zut46iyPWML6xc4x+78TeaXMSuJap5QObfb+rVvZJtla3asN4RwU7elaQaduP+HFizDA==" + }, + "node_modules/@firebase/app-compat": { + "version": "0.2.34", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.34.tgz", + "integrity": "sha512-enteBla1gBYObauvsC9bRRoqHZnOW48ahYABZ+l+FEiWil1rw0gVihl8D4eLqtQp/ci8+fbOBf3ZL19uFq/OCw==", + "dependencies": { + "@firebase/app": "0.10.4", + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-types": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.2.tgz", + "integrity": "sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==" + }, + "node_modules/@firebase/auth-compat": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.8.tgz", + "integrity": "sha512-qUgmv/mcth9wHPTOCKgAOeHe5c+BIOJVcbX2RfcjlXO3xnd8nRafwEkZKBNJUjy4oihYhqFMEMnTHLhwLJwLig==", + "dependencies": { + "@firebase/auth": "1.7.3", + "@firebase/auth-types": "0.12.2", + "@firebase/component": "0.6.7", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0", + "undici": "5.28.4" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/auth-compat/node_modules/@firebase/auth": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.7.3.tgz", + "integrity": "sha512-RiU1PjziOxLuyswtYtLK2qSjHIQJQGCk1h986SUFRbMQfzLXbQg8ZgXwxac1UAfDOzgzqPNCXhBuIlSK2UomoQ==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0", + "undici": "5.28.4" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@react-native-async-storage/async-storage": "^1.18.1" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.3.tgz", + "integrity": "sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==" + }, + "node_modules/@firebase/auth-types": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.2.tgz", + "integrity": "sha512-qsEBaRMoGvHO10unlDJhaKSuPn4pyoTtlQuP1ghZfzB6rNQPuhp/N/DcFZxm9i4v0SogjCbf9reWupwIvfmH6w==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/component": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.7.tgz", + "integrity": "sha512-baH1AA5zxfaz4O8w0vDwETByrKTQqB5CDjRls79Sa4eAGAoERw4Tnung7XbMl3jbJ4B/dmmtsMrdki0KikwDYA==", + "dependencies": { + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.5.tgz", + "integrity": "sha512-cAfwBqMQuW6HbhwI3Cb/gDqZg7aR0OmaJ85WUxlnoYW2Tm4eR0hFl5FEijI3/gYPUiUcUPQvTkGV222VkT7KPw==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.2", + "@firebase/auth-interop-types": "0.2.3", + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.5.tgz", + "integrity": "sha512-NDSMaDjQ+TZEMDMmzJwlTL05kh1+0Y84C+kVMaOmNOzRGRM7VHi29I6YUhCetXH+/b1Wh4ZZRyp1CuWkd8s6hg==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/database": "1.0.5", + "@firebase/database-types": "1.0.3", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.3.tgz", + "integrity": "sha512-39V/Riv2R3O/aUjYKh0xypj7NTNXNAK1bcgY5Kx+hdQPRS/aPTS8/5c0CGFYKgVuFbYlnlnhrCTYsh2uNhGwzA==", + "dependencies": { + "@firebase/app-types": "0.9.2", + "@firebase/util": "1.9.6" + } + }, + "node_modules/@firebase/firestore": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.6.3.tgz", + "integrity": "sha512-d/+N2iUsiJ/Dc7fApdpdmmTXzwuTCromsdA1lKwYfZtMIOd1fI881NSLwK2wV4I38wkLnvfKJUV6WpU1f3/ONg==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "@firebase/webchannel-wrapper": "1.0.0", + "@grpc/grpc-js": "~1.9.0", + "@grpc/proto-loader": "^0.7.8", + "tslib": "^2.1.0", + "undici": "5.28.4" + }, + "engines": { + "node": ">=10.10.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/firestore-compat": { + "version": "0.3.32", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.32.tgz", + "integrity": "sha512-at71mwK7a/mUXH0OgyY0+gUzedm/EUydDFYSFsBoO8DYowZ23Mgd6P4Rzq/Ll3zI/3xJN7LGe7Qp4iE/V/3Arg==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/firestore": "4.6.3", + "@firebase/firestore-types": "3.0.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/firestore-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.2.tgz", + "integrity": "sha512-wp1A+t5rI2Qc/2q7r2ZpjUXkRVPtGMd6zCLsiWurjsQpqPgFin3AhNibKcIzoF2rnToNa/XYtyWXuifjOOwDgg==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/functions": { + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.5.tgz", + "integrity": "sha512-qrHJ+l62mZiU5UZiVi84t/iLXZlhRuSvBQsa2qvNLgPsEWR7wdpWhRmVdB7AU8ndkSHJjGlMICqrVnz47sgU7Q==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.2", + "@firebase/auth-interop-types": "0.2.3", + "@firebase/component": "0.6.7", + "@firebase/messaging-interop-types": "0.2.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0", + "undici": "5.28.4" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/functions-compat": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.11.tgz", + "integrity": "sha512-Qn+ts/M6Lj2/6i1cp5V5TRR+Hi9kyXyHbo+w9GguINJ87zxrCe6ulx3TI5AGQkoQa8YFHUhT3DMGmLFiJjWTSQ==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/functions": "0.11.5", + "@firebase/functions-types": "0.6.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/functions-types": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.2.tgz", + "integrity": "sha512-0KiJ9lZ28nS2iJJvimpY4nNccV21rkQyor5Iheu/nq8aKXJqtJdeSlZDspjPSBBiHRzo7/GMUttegnsEITqR+w==" + }, + "node_modules/@firebase/installations": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.7.tgz", + "integrity": "sha512-i6iGoXRu5mX4rTsiMSSKrgh9pSEzD4hwBEzRh5kEhOTr8xN/wvQcCPZDSMVYKwM2XyCPBLVq0JzjyerwL0Rihg==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/util": "1.9.6", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/installations-compat": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.7.tgz", + "integrity": "sha512-RPcbD+3nqHbnhVjIOpWK2H5qzZ8pAAAScceiWph0VNTqpKyPQ5tDcp4V5fS0ELpfgsHYvroMLDKfeHxpfvm8cw==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/installations": "0.6.7", + "@firebase/installations-types": "0.5.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/installations-types": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.2.tgz", + "integrity": "sha512-que84TqGRZJpJKHBlF2pkvc1YcXrtEDOVGiDjovP/a3s6W4nlbohGXEsBJo0JCeeg/UG9A+DEZVDUV9GpklUzA==", + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/logger": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", + "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/messaging": { + "version": "0.12.9", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.9.tgz", + "integrity": "sha512-IH+JJmzbFGZXV3+TDyKdqqKPVfKRqBBg2BfYYOy7cm7J+SwV+uJMe8EnDKYeQLEQhtpwciPfJ3qQXJs2lbxDTw==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/installations": "0.6.7", + "@firebase/messaging-interop-types": "0.2.2", + "@firebase/util": "1.9.6", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/messaging-compat": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.9.tgz", + "integrity": "sha512-5jN6wyhwPgBH02zOtmmoOeyfsmoD7ty48D1m0vVPsFg55RqN2Z3Q9gkZ5GmPklFPjTPLcxB1ObcHOZvThTkm7g==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/messaging": "0.12.9", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/messaging-interop-types": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.2.tgz", + "integrity": "sha512-l68HXbuD2PPzDUOFb3aG+nZj5KA3INcPwlocwLZOzPp9rFM9yeuI9YLl6DQfguTX5eAGxO0doTR+rDLDvQb5tA==" + }, + "node_modules/@firebase/performance": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.7.tgz", + "integrity": "sha512-d+Q4ltjdJZqjzcdms5i0UC9KLYX7vKGcygZ+7zHA/Xk+bAbMD2CPU0nWTnlNFWifZWIcXZ/2mAMvaGMW3lypUA==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/installations": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/performance-compat": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.7.tgz", + "integrity": "sha512-cb8ge/5iTstxfIGW+iiY+7l3FtN8gobNh9JSQNZgLC9xmcfBYWEs8IeEWMI6S8T+At0oHc3lv+b2kpRMUWr8zQ==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/performance": "0.6.7", + "@firebase/performance-types": "0.2.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/performance-types": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.2.tgz", + "integrity": "sha512-gVq0/lAClVH5STrIdKnHnCo2UcPLjJlDUoEB/tB4KM+hAeHUxWKnpT0nemUPvxZ5nbdY/pybeyMe8Cs29gEcHA==" + }, + "node_modules/@firebase/remote-config": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.7.tgz", + "integrity": "sha512-5oPNrPFLsbsjpq0lUEIXoDF2eJK7vAbyXe/DEuZQxnwJlfR7aQbtUlEkRgQWcicXpyDmAmDLo7q7lDbCYa6CpA==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/installations": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/remote-config-compat": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.7.tgz", + "integrity": "sha512-Fq0oneQ4SluLnfr5/HfzRS1TZf1ANj1rWbCCW3+oC98An3nE+sCdp+FSuHsEVNwgMg4Tkwx9Oom2lkKeU+Vn+w==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/remote-config": "0.4.7", + "@firebase/remote-config-types": "0.3.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/remote-config-types": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.2.tgz", + "integrity": "sha512-0BC4+Ud7y2aPTyhXJTMTFfrGGLqdYXrUB9sJVAB8NiqJswDTc4/2qrE/yfUbnQJhbSi6ZaTTBKyG3n1nplssaA==" + }, + "node_modules/@firebase/storage": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.5.tgz", + "integrity": "sha512-nGWBOGFNr10j0LA4NJ3/Yh3us/lb0Q1xSIKZ38N6FcS+vY54nqJ7k3zE3PENregHC8+8txRow++A568G3v8hOA==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0", + "undici": "5.28.4" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/storage-compat": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.8.tgz", + "integrity": "sha512-qDfY9kMb6Ch2hZb40sBjDQ8YPxbjGOxuT+gU1Z0iIVSSpSX0f4YpGJCypUXiA0T11n6InCXB+T/Dknh2yxVTkg==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/storage": "0.12.5", + "@firebase/storage-types": "0.8.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/storage-types": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.2.tgz", + "integrity": "sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/util": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.6.tgz", + "integrity": "sha512-IBr1MZbp4d5MjBCXL3TW1dK/PDXX4yOGbiwRNh1oAbE/+ci5Uuvy9KIrsFYY80as1I0iOaD5oOMA9Q8j4TJWcw==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/vertexai-preview": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@firebase/vertexai-preview/-/vertexai-preview-0.0.1.tgz", + "integrity": "sha512-N8m9Xr0YZKy0t9SpQDuHrL2ppEAT/iqf88Y/O00QNA/Td/BMCL8sJ0c+Savh1TVrqh0rNp9n6HkZ39e/O5mwhA==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.2", + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/webchannel-wrapper": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.0.tgz", + "integrity": "sha512-zuWxyfXNbsKbm96HhXzainONPFqRcoZblQ++e9cAIGUuHfl2cFSBzW01jtesqWG/lqaUyX3H8O1y9oWboGNQBA==" + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.14", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.14.tgz", + "integrity": "sha512-nOpuzZ2G3IuMFN+UPPpKrC6NsLmWsTqSsm66IRfnBt1D4pwTqE27lmbpcPM+l2Ua4gE7PfjRHI6uedAy7hoXUw==", + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/proto-loader/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@grpc/proto-loader/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@grpc/proto-loader/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@grpc/proto-loader/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==" + }, + "node_modules/@grpc/proto-loader/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/@grpc/proto-loader/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@grpc/proto-loader/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@grpc/proto-loader/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@grpc/proto-loader/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@grpc/proto-loader/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "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==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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, + "engines": { + "node": ">=6.0.0" + } + }, + "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, + "engines": { + "node": ">=6.0.0" + } + }, + "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/@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/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "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==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.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==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "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==" + }, + "node_modules/@types/node": { + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.0.tgz", + "integrity": "sha512-KcEbMsn4Dpk+LIbHMj7gDPRKaTMStxxWRkRmxsg/jVdFdJCZWt1SchZcf0M4t8lIKdwwMsEyzhrcOXRrDPtOBw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.24.5", + "@babel/plugin-transform-react-jsx-self": "^7.24.5", + "@babel/plugin-transform-react-jsx-source": "^7.24.1", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "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==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "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": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001621", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001621.tgz", + "integrity": "sha512-+NLXZiviFFKX0fk8Piwv3PfLPGtRqJeq2TiNoUff/qB5KJgwecJTvCXDpmlyP/eCI/GUEmp/h/y5j0yckiiZrA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "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==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "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==" + }, + "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 + }, + "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, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.779", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.779.tgz", + "integrity": "sha512-oaTiIcszNfySXVJzKcjxd2YjPxziAd+GmXyb2HbidCeFo6Z88ygOT7EimlrEQhM2U08VhSrbKhLOXP0kKUCZ6g==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "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==", + "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, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/firebase": { + "version": "10.12.1", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.12.1.tgz", + "integrity": "sha512-B/R3BX26OAgreA64JN0lYspYRHMS36E19/Sv9WsyQu1RqPGBzWkBlt1RW6+38SdtMDlAnk3ibKL/SRSQHb1xRw==", + "dependencies": { + "@firebase/analytics": "0.10.4", + "@firebase/analytics-compat": "0.2.10", + "@firebase/app": "0.10.4", + "@firebase/app-check": "0.8.4", + "@firebase/app-check-compat": "0.3.11", + "@firebase/app-compat": "0.2.34", + "@firebase/app-types": "0.9.2", + "@firebase/auth": "1.7.3", + "@firebase/auth-compat": "0.5.8", + "@firebase/database": "1.0.5", + "@firebase/database-compat": "1.0.5", + "@firebase/firestore": "4.6.3", + "@firebase/firestore-compat": "0.3.32", + "@firebase/functions": "0.11.5", + "@firebase/functions-compat": "0.3.11", + "@firebase/installations": "0.6.7", + "@firebase/installations-compat": "0.2.7", + "@firebase/messaging": "0.12.9", + "@firebase/messaging-compat": "0.2.9", + "@firebase/performance": "0.6.7", + "@firebase/performance-compat": "0.2.7", + "@firebase/remote-config": "0.4.7", + "@firebase/remote-config-compat": "0.2.7", + "@firebase/storage": "0.12.5", + "@firebase/storage-compat": "0.3.8", + "@firebase/util": "1.9.6", + "@firebase/vertexai-preview": "0.0.1" + } + }, + "node_modules/firebase/node_modules/@firebase/auth": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.7.3.tgz", + "integrity": "sha512-RiU1PjziOxLuyswtYtLK2qSjHIQJQGCk1h986SUFRbMQfzLXbQg8ZgXwxac1UAfDOzgzqPNCXhBuIlSK2UomoQ==", + "dependencies": { + "@firebase/component": "0.6.7", + "@firebase/logger": "0.4.2", + "@firebase/util": "1.9.6", + "tslib": "^2.1.0", + "undici": "5.28.4" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@react-native-async-storage/async-storage": "^1.18.1" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": 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==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=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==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "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==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "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==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "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 + }, + "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/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/protobufjs": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", + "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-icons": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.2.1.tgz", + "integrity": "sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw==", + "peerDependencies": { + "react": "*" + } + }, + "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==" + }, + "node_modules/react-mde": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/react-mde/-/react-mde-11.5.0.tgz", + "integrity": "sha512-CH/VK6d+tpVjJ8rTXfh1dDt6GWedTgCU0668p8toqhAc3vy0Lu872O2RKYDSpkUrlbHI08fjUPTl++nExp6gag==", + "peerDependencies": { + "react": "^17.0.0", + "react-dom": "^17.0.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-split": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/react-split/-/react-split-2.0.13.tgz", + "integrity": "sha512-suq/UH4epMu2aF4NBh+imlpUvntsIvU3li9EBBLdxqNtYEg+nY7TGl8Ij65mD1qYyhs3dQhA1Pv3rLXd1s5/lQ==", + "dependencies": { + "prop-types": "^15.5.7", + "split.js": "^1.6.0" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/rollup": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", + "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.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "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, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/showdown": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/showdown/-/showdown-1.9.1.tgz", + "integrity": "sha512-9cGuS382HcvExtf5AHk7Cb4pAeQQ+h0eTr33V1mu+crYWV4KvWAw6el92bDrqGEk5d46Ai/fhbEUwqJ/mTCNEA==", + "dependencies": { + "yargs": "^14.2" + }, + "bin": { + "showdown": "bin/showdown.js" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split.js": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz", + "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw==" + }, + "node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/update-browserslist-db": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "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.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", + "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", + "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/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" + }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "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/yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dependencies": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + } + }, + "node_modules/yargs-parser": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz", + "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..ffc6f78 --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "markdown-notes-app-firestore", + "homepage": "https://chrisnajman.github.io/markdown-notes-app-firestore/", + "type": "module", + "scripts": { + "start": "vite", + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "firebase": "^10.12.1", + "react": "17.0.2", + "react-dom": "17.0.2", + "react-icons": "^5.2.1", + "react-mde": "11.5.0", + "react-split": "2.0.13", + "showdown": "1.9.1", + "vite": "latest" + }, + "devDependencies": { + "@vitejs/plugin-react": "*" + } +} diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..ae82fed --- /dev/null +++ b/public/404.html @@ -0,0 +1,30 @@ + + + + + + React Router + + + + + + \ No newline at end of file diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..4e67cd412e6412389831923c18f55f2e835dbfe0 GIT binary patch literal 5136 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 literal 0 HcmV?d00001 diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..839085a8f876e8878e4ccdb2bafefaed5cfb256b GIT binary patch literal 16993 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 HI9~f7qq;AW literal 0 HcmV?d00001 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..153d38cce1c8459da546a3aacb0d80577e1ff384 GIT binary patch literal 5074 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 literal 0 HcmV?d00001 diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..84ecfe25c0bd5881bb0e1f615539577b11d27ce5 GIT binary patch literal 336 zcmV-W0k8gvP)Px$3Q0skR5(wilQC|DFc3w*MH50}gv2dqIY4R-0TmQ*2E-YlfC}yq+PwfZr$9oY zVNnY3YP@o?5i|>K>>1f_{QuZY2=Rdng9#xRfHM#Q;D>R}zo%*XI&%rrG;dUW2Jm?X z0O0-$NYhj@ilV?cj<75XaU9EBmSu8QdsO@nAOuMQs;WX1MJUS>VHnCBV^jy&woR^8 zdPx%3Q0skR9HvdS52=WK@>d|GD9R1?FS68!@_3Fh=jF-H4(!0{R$udVP;K;Kfs0^ ziO93Ez)pDknU+Wllb~L1<;lFJz1NG^-7mS{B)~Z(=s!!PQs{I#3STmrM7!Nq_!v{3=+o(h*S^dCm*8s! zE(t6a3j~8f?Du;SW3$;XolfEN`HUezD5X*f)oN7$QoCF(U*)WB3J}t6w?iNh5TLW! z40gNSSOSE0-gC+cHPclAEj8l*B~Yu?P%IV|BB=RDfkvZ&TrT&fV9jO|`F#F7=KW*n za5yj?j}=K64u`SbZm*7^)9J)yGJ)6YRVA@pE)fcau-R<16QGs({eD4$jKJsfIbGqZ zbs!RnU@#cKYPBl*4~GL{u^2|9(QE(v3Y?RxP$-DNdc7{bw+P&-6;wMamCB_u+6i1n zzD2-dv7q1YBN~m0u;Flscs!2d@n{SILh*P!A|J?T-&d=ZT3+a*z!@o<&5CBL)w*>u z?(jO+QuRJ?%pE8oNz$V%%i#}PmFB4ko2Ap~@4a5{hiSj%FGa+mLha e(rIy;rhNwJBn(4sL$@{n0000);mrcY=yeW7T6ayLvfe4<|lY;&S-V_mhpnLJC z@gk8J5=}ONfS`DC%|MKxtRmUDfp%F4F;vE}7uhFm1b4-5>5Dlh9c!u03o=eeB7QE6;!WY^c%oR2>!gGV;P^bH}Y zAn-muK60+8+vz_%Jh1-$eui8mA@4+gdU~422f0X2^u<^e7Z-DV zkjVTkEG%55J|?t&NI#+VOZ`nK;W-l^`hp10CsiVxg>I4x*Z+x6@y{kIN+My*vk~L2 zuCC8%zW+hR_sJyq?CI%wT~t)`8~K%=y-6#R@3(rNljhUXR}u5He|-+nyfh_Cyo@-R zgs5UCNArt;?Aml*Sp1#Xg|0POeFOplc5!jR31w^hbNbKB%w$_zTLwgw!Lz~Oxc_~9 zeGDXQ7{>L2;3LQHxix_&%jjiC{u>$^*wxh)CzPRUO~Q6_b2GcYzqdAX9@>PQQ~%iS z?d|Ou_E47hfT98R3JMC?;o+fRh2?02jD#U-|KUG~K$oI#yp_A5~7W zqr^|Y54K6tRr;}2BxWRCoL{c5ue0s#ZR=TPB)yctk2CP$;bDHyetUb%%UM}jk#LK) zl)&HA)MPqe#(8o}ON+o5DR&)zZf-8y+1X+8xfsg3ySw~6J<^<`wuJEG+mMlw5mr@I zWr~s0`HwTl$;nBTIKz3od`4;0m$>m`eojnGFw9qAkmsukknBGrBZJ?8ou8kp#M$NL zC6`g$5g}%A;~yLxWOsLW+&6NJgTSW(B-)YF-i7V&@0;e0RS)wBGPSj}hHcpfm4igK z`vsWG2t&MDPbEM z8!QwG3G+NhtiZ3VtTgfE3jAU&3=Iv1>C1A~GJK7Wj@sQd#*BYvX2$fblI#oLFfA-B z$ShMC`02ePZ0t-zipts98P|mkiDJgDFz<*h`IRv!$3i79@zeMnMgB=hid#y=AKwv7 zO--@W(^E&iP~n$(ikj`Nk_>od7;Kx|6tgINZ7nt(%^Z7lzYA&E(Le`qAbgXhV z^&s(Ln*Ug{bY5qR1^knf6Xg)t_~&+#i646r)qW8Cxw*NNz^{4-$M+JdID%hYUCmUw zD!o|cB|AYX+s+?JCL&&!<= 360px) { + flex-direction: row; + } + gap: 1.5rem; + line-height: 1; + align-items: center; + justify-content: center; + font-weight: normal; + font-size: clamp(2rem, 1.6348rem + 2.087vw, 3.2rem); + + & svg { + width: inherit; + } +} + +button { + all: unset; + cursor: pointer; + + &:hover { + opacity: 0.8; + } +} + +.theme-toggler { + position: absolute; + top: 0; + right: 0; + display: flex; + align-items: center; + gap: 1rem; + padding: 0.5rem 1rem; + + & button { + font-size: clamp(1.4rem, 1.3391rem + 0.3478vw, 1.6rem); + font-family: inherit; + background-color: #405cf5; + color: white; + width: 2.5rem; + height: 1.3rem; + border-radius: 2rem; + display: flex; + justify-content: flex-end; + align-items: center; + padding: 2px; + + & span { + height: 1.3rem; + width: 1.3rem; + background-color: white; + border-radius: 50%; + } + } + + & p { + font-size: 1.4rem; + font-weight: 600; + color: currentColor; + + &.light { + opacity: 0.75; + } + + &.dark { + opacity: 1; + } + } +} + +.lightmode { + & .theme-toggler button { + justify-content: flex-start; + } + + & p { + &.light { + opacity: 1; + } + + &.dark { + opacity: 0.5; + } + } +} + +.page-container { + display: grid; + grid-template-rows: auto 1fr auto; + height: 100dvh; + height: 100vh; +} + +.page-header, +.page-footer { + padding: 4rem 2rem; +} + +.page-header, +.page-footer { + text-align: center; + + border-style: solid; + border-color: var(--fg); +} + +.page-header { + border-width: 0 0 2px 0; +} + +.page-footer { + border-width: 2px 0 0 0; +} + +.page-footer { + & a { + color: var(--fg); + text-decoration: none; + + &:hover { + text-decoration: underline; + } + + &::after { + content: " \27F6"; + } + } +} + +.skip-link { + color: var(--body-txt); + text-decoration: none; + font-weight: 600; + padding: 0.5rem 1rem; + + &::after { + content: " \2193"; + } +} + +/** + MARKDOWN APP STYLES + */ +.ql-editor p, +.ql-editor.ql-blank::before { + font-size: 1.3em; + font-weight: 100; +} + +.pane { + overflow-y: auto; +} + +.sidebar { + width: 20%; + height: 100vh; +} + +.sidebar--header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem; +} + +.sidebar--items { + padding-left: 0; + list-style: none; +} + +.new-note { + font-weight: 600; + font-size: clamp(1.4rem, 1.3391rem + 0.3478vw, 1.6rem); + font-family: inherit; + background-color: #405cf5; + color: white; + border-radius: 3px; + height: 3rem; + width: 3rem; + display: grid; + place-items: center; + border: none; +} + +.first-note { + background-color: #405cf5; + border: none; + color: white; + border-radius: 3px; + padding: 1rem; +} + +.editor { + width: 80%; + height: 100vh; +} + +.title { + overflow: hidden; + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + padding-inline-end: 0.5rem; +} + +.title--delete { + display: none; + cursor: pointer; + background-color: transparent; + border: none; +} + +.title:hover .title--delete { + display: block; +} + +.note-summary:not(:last-of-type) { + border-bottom: 1px solid lightgray; +} + +.text-snippet { + padding: 1rem; + font-weight: 400; + line-height: 1.2rem; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-size: clamp(1.4rem, 1.3391rem + 0.3478vw, 1.6rem); + font-family: inherit; +} + +.selected-note { + background-color: var(--note-selected-bg); + color: var(--bg); +} + +/** gutter **/ + +.gutter { + background-color: #eee; + + background-repeat: no-repeat; + background-position: 50%; +} + +.gutter.gutter-horizontal { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg=="); +} + +.gutter.gutter-horizontal:hover { + cursor: col-resize; +} + +.split { + display: flex; +} + +.no-notes { + width: 100%; + height: 100vh; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + & h2 { + margin-bottom: 1rem; + color: var(--fg); + } +} + +/* Editor */ +.mde-preview .mde-preview-content pre, +.react-mde-tabbed-layout, +.mde-header, +.mde-header * { + background: var(--bg) !important; +} + +.mde-header * { + color: var(--fg); +} +.mde-header .mde-tabs button { + padding: 0.5rem 1rem; +} + +.mde-text { + font-size: inherit; + font-family: inherit; + background-color: var(--bg); + color: var(--fg); + &:focus-visible { + outline-offset: -1px; + } +} + +/** Helpers **/ +.element-invisible { + clip: rect(1px, 1px, 1px, 1px); + height: 1px; + overflow: hidden; + position: absolute; + top: 0; + left: 0; + z-index: 200; + &.element-focusable:active, + &.element-focusable:focus { + clip: auto; + height: auto; + overflow: visible; + } +} + +/* Screenreader only */ +.visually-hidden { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip-path: inset(0); + border: 0; +} + +/* Remove all animations, transitions and smooth scroll for people that prefer not to see them */ +@media (prefers-reduced-motion: reduce) { + html, + html:focus-within { + scroll-behavior: auto; + } + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; + transition-delay: 0ms !important; + } +} + +.warning { + color: var(--clr-warning); + font-weight: 600; +} +/* Always comes last **/ +.hide { + display: none; +} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..5696869 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from "vite" +import react from "@vitejs/plugin-react" + +export default defineConfig({ + plugins: [react()], + base: "/markdown-notes-app-firestore/", +})