diff --git a/examples/nextjs-scheduler/fileInfo.ts b/examples/nextjs-scheduler/fileInfo.ts new file mode 100644 index 0000000..7b1b8ad --- /dev/null +++ b/examples/nextjs-scheduler/fileInfo.ts @@ -0,0 +1,2 @@ +import { DirectoryInfo } from '@/utils/exampleFileUtils'; + export const FILE_INFO: DirectoryInfo = {"isFile":false,"name":"nextjs-scheduler","path":"/","children":[{"isFile":false,"name":"app","path":"/app","children":[{"isFile":false,"name":"utils","path":"/app/utils","children":[{"isFile":true,"isOpen":false,"language":"typescript","name":"handlePeers.ts","path":"/app/utils/handlePeers.ts","content":"import { Indexable } from 'yorkie-js-sdk';\n\nconst randomPeers = [\n 'Alice',\n 'Bob',\n 'Carol',\n 'Chuck',\n 'Dave',\n 'Erin',\n 'Frank',\n 'Grace',\n 'Ivan',\n 'Justin',\n 'Matilda',\n 'Oscar',\n 'Steve',\n 'Victor',\n 'Zoe',\n];\n\n/**\n * display each peer's name\n */\nexport function displayPeers(\n peers: Array<{ clientID: string; presence: Indexable }>,\n) {\n const users = [];\n for (const { presence } of peers) {\n users.push(presence.userName);\n }\n\n return users;\n}\n\n/**\n * create random name of anonymous peer\n */\nexport function createRandomPeers() {\n const index = Math.floor(Math.random() * randomPeers.length);\n\n return randomPeers[index];\n}\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"parseDate.ts","path":"/app/utils/parseDate.ts","content":"/**\n * transform date format to DD-MM-YYYY\n */\nexport function parseDate(date: Date) {\n let [month, day, year] = date.toLocaleDateString('en').split('/');\n\n month = Number(month) > 9 ? month : '0' + month;\n day = Number(day) > 9 ? day : '0' + day;\n year = year.slice(2);\n\n return `${day}-${month}-${year}`;\n}\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"types.ts","path":"/app/utils/types.ts","content":"export interface ENVtypes {\n url: string;\n apiKey: string;\n}\n\nexport interface ContentTypes {\n date: string;\n text: string;\n}\n\nexport interface EditorPropsTypes {\n content: Array;\n actions: { [name: string]: any };\n}\n\nexport type ChangeEventHandler = (\n event: React.ChangeEvent,\n) => void;\n\ntype ValuePiece = Date | any;\n\nexport type CalendarValue = ValuePiece | [ValuePiece, ValuePiece];\n"}]},{"isFile":false,"name":"styles","path":"/app/styles","children":[{"isFile":true,"isOpen":false,"language":"css","name":"calendar.css","path":"/app/styles/calendar.css","content":"/* custom css code */\n\n.react-calendar {\n width: 350px;\n max-width: 100%;\n background: white;\n border: 1px solid #a0a096;\n font-family: Arial, Helvetica, sans-serif;\n line-height: 1.125em;\n}\n\n.react-calendar--doubleView {\n width: 700px;\n}\n\n.react-calendar--doubleView .react-calendar__viewContainer {\n display: flex;\n margin: -0.5em;\n}\n\n.react-calendar--doubleView .react-calendar__viewContainer > * {\n width: 50%;\n margin: 0.5em;\n}\n\n.react-calendar,\n.react-calendar *,\n.react-calendar *:before,\n.react-calendar *:after {\n -moz-box-sizing: border-box;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n}\n\n.react-calendar button {\n margin: 0;\n border: 0;\n outline: none;\n}\n\n.react-calendar button:enabled:hover {\n cursor: pointer;\n}\n\n.react-calendar__navigation {\n display: flex;\n height: 44px;\n margin-bottom: 1em;\n}\n\n.react-calendar__navigation button {\n min-width: 44px;\n background: none;\n}\n\n.react-calendar__navigation button:disabled {\n background-color: #f0f0f0;\n}\n\n.react-calendar__navigation button:enabled:hover,\n.react-calendar__navigation button:enabled:focus {\n background-color: #e6e6e6;\n}\n\n.react-calendar__month-view__weekdays {\n text-align: center;\n text-transform: uppercase;\n font-weight: bold;\n font-size: 0.75em;\n}\n\n.react-calendar__month-view__weekdays__weekday {\n padding: 0.5em;\n}\n\n.react-calendar__month-view__weekNumbers .react-calendar__tile {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.75em;\n font-weight: bold;\n}\n\n.react-calendar__month-view__days__day--weekend {\n color: #d10000;\n}\n\n.react-calendar__month-view__days__day--neighboringMonth {\n color: #757575;\n}\n\n.react-calendar__year-view .react-calendar__tile,\n.react-calendar__decade-view .react-calendar__tile,\n.react-calendar__century-view .react-calendar__tile {\n padding: 2em 0.5em;\n}\n\n.react-calendar__tile {\n max-width: 100%;\n padding: 10px 6.6667px;\n background: none;\n text-align: center;\n line-height: 16px;\n}\n\n.react-calendar__tile:disabled {\n background-color: #f0f0f0;\n}\n\n.react-calendar__tile:enabled:hover,\n.react-calendar__tile:enabled:focus {\n background-color: #e6e6e6;\n}\n\n.react-calendar__tile--now {\n background: #ffff76;\n}\n\n.react-calendar__tile--now:enabled:hover,\n.react-calendar__tile--now:enabled:focus {\n background: #ffffa9;\n}\n\n.react-calendar__tile--hasActive {\n background: #76baff;\n}\n\n.react-calendar__tile--hasActive:enabled:hover,\n.react-calendar__tile--hasActive:enabled:focus {\n background: #a9d4ff;\n}\n\n.react-calendar__tile--active {\n background: #006edc;\n color: white;\n}\n\n.highlight {\n background-color: #00887a;\n color: #f0f3f5;\n}\n\n.react-calendar__tile--active:enabled:hover,\n.react-calendar__tile--active:enabled:focus {\n background: #1087ff;\n}\n\n.react-calendar--selectRange .react-calendar__tile--hover {\n background-color: #e6e6e6;\n}\n"},{"isFile":true,"isOpen":false,"language":"css","name":"globals.css","path":"/app/styles/globals.css","content":"body {\n display: flex;\n padding: 5rem;\n justify-content: center;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Oxygen\",\n \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\",\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n font-size: 17px;\n color: #2f2f2f;\n}\n\ninput {\n width: 22rem;\n height: 3.5rem;\n outline: none;\n margin-left: 1rem;\n border: none;\n font-size: 20px;\n}\n\ntextarea {\n resize: none;\n outline: none;\n font-size: 17px;\n}\n\n.button {\n font-size: 17px;\n cursor: pointer;\n border: none;\n padding: 1rem 2rem 1rem 2rem;\n color: #f0f3f5;\n background-color: #00887a;\n}\n.button:hover {\n background-color: #00557a;\n}\n"},{"isFile":true,"isOpen":false,"language":"css","name":"page.module.css","path":"/app/styles/page.module.css","content":".main {\n width: 340px;\n}\n\n.textArea {\n width: 100%;\n height: 8rem;\n}\n\n.memo {\n width: 100%;\n min-height: 1rem;\n border-top: 1px solid #2f2f2f;\n border-bottom: 1px solid #2f2f2f;\n word-wrap: break-word;\n}\n\n.inputForm_editor {\n margin-top: 3rem;\n}\n"}]},{"isFile":true,"isOpen":false,"language":"tsx","name":"Scheduler.tsx","path":"/app/Scheduler.tsx","content":"'use client';\n\nimport React, { useState } from 'react';\nimport './styles/calendar.css';\nimport styles from './styles/page.module.css';\n\nimport { EditorPropsTypes, CalendarValue } from './utils/types';\nimport { parseDate } from './utils/parseDate';\nimport Calendar from 'react-calendar';\n\n/**\n * handle calendar component\n */\nexport default function Scheduler(props: EditorPropsTypes) {\n const { content, actions } = props;\n const [date, onChange] = useState(new Date());\n const [text, setText] = useState('Enter text here!');\n\n const currentDate = date ? parseDate(new Date(date.toString())) : '';\n\n const eventHandler = (event: string) => {\n let flag = false;\n switch (event) {\n case 'PUSH':\n flag = false;\n content.forEach((item) => {\n if (item.date === currentDate) {\n flag = !flag;\n return 0;\n }\n });\n\n flag\n ? actions.updateContent(currentDate, text)\n : actions.addContent(currentDate, text);\n\n setText('Enter text here!');\n break;\n case 'DELETE':\n actions.deleteContent(currentDate);\n break;\n }\n };\n\n return (\n
\n
\n \n date.toLocaleString('en', { day: 'numeric' })\n }\n tileClassName={({ date }) =>\n content.find((item) => item.date === parseDate(date))\n ? 'highlight'\n : ''\n }\n />\n

selected day : {currentDate}

\n
\n {content.map((item, i: number) => {\n if (item.date === currentDate) {\n return

{item.text}

;\n }\n })}\n
\n
\n

input form

\n ) =>\n setText(e.target.value)\n }\n />\n
\n \n \n
\n
\n );\n}\n"},{"isFile":true,"isOpen":false,"language":"ico","name":"favicon.ico","path":"/app/favicon.ico","content":""},{"isFile":true,"isOpen":false,"language":"tsx","name":"layout.tsx","path":"/app/layout.tsx","content":"import './styles/globals.css';\nimport type { Metadata } from 'next';\n\nexport const metadata: Metadata = {\n title: 'Next.js react-calendar example',\n description: 'example of yorkie-js-sdk with next.js & react-calendar',\n icons: {\n icon: './favicon.ico',\n },\n};\n\n/**\n * default root layout of service\n */\nexport default function RootLayout({\n children,\n}: {\n children: React.ReactNode;\n}) {\n return (\n \n {children}\n \n );\n}\n"},{"isFile":true,"isOpen":false,"language":"tsx","name":"not-found.tsx","path":"/app/not-found.tsx","content":"/**\n * 404-not found\n */\nexport default function notFound() {\n return

404 not found

;\n}\n"},{"isFile":true,"isOpen":false,"language":"tsx","name":"page.tsx","path":"/app/page.tsx","content":"/**\n * yorkie-js-sdk must be loaded on client-side\n */\n'use client';\n\nimport styles from './styles/page.module.css';\nimport React, { useEffect, useState } from 'react';\n\nimport { ContentTypes, ENVtypes } from './utils/types';\nimport { displayPeers, createRandomPeers } from './utils/handlePeers';\nimport { parseDate } from './utils/parseDate';\nimport yorkie, { Document, JSONArray, DocEventType } from 'yorkie-js-sdk';\nimport Scheduler from './Scheduler';\n\n// parseDate() value's format = \"DD-MM-YYYY\"\nconst defaultContent: JSONArray = [\n {\n date: parseDate(new Date()).replace(/^\\d{2}/, '01'),\n text: 'payday',\n },\n {\n date: parseDate(new Date()).replace(/^\\d{2}/, '17'),\n text: \"Garry's birthday\",\n },\n];\n\nconst ENV: ENVtypes = {\n url: process.env.NEXT_PUBLIC_YORKIE_API_ADDR!,\n apiKey: process.env.NEXT_PUBLIC_YORKIE_API_KEY!,\n};\n\nconst documentKey = `next.js-Scheduler-${parseDate(new Date())}`;\n\n/**\n * main page\n */\nexport default function Editor() {\n const [peers, setPeers] = useState>([]);\n const [content, setContent] = useState>(defaultContent);\n\n // create Yorkie Document with useState value\n const [doc] = useState }>>(\n () =>\n new yorkie.Document<{ content: JSONArray }>(documentKey),\n );\n\n const actions = {\n // push new content to Yorkie's database\n addContent(date: string, text: string) {\n doc.update((root) => {\n root.content.push({ date, text });\n });\n },\n\n // delete selected content at Yorkie's database\n deleteContent(date: string) {\n doc.update((root) => {\n let target;\n for (const item of root.content) {\n if (item.date === date) {\n target = item as any;\n break;\n }\n }\n\n if (target) {\n root.content.deleteByID!(target.getID());\n }\n });\n },\n\n // edit selected content at Yorkie's database\n updateContent(date: string, text: string) {\n doc.update((root) => {\n let target;\n for (const item of root.content) {\n if (item.date === date) {\n target = item;\n break;\n }\n }\n\n if (target) {\n target.text = text;\n }\n });\n },\n };\n\n useEffect(() => {\n // create Yorkie Client at client-side\n const client = new yorkie.Client(ENV.url, {\n apiKey: ENV.apiKey,\n });\n\n // subscribe document event of \"PresenceChanged\"(=\"peers-changed\")\n doc.subscribe('presence', (event) => {\n if (event.type !== DocEventType.PresenceChanged) {\n setPeers(displayPeers(doc.getPresences()));\n }\n });\n\n /**\n * `attachDoc` is a helper function to attach the document into the client.\n */\n async function attachDoc(\n doc: Document<{ content: JSONArray }>,\n callback: (props: any) => void,\n ) {\n // 01. activate client\n await client.activate();\n // 02. attach the document into the client with presence\n await client.attach(doc, {\n initialPresence: {\n userName: createRandomPeers(),\n },\n });\n\n // 03. create default content if not exists.\n doc.update((root) => {\n if (!root.content) {\n root.content = defaultContent;\n }\n }, 'create default content if not exists');\n\n // 04. subscribe doc's change event from local and remote.\n doc.subscribe((event) => {\n callback(doc.getRoot().content);\n });\n\n // 05. set content to the attached document.\n callback(doc.getRoot().content);\n }\n\n attachDoc(doc, (content) => setContent(content));\n }, []);\n\n return (\n
\n

\n peers : [\n {peers.map((man: string, i: number) => {\n return {man}, ;\n })}{' '}\n ]\n

\n \n
\n );\n}\n"}]},{"isFile":true,"isOpen":false,"language":"","name":".env","path":"/.env","content":"NEXT_PUBLIC_YORKIE_API_ADDR='http://localhost:8080'\nNEXT_PUBLIC_YORKIE_API_KEY=''\n"},{"isFile":true,"isOpen":false,"language":"production","name":".env.production","path":"/.env.production","content":"NEXT_PUBLIC_YORKIE_API_ADDR='https://api.yorkie.dev'\nNEXT_PUBLIC_YORKIE_API_KEY='cedaovjuioqlk4pjqn6g'\n"},{"isFile":true,"isOpen":false,"language":"javascript","name":".eslintrc.js","path":"/.eslintrc.js","content":"module.exports = {\n rules: {\n 'prettier/prettier': [\n 'error',\n {\n endOfLine: 'auto',\n },\n ],\n },\n};\n"},{"isFile":true,"isOpen":false,"language":"","name":".gitignore","path":"/.gitignore","content":"# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n\n# testing\n/coverage\n\n# next.js\n/.next/\n/out/\n\n# production\n/build\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# local env files\n.env*.local\n\n# vercel\n.vercel\n\n# typescript\n*.tsbuildinfo\nnext-env.d.ts\n"},{"isFile":true,"isOpen":false,"language":"markdown","name":"README.md","path":"/README.md","content":"# Yorkie Next.js scheduler Example\n\n

\n \n \"Live\n \n

\n\n\"Next.js\n\n## How to run demo\n\nAt project root, run below command to start Yorkie server and Envoy proxy.\n\n```bash\n$ docker-compose up -f docker/docker-compose.yml up --build -d\n```\n\nThen install dependencies and run the demo.\n\n```bash\n$ npm install\n```\n\nNow you can run the demo.\n\n```bash\n$ npm run dev\n```\n"},{"isFile":true,"isOpen":false,"language":"javascript","name":"next.config.js","path":"/next.config.js","content":"/** @type {import('next').NextConfig} */\nconst nextConfig = {\n output: 'export',\n distDir: 'dist',\n basePath: '/yorkie-js-sdk/examples/nextjs-scheduler',\n assetPrefix: '/yorkie-js-sdk/examples/nextjs-scheduler/',\n};\n\nmodule.exports = nextConfig;\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package-lock.json","path":"/package-lock.json","content":"{\n \"name\": \"nextjs-example\",\n \"version\": \"0.0.0\",\n \"lockfileVersion\": 2,\n \"requires\": true,\n \"packages\": {\n \"\": {\n \"name\": \"nextjs-example\",\n \"version\": \"0.0.0\",\n \"dependencies\": {\n \"next\": \"13.5.4\",\n \"react\": \"18.2.0\",\n \"react-calendar\": \"^4.6.0\",\n \"react-dom\": \"18.2.0\",\n \"yorkie-js-sdk\": \"^0.4.6\"\n },\n \"devDependencies\": {\n \"@types/node\": \"20.4.2\",\n \"@types/react\": \"18.0.24\",\n \"@types/react-dom\": \"18.0.8\",\n \"typescript\": \"4.6.4\"\n }\n },\n \"node_modules/@next/env\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@next/env/-/env-13.5.4.tgz\",\n \"integrity\": \"sha512-LGegJkMvRNw90WWphGJ3RMHMVplYcOfRWf2Be3td3sUa+1AaxmsYyANsA+znrGCBjXJNi4XAQlSoEfUxs/4kIQ==\"\n },\n \"node_modules/@next/swc-darwin-arm64\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.4.tgz\",\n \"integrity\": \"sha512-Df8SHuXgF1p+aonBMcDPEsaahNo2TCwuie7VXED4FVyECvdXfRT9unapm54NssV9tF3OQFKBFOdlje4T43VO0w==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">= 10\"\n }\n },\n \"node_modules/@next/swc-darwin-x64\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.4.tgz\",\n \"integrity\": \"sha512-siPuUwO45PnNRMeZnSa8n/Lye5ZX93IJom9wQRB5DEOdFrw0JjOMu1GINB8jAEdwa7Vdyn1oJ2xGNaQpdQQ9Pw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">= 10\"\n }\n },\n \"node_modules/@next/swc-linux-arm64-gnu\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.4.tgz\",\n \"integrity\": \"sha512-l/k/fvRP/zmB2jkFMfefmFkyZbDkYW0mRM/LB+tH5u9pB98WsHXC0WvDHlGCYp3CH/jlkJPL7gN8nkTQVrQ/2w==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">= 10\"\n }\n },\n \"node_modules/@next/swc-linux-arm64-musl\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.4.tgz\",\n \"integrity\": \"sha512-YYGb7SlLkI+XqfQa8VPErljb7k9nUnhhRrVaOdfJNCaQnHBcvbT7cx/UjDQLdleJcfyg1Hkn5YSSIeVfjgmkTg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">= 10\"\n }\n },\n \"node_modules/@next/swc-linux-x64-gnu\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.4.tgz\",\n \"integrity\": \"sha512-uE61vyUSClnCH18YHjA8tE1prr/PBFlBFhxBZis4XBRJoR+txAky5d7gGNUIbQ8sZZ7LVkSVgm/5Fc7mwXmRAg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">= 10\"\n }\n },\n \"node_modules/@next/swc-linux-x64-musl\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.4.tgz\",\n \"integrity\": \"sha512-qVEKFYML/GvJSy9CfYqAdUexA6M5AklYcQCW+8JECmkQHGoPxCf04iMh7CPR7wkHyWWK+XLt4Ja7hhsPJtSnhg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">= 10\"\n }\n },\n \"node_modules/@next/swc-win32-arm64-msvc\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.4.tgz\",\n \"integrity\": \"sha512-mDSQfqxAlfpeZOLPxLymZkX0hYF3juN57W6vFHTvwKlnHfmh12Pt7hPIRLYIShk8uYRsKPtMTth/EzpwRI+u8w==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">= 10\"\n }\n },\n \"node_modules/@next/swc-win32-ia32-msvc\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.4.tgz\",\n \"integrity\": \"sha512-aoqAT2XIekIWoriwzOmGFAvTtVY5O7JjV21giozBTP5c6uZhpvTWRbmHXbmsjZqY4HnEZQRXWkSAppsIBweKqw==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">= 10\"\n }\n },\n \"node_modules/@next/swc-win32-x64-msvc\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.4.tgz\",\n \"integrity\": \"sha512-cyRvlAxwlddlqeB9xtPSfNSCRy8BOa4wtMo0IuI9P7Y0XT2qpDrpFKRyZ7kUngZis59mPVla5k8X1oOJ8RxDYg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">= 10\"\n }\n },\n \"node_modules/@swc/helpers\": {\n \"version\": \"0.5.2\",\n \"resolved\": \"https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz\",\n \"integrity\": \"sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==\",\n \"dependencies\": {\n \"tslib\": \"^2.4.0\"\n }\n },\n \"node_modules/@types/google-protobuf\": {\n \"version\": \"3.15.6\",\n \"resolved\": \"https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.6.tgz\",\n \"integrity\": \"sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==\"\n },\n \"node_modules/@types/lodash\": {\n \"version\": \"4.14.196\",\n \"resolved\": \"https://registry.npmjs.org/@types/lodash/-/lodash-4.14.196.tgz\",\n \"integrity\": \"sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ==\"\n },\n \"node_modules/@types/lodash.memoize\": {\n \"version\": \"4.1.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/lodash.memoize/-/lodash.memoize-4.1.7.tgz\",\n \"integrity\": \"sha512-lGN7WeO4vO6sICVpf041Q7BX/9k1Y24Zo3FY0aUezr1QlKznpjzsDk3T3wvH8ofYzoK0QupN9TWcFAFZlyPwQQ==\",\n \"dependencies\": {\n \"@types/lodash\": \"*\"\n }\n },\n \"node_modules/@types/long\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz\",\n \"integrity\": \"sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==\"\n },\n \"node_modules/@types/node\": {\n \"version\": \"20.4.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz\",\n \"integrity\": \"sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==\",\n \"dev\": true\n },\n \"node_modules/@types/prop-types\": {\n \"version\": \"15.7.5\",\n \"resolved\": \"https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz\",\n \"integrity\": \"sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==\",\n \"devOptional\": true\n },\n \"node_modules/@types/react\": {\n \"version\": \"18.0.24\",\n \"resolved\": \"https://registry.npmjs.org/@types/react/-/react-18.0.24.tgz\",\n \"integrity\": \"sha512-wRJWT6ouziGUy+9uX0aW4YOJxAY0bG6/AOk5AW5QSvZqI7dk6VBIbXvcVgIw/W5Jrl24f77df98GEKTJGOLx7Q==\",\n \"devOptional\": true,\n \"dependencies\": {\n \"@types/prop-types\": \"*\",\n \"@types/scheduler\": \"*\",\n \"csstype\": \"^3.0.2\"\n }\n },\n \"node_modules/@types/react-dom\": {\n \"version\": \"18.0.8\",\n \"resolved\": \"https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.8.tgz\",\n \"integrity\": \"sha512-C3GYO0HLaOkk9dDAz3Dl4sbe4AKUGTCfFIZsz3n/82dPNN8Du533HzKatDxeUYWu24wJgMP1xICqkWk1YOLOIw==\",\n \"dev\": true,\n \"dependencies\": {\n \"@types/react\": \"*\"\n }\n },\n \"node_modules/@types/scheduler\": {\n \"version\": \"0.16.3\",\n \"resolved\": \"https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz\",\n \"integrity\": \"sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==\",\n \"devOptional\": true\n },\n \"node_modules/@wojtekmaj/date-utils\": {\n \"version\": \"1.5.0\",\n \"resolved\": \"https://registry.npmjs.org/@wojtekmaj/date-utils/-/date-utils-1.5.0.tgz\",\n \"integrity\": \"sha512-0mq88lCND6QiffnSDWp+TbOxzJSwy2V/3XN+HwWZ7S2n19QAgR5dy5hRVhlECXvQIq2r+VcblBu+S9V+yMcxXw==\",\n \"funding\": {\n \"url\": \"https://github.com/wojtekmaj/date-utils?sponsor=1\"\n }\n },\n \"node_modules/busboy\": {\n \"version\": \"1.6.0\",\n \"resolved\": \"https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz\",\n \"integrity\": \"sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==\",\n \"dependencies\": {\n \"streamsearch\": \"^1.1.0\"\n },\n \"engines\": {\n \"node\": \">=10.16.0\"\n }\n },\n \"node_modules/caniuse-lite\": {\n \"version\": \"1.0.30001516\",\n \"resolved\": \"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz\",\n \"integrity\": \"sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==\",\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/caniuse-lite\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ]\n },\n \"node_modules/client-only\": {\n \"version\": \"0.0.1\",\n \"resolved\": \"https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz\",\n \"integrity\": \"sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==\"\n },\n \"node_modules/clsx\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz\",\n \"integrity\": \"sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==\",\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/csstype\": {\n \"version\": \"3.1.2\",\n \"resolved\": \"https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz\",\n \"integrity\": \"sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==\",\n \"devOptional\": true\n },\n \"node_modules/get-user-locale\": {\n \"version\": \"2.3.0\",\n \"resolved\": \"https://registry.npmjs.org/get-user-locale/-/get-user-locale-2.3.0.tgz\",\n \"integrity\": \"sha512-I3rQvAUwu2nauRD9YyQBSXVFJZixNouwA+eZld51Sn4Pn0N1qFbgcgOi/nPigJPQlNY519mT95fiSPRgflQiTA==\",\n \"dependencies\": {\n \"@types/lodash.memoize\": \"^4.1.7\",\n \"lodash.memoize\": \"^4.1.1\"\n },\n \"funding\": {\n \"url\": \"https://github.com/wojtekmaj/get-user-locale?sponsor=1\"\n }\n },\n \"node_modules/glob-to-regexp\": {\n \"version\": \"0.4.1\",\n \"resolved\": \"https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz\",\n \"integrity\": \"sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==\"\n },\n \"node_modules/google-protobuf\": {\n \"version\": \"3.21.2\",\n \"resolved\": \"https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz\",\n \"integrity\": \"sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==\"\n },\n \"node_modules/graceful-fs\": {\n \"version\": \"4.2.11\",\n \"resolved\": \"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz\",\n \"integrity\": \"sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==\"\n },\n \"node_modules/grpc-web\": {\n \"version\": \"1.4.2\",\n \"resolved\": \"https://registry.npmjs.org/grpc-web/-/grpc-web-1.4.2.tgz\",\n \"integrity\": \"sha512-gUxWq42l5ldaRplcKb4Pw5O4XBONWZgz3vxIIXnfIeJj8Jc3wYiq2O4c9xzx/NGbbPEej4rhI62C9eTENwLGNw==\"\n },\n \"node_modules/js-tokens\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\"\n },\n \"node_modules/lodash.memoize\": {\n \"version\": \"4.1.2\",\n \"resolved\": \"https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz\",\n \"integrity\": \"sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==\"\n },\n \"node_modules/long\": {\n \"version\": \"5.2.3\",\n \"resolved\": \"https://registry.npmjs.org/long/-/long-5.2.3.tgz\",\n \"integrity\": \"sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==\"\n },\n \"node_modules/loose-envify\": {\n \"version\": \"1.4.0\",\n \"resolved\": \"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz\",\n \"integrity\": \"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==\",\n \"dependencies\": {\n \"js-tokens\": \"^3.0.0 || ^4.0.0\"\n },\n \"bin\": {\n \"loose-envify\": \"cli.js\"\n }\n },\n \"node_modules/nanoid\": {\n \"version\": \"3.3.6\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz\",\n \"integrity\": \"sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==\",\n \"funding\": [\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"bin\": {\n \"nanoid\": \"bin/nanoid.cjs\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || ^13.7 || ^14 || >=15.0.1\"\n }\n },\n \"node_modules/next\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/next/-/next-13.5.4.tgz\",\n \"integrity\": \"sha512-+93un5S779gho8y9ASQhb/bTkQF17FNQOtXLKAj3lsNgltEcF0C5PMLLncDmH+8X1EnJH1kbqAERa29nRXqhjA==\",\n \"dependencies\": {\n \"@next/env\": \"13.5.4\",\n \"@swc/helpers\": \"0.5.2\",\n \"busboy\": \"1.6.0\",\n \"caniuse-lite\": \"^1.0.30001406\",\n \"postcss\": \"8.4.31\",\n \"styled-jsx\": \"5.1.1\",\n \"watchpack\": \"2.4.0\"\n },\n \"bin\": {\n \"next\": \"dist/bin/next\"\n },\n \"engines\": {\n \"node\": \">=16.14.0\"\n },\n \"optionalDependencies\": {\n \"@next/swc-darwin-arm64\": \"13.5.4\",\n \"@next/swc-darwin-x64\": \"13.5.4\",\n \"@next/swc-linux-arm64-gnu\": \"13.5.4\",\n \"@next/swc-linux-arm64-musl\": \"13.5.4\",\n \"@next/swc-linux-x64-gnu\": \"13.5.4\",\n \"@next/swc-linux-x64-musl\": \"13.5.4\",\n \"@next/swc-win32-arm64-msvc\": \"13.5.4\",\n \"@next/swc-win32-ia32-msvc\": \"13.5.4\",\n \"@next/swc-win32-x64-msvc\": \"13.5.4\"\n },\n \"peerDependencies\": {\n \"@opentelemetry/api\": \"^1.1.0\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"sass\": \"^1.3.0\"\n },\n \"peerDependenciesMeta\": {\n \"@opentelemetry/api\": {\n \"optional\": true\n },\n \"sass\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/object-assign\": {\n \"version\": \"4.1.1\",\n \"resolved\": \"https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz\",\n \"integrity\": \"sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/picocolors\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz\",\n \"integrity\": \"sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==\"\n },\n \"node_modules/postcss\": {\n \"version\": \"8.4.31\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz\",\n \"integrity\": \"sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==\",\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/postcss/\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/postcss\"\n },\n {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/ai\"\n }\n ],\n \"dependencies\": {\n \"nanoid\": \"^3.3.6\",\n \"picocolors\": \"^1.0.0\",\n \"source-map-js\": \"^1.0.2\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || >=14\"\n }\n },\n \"node_modules/prop-types\": {\n \"version\": \"15.8.1\",\n \"resolved\": \"https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz\",\n \"integrity\": \"sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==\",\n \"dependencies\": {\n \"loose-envify\": \"^1.4.0\",\n \"object-assign\": \"^4.1.1\",\n \"react-is\": \"^16.13.1\"\n }\n },\n \"node_modules/react\": {\n \"version\": \"18.2.0\",\n \"resolved\": \"https://registry.npmjs.org/react/-/react-18.2.0.tgz\",\n \"integrity\": \"sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n },\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/react-calendar\": {\n \"version\": \"4.6.0\",\n \"resolved\": \"https://registry.npmjs.org/react-calendar/-/react-calendar-4.6.0.tgz\",\n \"integrity\": \"sha512-GJ6ZipKMQmlK666t+0hgmecu6WHydEnMWJjKdEkUxW6F471hiM5DkbWXkfr8wlAg9tc9feNCBhXw3SqsPOm01A==\",\n \"dependencies\": {\n \"@wojtekmaj/date-utils\": \"^1.1.3\",\n \"clsx\": \"^2.0.0\",\n \"get-user-locale\": \"^2.2.1\",\n \"prop-types\": \"^15.6.0\",\n \"tiny-warning\": \"^1.0.0\"\n },\n \"funding\": {\n \"url\": \"https://github.com/wojtekmaj/react-calendar?sponsor=1\"\n },\n \"peerDependencies\": {\n \"@types/react\": \"^16.8.0 || ^17.0.0 || ^18.0.0\",\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0\",\n \"react-dom\": \"^16.8.0 || ^17.0.0 || ^18.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/react\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/react-dom\": {\n \"version\": \"18.2.0\",\n \"resolved\": \"https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz\",\n \"integrity\": \"sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\",\n \"scheduler\": \"^0.23.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^18.2.0\"\n }\n },\n \"node_modules/react-is\": {\n \"version\": \"16.13.1\",\n \"resolved\": \"https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz\",\n \"integrity\": \"sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==\"\n },\n \"node_modules/scheduler\": {\n \"version\": \"0.23.0\",\n \"resolved\": \"https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz\",\n \"integrity\": \"sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n }\n },\n \"node_modules/source-map-js\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz\",\n \"integrity\": \"sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/streamsearch\": {\n \"version\": \"1.1.0\",\n \"resolved\": \"https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz\",\n \"integrity\": \"sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==\",\n \"engines\": {\n \"node\": \">=10.0.0\"\n }\n },\n \"node_modules/styled-jsx\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz\",\n \"integrity\": \"sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==\",\n \"dependencies\": {\n \"client-only\": \"0.0.1\"\n },\n \"engines\": {\n \"node\": \">= 12.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \">= 16.8.0 || 17.x.x || ^18.0.0-0\"\n },\n \"peerDependenciesMeta\": {\n \"@babel/core\": {\n \"optional\": true\n },\n \"babel-plugin-macros\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/tiny-warning\": {\n \"version\": \"1.0.3\",\n \"resolved\": \"https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz\",\n \"integrity\": \"sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==\"\n },\n \"node_modules/tslib\": {\n \"version\": \"2.6.2\",\n \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz\",\n \"integrity\": \"sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==\"\n },\n \"node_modules/typescript\": {\n \"version\": \"4.6.4\",\n \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz\",\n \"integrity\": \"sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==\",\n \"dev\": true,\n \"bin\": {\n \"tsc\": \"bin/tsc\",\n \"tsserver\": \"bin/tsserver\"\n },\n \"engines\": {\n \"node\": \">=4.2.0\"\n }\n },\n \"node_modules/watchpack\": {\n \"version\": \"2.4.0\",\n \"resolved\": \"https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz\",\n \"integrity\": \"sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==\",\n \"dependencies\": {\n \"glob-to-regexp\": \"^0.4.1\",\n \"graceful-fs\": \"^4.1.2\"\n },\n \"engines\": {\n \"node\": \">=10.13.0\"\n }\n },\n \"node_modules/yorkie-js-sdk\": {\n \"version\": \"0.4.6\",\n \"resolved\": \"https://registry.npmjs.org/yorkie-js-sdk/-/yorkie-js-sdk-0.4.6.tgz\",\n \"integrity\": \"sha512-wy5bWi397Ud/7e0zcE/5le/yg8wyz5FgsmBEVSeB8CXAu7sJhPQsQF/jdxbFZf+tym8PxfzFGkyIn+Lpsaf7og==\",\n \"dependencies\": {\n \"@types/google-protobuf\": \"^3.15.5\",\n \"@types/long\": \"^4.0.1\",\n \"google-protobuf\": \"^3.19.4\",\n \"grpc-web\": \"^1.3.1\",\n \"long\": \"^5.2.0\"\n }\n }\n },\n \"dependencies\": {\n \"@next/env\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@next/env/-/env-13.5.4.tgz\",\n \"integrity\": \"sha512-LGegJkMvRNw90WWphGJ3RMHMVplYcOfRWf2Be3td3sUa+1AaxmsYyANsA+znrGCBjXJNi4XAQlSoEfUxs/4kIQ==\"\n },\n \"@next/swc-darwin-arm64\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.4.tgz\",\n \"integrity\": \"sha512-Df8SHuXgF1p+aonBMcDPEsaahNo2TCwuie7VXED4FVyECvdXfRT9unapm54NssV9tF3OQFKBFOdlje4T43VO0w==\",\n \"optional\": true\n },\n \"@next/swc-darwin-x64\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.4.tgz\",\n \"integrity\": \"sha512-siPuUwO45PnNRMeZnSa8n/Lye5ZX93IJom9wQRB5DEOdFrw0JjOMu1GINB8jAEdwa7Vdyn1oJ2xGNaQpdQQ9Pw==\",\n \"optional\": true\n },\n \"@next/swc-linux-arm64-gnu\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.4.tgz\",\n \"integrity\": \"sha512-l/k/fvRP/zmB2jkFMfefmFkyZbDkYW0mRM/LB+tH5u9pB98WsHXC0WvDHlGCYp3CH/jlkJPL7gN8nkTQVrQ/2w==\",\n \"optional\": true\n },\n \"@next/swc-linux-arm64-musl\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.4.tgz\",\n \"integrity\": \"sha512-YYGb7SlLkI+XqfQa8VPErljb7k9nUnhhRrVaOdfJNCaQnHBcvbT7cx/UjDQLdleJcfyg1Hkn5YSSIeVfjgmkTg==\",\n \"optional\": true\n },\n \"@next/swc-linux-x64-gnu\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.4.tgz\",\n \"integrity\": \"sha512-uE61vyUSClnCH18YHjA8tE1prr/PBFlBFhxBZis4XBRJoR+txAky5d7gGNUIbQ8sZZ7LVkSVgm/5Fc7mwXmRAg==\",\n \"optional\": true\n },\n \"@next/swc-linux-x64-musl\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.4.tgz\",\n \"integrity\": \"sha512-qVEKFYML/GvJSy9CfYqAdUexA6M5AklYcQCW+8JECmkQHGoPxCf04iMh7CPR7wkHyWWK+XLt4Ja7hhsPJtSnhg==\",\n \"optional\": true\n },\n \"@next/swc-win32-arm64-msvc\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.4.tgz\",\n \"integrity\": \"sha512-mDSQfqxAlfpeZOLPxLymZkX0hYF3juN57W6vFHTvwKlnHfmh12Pt7hPIRLYIShk8uYRsKPtMTth/EzpwRI+u8w==\",\n \"optional\": true\n },\n \"@next/swc-win32-ia32-msvc\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.4.tgz\",\n \"integrity\": \"sha512-aoqAT2XIekIWoriwzOmGFAvTtVY5O7JjV21giozBTP5c6uZhpvTWRbmHXbmsjZqY4HnEZQRXWkSAppsIBweKqw==\",\n \"optional\": true\n },\n \"@next/swc-win32-x64-msvc\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.4.tgz\",\n \"integrity\": \"sha512-cyRvlAxwlddlqeB9xtPSfNSCRy8BOa4wtMo0IuI9P7Y0XT2qpDrpFKRyZ7kUngZis59mPVla5k8X1oOJ8RxDYg==\",\n \"optional\": true\n },\n \"@swc/helpers\": {\n \"version\": \"0.5.2\",\n \"resolved\": \"https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz\",\n \"integrity\": \"sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==\",\n \"requires\": {\n \"tslib\": \"^2.4.0\"\n }\n },\n \"@types/google-protobuf\": {\n \"version\": \"3.15.6\",\n \"resolved\": \"https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.6.tgz\",\n \"integrity\": \"sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==\"\n },\n \"@types/lodash\": {\n \"version\": \"4.14.196\",\n \"resolved\": \"https://registry.npmjs.org/@types/lodash/-/lodash-4.14.196.tgz\",\n \"integrity\": \"sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ==\"\n },\n \"@types/lodash.memoize\": {\n \"version\": \"4.1.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/lodash.memoize/-/lodash.memoize-4.1.7.tgz\",\n \"integrity\": \"sha512-lGN7WeO4vO6sICVpf041Q7BX/9k1Y24Zo3FY0aUezr1QlKznpjzsDk3T3wvH8ofYzoK0QupN9TWcFAFZlyPwQQ==\",\n \"requires\": {\n \"@types/lodash\": \"*\"\n }\n },\n \"@types/long\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz\",\n \"integrity\": \"sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==\"\n },\n \"@types/node\": {\n \"version\": \"20.4.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz\",\n \"integrity\": \"sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==\",\n \"dev\": true\n },\n \"@types/prop-types\": {\n \"version\": \"15.7.5\",\n \"resolved\": \"https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz\",\n \"integrity\": \"sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==\",\n \"devOptional\": true\n },\n \"@types/react\": {\n \"version\": \"18.0.24\",\n \"resolved\": \"https://registry.npmjs.org/@types/react/-/react-18.0.24.tgz\",\n \"integrity\": \"sha512-wRJWT6ouziGUy+9uX0aW4YOJxAY0bG6/AOk5AW5QSvZqI7dk6VBIbXvcVgIw/W5Jrl24f77df98GEKTJGOLx7Q==\",\n \"devOptional\": true,\n \"requires\": {\n \"@types/prop-types\": \"*\",\n \"@types/scheduler\": \"*\",\n \"csstype\": \"^3.0.2\"\n }\n },\n \"@types/react-dom\": {\n \"version\": \"18.0.8\",\n \"resolved\": \"https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.8.tgz\",\n \"integrity\": \"sha512-C3GYO0HLaOkk9dDAz3Dl4sbe4AKUGTCfFIZsz3n/82dPNN8Du533HzKatDxeUYWu24wJgMP1xICqkWk1YOLOIw==\",\n \"dev\": true,\n \"requires\": {\n \"@types/react\": \"*\"\n }\n },\n \"@types/scheduler\": {\n \"version\": \"0.16.3\",\n \"resolved\": \"https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz\",\n \"integrity\": \"sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==\",\n \"devOptional\": true\n },\n \"@wojtekmaj/date-utils\": {\n \"version\": \"1.5.0\",\n \"resolved\": \"https://registry.npmjs.org/@wojtekmaj/date-utils/-/date-utils-1.5.0.tgz\",\n \"integrity\": \"sha512-0mq88lCND6QiffnSDWp+TbOxzJSwy2V/3XN+HwWZ7S2n19QAgR5dy5hRVhlECXvQIq2r+VcblBu+S9V+yMcxXw==\"\n },\n \"busboy\": {\n \"version\": \"1.6.0\",\n \"resolved\": \"https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz\",\n \"integrity\": \"sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==\",\n \"requires\": {\n \"streamsearch\": \"^1.1.0\"\n }\n },\n \"caniuse-lite\": {\n \"version\": \"1.0.30001516\",\n \"resolved\": \"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz\",\n \"integrity\": \"sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==\"\n },\n \"client-only\": {\n \"version\": \"0.0.1\",\n \"resolved\": \"https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz\",\n \"integrity\": \"sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==\"\n },\n \"clsx\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz\",\n \"integrity\": \"sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==\"\n },\n \"csstype\": {\n \"version\": \"3.1.2\",\n \"resolved\": \"https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz\",\n \"integrity\": \"sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==\",\n \"devOptional\": true\n },\n \"get-user-locale\": {\n \"version\": \"2.3.0\",\n \"resolved\": \"https://registry.npmjs.org/get-user-locale/-/get-user-locale-2.3.0.tgz\",\n \"integrity\": \"sha512-I3rQvAUwu2nauRD9YyQBSXVFJZixNouwA+eZld51Sn4Pn0N1qFbgcgOi/nPigJPQlNY519mT95fiSPRgflQiTA==\",\n \"requires\": {\n \"@types/lodash.memoize\": \"^4.1.7\",\n \"lodash.memoize\": \"^4.1.1\"\n }\n },\n \"glob-to-regexp\": {\n \"version\": \"0.4.1\",\n \"resolved\": \"https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz\",\n \"integrity\": \"sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==\"\n },\n \"google-protobuf\": {\n \"version\": \"3.21.2\",\n \"resolved\": \"https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz\",\n \"integrity\": \"sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==\"\n },\n \"graceful-fs\": {\n \"version\": \"4.2.11\",\n \"resolved\": \"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz\",\n \"integrity\": \"sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==\"\n },\n \"grpc-web\": {\n \"version\": \"1.4.2\",\n \"resolved\": \"https://registry.npmjs.org/grpc-web/-/grpc-web-1.4.2.tgz\",\n \"integrity\": \"sha512-gUxWq42l5ldaRplcKb4Pw5O4XBONWZgz3vxIIXnfIeJj8Jc3wYiq2O4c9xzx/NGbbPEej4rhI62C9eTENwLGNw==\"\n },\n \"js-tokens\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\"\n },\n \"lodash.memoize\": {\n \"version\": \"4.1.2\",\n \"resolved\": \"https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz\",\n \"integrity\": \"sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==\"\n },\n \"long\": {\n \"version\": \"5.2.3\",\n \"resolved\": \"https://registry.npmjs.org/long/-/long-5.2.3.tgz\",\n \"integrity\": \"sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==\"\n },\n \"loose-envify\": {\n \"version\": \"1.4.0\",\n \"resolved\": \"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz\",\n \"integrity\": \"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==\",\n \"requires\": {\n \"js-tokens\": \"^3.0.0 || ^4.0.0\"\n }\n },\n \"nanoid\": {\n \"version\": \"3.3.6\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz\",\n \"integrity\": \"sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==\"\n },\n \"next\": {\n \"version\": \"13.5.4\",\n \"resolved\": \"https://registry.npmjs.org/next/-/next-13.5.4.tgz\",\n \"integrity\": \"sha512-+93un5S779gho8y9ASQhb/bTkQF17FNQOtXLKAj3lsNgltEcF0C5PMLLncDmH+8X1EnJH1kbqAERa29nRXqhjA==\",\n \"requires\": {\n \"@next/env\": \"13.5.4\",\n \"@next/swc-darwin-arm64\": \"13.5.4\",\n \"@next/swc-darwin-x64\": \"13.5.4\",\n \"@next/swc-linux-arm64-gnu\": \"13.5.4\",\n \"@next/swc-linux-arm64-musl\": \"13.5.4\",\n \"@next/swc-linux-x64-gnu\": \"13.5.4\",\n \"@next/swc-linux-x64-musl\": \"13.5.4\",\n \"@next/swc-win32-arm64-msvc\": \"13.5.4\",\n \"@next/swc-win32-ia32-msvc\": \"13.5.4\",\n \"@next/swc-win32-x64-msvc\": \"13.5.4\",\n \"@swc/helpers\": \"0.5.2\",\n \"busboy\": \"1.6.0\",\n \"caniuse-lite\": \"^1.0.30001406\",\n \"postcss\": \"8.4.31\",\n \"styled-jsx\": \"5.1.1\",\n \"watchpack\": \"2.4.0\"\n }\n },\n \"object-assign\": {\n \"version\": \"4.1.1\",\n \"resolved\": \"https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz\",\n \"integrity\": \"sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==\"\n },\n \"picocolors\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz\",\n \"integrity\": \"sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==\"\n },\n \"postcss\": {\n \"version\": \"8.4.31\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz\",\n \"integrity\": \"sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==\",\n \"requires\": {\n \"nanoid\": \"^3.3.6\",\n \"picocolors\": \"^1.0.0\",\n \"source-map-js\": \"^1.0.2\"\n }\n },\n \"prop-types\": {\n \"version\": \"15.8.1\",\n \"resolved\": \"https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz\",\n \"integrity\": \"sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==\",\n \"requires\": {\n \"loose-envify\": \"^1.4.0\",\n \"object-assign\": \"^4.1.1\",\n \"react-is\": \"^16.13.1\"\n }\n },\n \"react\": {\n \"version\": \"18.2.0\",\n \"resolved\": \"https://registry.npmjs.org/react/-/react-18.2.0.tgz\",\n \"integrity\": \"sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==\",\n \"requires\": {\n \"loose-envify\": \"^1.1.0\"\n }\n },\n \"react-calendar\": {\n \"version\": \"4.6.0\",\n \"resolved\": \"https://registry.npmjs.org/react-calendar/-/react-calendar-4.6.0.tgz\",\n \"integrity\": \"sha512-GJ6ZipKMQmlK666t+0hgmecu6WHydEnMWJjKdEkUxW6F471hiM5DkbWXkfr8wlAg9tc9feNCBhXw3SqsPOm01A==\",\n \"requires\": {\n \"@wojtekmaj/date-utils\": \"^1.1.3\",\n \"clsx\": \"^2.0.0\",\n \"get-user-locale\": \"^2.2.1\",\n \"prop-types\": \"^15.6.0\",\n \"tiny-warning\": \"^1.0.0\"\n }\n },\n \"react-dom\": {\n \"version\": \"18.2.0\",\n \"resolved\": \"https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz\",\n \"integrity\": \"sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==\",\n \"requires\": {\n \"loose-envify\": \"^1.1.0\",\n \"scheduler\": \"^0.23.0\"\n }\n },\n \"react-is\": {\n \"version\": \"16.13.1\",\n \"resolved\": \"https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz\",\n \"integrity\": \"sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==\"\n },\n \"scheduler\": {\n \"version\": \"0.23.0\",\n \"resolved\": \"https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz\",\n \"integrity\": \"sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==\",\n \"requires\": {\n \"loose-envify\": \"^1.1.0\"\n }\n },\n \"source-map-js\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz\",\n \"integrity\": \"sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==\"\n },\n \"streamsearch\": {\n \"version\": \"1.1.0\",\n \"resolved\": \"https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz\",\n \"integrity\": \"sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==\"\n },\n \"styled-jsx\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz\",\n \"integrity\": \"sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==\",\n \"requires\": {\n \"client-only\": \"0.0.1\"\n }\n },\n \"tiny-warning\": {\n \"version\": \"1.0.3\",\n \"resolved\": \"https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz\",\n \"integrity\": \"sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==\"\n },\n \"tslib\": {\n \"version\": \"2.6.2\",\n \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz\",\n \"integrity\": \"sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==\"\n },\n \"typescript\": {\n \"version\": \"4.6.4\",\n \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz\",\n \"integrity\": \"sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==\",\n \"dev\": true\n },\n \"watchpack\": {\n \"version\": \"2.4.0\",\n \"resolved\": \"https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz\",\n \"integrity\": \"sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==\",\n \"requires\": {\n \"glob-to-regexp\": \"^0.4.1\",\n \"graceful-fs\": \"^4.1.2\"\n }\n },\n \"yorkie-js-sdk\": {\n \"version\": \"0.4.6\",\n \"resolved\": \"https://registry.npmjs.org/yorkie-js-sdk/-/yorkie-js-sdk-0.4.6.tgz\",\n \"integrity\": \"sha512-wy5bWi397Ud/7e0zcE/5le/yg8wyz5FgsmBEVSeB8CXAu7sJhPQsQF/jdxbFZf+tym8PxfzFGkyIn+Lpsaf7og==\",\n \"requires\": {\n \"@types/google-protobuf\": \"^3.15.5\",\n \"@types/long\": \"^4.0.1\",\n \"google-protobuf\": \"^3.19.4\",\n \"grpc-web\": \"^1.3.1\",\n \"long\": \"^5.2.0\"\n }\n }\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package.json","path":"/package.json","content":"{\n \"name\": \"nextjs-scheduler\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"scripts\": {\n \"dev\": \"next dev -p 5173\",\n \"build\": \"next build && touch ./dist/.nojekyll\",\n \"start\": \"next start\",\n \"lint\": \"next lint\"\n },\n \"dependencies\": {\n \"next\": \"13.5.4\",\n \"react\": \"18.2.0\",\n \"react-calendar\": \"^4.6.0\",\n \"react-dom\": \"18.2.0\",\n \"yorkie-js-sdk\": \"^0.4.7\"\n },\n \"devDependencies\": {\n \"@types/node\": \"20.4.2\",\n \"@types/react\": \"18.0.24\",\n \"@types/react-dom\": \"18.0.8\",\n \"typescript\": \"4.6.4\"\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"jpg","name":"thumbnail.jpg","path":"/thumbnail.jpg","content":""},{"isFile":true,"isOpen":false,"language":"json","name":"tsconfig.json","path":"/tsconfig.json","content":"{\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"lib\": [\n \"DOM\",\n \"DOM.Iterable\",\n \"ESNext\"\n ],\n \"allowJs\": false,\n \"skipLibCheck\": true,\n \"strict\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"noEmit\": true,\n \"esModuleInterop\": true,\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Node\",\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"jsx\": \"preserve\",\n \"incremental\": true,\n \"plugins\": [\n {\n \"name\": \"next\"\n }\n ],\n \"paths\": {\n \"@/*\": [\n \"./*\"\n ]\n }\n },\n \"include\": [\n \"next-env.d.ts\",\n \"**/*.ts\",\n \"**/*.tsx\",\n \".next/types/**/*.ts\"\n ],\n \"exclude\": [\n \"node_modules\"\n ]\n}\n"}]} \ No newline at end of file diff --git a/examples/profile-stack/fileInfo.ts b/examples/profile-stack/fileInfo.ts index a813399..cb272bc 100644 --- a/examples/profile-stack/fileInfo.ts +++ b/examples/profile-stack/fileInfo.ts @@ -1,2 +1,2 @@ import { DirectoryInfo } from '@/utils/exampleFileUtils'; - export const FILE_INFO: DirectoryInfo = {"isFile":false,"name":"profile-stack","path":"/","children":[{"isFile":false,"name":"public","path":"/public","children":[{"isFile":false,"name":"images","path":"/public/images","children":[{"isFile":true,"isOpen":false,"language":"svg","name":"profile-blue.svg","path":"/public/images/profile-blue.svg","content":"\n\n\n\n\n\n\n\n\n\n\n\n"},{"isFile":true,"isOpen":false,"language":"svg","name":"profile-green.svg","path":"/public/images/profile-green.svg","content":"\n\n\n\n\n\n\n\n\n\n\n\n"},{"isFile":true,"isOpen":false,"language":"svg","name":"profile-orange.svg","path":"/public/images/profile-orange.svg","content":"\n\n\n\n\n\n\n\n\n\n\n\n"},{"isFile":true,"isOpen":false,"language":"svg","name":"profile-purple.svg","path":"/public/images/profile-purple.svg","content":"\n\n\n\n\n\n\n\n\n\n\n\n"},{"isFile":true,"isOpen":false,"language":"svg","name":"profile-red.svg","path":"/public/images/profile-red.svg","content":"\n\n\n\n\n\n\n\n\n\n\n\n"},{"isFile":true,"isOpen":false,"language":"svg","name":"profile-yellow.svg","path":"/public/images/profile-yellow.svg","content":"\n\n\n\n\n\n\n\n\n\n\n\n"}]},{"isFile":true,"isOpen":false,"language":"ico","name":"favicon.ico","path":"/public/favicon.ico","content":""}]},{"isFile":true,"isOpen":false,"language":"","name":".env","path":"/.env","content":"VITE_YORKIE_API_ADDR='http://localhost:8080'\nVITE_YORKIE_API_KEY=''\n"},{"isFile":true,"isOpen":false,"language":"production","name":".env.production","path":"/.env.production","content":"VITE_YORKIE_API_ADDR='https://api.yorkie.dev'\nVITE_YORKIE_API_KEY='cedaovjuioqlk4pjqn6g'\n"},{"isFile":true,"isOpen":false,"language":"","name":".gitignore","path":"/.gitignore","content":"# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"},{"isFile":true,"isOpen":false,"language":"markdown","name":"README.md","path":"/README.md","content":"# Yorkie Profile Stack Example\n\n

\n \n \"Live\n \n

\n\n\"Profile\n\n## How to run demo\n\nAt project root, run below command to start Yorkie and Envoy proxy.\n\n```bash\n$ docker-compose -f docker/docker-compose.yml up --build -d\n```\n\nInstall dependencies\n\n```bash\n$ npm install\n```\n\nStart demo project\n\n```bash\n$ npm run dev\n```\n"},{"isFile":true,"isOpen":false,"language":"markup","name":"index.html","path":"/index.html","content":"\n\n \n \n \n \n Profile Stack - Yorkie Example\n \n \n \n
\n
\n
\n \n \n\n"},{"isFile":true,"isOpen":false,"language":"javascript","name":"main.js","path":"/main.js","content":"import yorkie from 'yorkie-js-sdk';\nimport { getRandomName, getRandomColor } from './util.js';\n\nasync function main() {\n const client = new yorkie.Client(import.meta.env.VITE_YORKIE_API_ADDR, {\n apiKey: import.meta.env.VITE_YORKIE_API_KEY,\n // set the client's name and color to presence.\n presence: {\n name: getRandomName(),\n color: getRandomColor(),\n },\n });\n await client.activate();\n\n client.subscribe((event) => {\n if (event.type === 'peers-changed') {\n // show peer list\n displayPeerList(client.getPeersByDocKey(doc.getKey()), client.getID());\n }\n });\n\n const doc = new yorkie.Document('profile-stack');\n await client.attach(doc);\n\n window.addEventListener('beforeunload', () => {\n client.deactivate();\n });\n}\n\nconst MAX_PEER_VIEW = 4;\nconst createPeer = (name, color, type) => {\n const $peer = document.createElement('div');\n $peer.className = 'peer';\n\n if (type === 'main') {\n $peer.innerHTML = `\n
\n \"profile\"\n
\n
${name}
\n `;\n } else if (type === 'more') {\n $peer.innerHTML = `\n \"profile\"\n ${name}\n `;\n }\n return $peer;\n};\n\nconst displayPeerList = (peers, myClientID) => {\n const peerList = peers.filter(\n ({ clientID: id, presence }) =>\n id !== myClientID && presence.name && presence.color,\n );\n const peerCount = peerList.length + 1;\n const hasMorePeers = peerCount > MAX_PEER_VIEW;\n const $peerList = document.getElementById('peerList');\n $peerList.innerHTML = '';\n const $peerMoreList = document.createElement('div');\n $peerMoreList.className = 'peer-more-list speech-bubbles';\n\n const myPresence = peers.find(\n ({ clientID: id }) => id === myClientID,\n ).presence;\n const $me = createPeer(`${myPresence.name} (me)`, myPresence.color, 'main');\n $me.classList.add('me');\n $peerList.appendChild($me);\n peerList.forEach((peer, i) => {\n const { name, color } = peer.presence;\n if (i < MAX_PEER_VIEW - 1) {\n const $peer = createPeer(name, color, 'main');\n $peerList.appendChild($peer);\n return;\n }\n const $peer = createPeer(name, color, 'more');\n $peerMoreList.appendChild($peer);\n });\n\n if (hasMorePeers) {\n const $peer = document.createElement('div');\n $peer.className = 'peer more';\n $peer.innerHTML = `\n
\n +${peerCount - MAX_PEER_VIEW}\n
\n `;\n $peer.appendChild($peerMoreList);\n $peerList.appendChild($peer);\n }\n};\n\nmain();\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package-lock.json","path":"/package-lock.json","content":"{\n \"name\": \"profile-stack\",\n \"version\": \"0.0.0\",\n \"lockfileVersion\": 1,\n \"requires\": true,\n \"dependencies\": {\n \"@esbuild/android-arm\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz\",\n \"integrity\": \"sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"@esbuild/linux-loong64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz\",\n \"integrity\": \"sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"@types/google-protobuf\": {\n \"version\": \"3.15.6\",\n \"resolved\": \"https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.6.tgz\",\n \"integrity\": \"sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==\"\n },\n \"@types/long\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz\",\n \"integrity\": \"sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==\"\n },\n \"esbuild\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz\",\n \"integrity\": \"sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==\",\n \"dev\": true,\n \"requires\": {\n \"@esbuild/android-arm\": \"0.15.18\",\n \"@esbuild/linux-loong64\": \"0.15.18\",\n \"esbuild-android-64\": \"0.15.18\",\n \"esbuild-android-arm64\": \"0.15.18\",\n \"esbuild-darwin-64\": \"0.15.18\",\n \"esbuild-darwin-arm64\": \"0.15.18\",\n \"esbuild-freebsd-64\": \"0.15.18\",\n \"esbuild-freebsd-arm64\": \"0.15.18\",\n \"esbuild-linux-32\": \"0.15.18\",\n \"esbuild-linux-64\": \"0.15.18\",\n \"esbuild-linux-arm\": \"0.15.18\",\n \"esbuild-linux-arm64\": \"0.15.18\",\n \"esbuild-linux-mips64le\": \"0.15.18\",\n \"esbuild-linux-ppc64le\": \"0.15.18\",\n \"esbuild-linux-riscv64\": \"0.15.18\",\n \"esbuild-linux-s390x\": \"0.15.18\",\n \"esbuild-netbsd-64\": \"0.15.18\",\n \"esbuild-openbsd-64\": \"0.15.18\",\n \"esbuild-sunos-64\": \"0.15.18\",\n \"esbuild-windows-32\": \"0.15.18\",\n \"esbuild-windows-64\": \"0.15.18\",\n \"esbuild-windows-arm64\": \"0.15.18\"\n }\n },\n \"esbuild-android-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz\",\n \"integrity\": \"sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-android-arm64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz\",\n \"integrity\": \"sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-darwin-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz\",\n \"integrity\": \"sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-darwin-arm64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz\",\n \"integrity\": \"sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-freebsd-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz\",\n \"integrity\": \"sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-freebsd-arm64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz\",\n \"integrity\": \"sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-32\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz\",\n \"integrity\": \"sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz\",\n \"integrity\": \"sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-arm\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz\",\n \"integrity\": \"sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-arm64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz\",\n \"integrity\": \"sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-mips64le\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz\",\n \"integrity\": \"sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-ppc64le\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz\",\n \"integrity\": \"sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-riscv64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz\",\n \"integrity\": \"sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-s390x\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz\",\n \"integrity\": \"sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-netbsd-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz\",\n \"integrity\": \"sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-openbsd-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz\",\n \"integrity\": \"sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-sunos-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz\",\n \"integrity\": \"sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-windows-32\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz\",\n \"integrity\": \"sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-windows-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz\",\n \"integrity\": \"sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-windows-arm64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz\",\n \"integrity\": \"sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"fsevents\": {\n \"version\": \"2.3.2\",\n \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz\",\n \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"function-bind\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz\",\n \"integrity\": \"sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==\",\n \"dev\": true\n },\n \"google-protobuf\": {\n \"version\": \"3.21.2\",\n \"resolved\": \"https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz\",\n \"integrity\": \"sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==\"\n },\n \"grpc-web\": {\n \"version\": \"1.4.2\",\n \"resolved\": \"https://registry.npmjs.org/grpc-web/-/grpc-web-1.4.2.tgz\",\n \"integrity\": \"sha512-gUxWq42l5ldaRplcKb4Pw5O4XBONWZgz3vxIIXnfIeJj8Jc3wYiq2O4c9xzx/NGbbPEej4rhI62C9eTENwLGNw==\"\n },\n \"has\": {\n \"version\": \"1.0.3\",\n \"resolved\": \"https://registry.npmjs.org/has/-/has-1.0.3.tgz\",\n \"integrity\": \"sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==\",\n \"dev\": true,\n \"requires\": {\n \"function-bind\": \"^1.1.1\"\n }\n },\n \"is-core-module\": {\n \"version\": \"2.12.1\",\n \"resolved\": \"https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz\",\n \"integrity\": \"sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==\",\n \"dev\": true,\n \"requires\": {\n \"has\": \"^1.0.3\"\n }\n },\n \"long\": {\n \"version\": \"5.2.3\",\n \"resolved\": \"https://registry.npmjs.org/long/-/long-5.2.3.tgz\",\n \"integrity\": \"sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==\"\n },\n \"nanoid\": {\n \"version\": \"3.3.6\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz\",\n \"integrity\": \"sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==\",\n \"dev\": true\n },\n \"path-parse\": {\n \"version\": \"1.0.7\",\n \"resolved\": \"https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz\",\n \"integrity\": \"sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==\",\n \"dev\": true\n },\n \"picocolors\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz\",\n \"integrity\": \"sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==\",\n \"dev\": true\n },\n \"postcss\": {\n \"version\": \"8.4.24\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz\",\n \"integrity\": \"sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==\",\n \"dev\": true,\n \"requires\": {\n \"nanoid\": \"^3.3.6\",\n \"picocolors\": \"^1.0.0\",\n \"source-map-js\": \"^1.0.2\"\n }\n },\n \"resolve\": {\n \"version\": \"1.22.2\",\n \"resolved\": \"https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz\",\n \"integrity\": \"sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==\",\n \"dev\": true,\n \"requires\": {\n \"is-core-module\": \"^2.11.0\",\n \"path-parse\": \"^1.0.7\",\n \"supports-preserve-symlinks-flag\": \"^1.0.0\"\n }\n },\n \"rollup\": {\n \"version\": \"2.79.1\",\n \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz\",\n \"integrity\": \"sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==\",\n \"dev\": true,\n \"requires\": {\n \"fsevents\": \"~2.3.2\"\n }\n },\n \"source-map-js\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz\",\n \"integrity\": \"sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==\",\n \"dev\": true\n },\n \"supports-preserve-symlinks-flag\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz\",\n \"integrity\": \"sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==\",\n \"dev\": true\n },\n \"vite\": {\n \"version\": \"3.2.7\",\n \"resolved\": \"https://registry.npmjs.org/vite/-/vite-3.2.7.tgz\",\n \"integrity\": \"sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==\",\n \"dev\": true,\n \"requires\": {\n \"esbuild\": \"^0.15.9\",\n \"fsevents\": \"~2.3.2\",\n \"postcss\": \"^8.4.18\",\n \"resolve\": \"^1.22.1\",\n \"rollup\": \"^2.79.1\"\n }\n },\n \"yorkie-js-sdk\": {\n \"version\": \"0.3.5\",\n \"resolved\": \"https://registry.npmjs.org/yorkie-js-sdk/-/yorkie-js-sdk-0.3.5.tgz\",\n \"integrity\": \"sha512-CZdc5yUhmJUQWpulDOeDwlW9Uh5WgDBLuCyhXV8+Crb3Kr14PCmrJJ9lI3rVSReosQtq8RjPYnwMd7KbtYALyw==\",\n \"requires\": {\n \"@types/google-protobuf\": \"^3.15.5\",\n \"@types/long\": \"^4.0.1\",\n \"google-protobuf\": \"^3.19.4\",\n \"grpc-web\": \"^1.3.1\",\n \"long\": \"^5.2.0\"\n }\n }\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package.json","path":"/package.json","content":"{\n \"name\": \"profile-stack\",\n \"private\": true,\n \"version\": \"0.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"vite build\",\n \"preview\": \"vite preview\"\n },\n \"devDependencies\": {\n \"vite\": \"^3.2.7\"\n },\n \"dependencies\": {\n \"yorkie-js-sdk\": \"^0.4.2\"\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"css","name":"style.css","path":"/style.css","content":"* {\n margin: 0;\n padding: 0;\n}\n\nbody {\n --light-gray: #f5f3f1;\n --gray: #c2bdba;\n --black: #332e2b;\n --white: #fefdfb;\n\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100vh;\n color: var(--black);\n}\n\nimg {\n vertical-align: top;\n}\n\n*::-webkit-scrollbar {\n width: 10px;\n height: 4px;\n}\n\n*::-webkit-scrollbar-thumb {\n background: var(--gray);\n border-radius: 10px;\n border: 3px solid var(--white);\n}\n\n*::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.speech-bubbles {\n padding: 16px;\n border: 1px solid var(--gray);\n border-radius: 16px;\n}\n\n.speech-bubbles:before {\n position: absolute;\n top: 0;\n left: 50%;\n margin-left: -6px;\n margin-top: -8px;\n width: 0;\n height: 0;\n content: '';\n border-top: 0px solid transparent;\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n border-bottom: 8px solid var(--gray);\n}\n\n.speech-bubbles:after {\n position: absolute;\n top: 0;\n left: 50%;\n margin-left: -5px;\n margin-top: -6px;\n width: 0;\n height: 0;\n content: '';\n border-top: 0px solid transparent;\n border-left: 5px solid transparent;\n border-right: 5px solid transparent;\n border-bottom: 7px solid var(--white);\n}\n\n#peerList {\n display: inline-flex;\n border: 1px solid var(--gray);\n border-radius: 100px;\n white-space: nowrap;\n}\n\n.peer {\n position: relative;\n margin: 12px;\n}\n\n.profile-img {\n width: 52px;\n cursor: pointer;\n}\n\n.peer.me {\n order: -1;\n}\n\n.peer .name {\n font-weight: 900;\n white-space: nowrap;\n}\n\n.peer .speech-bubbles {\n display: none;\n position: absolute;\n top: 80px;\n left: 50%;\n transform: translate(-50%);\n background: var(--white);\n}\n\n.peer:hover .speech-bubbles {\n display: block;\n}\n\n.peer.more {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 52px;\n height: 52px;\n background: var(--light-gray);\n border-radius: 100%;\n font-weight: 900;\n font-size: 24px;\n cursor: pointer;\n}\n\n.peer-more-list {\n font-size: 16px;\n}\n\n.peer-more-list .peer {\n display: flex;\n align-items: center;\n margin: 0 0 12px 0;\n}\n\n.peer-more-list .peer:last-child {\n margin-bottom: 0;\n}\n\n.peer-more-list .profile-img {\n margin-right: 8px;\n width: 26px;\n}\n"},{"isFile":true,"isOpen":false,"language":"jpg","name":"thumbnail.jpg","path":"/thumbnail.jpg","content":""},{"isFile":true,"isOpen":false,"language":"javascript","name":"util.js","path":"/util.js","content":"const NAMES = [\n 'Ali',\n 'Beatriz',\n 'Charles',\n 'Diya',\n 'Eric',\n 'Fatima',\n 'Gabriel',\n 'Hanna',\n 'Johnson',\n 'Perry',\n 'Parker',\n 'Kelly',\n];\nexport const getRandomName = () => {\n const index = Math.floor(Math.random() * NAMES.length);\n return NAMES[index];\n};\n\nconst COLORS = ['red', 'yellow', 'orange', 'green', 'blue', 'purple'];\nexport const getRandomColor = () => {\n const index = Math.floor(Math.random() * COLORS.length);\n return COLORS[index];\n};\n"},{"isFile":true,"isOpen":false,"language":"javascript","name":"vite.config.js","path":"/vite.config.js","content":"import { defineConfig } from 'vite';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n base: '',\n});\n"}]} \ No newline at end of file + export const FILE_INFO: DirectoryInfo = {"isFile":false,"name":"profile-stack","path":"/","children":[{"isFile":false,"name":"public","path":"/public","children":[{"isFile":false,"name":"images","path":"/public/images","children":[{"isFile":true,"isOpen":false,"language":"svg","name":"profile-blue.svg","path":"/public/images/profile-blue.svg","content":"\n\n\n\n\n\n\n\n\n\n\n\n"},{"isFile":true,"isOpen":false,"language":"svg","name":"profile-green.svg","path":"/public/images/profile-green.svg","content":"\n\n\n\n\n\n\n\n\n\n\n\n"},{"isFile":true,"isOpen":false,"language":"svg","name":"profile-orange.svg","path":"/public/images/profile-orange.svg","content":"\n\n\n\n\n\n\n\n\n\n\n\n"},{"isFile":true,"isOpen":false,"language":"svg","name":"profile-purple.svg","path":"/public/images/profile-purple.svg","content":"\n\n\n\n\n\n\n\n\n\n\n\n"},{"isFile":true,"isOpen":false,"language":"svg","name":"profile-red.svg","path":"/public/images/profile-red.svg","content":"\n\n\n\n\n\n\n\n\n\n\n\n"},{"isFile":true,"isOpen":false,"language":"svg","name":"profile-yellow.svg","path":"/public/images/profile-yellow.svg","content":"\n\n\n\n\n\n\n\n\n\n\n\n"}]},{"isFile":true,"isOpen":false,"language":"ico","name":"favicon.ico","path":"/public/favicon.ico","content":""}]},{"isFile":true,"isOpen":false,"language":"","name":".env","path":"/.env","content":"VITE_YORKIE_API_ADDR='http://localhost:8080'\nVITE_YORKIE_API_KEY=''\n"},{"isFile":true,"isOpen":false,"language":"production","name":".env.production","path":"/.env.production","content":"VITE_YORKIE_API_ADDR='https://api.yorkie.dev'\nVITE_YORKIE_API_KEY='cedaovjuioqlk4pjqn6g'\n"},{"isFile":true,"isOpen":false,"language":"","name":".gitignore","path":"/.gitignore","content":"# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"},{"isFile":true,"isOpen":false,"language":"markdown","name":"README.md","path":"/README.md","content":"# Yorkie Profile Stack Example\n\n

\n \n \"Live\n \n

\n\n\"Profile\n\n## How to run demo\n\nAt project root, run below command to start Yorkie and Envoy proxy.\n\n```bash\n$ docker-compose -f docker/docker-compose.yml up --build -d\n```\n\nInstall dependencies\n\n```bash\n$ npm install\n```\n\nStart demo project\n\n```bash\n$ npm run dev\n```\n"},{"isFile":true,"isOpen":false,"language":"markup","name":"index.html","path":"/index.html","content":"\n\n \n \n \n \n Profile Stack - Yorkie Example\n \n \n \n
\n
\n
\n \n \n\n"},{"isFile":true,"isOpen":false,"language":"javascript","name":"main.js","path":"/main.js","content":"import yorkie, { DocEventType } from 'yorkie-js-sdk';\nimport { getRandomName, getRandomColor } from './util.js';\n\nasync function main() {\n const client = new yorkie.Client(import.meta.env.VITE_YORKIE_API_ADDR, {\n apiKey: import.meta.env.VITE_YORKIE_API_KEY,\n });\n await client.activate();\n const doc = new yorkie.Document('profile-stack');\n doc.subscribe('presence', (event) => {\n if (event.type !== DocEventType.PresenceChanged) {\n displayPeerList(doc.getPresences(), client.getID());\n }\n });\n await client.attach(doc, {\n // set the client's name and color to presence.\n initialPresence: {\n name: getRandomName(),\n color: getRandomColor(),\n },\n });\n\n window.addEventListener('beforeunload', () => {\n client.deactivate();\n });\n}\n\nconst MAX_PEER_VIEW = 4;\nconst createPeer = (name, color, type) => {\n const $peer = document.createElement('div');\n $peer.className = 'peer';\n\n if (type === 'main') {\n $peer.innerHTML = `\n
\n \"profile\"\n
\n
${name}
\n `;\n } else if (type === 'more') {\n $peer.innerHTML = `\n \"profile\"\n ${name}\n `;\n }\n return $peer;\n};\n\nconst displayPeerList = (peers, myClientID) => {\n const peerList = peers.filter(\n ({ clientID: id, presence }) =>\n id !== myClientID && presence.name && presence.color,\n );\n const peerCount = peerList.length + 1;\n const hasMorePeers = peerCount > MAX_PEER_VIEW;\n const $peerList = document.getElementById('peerList');\n $peerList.innerHTML = '';\n const $peerMoreList = document.createElement('div');\n $peerMoreList.className = 'peer-more-list speech-bubbles';\n\n const myPresence = peers.find(\n ({ clientID: id }) => id === myClientID,\n ).presence;\n const $me = createPeer(`${myPresence.name} (me)`, myPresence.color, 'main');\n $me.classList.add('me');\n $peerList.appendChild($me);\n peerList.forEach((peer, i) => {\n const { name, color } = peer.presence;\n if (i < MAX_PEER_VIEW - 1) {\n const $peer = createPeer(name, color, 'main');\n $peerList.appendChild($peer);\n return;\n }\n const $peer = createPeer(name, color, 'more');\n $peerMoreList.appendChild($peer);\n });\n\n if (hasMorePeers) {\n const $peer = document.createElement('div');\n $peer.className = 'peer more';\n $peer.innerHTML = `\n
\n +${peerCount - MAX_PEER_VIEW}\n
\n `;\n $peer.appendChild($peerMoreList);\n $peerList.appendChild($peer);\n }\n};\n\nmain();\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package.json","path":"/package.json","content":"{\n \"name\": \"profile-stack\",\n \"private\": true,\n \"version\": \"0.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"vite build\",\n \"preview\": \"vite preview\"\n },\n \"devDependencies\": {\n \"vite\": \"^3.2.7\"\n },\n \"dependencies\": {\n \"yorkie-js-sdk\": \"^0.4.7\"\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"css","name":"style.css","path":"/style.css","content":"* {\n margin: 0;\n padding: 0;\n}\n\nbody {\n --light-gray: #f5f3f1;\n --gray: #c2bdba;\n --black: #332e2b;\n --white: #fefdfb;\n\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100vh;\n color: var(--black);\n}\n\nimg {\n vertical-align: top;\n}\n\n*::-webkit-scrollbar {\n width: 10px;\n height: 4px;\n}\n\n*::-webkit-scrollbar-thumb {\n background: var(--gray);\n border-radius: 10px;\n border: 3px solid var(--white);\n}\n\n*::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.speech-bubbles {\n padding: 16px;\n border: 1px solid var(--gray);\n border-radius: 16px;\n}\n\n.speech-bubbles:before {\n position: absolute;\n top: 0;\n left: 50%;\n margin-left: -6px;\n margin-top: -8px;\n width: 0;\n height: 0;\n content: '';\n border-top: 0px solid transparent;\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n border-bottom: 8px solid var(--gray);\n}\n\n.speech-bubbles:after {\n position: absolute;\n top: 0;\n left: 50%;\n margin-left: -5px;\n margin-top: -6px;\n width: 0;\n height: 0;\n content: '';\n border-top: 0px solid transparent;\n border-left: 5px solid transparent;\n border-right: 5px solid transparent;\n border-bottom: 7px solid var(--white);\n}\n\n#peerList {\n display: inline-flex;\n border: 1px solid var(--gray);\n border-radius: 100px;\n white-space: nowrap;\n}\n\n.peer {\n position: relative;\n margin: 12px;\n}\n\n.profile-img {\n width: 52px;\n cursor: pointer;\n}\n\n.peer.me {\n order: -1;\n}\n\n.peer .name {\n font-weight: 900;\n white-space: nowrap;\n}\n\n.peer .speech-bubbles {\n display: none;\n position: absolute;\n top: 80px;\n left: 50%;\n transform: translate(-50%);\n background: var(--white);\n}\n\n.peer:hover .speech-bubbles {\n display: block;\n}\n\n.peer.more {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 52px;\n height: 52px;\n background: var(--light-gray);\n border-radius: 100%;\n font-weight: 900;\n font-size: 24px;\n cursor: pointer;\n}\n\n.peer-more-list {\n font-size: 16px;\n}\n\n.peer-more-list .peer {\n display: flex;\n align-items: center;\n margin: 0 0 12px 0;\n}\n\n.peer-more-list .peer:last-child {\n margin-bottom: 0;\n}\n\n.peer-more-list .profile-img {\n margin-right: 8px;\n width: 26px;\n}\n"},{"isFile":true,"isOpen":false,"language":"jpg","name":"thumbnail.jpg","path":"/thumbnail.jpg","content":""},{"isFile":true,"isOpen":false,"language":"javascript","name":"util.js","path":"/util.js","content":"const NAMES = [\n 'Ali',\n 'Beatriz',\n 'Charles',\n 'Diya',\n 'Eric',\n 'Fatima',\n 'Gabriel',\n 'Hanna',\n 'Johnson',\n 'Perry',\n 'Parker',\n 'Kelly',\n];\nexport const getRandomName = () => {\n const index = Math.floor(Math.random() * NAMES.length);\n return NAMES[index];\n};\n\nconst COLORS = ['red', 'yellow', 'orange', 'green', 'blue', 'purple'];\nexport const getRandomColor = () => {\n const index = Math.floor(Math.random() * COLORS.length);\n return COLORS[index];\n};\n"},{"isFile":true,"isOpen":false,"language":"javascript","name":"vite.config.js","path":"/vite.config.js","content":"import { defineConfig } from 'vite';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n base: '',\n});\n"}]} \ No newline at end of file diff --git a/examples/react-tldraw/fileInfo.ts b/examples/react-tldraw/fileInfo.ts index f419fa9..9e292a9 100644 --- a/examples/react-tldraw/fileInfo.ts +++ b/examples/react-tldraw/fileInfo.ts @@ -1,2 +1,2 @@ import { DirectoryInfo } from '@/utils/exampleFileUtils'; - export const FILE_INFO: DirectoryInfo = {"isFile":false,"name":"react-tldraw","path":"/","children":[{"isFile":false,"name":"src","path":"/src","children":[{"isFile":false,"name":"hooks","path":"/src/hooks","children":[{"isFile":true,"isOpen":false,"language":"typescript","name":"types.ts","path":"/src/hooks/types.ts","content":"// Yorkie type for typescript\nimport type { TDAsset, TDBinding, TDShape } from '@tldraw/tldraw';\n\nexport type Options = {\n apiKey?: string;\n presence: object;\n syncLoopDuration: number;\n reconnectStreamDelay: number;\n};\n\nexport type YorkieDocType = {\n shapes: Record;\n bindings: Record;\n assets: Record;\n};\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"useMultiplayerState.ts","path":"/src/hooks/useMultiplayerState.ts","content":"/* eslint-disable jsdoc/require-jsdoc */\nimport { useCallback, useEffect, useState } from 'react';\nimport {\n TDUserStatus,\n TDAsset,\n TDBinding,\n TDShape,\n TDUser,\n TldrawApp,\n} from '@tldraw/tldraw';\nimport { useThrottleCallback } from '@react-hook/throttle';\nimport * as yorkie from 'yorkie-js-sdk';\nimport randomColor from 'randomcolor';\nimport { uniqueNamesGenerator, names } from 'unique-names-generator';\n\nimport type { Options, YorkieDocType } from './types';\n\n// Yorkie Client declaration\nlet client: yorkie.Client;\n\n// Yorkie Document declaration\nlet doc: yorkie.Document;\n\nexport function useMultiplayerState(roomId: string) {\n const [app, setApp] = useState();\n const [loading, setLoading] = useState(true);\n\n // Callbacks --------------\n\n const onMount = useCallback(\n (app: TldrawApp) => {\n app.loadRoom(roomId);\n app.setIsLoading(true);\n app.pause();\n setApp(app);\n\n const randomName = uniqueNamesGenerator({\n dictionaries: [names],\n });\n\n // On mount, create new user\n app.updateUsers([\n {\n id: app!.currentUser!.id,\n point: [0, 0],\n color: randomColor(),\n status: TDUserStatus.Connected,\n activeShapes: [],\n selectedIds: [],\n metadata: { name: randomName }, // <-- custom metadata\n },\n ]);\n },\n [roomId],\n );\n\n // Update Yorkie doc when the app's shapes change.\n // Prevent overloading yorkie update api call by throttle\n const onChangePage = useThrottleCallback(\n (\n app: TldrawApp,\n shapes: Record,\n bindings: Record,\n ) => {\n if (!app || client === undefined || doc === undefined) return;\n\n doc.update((root) => {\n Object.entries(shapes).forEach(([id, shape]) => {\n if (!shape) {\n delete root.shapes[id];\n } else {\n root.shapes[id] = shape;\n }\n });\n\n Object.entries(bindings).forEach(([id, binding]) => {\n if (!binding) {\n delete root.bindings[id];\n } else {\n root.bindings[id] = binding;\n }\n });\n\n // Should store app.document.assets which is global asset storage referenced by inner page assets\n // Document key for assets should be asset.id (string), not index\n Object.entries(app.assets).forEach(([, asset]) => {\n if (!asset.id) {\n delete root.assets[asset.id];\n } else {\n root.assets[asset.id] = asset;\n }\n });\n });\n },\n 60,\n false,\n );\n\n // Handle presence updates when the user's pointer / selection changes\n const onChangePresence = useThrottleCallback(\n (app: TldrawApp, user: TDUser) => {\n if (!app || client === undefined || !client.isActive()) return;\n\n client.updatePresence('user', user);\n },\n 60,\n false,\n );\n\n // Document Changes --------\n\n useEffect(() => {\n if (!app) return;\n\n // Detach & deactive yorkie client before unload\n function handleDisconnect() {\n if (client === undefined || doc === undefined) return;\n\n client.detach(doc);\n client.deactivate();\n }\n\n window.addEventListener('beforeunload', handleDisconnect);\n\n // Subscribe to changes\n function handleChanges() {\n const root = doc.getRoot();\n\n // Parse proxy object to record\n const shapeRecord: Record = JSON.parse(\n root.shapes.toJSON(),\n );\n const bindingRecord: Record = JSON.parse(\n root.bindings.toJSON(),\n );\n const assetRecord: Record = JSON.parse(\n root.assets.toJSON(),\n );\n\n // Replace page content with changed(propagated) records\n app?.replacePageContent(shapeRecord, bindingRecord, assetRecord);\n }\n\n let stillAlive = true;\n\n // Setup the document's storage and subscriptions\n async function setupDocument() {\n try {\n // 01. Create client with RPCAddr(envoy) and options with presence and apiKey if provided.\n // Then activate client.\n const options: Options = {\n apiKey: import.meta.env.VITE_YORKIE_API_KEY,\n presence: {\n user: app?.currentUser,\n },\n syncLoopDuration: 0,\n reconnectStreamDelay: 1000,\n };\n\n client = new yorkie.Client(\n import.meta.env.VITE_YORKIE_API_ADDR,\n options,\n );\n await client.activate();\n\n // 01-1. Subscribe peers-changed event and update tldraw users state\n client.subscribe((event) => {\n if (event.type !== 'peers-changed') return;\n\n const { type, peers } = event.value;\n // remove leaved users\n if (type === 'unwatched') {\n peers[doc.getKey()].map((peer) => {\n app?.removeUser(peer.presence.user.id);\n });\n }\n\n // update users\n const allPeers = client\n .getPeersByDocKey(doc.getKey())\n .map((peer) => peer.presence.user);\n app?.updateUsers(allPeers);\n });\n\n // 02. Create document with tldraw custom object type, then attach it into the client.\n doc = new yorkie.Document(roomId);\n await client.attach(doc);\n\n // 03. Initialize document if document not exists.\n doc.update((root) => {\n if (!root.shapes) {\n root.shapes = {};\n }\n if (!root.bindings) {\n root.bindings = {};\n }\n if (!root.assets) {\n root.assets = {};\n }\n }, 'create shapes/bindings/assets object if not exists');\n\n // 04. Subscribe document event and handle changes.\n doc.subscribe((event) => {\n if (event.type === 'remote-change') {\n handleChanges();\n }\n });\n\n // 05. Sync client to sync document with other peers.\n await client.sync();\n\n if (stillAlive) {\n // Update the document with initial content\n handleChanges();\n\n // Zoom to fit the content & finish loading\n if (app) {\n app.zoomToFit();\n if (app.zoom > 1) {\n app.resetZoom();\n }\n app.setIsLoading(false);\n }\n\n setLoading(false);\n }\n } catch (e) {\n console.error(e);\n }\n }\n\n setupDocument();\n\n return () => {\n window.removeEventListener('beforeunload', handleDisconnect);\n stillAlive = false;\n };\n }, [app]);\n\n return {\n onMount,\n onChangePage,\n loading,\n onChangePresence,\n };\n}\n"}]},{"isFile":true,"isOpen":false,"language":"css","name":"App.css","path":"/src/App.css","content":"html,\n* {\n box-sizing: border-box;\n}\n\nbody {\n overscroll-behavior: none;\n margin: 0px;\n padding: 0px;\n font-size: 1em;\n font-family: Arial, Helvetica, sans-serif;\n}\n\n.tldraw {\n position: fixed;\n top: 0px;\n left: 0px;\n right: 0px;\n bottom: 0px;\n width: 100%;\n height: 100%;\n}"},{"isFile":true,"isOpen":false,"language":"tsx","name":"App.tsx","path":"/src/App.tsx","content":"import { Tldraw, useFileSystem } from '@tldraw/tldraw';\nimport { useMultiplayerState } from './hooks/useMultiplayerState';\nimport CustomCursor from './CustomCursor';\nimport './App.css';\n\n/*\nThis demo shows how to integrate TLDraw with a multiplayer room\nvia Yorkie.\n\nWarning: Keeping images enabled for multiplayer applications\nwithout providing a storage bucket based solution will cause\nmassive base64 string to be written to the multiplayer storage.\nIt's recommended to use a storage bucket based solution, such as\nAmazon AWS S3.\n*/\n\nexport default function App() {\n const fileSystemEvents = useFileSystem();\n const { ...events } = useMultiplayerState(\n `tldraw-${(new Date()).toISOString().substring(0, 10).replace(/-/g, '')}`\n );\n const component = { Cursor: CustomCursor };\n\n return (\n
\n \n
\n );\n}\n"},{"isFile":true,"isOpen":false,"language":"tsx","name":"CustomCursor.tsx","path":"/src/CustomCursor.tsx","content":"import { CursorComponent } from '@tldraw/core';\n\n// A custom cursor component.\n// Component overrides for the tldraw renderer\nconst CustomCursor: CursorComponent<{ name: 'Anonymous' }> = ({\n color,\n metadata,\n}) => {\n return (\n \n \n \n {metadata!.name}\n \n \n );\n};\n\nexport default CustomCursor;\n"},{"isFile":true,"isOpen":false,"language":"tsx","name":"main.tsx","path":"/src/main.tsx","content":"import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport App from './App';\n\nReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(\n \n \n ,\n);\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"vite-env.d.ts","path":"/src/vite-env.d.ts","content":"/// \n"}]},{"isFile":true,"isOpen":false,"language":"","name":".env","path":"/.env","content":"VITE_YORKIE_API_ADDR='http://localhost:8080'\nVITE_YORKIE_API_KEY=''"},{"isFile":true,"isOpen":false,"language":"production","name":".env.production","path":"/.env.production","content":"VITE_YORKIE_API_ADDR='https://api.yorkie.dev'\nVITE_YORKIE_API_KEY='cedaovjuioqlk4pjqn6g'"},{"isFile":true,"isOpen":false,"language":"","name":".gitignore","path":"/.gitignore","content":"# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"},{"isFile":true,"isOpen":false,"language":"markdown","name":"README.md","path":"/README.md","content":"# Yorkie React tldraw Example\n\n

\n \n \"Live\n \n

\n\n\"React\n\n## How to run demo\n\nAt project root, run below command to start Yorkie server and Envoy proxy.\n\n```bash\n$ docker-compose up -f docker/docker-compose.yml up --build -d\n```\n\nThen install dependencies and run the demo.\n\n```bash\n$ npm install\n```\n\nNow you can run the demo.\n\n```bash\n$ npm run dev\n```\n"},{"isFile":true,"isOpen":false,"language":"markup","name":"index.html","path":"/index.html","content":"\n\n \n \n \n react-tldraw\n \n \n
\n \n \n\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package-lock.json","path":"/package-lock.json","content":"{\n \"name\": \"react-tldraw\",\n \"version\": \"0.1.0\",\n \"lockfileVersion\": 2,\n \"requires\": true,\n \"packages\": {\n \"\": {\n \"name\": \"react-tldraw\",\n \"version\": \"0.1.0\",\n \"dependencies\": {\n \"@react-hook/throttle\": \"^2.2.0\",\n \"@tldraw/tldraw\": \"1.26.3\",\n \"randomcolor\": \"^0.6.2\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"unique-names-generator\": \"^4.7.1\",\n \"yorkie-js-sdk\": \"^0.3.5\"\n },\n \"devDependencies\": {\n \"@types/randomcolor\": \"^0.5.5\",\n \"@types/react\": \"^18.0.24\",\n \"@types/react-dom\": \"^18.0.8\",\n \"@vitejs/plugin-react\": \"^2.2.0\",\n \"typescript\": \"^4.6.4\",\n \"vite\": \"^3.2.7\"\n }\n },\n \"node_modules/@ampproject/remapping\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz\",\n \"integrity\": \"sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==\",\n \"dev\": true,\n \"dependencies\": {\n \"@jridgewell/gen-mapping\": \"^0.1.0\",\n \"@jridgewell/trace-mapping\": \"^0.3.9\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/code-frame\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz\",\n \"integrity\": \"sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/highlight\": \"^7.18.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/compat-data\": {\n \"version\": \"7.20.10\",\n \"resolved\": \"https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz\",\n \"integrity\": \"sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/core\": {\n \"version\": \"7.20.12\",\n \"resolved\": \"https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz\",\n \"integrity\": \"sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==\",\n \"dev\": true,\n \"dependencies\": {\n \"@ampproject/remapping\": \"^2.1.0\",\n \"@babel/code-frame\": \"^7.18.6\",\n \"@babel/generator\": \"^7.20.7\",\n \"@babel/helper-compilation-targets\": \"^7.20.7\",\n \"@babel/helper-module-transforms\": \"^7.20.11\",\n \"@babel/helpers\": \"^7.20.7\",\n \"@babel/parser\": \"^7.20.7\",\n \"@babel/template\": \"^7.20.7\",\n \"@babel/traverse\": \"^7.20.12\",\n \"@babel/types\": \"^7.20.7\",\n \"convert-source-map\": \"^1.7.0\",\n \"debug\": \"^4.1.0\",\n \"gensync\": \"^1.0.0-beta.2\",\n \"json5\": \"^2.2.2\",\n \"semver\": \"^6.3.0\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"funding\": {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/babel\"\n }\n },\n \"node_modules/@babel/generator\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz\",\n \"integrity\": \"sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/types\": \"^7.20.7\",\n \"@jridgewell/gen-mapping\": \"^0.3.2\",\n \"jsesc\": \"^2.5.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping\": {\n \"version\": \"0.3.2\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz\",\n \"integrity\": \"sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==\",\n \"dev\": true,\n \"dependencies\": {\n \"@jridgewell/set-array\": \"^1.0.1\",\n \"@jridgewell/sourcemap-codec\": \"^1.4.10\",\n \"@jridgewell/trace-mapping\": \"^0.3.9\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/helper-annotate-as-pure\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz\",\n \"integrity\": \"sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/types\": \"^7.18.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-compilation-targets\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz\",\n \"integrity\": \"sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/compat-data\": \"^7.20.5\",\n \"@babel/helper-validator-option\": \"^7.18.6\",\n \"browserslist\": \"^4.21.3\",\n \"lru-cache\": \"^5.1.1\",\n \"semver\": \"^6.3.0\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0\"\n }\n },\n \"node_modules/@babel/helper-environment-visitor\": {\n \"version\": \"7.18.9\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz\",\n \"integrity\": \"sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-function-name\": {\n \"version\": \"7.19.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz\",\n \"integrity\": \"sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/template\": \"^7.18.10\",\n \"@babel/types\": \"^7.19.0\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-hoist-variables\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz\",\n \"integrity\": \"sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/types\": \"^7.18.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-imports\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz\",\n \"integrity\": \"sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/types\": \"^7.18.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-transforms\": {\n \"version\": \"7.20.11\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz\",\n \"integrity\": \"sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/helper-environment-visitor\": \"^7.18.9\",\n \"@babel/helper-module-imports\": \"^7.18.6\",\n \"@babel/helper-simple-access\": \"^7.20.2\",\n \"@babel/helper-split-export-declaration\": \"^7.18.6\",\n \"@babel/helper-validator-identifier\": \"^7.19.1\",\n \"@babel/template\": \"^7.20.7\",\n \"@babel/traverse\": \"^7.20.10\",\n \"@babel/types\": \"^7.20.7\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-plugin-utils\": {\n \"version\": \"7.20.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz\",\n \"integrity\": \"sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-simple-access\": {\n \"version\": \"7.20.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz\",\n \"integrity\": \"sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/types\": \"^7.20.2\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-split-export-declaration\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz\",\n \"integrity\": \"sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/types\": \"^7.18.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-string-parser\": {\n \"version\": \"7.19.4\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz\",\n \"integrity\": \"sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-identifier\": {\n \"version\": \"7.19.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz\",\n \"integrity\": \"sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-option\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz\",\n \"integrity\": \"sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helpers\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz\",\n \"integrity\": \"sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/template\": \"^7.20.7\",\n \"@babel/traverse\": \"^7.20.7\",\n \"@babel/types\": \"^7.20.7\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/highlight\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz\",\n \"integrity\": \"sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/helper-validator-identifier\": \"^7.18.6\",\n \"chalk\": \"^2.0.0\",\n \"js-tokens\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/parser\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz\",\n \"integrity\": \"sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==\",\n \"dev\": true,\n \"bin\": {\n \"parser\": \"bin/babel-parser.js\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/plugin-syntax-jsx\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz\",\n \"integrity\": \"sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.18.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.7.tgz\",\n \"integrity\": \"sha512-Tfq7qqD+tRj3EoDhY00nn2uP2hsRxgYGi5mLQ5TimKav0a9Lrpd4deE+fcLXU8zFYRjlKPHZhpCvfEA6qnBxqQ==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/helper-annotate-as-pure\": \"^7.18.6\",\n \"@babel/helper-module-imports\": \"^7.18.6\",\n \"@babel/helper-plugin-utils\": \"^7.20.2\",\n \"@babel/plugin-syntax-jsx\": \"^7.18.6\",\n \"@babel/types\": \"^7.20.7\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-development\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz\",\n \"integrity\": \"sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/plugin-transform-react-jsx\": \"^7.18.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-self\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz\",\n \"integrity\": \"sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.18.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-source\": {\n \"version\": \"7.19.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz\",\n \"integrity\": \"sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.19.0\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/runtime\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz\",\n \"integrity\": \"sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==\",\n \"dependencies\": {\n \"regenerator-runtime\": \"^0.13.11\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/template\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz\",\n \"integrity\": \"sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.18.6\",\n \"@babel/parser\": \"^7.20.7\",\n \"@babel/types\": \"^7.20.7\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/traverse\": {\n \"version\": \"7.20.12\",\n \"resolved\": \"https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz\",\n \"integrity\": \"sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.18.6\",\n \"@babel/generator\": \"^7.20.7\",\n \"@babel/helper-environment-visitor\": \"^7.18.9\",\n \"@babel/helper-function-name\": \"^7.19.0\",\n \"@babel/helper-hoist-variables\": \"^7.18.6\",\n \"@babel/helper-split-export-declaration\": \"^7.18.6\",\n \"@babel/parser\": \"^7.20.7\",\n \"@babel/types\": \"^7.20.7\",\n \"debug\": \"^4.1.0\",\n \"globals\": \"^11.1.0\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/types\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz\",\n \"integrity\": \"sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/helper-string-parser\": \"^7.19.4\",\n \"@babel/helper-validator-identifier\": \"^7.19.1\",\n \"to-fast-properties\": \"^2.0.0\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@esbuild/android-arm\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz\",\n \"integrity\": \"sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz\",\n \"integrity\": \"sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@floating-ui/core\": {\n \"version\": \"0.7.3\",\n \"resolved\": \"https://registry.npmjs.org/@floating-ui/core/-/core-0.7.3.tgz\",\n \"integrity\": \"sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==\"\n },\n \"node_modules/@floating-ui/dom\": {\n \"version\": \"0.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@floating-ui/dom/-/dom-0.5.4.tgz\",\n \"integrity\": \"sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==\",\n \"dependencies\": {\n \"@floating-ui/core\": \"^0.7.3\"\n }\n },\n \"node_modules/@floating-ui/react-dom\": {\n \"version\": \"0.7.2\",\n \"resolved\": \"https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-0.7.2.tgz\",\n \"integrity\": \"sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg==\",\n \"dependencies\": {\n \"@floating-ui/dom\": \"^0.5.3\",\n \"use-isomorphic-layout-effect\": \"^1.1.1\"\n },\n \"peerDependencies\": {\n \"react\": \">=16.8.0\",\n \"react-dom\": \">=16.8.0\"\n }\n },\n \"node_modules/@formatjs/ecma402-abstract\": {\n \"version\": \"1.14.3\",\n \"resolved\": \"https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.14.3.tgz\",\n \"integrity\": \"sha512-SlsbRC/RX+/zg4AApWIFNDdkLtFbkq3LNoZWXZCE/nHVKqoIJyaoQyge/I0Y38vLxowUn9KTtXgusLD91+orbg==\",\n \"dependencies\": {\n \"@formatjs/intl-localematcher\": \"0.2.32\",\n \"tslib\": \"^2.4.0\"\n }\n },\n \"node_modules/@formatjs/fast-memoize\": {\n \"version\": \"1.2.7\",\n \"resolved\": \"https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-1.2.7.tgz\",\n \"integrity\": \"sha512-hPeM5LXUUjtCKPybWOUAWpv8lpja8Xz+uKprFPJcg5F2Rd+/bf1E0UUsLRpaAgOReAf5HMRtoIgv/UcyPICrTQ==\",\n \"dependencies\": {\n \"tslib\": \"^2.4.0\"\n }\n },\n \"node_modules/@formatjs/icu-messageformat-parser\": {\n \"version\": \"2.1.14\",\n \"resolved\": \"https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.14.tgz\",\n \"integrity\": \"sha512-0KqeVOb72losEhUW+59vhZGGd14s1f35uThfEMVKZHKLEObvJdFTiI3ZQwvTMUCzLEMxnS6mtnYPmG4mTvwd3Q==\",\n \"dependencies\": {\n \"@formatjs/ecma402-abstract\": \"1.14.3\",\n \"@formatjs/icu-skeleton-parser\": \"1.3.18\",\n \"tslib\": \"^2.4.0\"\n }\n },\n \"node_modules/@formatjs/icu-skeleton-parser\": {\n \"version\": \"1.3.18\",\n \"resolved\": \"https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.18.tgz\",\n \"integrity\": \"sha512-ND1ZkZfmLPcHjAH1sVpkpQxA+QYfOX3py3SjKWMUVGDow18gZ0WPqz3F+pJLYQMpS2LnnQ5zYR2jPVYTbRwMpg==\",\n \"dependencies\": {\n \"@formatjs/ecma402-abstract\": \"1.14.3\",\n \"tslib\": \"^2.4.0\"\n }\n },\n \"node_modules/@formatjs/intl\": {\n \"version\": \"2.6.3\",\n \"resolved\": \"https://registry.npmjs.org/@formatjs/intl/-/intl-2.6.3.tgz\",\n \"integrity\": \"sha512-JaVZk14U/GypVfCZPevQ0KdruFkq16FXx7g398/Dm+YEx/W7sRiftbZeDy4wQ7WGryb45e763XycxD9o/vm9BA==\",\n \"dependencies\": {\n \"@formatjs/ecma402-abstract\": \"1.14.3\",\n \"@formatjs/fast-memoize\": \"1.2.7\",\n \"@formatjs/icu-messageformat-parser\": \"2.1.14\",\n \"@formatjs/intl-displaynames\": \"6.2.3\",\n \"@formatjs/intl-listformat\": \"7.1.7\",\n \"intl-messageformat\": \"10.2.5\",\n \"tslib\": \"^2.4.0\"\n },\n \"peerDependencies\": {\n \"typescript\": \"^4.7\"\n },\n \"peerDependenciesMeta\": {\n \"typescript\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/@formatjs/intl-displaynames\": {\n \"version\": \"6.2.3\",\n \"resolved\": \"https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-6.2.3.tgz\",\n \"integrity\": \"sha512-teB0L68MDGM8jEKQg55w7nvFjzeLHE6e3eK/04s+iuEVYYmvjjiHJKHrthKENzcJ0F6mHf/AwXrbX+1mKxT6AQ==\",\n \"dependencies\": {\n \"@formatjs/ecma402-abstract\": \"1.14.3\",\n \"@formatjs/intl-localematcher\": \"0.2.32\",\n \"tslib\": \"^2.4.0\"\n }\n },\n \"node_modules/@formatjs/intl-listformat\": {\n \"version\": \"7.1.7\",\n \"resolved\": \"https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-7.1.7.tgz\",\n \"integrity\": \"sha512-Zzf5ruPpfJnrAA2hGgf/6pMgQ3tx9oJVhpqycFDavHl3eEzrwdHddGqGdSNwhd0bB4NAFttZNQdmKDldc5iDZw==\",\n \"dependencies\": {\n \"@formatjs/ecma402-abstract\": \"1.14.3\",\n \"@formatjs/intl-localematcher\": \"0.2.32\",\n \"tslib\": \"^2.4.0\"\n }\n },\n \"node_modules/@formatjs/intl-localematcher\": {\n \"version\": \"0.2.32\",\n \"resolved\": \"https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.32.tgz\",\n \"integrity\": \"sha512-k/MEBstff4sttohyEpXxCmC3MqbUn9VvHGlZ8fauLzkbwXmVrEeyzS+4uhrvAk9DWU9/7otYWxyDox4nT/KVLQ==\",\n \"dependencies\": {\n \"tslib\": \"^2.4.0\"\n }\n },\n \"node_modules/@jridgewell/gen-mapping\": {\n \"version\": \"0.1.1\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz\",\n \"integrity\": \"sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==\",\n \"dev\": true,\n \"dependencies\": {\n \"@jridgewell/set-array\": \"^1.0.0\",\n \"@jridgewell/sourcemap-codec\": \"^1.4.10\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@jridgewell/resolve-uri\": {\n \"version\": \"3.1.0\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz\",\n \"integrity\": \"sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@jridgewell/set-array\": {\n \"version\": \"1.1.2\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz\",\n \"integrity\": \"sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@jridgewell/sourcemap-codec\": {\n \"version\": \"1.4.14\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz\",\n \"integrity\": \"sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==\",\n \"dev\": true\n },\n \"node_modules/@jridgewell/trace-mapping\": {\n \"version\": \"0.3.17\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz\",\n \"integrity\": \"sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==\",\n \"dev\": true,\n \"dependencies\": {\n \"@jridgewell/resolve-uri\": \"3.1.0\",\n \"@jridgewell/sourcemap-codec\": \"1.4.14\"\n }\n },\n \"node_modules/@radix-ui/primitive\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz\",\n \"integrity\": \"sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\"\n }\n },\n \"node_modules/@radix-ui/react-alert-dialog\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.0.2.tgz\",\n \"integrity\": \"sha512-0MtxV53FaEEBOKRgyLnEqHZKKDS5BldQ9oUBsKVXWI5FHbl2jp35qs+0aJET+K5hJDsc40kQUzP7g+wC7tqrqA==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/primitive\": \"1.0.0\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-dialog\": \"1.0.2\",\n \"@radix-ui/react-primitive\": \"1.0.1\",\n \"@radix-ui/react-slot\": \"1.0.1\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-arrow\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.0.tgz\",\n \"integrity\": \"sha512-1MUuv24HCdepi41+qfv125EwMuxgQ+U+h0A9K3BjCO/J8nVRREKHHpkD9clwfnjEDk9hgGzCnff4aUKCPiRepw==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-primitive\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-arrow/node_modules/@radix-ui/react-primitive\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz\",\n \"integrity\": \"sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-slot\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-arrow/node_modules/@radix-ui/react-slot\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz\",\n \"integrity\": \"sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-collection\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.0.tgz\",\n \"integrity\": \"sha512-8i1pf5dKjnq90Z8udnnXKzdCEV3/FYrfw0n/b6NvB6piXEn3fO1bOh7HBcpG8XrnIXzxlYu2oCcR38QpyLS/mg==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.0\",\n \"@radix-ui/react-slot\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-primitive\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz\",\n \"integrity\": \"sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-slot\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz\",\n \"integrity\": \"sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-compose-refs\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz\",\n \"integrity\": \"sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-context\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz\",\n \"integrity\": \"sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-context-menu\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-1.0.0.tgz\",\n \"integrity\": \"sha512-JkwOgdXwErwEEpsmgu0Ob8zD3gzWS1brPXnNGPyZEtR6/EYyDgruQYKiihXVsCrPCdrNUHawop9I1+6JTdXPTA==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/primitive\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-menu\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.0\",\n \"@radix-ui/react-use-callback-ref\": \"1.0.0\",\n \"@radix-ui/react-use-controllable-state\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-primitive\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz\",\n \"integrity\": \"sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-slot\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-context-menu/node_modules/@radix-ui/react-slot\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz\",\n \"integrity\": \"sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-dialog\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.2.tgz\",\n \"integrity\": \"sha512-EKxxp2WNSmUPkx4trtWNmZ4/vAYEg7JkAfa1HKBUnaubw9eHzf1Orr9B472lJYaYz327RHDrd4R95fsw7VR8DA==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/primitive\": \"1.0.0\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-dismissable-layer\": \"1.0.2\",\n \"@radix-ui/react-focus-guards\": \"1.0.0\",\n \"@radix-ui/react-focus-scope\": \"1.0.1\",\n \"@radix-ui/react-id\": \"1.0.0\",\n \"@radix-ui/react-portal\": \"1.0.1\",\n \"@radix-ui/react-presence\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.1\",\n \"@radix-ui/react-slot\": \"1.0.1\",\n \"@radix-ui/react-use-controllable-state\": \"1.0.0\",\n \"aria-hidden\": \"^1.1.1\",\n \"react-remove-scroll\": \"2.5.5\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-direction\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.0.tgz\",\n \"integrity\": \"sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-dismissable-layer\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.2.tgz\",\n \"integrity\": \"sha512-WjJzMrTWROozDqLB0uRWYvj4UuXsM/2L19EmQ3Au+IJWqwvwq9Bwd+P8ivo0Deg9JDPArR1I6MbWNi1CmXsskg==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/primitive\": \"1.0.0\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.1\",\n \"@radix-ui/react-use-callback-ref\": \"1.0.0\",\n \"@radix-ui/react-use-escape-keydown\": \"1.0.2\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-dropdown-menu\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-1.0.0.tgz\",\n \"integrity\": \"sha512-Ptben3TxPWrZLbInO7zjAK73kmjYuStsxfg6ujgt+EywJyREoibhZYnsSNqC+UiOtl4PdW/MOHhxVDtew5fouQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/primitive\": \"1.0.0\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-id\": \"1.0.0\",\n \"@radix-ui/react-menu\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.0\",\n \"@radix-ui/react-use-controllable-state\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-primitive\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz\",\n \"integrity\": \"sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-slot\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-dropdown-menu/node_modules/@radix-ui/react-slot\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz\",\n \"integrity\": \"sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-focus-guards\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz\",\n \"integrity\": \"sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-focus-scope\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.1.tgz\",\n \"integrity\": \"sha512-Ej2MQTit8IWJiS2uuujGUmxXjF/y5xZptIIQnyd2JHLwtV0R2j9NRVoRj/1j/gJ7e3REdaBw4Hjf4a1ImhkZcQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.1\",\n \"@radix-ui/react-use-callback-ref\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-icons\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.1.1.tgz\",\n \"integrity\": \"sha512-xc3wQC59rsFylVbSusQCrrM+6695ppF730Q6yqzhRdqDcRNWIm2R6ngpzBoSOQMcwnq4p805F+Gr7xo4fmtN1A==\",\n \"peerDependencies\": {\n \"react\": \"^16.x || ^17.x || ^18.x\"\n }\n },\n \"node_modules/@radix-ui/react-id\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz\",\n \"integrity\": \"sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-use-layout-effect\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-menu\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-1.0.0.tgz\",\n \"integrity\": \"sha512-icW4C64T6nHh3Z4Q1fxO1RlSShouFF4UpUmPV8FLaJZfphDljannKErDuALDx4ClRLihAPZ9i+PrLNPoWS2DMA==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/primitive\": \"1.0.0\",\n \"@radix-ui/react-collection\": \"1.0.0\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-direction\": \"1.0.0\",\n \"@radix-ui/react-dismissable-layer\": \"1.0.0\",\n \"@radix-ui/react-focus-guards\": \"1.0.0\",\n \"@radix-ui/react-focus-scope\": \"1.0.0\",\n \"@radix-ui/react-id\": \"1.0.0\",\n \"@radix-ui/react-popper\": \"1.0.0\",\n \"@radix-ui/react-portal\": \"1.0.0\",\n \"@radix-ui/react-presence\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.0\",\n \"@radix-ui/react-roving-focus\": \"1.0.0\",\n \"@radix-ui/react-slot\": \"1.0.0\",\n \"@radix-ui/react-use-callback-ref\": \"1.0.0\",\n \"aria-hidden\": \"^1.1.1\",\n \"react-remove-scroll\": \"2.5.4\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-dismissable-layer\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.0.tgz\",\n \"integrity\": \"sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/primitive\": \"1.0.0\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.0\",\n \"@radix-ui/react-use-callback-ref\": \"1.0.0\",\n \"@radix-ui/react-use-escape-keydown\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-focus-scope\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.0.tgz\",\n \"integrity\": \"sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.0\",\n \"@radix-ui/react-use-callback-ref\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-portal\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.0.tgz\",\n \"integrity\": \"sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-primitive\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-primitive\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz\",\n \"integrity\": \"sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-slot\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz\",\n \"integrity\": \"sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-use-escape-keydown\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz\",\n \"integrity\": \"sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-use-callback-ref\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-menu/node_modules/react-remove-scroll\": {\n \"version\": \"2.5.4\",\n \"resolved\": \"https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz\",\n \"integrity\": \"sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==\",\n \"dependencies\": {\n \"react-remove-scroll-bar\": \"^2.3.3\",\n \"react-style-singleton\": \"^2.2.1\",\n \"tslib\": \"^2.1.0\",\n \"use-callback-ref\": \"^1.3.0\",\n \"use-sidecar\": \"^1.1.2\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"peerDependencies\": {\n \"@types/react\": \"^16.8.0 || ^17.0.0 || ^18.0.0\",\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/react\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/@radix-ui/react-popover\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.2.tgz\",\n \"integrity\": \"sha512-4tqZEl9w95R5mlZ/sFdgBnfhCBOEPepLIurBA5kt/qaAhldJ1tNQd0ngr0ET0AHbPotT4mwxMPr7a+MA/wbK0g==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/primitive\": \"1.0.0\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-dismissable-layer\": \"1.0.2\",\n \"@radix-ui/react-focus-guards\": \"1.0.0\",\n \"@radix-ui/react-focus-scope\": \"1.0.1\",\n \"@radix-ui/react-id\": \"1.0.0\",\n \"@radix-ui/react-popper\": \"1.0.1\",\n \"@radix-ui/react-portal\": \"1.0.1\",\n \"@radix-ui/react-presence\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.1\",\n \"@radix-ui/react-slot\": \"1.0.1\",\n \"@radix-ui/react-use-controllable-state\": \"1.0.0\",\n \"aria-hidden\": \"^1.1.1\",\n \"react-remove-scroll\": \"2.5.5\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-arrow\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.1.tgz\",\n \"integrity\": \"sha512-1yientwXqXcErDHEv8av9ZVNEBldH8L9scVR3is20lL+jOCfcJyMFZFEY5cgIrgexsq1qggSXqiEL/d/4f+QXA==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-primitive\": \"1.0.1\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-popper\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.0.1.tgz\",\n \"integrity\": \"sha512-J4Vj7k3k+EHNWgcKrE+BLlQfpewxA7Zd76h5I0bIa+/EqaIZ3DuwrbPj49O3wqN+STnXsBuxiHLiF0iU3yfovw==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@floating-ui/react-dom\": \"0.7.2\",\n \"@radix-ui/react-arrow\": \"1.0.1\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.1\",\n \"@radix-ui/react-use-layout-effect\": \"1.0.0\",\n \"@radix-ui/react-use-rect\": \"1.0.0\",\n \"@radix-ui/react-use-size\": \"1.0.0\",\n \"@radix-ui/rect\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-popper\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.0.0.tgz\",\n \"integrity\": \"sha512-k2dDd+1Wl0XWAMs9ZvAxxYsB9sOsEhrFQV4CINd7IUZf0wfdye4OHen9siwxvZImbzhgVeKTJi68OQmPRvVdMg==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@floating-ui/react-dom\": \"0.7.2\",\n \"@radix-ui/react-arrow\": \"1.0.0\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.0\",\n \"@radix-ui/react-use-layout-effect\": \"1.0.0\",\n \"@radix-ui/react-use-rect\": \"1.0.0\",\n \"@radix-ui/react-use-size\": \"1.0.0\",\n \"@radix-ui/rect\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-primitive\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz\",\n \"integrity\": \"sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-slot\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-popper/node_modules/@radix-ui/react-slot\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz\",\n \"integrity\": \"sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-portal\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.1.tgz\",\n \"integrity\": \"sha512-NY2vUWI5WENgAT1nfC6JS7RU5xRYBfjZVLq0HmgEN1Ezy3rk/UruMV4+Rd0F40PEaFC5SrLS1ixYvcYIQrb4Ig==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-primitive\": \"1.0.1\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-presence\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz\",\n \"integrity\": \"sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-use-layout-effect\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-primitive\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz\",\n \"integrity\": \"sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-slot\": \"1.0.1\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-roving-focus\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.0.tgz\",\n \"integrity\": \"sha512-lHvO4MhvoWpeNbiJAoyDsEtbKqP2jkkdwsMVJ3kfqbkC71J/aXE6Th6gkZA1xHEqSku+t+UgoDjvE7Z3gsBpcg==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/primitive\": \"1.0.0\",\n \"@radix-ui/react-collection\": \"1.0.0\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-direction\": \"1.0.0\",\n \"@radix-ui/react-id\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.0\",\n \"@radix-ui/react-use-callback-ref\": \"1.0.0\",\n \"@radix-ui/react-use-controllable-state\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-primitive\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz\",\n \"integrity\": \"sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-slot\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-roving-focus/node_modules/@radix-ui/react-slot\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz\",\n \"integrity\": \"sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-slot\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz\",\n \"integrity\": \"sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-tooltip\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.2.tgz\",\n \"integrity\": \"sha512-11gUlok2rv5mu+KBtxniOKKNKjqC/uTbgFHWoQdbF46vMV+zjDaBvCtVDK9+MTddlpmlisGPGvvojX7Qm0yr+g==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/primitive\": \"1.0.0\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-dismissable-layer\": \"1.0.2\",\n \"@radix-ui/react-id\": \"1.0.0\",\n \"@radix-ui/react-popper\": \"1.0.1\",\n \"@radix-ui/react-portal\": \"1.0.1\",\n \"@radix-ui/react-presence\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.1\",\n \"@radix-ui/react-slot\": \"1.0.1\",\n \"@radix-ui/react-use-controllable-state\": \"1.0.0\",\n \"@radix-ui/react-visually-hidden\": \"1.0.1\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-arrow\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.1.tgz\",\n \"integrity\": \"sha512-1yientwXqXcErDHEv8av9ZVNEBldH8L9scVR3is20lL+jOCfcJyMFZFEY5cgIrgexsq1qggSXqiEL/d/4f+QXA==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-primitive\": \"1.0.1\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-popper\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.0.1.tgz\",\n \"integrity\": \"sha512-J4Vj7k3k+EHNWgcKrE+BLlQfpewxA7Zd76h5I0bIa+/EqaIZ3DuwrbPj49O3wqN+STnXsBuxiHLiF0iU3yfovw==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@floating-ui/react-dom\": \"0.7.2\",\n \"@radix-ui/react-arrow\": \"1.0.1\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.1\",\n \"@radix-ui/react-use-layout-effect\": \"1.0.0\",\n \"@radix-ui/react-use-rect\": \"1.0.0\",\n \"@radix-ui/react-use-size\": \"1.0.0\",\n \"@radix-ui/rect\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-use-callback-ref\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz\",\n \"integrity\": \"sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-use-controllable-state\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz\",\n \"integrity\": \"sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-use-callback-ref\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-use-escape-keydown\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.2.tgz\",\n \"integrity\": \"sha512-DXGim3x74WgUv+iMNCF+cAo8xUHHeqvjx8zs7trKf+FkQKPQXLk2sX7Gx1ysH7Q76xCpZuxIJE7HLPxRE+Q+GA==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-use-callback-ref\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-use-layout-effect\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz\",\n \"integrity\": \"sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-use-rect\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.0.tgz\",\n \"integrity\": \"sha512-TB7pID8NRMEHxb/qQJpvSt3hQU4sqNPM1VCTjTRjEOa7cEop/QMuq8S6fb/5Tsz64kqSvB9WnwsDHtjnrM9qew==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/rect\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-use-size\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.0.tgz\",\n \"integrity\": \"sha512-imZ3aYcoYCKhhgNpkNDh/aTiU05qw9hX+HHI1QDBTyIlcFjgeFlKKySNGMwTp7nYFLQg/j0VA2FmCY4WPDDHMg==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-use-layout-effect\": \"1.0.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/react-visually-hidden\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.1.tgz\",\n \"integrity\": \"sha512-K1hJcCMfWfiYUibRqf3V8r5Drpyf7rh44jnrwAbdvI5iCCijilBBeyQv9SKidYNZIopMdCyR9FnIjkHxHN0FcQ==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-primitive\": \"1.0.1\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.8 || ^17.0 || ^18.0\",\n \"react-dom\": \"^16.8 || ^17.0 || ^18.0\"\n }\n },\n \"node_modules/@radix-ui/rect\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.0.tgz\",\n \"integrity\": \"sha512-d0O68AYy/9oeEy1DdC07bz1/ZXX+DqCskRd3i4JzLSTXwefzaepQrKjXC7aNM8lTHjFLDO0pDgaEiQ7jEk+HVg==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.13.10\"\n }\n },\n \"node_modules/@react-hook/latest\": {\n \"version\": \"1.0.3\",\n \"resolved\": \"https://registry.npmjs.org/@react-hook/latest/-/latest-1.0.3.tgz\",\n \"integrity\": \"sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==\",\n \"peerDependencies\": {\n \"react\": \">=16.8\"\n }\n },\n \"node_modules/@react-hook/throttle\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@react-hook/throttle/-/throttle-2.2.0.tgz\",\n \"integrity\": \"sha512-LJ5eg+yMV8lXtqK3lR+OtOZ2WH/EfWvuiEEu0M3bhR7dZRfTyEJKxH1oK9uyBxiXPtWXiQggWbZirMCXam51tg==\",\n \"dependencies\": {\n \"@react-hook/latest\": \"^1.0.2\"\n },\n \"peerDependencies\": {\n \"react\": \">=16.8\"\n }\n },\n \"node_modules/@stitches/react\": {\n \"version\": \"1.2.8\",\n \"resolved\": \"https://registry.npmjs.org/@stitches/react/-/react-1.2.8.tgz\",\n \"integrity\": \"sha512-9g9dWI4gsSVe8bNLlb+lMkBYsnIKCZTmvqvDG+Avnn69XfmHZKiaMrx7cgTaddq7aTPPmXiTsbFcUy0xgI4+wA==\",\n \"peerDependencies\": {\n \"react\": \">= 16.3.0\"\n }\n },\n \"node_modules/@tldraw/core\": {\n \"version\": \"1.20.3\",\n \"resolved\": \"https://registry.npmjs.org/@tldraw/core/-/core-1.20.3.tgz\",\n \"integrity\": \"sha512-R/HqtQOg8yedcN70m75ekdm2u6dAHQpg3uxmzd7/TsdUnbfZc5UMp3TakYlTD6JwSSRV0n2huI4AD8D/NJ5jEw==\",\n \"dependencies\": {\n \"@tldraw/intersect\": \"^1.8.0\",\n \"@tldraw/vec\": \"^1.8.0\",\n \"@use-gesture/react\": \"^10.2.19\",\n \"perfect-freehand\": \"^1.1.0\"\n },\n \"peerDependencies\": {\n \"react\": \">=16.8\",\n \"react-dom\": \">=16.8\"\n }\n },\n \"node_modules/@tldraw/intersect\": {\n \"version\": \"1.8.0\",\n \"resolved\": \"https://registry.npmjs.org/@tldraw/intersect/-/intersect-1.8.0.tgz\",\n \"integrity\": \"sha512-0UarshNpyq2+O4o0xHMJIBgF0E630mes5CkMoO+D5xgYppSBIkeqYDcv0ujsmAhMKX1O6Y0ShuuHeflBEULUoQ==\",\n \"dependencies\": {\n \"@tldraw/vec\": \"^1.8.0\"\n }\n },\n \"node_modules/@tldraw/tldraw\": {\n \"version\": \"1.26.3\",\n \"resolved\": \"https://registry.npmjs.org/@tldraw/tldraw/-/tldraw-1.26.3.tgz\",\n \"integrity\": \"sha512-u8FfU3Q84y9E0PFLtw857bkmtlos4+/SSta9IrKQugrqVLBWzyixa2Wfk4e8h+Fr3CLCPa7uaBnlvT3Awr6dDQ==\",\n \"dependencies\": {\n \"@radix-ui/react-alert-dialog\": \"^1.0.0\",\n \"@radix-ui/react-context-menu\": \"^1.0.0\",\n \"@radix-ui/react-dialog\": \"^1.0.0\",\n \"@radix-ui/react-dropdown-menu\": \"^1.0.0\",\n \"@radix-ui/react-icons\": \"^1.1.1\",\n \"@radix-ui/react-popover\": \"^1.0.0\",\n \"@radix-ui/react-tooltip\": \"^1.0.0\",\n \"@stitches/react\": \"^1.2.8\",\n \"@tldraw/core\": \"^1.20.2\",\n \"@tldraw/intersect\": \"^1.8.0\",\n \"@tldraw/vec\": \"^1.8.0\",\n \"browser-fs-access\": \"^0.31.0\",\n \"idb-keyval\": \"^6.2.0\",\n \"perfect-freehand\": \"^1.2.0\",\n \"react-error-boundary\": \"^3.1.4\",\n \"react-hotkeys-hook\": \"^3.4.7\",\n \"react-intl\": \"^6.1.1\",\n \"tslib\": \"^2.4.0\",\n \"zustand\": \"^4.1.1\"\n },\n \"peerDependencies\": {\n \"react\": \">=16.8\",\n \"react-dom\": \">=16.8\"\n }\n },\n \"node_modules/@tldraw/vec\": {\n \"version\": \"1.8.0\",\n \"resolved\": \"https://registry.npmjs.org/@tldraw/vec/-/vec-1.8.0.tgz\",\n \"integrity\": \"sha512-GiS5Df3CzXY/fPBFcM0CKFERZfI4Cg1X33VPZX+NLo7Fwm/h9zu/aU24N1mG75Q9LuMnwKm7woxKr8BiUXGYCg==\"\n },\n \"node_modules/@types/google-protobuf\": {\n \"version\": \"3.15.6\",\n \"resolved\": \"https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.6.tgz\",\n \"integrity\": \"sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==\"\n },\n \"node_modules/@types/hoist-non-react-statics\": {\n \"version\": \"3.3.1\",\n \"resolved\": \"https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz\",\n \"integrity\": \"sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==\",\n \"dependencies\": {\n \"@types/react\": \"*\",\n \"hoist-non-react-statics\": \"^3.3.0\"\n }\n },\n \"node_modules/@types/long\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz\",\n \"integrity\": \"sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==\"\n },\n \"node_modules/@types/prop-types\": {\n \"version\": \"15.7.5\",\n \"resolved\": \"https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz\",\n \"integrity\": \"sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==\"\n },\n \"node_modules/@types/randomcolor\": {\n \"version\": \"0.5.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/randomcolor/-/randomcolor-0.5.7.tgz\",\n \"integrity\": \"sha512-LPcG96dGYRCsXlk1fslUNIg6ebEi+bKNyn84uBL/pu2cRSf5i/djD3ArJZOyzszVMVV/DB87va6pMZP+tRSl/w==\",\n \"dev\": true\n },\n \"node_modules/@types/react\": {\n \"version\": \"18.0.26\",\n \"resolved\": \"https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz\",\n \"integrity\": \"sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==\",\n \"dependencies\": {\n \"@types/prop-types\": \"*\",\n \"@types/scheduler\": \"*\",\n \"csstype\": \"^3.0.2\"\n }\n },\n \"node_modules/@types/react-dom\": {\n \"version\": \"18.0.10\",\n \"resolved\": \"https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.10.tgz\",\n \"integrity\": \"sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==\",\n \"dev\": true,\n \"dependencies\": {\n \"@types/react\": \"*\"\n }\n },\n \"node_modules/@types/scheduler\": {\n \"version\": \"0.16.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz\",\n \"integrity\": \"sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==\"\n },\n \"node_modules/@use-gesture/core\": {\n \"version\": \"10.2.23\",\n \"resolved\": \"https://registry.npmjs.org/@use-gesture/core/-/core-10.2.23.tgz\",\n \"integrity\": \"sha512-Ynap/Uh6RX1Vgn3zNmFTyKapapdf7Av+GzAe6h+RsBZaxMF1z3cK6aohHPJP6T1hLrPyH/yehxa7RBqyESG9RA==\"\n },\n \"node_modules/@use-gesture/react\": {\n \"version\": \"10.2.23\",\n \"resolved\": \"https://registry.npmjs.org/@use-gesture/react/-/react-10.2.23.tgz\",\n \"integrity\": \"sha512-anj9j3Lm4l+/s60Jv1FD2m13r+T+aYstSHUT62hTugojM64LPe9XatfEVHRyWOrGjRU2buQhlm03xN8oxkg/OQ==\",\n \"dependencies\": {\n \"@use-gesture/core\": \"10.2.23\"\n },\n \"peerDependencies\": {\n \"react\": \">= 16.8.0\"\n }\n },\n \"node_modules/@vitejs/plugin-react\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.2.0.tgz\",\n \"integrity\": \"sha512-FFpefhvExd1toVRlokZgxgy2JtnBOdp4ZDsq7ldCWaqGSGn9UhWMAVm/1lxPL14JfNS5yGz+s9yFrQY6shoStA==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/core\": \"^7.19.6\",\n \"@babel/plugin-transform-react-jsx\": \"^7.19.0\",\n \"@babel/plugin-transform-react-jsx-development\": \"^7.18.6\",\n \"@babel/plugin-transform-react-jsx-self\": \"^7.18.6\",\n \"@babel/plugin-transform-react-jsx-source\": \"^7.19.6\",\n \"magic-string\": \"^0.26.7\",\n \"react-refresh\": \"^0.14.0\"\n },\n \"engines\": {\n \"node\": \"^14.18.0 || >=16.0.0\"\n },\n \"peerDependencies\": {\n \"vite\": \"^3.0.0\"\n }\n },\n \"node_modules/ansi-styles\": {\n \"version\": \"3.2.1\",\n \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz\",\n \"integrity\": \"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==\",\n \"dev\": true,\n \"dependencies\": {\n \"color-convert\": \"^1.9.0\"\n },\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/aria-hidden\": {\n \"version\": \"1.2.2\",\n \"resolved\": \"https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.2.tgz\",\n \"integrity\": \"sha512-6y/ogyDTk/7YAe91T3E2PR1ALVKyM2QbTio5HwM+N1Q6CMlCKhvClyIjkckBswa0f2xJhjsfzIGa1yVSe1UMVA==\",\n \"dependencies\": {\n \"tslib\": \"^2.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"peerDependencies\": {\n \"@types/react\": \"^16.9.0 || ^17.0.0 || ^18.0.0\",\n \"react\": \"^16.9.0 || ^17.0.0 || ^18.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/react\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/browser-fs-access\": {\n \"version\": \"0.31.1\",\n \"resolved\": \"https://registry.npmjs.org/browser-fs-access/-/browser-fs-access-0.31.1.tgz\",\n \"integrity\": \"sha512-jMz9f56DkLM7LyA8wZYO7CtpoF3RdUk1/FXrnRNybgV0R5eqk/fgFWR0k5IMjPYgK4jmZecytP/UDO5WBi9Dhg==\"\n },\n \"node_modules/browserslist\": {\n \"version\": \"4.21.4\",\n \"resolved\": \"https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz\",\n \"integrity\": \"sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n }\n ],\n \"dependencies\": {\n \"caniuse-lite\": \"^1.0.30001400\",\n \"electron-to-chromium\": \"^1.4.251\",\n \"node-releases\": \"^2.0.6\",\n \"update-browserslist-db\": \"^1.0.9\"\n },\n \"bin\": {\n \"browserslist\": \"cli.js\"\n },\n \"engines\": {\n \"node\": \"^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7\"\n }\n },\n \"node_modules/caniuse-lite\": {\n \"version\": \"1.0.30001442\",\n \"resolved\": \"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz\",\n \"integrity\": \"sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/caniuse-lite\"\n }\n ]\n },\n \"node_modules/chalk\": {\n \"version\": \"2.4.2\",\n \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz\",\n \"integrity\": \"sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==\",\n \"dev\": true,\n \"dependencies\": {\n \"ansi-styles\": \"^3.2.1\",\n \"escape-string-regexp\": \"^1.0.5\",\n \"supports-color\": \"^5.3.0\"\n },\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/color-convert\": {\n \"version\": \"1.9.3\",\n \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz\",\n \"integrity\": \"sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==\",\n \"dev\": true,\n \"dependencies\": {\n \"color-name\": \"1.1.3\"\n }\n },\n \"node_modules/color-name\": {\n \"version\": \"1.1.3\",\n \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz\",\n \"integrity\": \"sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==\",\n \"dev\": true\n },\n \"node_modules/convert-source-map\": {\n \"version\": \"1.9.0\",\n \"resolved\": \"https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz\",\n \"integrity\": \"sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==\",\n \"dev\": true\n },\n \"node_modules/csstype\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz\",\n \"integrity\": \"sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==\"\n },\n \"node_modules/debug\": {\n \"version\": \"4.3.4\",\n \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.3.4.tgz\",\n \"integrity\": \"sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==\",\n \"dev\": true,\n \"dependencies\": {\n \"ms\": \"2.1.2\"\n },\n \"engines\": {\n \"node\": \">=6.0\"\n },\n \"peerDependenciesMeta\": {\n \"supports-color\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/detect-node-es\": {\n \"version\": \"1.1.0\",\n \"resolved\": \"https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz\",\n \"integrity\": \"sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==\"\n },\n \"node_modules/electron-to-chromium\": {\n \"version\": \"1.4.284\",\n \"resolved\": \"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz\",\n \"integrity\": \"sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==\",\n \"dev\": true\n },\n \"node_modules/esbuild\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz\",\n \"integrity\": \"sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"optionalDependencies\": {\n \"@esbuild/android-arm\": \"0.15.18\",\n \"@esbuild/linux-loong64\": \"0.15.18\",\n \"esbuild-android-64\": \"0.15.18\",\n \"esbuild-android-arm64\": \"0.15.18\",\n \"esbuild-darwin-64\": \"0.15.18\",\n \"esbuild-darwin-arm64\": \"0.15.18\",\n \"esbuild-freebsd-64\": \"0.15.18\",\n \"esbuild-freebsd-arm64\": \"0.15.18\",\n \"esbuild-linux-32\": \"0.15.18\",\n \"esbuild-linux-64\": \"0.15.18\",\n \"esbuild-linux-arm\": \"0.15.18\",\n \"esbuild-linux-arm64\": \"0.15.18\",\n \"esbuild-linux-mips64le\": \"0.15.18\",\n \"esbuild-linux-ppc64le\": \"0.15.18\",\n \"esbuild-linux-riscv64\": \"0.15.18\",\n \"esbuild-linux-s390x\": \"0.15.18\",\n \"esbuild-netbsd-64\": \"0.15.18\",\n \"esbuild-openbsd-64\": \"0.15.18\",\n \"esbuild-sunos-64\": \"0.15.18\",\n \"esbuild-windows-32\": \"0.15.18\",\n \"esbuild-windows-64\": \"0.15.18\",\n \"esbuild-windows-arm64\": \"0.15.18\"\n }\n },\n \"node_modules/esbuild-android-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz\",\n \"integrity\": \"sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-android-arm64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz\",\n \"integrity\": \"sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-darwin-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz\",\n \"integrity\": \"sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-darwin-arm64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz\",\n \"integrity\": \"sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-freebsd-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz\",\n \"integrity\": \"sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-freebsd-arm64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz\",\n \"integrity\": \"sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-32\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz\",\n \"integrity\": \"sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz\",\n \"integrity\": \"sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-arm\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz\",\n \"integrity\": \"sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-arm64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz\",\n \"integrity\": \"sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-mips64le\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz\",\n \"integrity\": \"sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-ppc64le\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz\",\n \"integrity\": \"sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-riscv64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz\",\n \"integrity\": \"sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-s390x\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz\",\n \"integrity\": \"sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-netbsd-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz\",\n \"integrity\": \"sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-openbsd-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz\",\n \"integrity\": \"sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-sunos-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz\",\n \"integrity\": \"sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-windows-32\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz\",\n \"integrity\": \"sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-windows-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz\",\n \"integrity\": \"sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-windows-arm64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz\",\n \"integrity\": \"sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/escalade\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz\",\n \"integrity\": \"sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/escape-string-regexp\": {\n \"version\": \"1.0.5\",\n \"resolved\": \"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz\",\n \"integrity\": \"sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=0.8.0\"\n }\n },\n \"node_modules/fsevents\": {\n \"version\": \"2.3.2\",\n \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz\",\n \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n }\n },\n \"node_modules/function-bind\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz\",\n \"integrity\": \"sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==\",\n \"dev\": true\n },\n \"node_modules/gensync\": {\n \"version\": \"1.0.0-beta.2\",\n \"resolved\": \"https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz\",\n \"integrity\": \"sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/get-nonce\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz\",\n \"integrity\": \"sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==\",\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/globals\": {\n \"version\": \"11.12.0\",\n \"resolved\": \"https://registry.npmjs.org/globals/-/globals-11.12.0.tgz\",\n \"integrity\": \"sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/google-protobuf\": {\n \"version\": \"3.21.2\",\n \"resolved\": \"https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz\",\n \"integrity\": \"sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==\"\n },\n \"node_modules/grpc-web\": {\n \"version\": \"1.4.2\",\n \"resolved\": \"https://registry.npmjs.org/grpc-web/-/grpc-web-1.4.2.tgz\",\n \"integrity\": \"sha512-gUxWq42l5ldaRplcKb4Pw5O4XBONWZgz3vxIIXnfIeJj8Jc3wYiq2O4c9xzx/NGbbPEej4rhI62C9eTENwLGNw==\"\n },\n \"node_modules/has\": {\n \"version\": \"1.0.3\",\n \"resolved\": \"https://registry.npmjs.org/has/-/has-1.0.3.tgz\",\n \"integrity\": \"sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==\",\n \"dev\": true,\n \"dependencies\": {\n \"function-bind\": \"^1.1.1\"\n },\n \"engines\": {\n \"node\": \">= 0.4.0\"\n }\n },\n \"node_modules/has-flag\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz\",\n \"integrity\": \"sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/hoist-non-react-statics\": {\n \"version\": \"3.3.2\",\n \"resolved\": \"https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz\",\n \"integrity\": \"sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==\",\n \"dependencies\": {\n \"react-is\": \"^16.7.0\"\n }\n },\n \"node_modules/hotkeys-js\": {\n \"version\": \"3.9.4\",\n \"resolved\": \"https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-3.9.4.tgz\",\n \"integrity\": \"sha512-2zuLt85Ta+gIyvs4N88pCYskNrxf1TFv3LR9t5mdAZIX8BcgQQ48F2opUptvHa6m8zsy5v/a0i9mWzTrlNWU0Q==\"\n },\n \"node_modules/idb-keyval\": {\n \"version\": \"6.2.0\",\n \"resolved\": \"https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.0.tgz\",\n \"integrity\": \"sha512-uw+MIyQn2jl3+hroD7hF8J7PUviBU7BPKWw4f/ISf32D4LoGu98yHjrzWWJDASu9QNrX10tCJqk9YY0ClWm8Ng==\",\n \"dependencies\": {\n \"safari-14-idb-fix\": \"^3.0.0\"\n }\n },\n \"node_modules/intl-messageformat\": {\n \"version\": \"10.2.5\",\n \"resolved\": \"https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.2.5.tgz\",\n \"integrity\": \"sha512-AievYMN6WLLHwBeCTv4aRKG+w3ZNyZtkObwgsKk3Q7GNTq8zDRvDbJSBQkb2OPeVCcAKcIXvak9FF/bRNavoww==\",\n \"dependencies\": {\n \"@formatjs/ecma402-abstract\": \"1.14.3\",\n \"@formatjs/fast-memoize\": \"1.2.7\",\n \"@formatjs/icu-messageformat-parser\": \"2.1.14\",\n \"tslib\": \"^2.4.0\"\n }\n },\n \"node_modules/invariant\": {\n \"version\": \"2.2.4\",\n \"resolved\": \"https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz\",\n \"integrity\": \"sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==\",\n \"dependencies\": {\n \"loose-envify\": \"^1.0.0\"\n }\n },\n \"node_modules/is-core-module\": {\n \"version\": \"2.11.0\",\n \"resolved\": \"https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz\",\n \"integrity\": \"sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==\",\n \"dev\": true,\n \"dependencies\": {\n \"has\": \"^1.0.3\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/js-tokens\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\"\n },\n \"node_modules/jsesc\": {\n \"version\": \"2.5.2\",\n \"resolved\": \"https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz\",\n \"integrity\": \"sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==\",\n \"dev\": true,\n \"bin\": {\n \"jsesc\": \"bin/jsesc\"\n },\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/json5\": {\n \"version\": \"2.2.3\",\n \"resolved\": \"https://registry.npmjs.org/json5/-/json5-2.2.3.tgz\",\n \"integrity\": \"sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==\",\n \"dev\": true,\n \"bin\": {\n \"json5\": \"lib/cli.js\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/long\": {\n \"version\": \"5.2.1\",\n \"resolved\": \"https://registry.npmjs.org/long/-/long-5.2.1.tgz\",\n \"integrity\": \"sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==\"\n },\n \"node_modules/loose-envify\": {\n \"version\": \"1.4.0\",\n \"resolved\": \"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz\",\n \"integrity\": \"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==\",\n \"dependencies\": {\n \"js-tokens\": \"^3.0.0 || ^4.0.0\"\n },\n \"bin\": {\n \"loose-envify\": \"cli.js\"\n }\n },\n \"node_modules/lru-cache\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz\",\n \"integrity\": \"sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==\",\n \"dev\": true,\n \"dependencies\": {\n \"yallist\": \"^3.0.2\"\n }\n },\n \"node_modules/magic-string\": {\n \"version\": \"0.26.7\",\n \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz\",\n \"integrity\": \"sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==\",\n \"dev\": true,\n \"dependencies\": {\n \"sourcemap-codec\": \"^1.4.8\"\n },\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/ms\": {\n \"version\": \"2.1.2\",\n \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.2.tgz\",\n \"integrity\": \"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==\",\n \"dev\": true\n },\n \"node_modules/nanoid\": {\n \"version\": \"3.3.4\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz\",\n \"integrity\": \"sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==\",\n \"dev\": true,\n \"bin\": {\n \"nanoid\": \"bin/nanoid.cjs\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || ^13.7 || ^14 || >=15.0.1\"\n }\n },\n \"node_modules/node-releases\": {\n \"version\": \"2.0.8\",\n \"resolved\": \"https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz\",\n \"integrity\": \"sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==\",\n \"dev\": true\n },\n \"node_modules/path-parse\": {\n \"version\": \"1.0.7\",\n \"resolved\": \"https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz\",\n \"integrity\": \"sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==\",\n \"dev\": true\n },\n \"node_modules/perfect-freehand\": {\n \"version\": \"1.2.0\",\n \"resolved\": \"https://registry.npmjs.org/perfect-freehand/-/perfect-freehand-1.2.0.tgz\",\n \"integrity\": \"sha512-h/0ikF1M3phW7CwpZ5MMvKnfpHficWoOEyr//KVNTxV4F6deRK1eYMtHyBKEAKFK0aXIEUK9oBvlF6PNXMDsAw==\"\n },\n \"node_modules/picocolors\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz\",\n \"integrity\": \"sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==\",\n \"dev\": true\n },\n \"node_modules/postcss\": {\n \"version\": \"8.4.21\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz\",\n \"integrity\": \"sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/postcss/\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/postcss\"\n }\n ],\n \"dependencies\": {\n \"nanoid\": \"^3.3.4\",\n \"picocolors\": \"^1.0.0\",\n \"source-map-js\": \"^1.0.2\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || >=14\"\n }\n },\n \"node_modules/randomcolor\": {\n \"version\": \"0.6.2\",\n \"resolved\": \"https://registry.npmjs.org/randomcolor/-/randomcolor-0.6.2.tgz\",\n \"integrity\": \"sha512-Mn6TbyYpFgwFuQ8KJKqf3bqqY9O1y37/0jgSK/61PUxV4QfIMv0+K2ioq8DfOjkBslcjwSzRfIDEXfzA9aCx7A==\"\n },\n \"node_modules/react\": {\n \"version\": \"18.2.0\",\n \"resolved\": \"https://registry.npmjs.org/react/-/react-18.2.0.tgz\",\n \"integrity\": \"sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n },\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/react-dom\": {\n \"version\": \"18.2.0\",\n \"resolved\": \"https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz\",\n \"integrity\": \"sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\",\n \"scheduler\": \"^0.23.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^18.2.0\"\n }\n },\n \"node_modules/react-error-boundary\": {\n \"version\": \"3.1.4\",\n \"resolved\": \"https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz\",\n \"integrity\": \"sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.12.5\"\n },\n \"engines\": {\n \"node\": \">=10\",\n \"npm\": \">=6\"\n },\n \"peerDependencies\": {\n \"react\": \">=16.13.1\"\n }\n },\n \"node_modules/react-hotkeys-hook\": {\n \"version\": \"3.4.7\",\n \"resolved\": \"https://registry.npmjs.org/react-hotkeys-hook/-/react-hotkeys-hook-3.4.7.tgz\",\n \"integrity\": \"sha512-+bbPmhPAl6ns9VkXkNNyxlmCAIyDAcWbB76O4I0ntr3uWCRuIQf/aRLartUahe9chVMPj+OEzzfk3CQSjclUEQ==\",\n \"dependencies\": {\n \"hotkeys-js\": \"3.9.4\"\n },\n \"peerDependencies\": {\n \"react\": \">=16.8.1\",\n \"react-dom\": \">=16.8.1\"\n }\n },\n \"node_modules/react-intl\": {\n \"version\": \"6.2.5\",\n \"resolved\": \"https://registry.npmjs.org/react-intl/-/react-intl-6.2.5.tgz\",\n \"integrity\": \"sha512-nz21POTKbE0sPEuEJU4o5YTZYY7VlIYCPNJaD6D2+xKyk6Noj6DoUK0LRO9LXuQNUuQ044IZl3m6ymzZRj8XFQ==\",\n \"dependencies\": {\n \"@formatjs/ecma402-abstract\": \"1.14.3\",\n \"@formatjs/icu-messageformat-parser\": \"2.1.14\",\n \"@formatjs/intl\": \"2.6.3\",\n \"@formatjs/intl-displaynames\": \"6.2.3\",\n \"@formatjs/intl-listformat\": \"7.1.7\",\n \"@types/hoist-non-react-statics\": \"^3.3.1\",\n \"@types/react\": \"16 || 17 || 18\",\n \"hoist-non-react-statics\": \"^3.3.2\",\n \"intl-messageformat\": \"10.2.5\",\n \"tslib\": \"^2.4.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^16.6.0 || 17 || 18\",\n \"typescript\": \"^4.7\"\n },\n \"peerDependenciesMeta\": {\n \"typescript\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/react-is\": {\n \"version\": \"16.13.1\",\n \"resolved\": \"https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz\",\n \"integrity\": \"sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==\"\n },\n \"node_modules/react-refresh\": {\n \"version\": \"0.14.0\",\n \"resolved\": \"https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz\",\n \"integrity\": \"sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/react-remove-scroll\": {\n \"version\": \"2.5.5\",\n \"resolved\": \"https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz\",\n \"integrity\": \"sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==\",\n \"dependencies\": {\n \"react-remove-scroll-bar\": \"^2.3.3\",\n \"react-style-singleton\": \"^2.2.1\",\n \"tslib\": \"^2.1.0\",\n \"use-callback-ref\": \"^1.3.0\",\n \"use-sidecar\": \"^1.1.2\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"peerDependencies\": {\n \"@types/react\": \"^16.8.0 || ^17.0.0 || ^18.0.0\",\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/react\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/react-remove-scroll-bar\": {\n \"version\": \"2.3.4\",\n \"resolved\": \"https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz\",\n \"integrity\": \"sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==\",\n \"dependencies\": {\n \"react-style-singleton\": \"^2.2.1\",\n \"tslib\": \"^2.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"peerDependencies\": {\n \"@types/react\": \"^16.8.0 || ^17.0.0 || ^18.0.0\",\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/react\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/react-style-singleton\": {\n \"version\": \"2.2.1\",\n \"resolved\": \"https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz\",\n \"integrity\": \"sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==\",\n \"dependencies\": {\n \"get-nonce\": \"^1.0.0\",\n \"invariant\": \"^2.2.4\",\n \"tslib\": \"^2.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"peerDependencies\": {\n \"@types/react\": \"^16.8.0 || ^17.0.0 || ^18.0.0\",\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/react\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/regenerator-runtime\": {\n \"version\": \"0.13.11\",\n \"resolved\": \"https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz\",\n \"integrity\": \"sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==\"\n },\n \"node_modules/resolve\": {\n \"version\": \"1.22.1\",\n \"resolved\": \"https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz\",\n \"integrity\": \"sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==\",\n \"dev\": true,\n \"dependencies\": {\n \"is-core-module\": \"^2.9.0\",\n \"path-parse\": \"^1.0.7\",\n \"supports-preserve-symlinks-flag\": \"^1.0.0\"\n },\n \"bin\": {\n \"resolve\": \"bin/resolve\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/rollup\": {\n \"version\": \"2.79.1\",\n \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz\",\n \"integrity\": \"sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==\",\n \"dev\": true,\n \"bin\": {\n \"rollup\": \"dist/bin/rollup\"\n },\n \"engines\": {\n \"node\": \">=10.0.0\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.2\"\n }\n },\n \"node_modules/safari-14-idb-fix\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/safari-14-idb-fix/-/safari-14-idb-fix-3.0.0.tgz\",\n \"integrity\": \"sha512-eBNFLob4PMq8JA1dGyFn6G97q3/WzNtFK4RnzT1fnLq+9RyrGknzYiM/9B12MnKAxuj1IXr7UKYtTNtjyKMBog==\"\n },\n \"node_modules/scheduler\": {\n \"version\": \"0.23.0\",\n \"resolved\": \"https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz\",\n \"integrity\": \"sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n }\n },\n \"node_modules/semver\": {\n \"version\": \"6.3.0\",\n \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.0.tgz\",\n \"integrity\": \"sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==\",\n \"dev\": true,\n \"bin\": {\n \"semver\": \"bin/semver.js\"\n }\n },\n \"node_modules/source-map-js\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz\",\n \"integrity\": \"sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/sourcemap-codec\": {\n \"version\": \"1.4.8\",\n \"resolved\": \"https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz\",\n \"integrity\": \"sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==\",\n \"deprecated\": \"Please use @jridgewell/sourcemap-codec instead\",\n \"dev\": true\n },\n \"node_modules/supports-color\": {\n \"version\": \"5.5.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz\",\n \"integrity\": \"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==\",\n \"dev\": true,\n \"dependencies\": {\n \"has-flag\": \"^3.0.0\"\n },\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/supports-preserve-symlinks-flag\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz\",\n \"integrity\": \"sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">= 0.4\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/to-fast-properties\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz\",\n \"integrity\": \"sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/tslib\": {\n \"version\": \"2.4.1\",\n \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz\",\n \"integrity\": \"sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==\"\n },\n \"node_modules/typescript\": {\n \"version\": \"4.9.4\",\n \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz\",\n \"integrity\": \"sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==\",\n \"devOptional\": true,\n \"bin\": {\n \"tsc\": \"bin/tsc\",\n \"tsserver\": \"bin/tsserver\"\n },\n \"engines\": {\n \"node\": \">=4.2.0\"\n }\n },\n \"node_modules/unique-names-generator\": {\n \"version\": \"4.7.1\",\n \"resolved\": \"https://registry.npmjs.org/unique-names-generator/-/unique-names-generator-4.7.1.tgz\",\n \"integrity\": \"sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow==\",\n \"engines\": {\n \"node\": \">=8\"\n }\n },\n \"node_modules/update-browserslist-db\": {\n \"version\": \"1.0.10\",\n \"resolved\": \"https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz\",\n \"integrity\": \"sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n }\n ],\n \"dependencies\": {\n \"escalade\": \"^3.1.1\",\n \"picocolors\": \"^1.0.0\"\n },\n \"bin\": {\n \"browserslist-lint\": \"cli.js\"\n },\n \"peerDependencies\": {\n \"browserslist\": \">= 4.21.0\"\n }\n },\n \"node_modules/use-callback-ref\": {\n \"version\": \"1.3.0\",\n \"resolved\": \"https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz\",\n \"integrity\": \"sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==\",\n \"dependencies\": {\n \"tslib\": \"^2.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"peerDependencies\": {\n \"@types/react\": \"^16.8.0 || ^17.0.0 || ^18.0.0\",\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/react\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/use-isomorphic-layout-effect\": {\n \"version\": \"1.1.2\",\n \"resolved\": \"https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz\",\n \"integrity\": \"sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==\",\n \"peerDependencies\": {\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/react\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/use-sidecar\": {\n \"version\": \"1.1.2\",\n \"resolved\": \"https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz\",\n \"integrity\": \"sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==\",\n \"dependencies\": {\n \"detect-node-es\": \"^1.1.0\",\n \"tslib\": \"^2.0.0\"\n },\n \"engines\": {\n \"node\": \">=10\"\n },\n \"peerDependencies\": {\n \"@types/react\": \"^16.9.0 || ^17.0.0 || ^18.0.0\",\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/react\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/use-sync-external-store\": {\n \"version\": \"1.2.0\",\n \"resolved\": \"https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz\",\n \"integrity\": \"sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==\",\n \"peerDependencies\": {\n \"react\": \"^16.8.0 || ^17.0.0 || ^18.0.0\"\n }\n },\n \"node_modules/vite\": {\n \"version\": \"3.2.7\",\n \"resolved\": \"https://registry.npmjs.org/vite/-/vite-3.2.7.tgz\",\n \"integrity\": \"sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==\",\n \"dev\": true,\n \"dependencies\": {\n \"esbuild\": \"^0.15.9\",\n \"postcss\": \"^8.4.18\",\n \"resolve\": \"^1.22.1\",\n \"rollup\": \"^2.79.1\"\n },\n \"bin\": {\n \"vite\": \"bin/vite.js\"\n },\n \"engines\": {\n \"node\": \"^14.18.0 || >=16.0.0\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.2\"\n },\n \"peerDependencies\": {\n \"@types/node\": \">= 14\",\n \"less\": \"*\",\n \"sass\": \"*\",\n \"stylus\": \"*\",\n \"sugarss\": \"*\",\n \"terser\": \"^5.4.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/node\": {\n \"optional\": true\n },\n \"less\": {\n \"optional\": true\n },\n \"sass\": {\n \"optional\": true\n },\n \"stylus\": {\n \"optional\": true\n },\n \"sugarss\": {\n \"optional\": true\n },\n \"terser\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/yallist\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz\",\n \"integrity\": \"sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==\",\n \"dev\": true\n },\n \"node_modules/yorkie-js-sdk\": {\n \"version\": \"0.3.5\",\n \"resolved\": \"https://registry.npmjs.org/yorkie-js-sdk/-/yorkie-js-sdk-0.3.5.tgz\",\n \"integrity\": \"sha512-CZdc5yUhmJUQWpulDOeDwlW9Uh5WgDBLuCyhXV8+Crb3Kr14PCmrJJ9lI3rVSReosQtq8RjPYnwMd7KbtYALyw==\",\n \"dependencies\": {\n \"@types/google-protobuf\": \"^3.15.5\",\n \"@types/long\": \"^4.0.1\",\n \"google-protobuf\": \"^3.19.4\",\n \"grpc-web\": \"^1.3.1\",\n \"long\": \"^5.2.0\"\n }\n },\n \"node_modules/zustand\": {\n \"version\": \"4.2.0\",\n \"resolved\": \"https://registry.npmjs.org/zustand/-/zustand-4.2.0.tgz\",\n \"integrity\": \"sha512-eNwaDoD2FYVnMgtNxiMUhTJO780wonZUzJrPQTLYI0erSIMZF8cniWFW22kGQUECd8rdHRJ/ZJL2XO54c9Ttuw==\",\n \"dependencies\": {\n \"use-sync-external-store\": \"1.2.0\"\n },\n \"engines\": {\n \"node\": \">=12.7.0\"\n },\n \"peerDependencies\": {\n \"immer\": \">=9.0\",\n \"react\": \">=16.8\"\n },\n \"peerDependenciesMeta\": {\n \"immer\": {\n \"optional\": true\n },\n \"react\": {\n \"optional\": true\n }\n }\n }\n },\n \"dependencies\": {\n \"@ampproject/remapping\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz\",\n \"integrity\": \"sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==\",\n \"dev\": true,\n \"requires\": {\n \"@jridgewell/gen-mapping\": \"^0.1.0\",\n \"@jridgewell/trace-mapping\": \"^0.3.9\"\n }\n },\n \"@babel/code-frame\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz\",\n \"integrity\": \"sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/highlight\": \"^7.18.6\"\n }\n },\n \"@babel/compat-data\": {\n \"version\": \"7.20.10\",\n \"resolved\": \"https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz\",\n \"integrity\": \"sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==\",\n \"dev\": true\n },\n \"@babel/core\": {\n \"version\": \"7.20.12\",\n \"resolved\": \"https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz\",\n \"integrity\": \"sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==\",\n \"dev\": true,\n \"requires\": {\n \"@ampproject/remapping\": \"^2.1.0\",\n \"@babel/code-frame\": \"^7.18.6\",\n \"@babel/generator\": \"^7.20.7\",\n \"@babel/helper-compilation-targets\": \"^7.20.7\",\n \"@babel/helper-module-transforms\": \"^7.20.11\",\n \"@babel/helpers\": \"^7.20.7\",\n \"@babel/parser\": \"^7.20.7\",\n \"@babel/template\": \"^7.20.7\",\n \"@babel/traverse\": \"^7.20.12\",\n \"@babel/types\": \"^7.20.7\",\n \"convert-source-map\": \"^1.7.0\",\n \"debug\": \"^4.1.0\",\n \"gensync\": \"^1.0.0-beta.2\",\n \"json5\": \"^2.2.2\",\n \"semver\": \"^6.3.0\"\n }\n },\n \"@babel/generator\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz\",\n \"integrity\": \"sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/types\": \"^7.20.7\",\n \"@jridgewell/gen-mapping\": \"^0.3.2\",\n \"jsesc\": \"^2.5.1\"\n },\n \"dependencies\": {\n \"@jridgewell/gen-mapping\": {\n \"version\": \"0.3.2\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz\",\n \"integrity\": \"sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==\",\n \"dev\": true,\n \"requires\": {\n \"@jridgewell/set-array\": \"^1.0.1\",\n \"@jridgewell/sourcemap-codec\": \"^1.4.10\",\n \"@jridgewell/trace-mapping\": \"^0.3.9\"\n }\n }\n }\n },\n \"@babel/helper-annotate-as-pure\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz\",\n \"integrity\": \"sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/types\": \"^7.18.6\"\n }\n },\n \"@babel/helper-compilation-targets\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz\",\n \"integrity\": \"sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/compat-data\": \"^7.20.5\",\n \"@babel/helper-validator-option\": \"^7.18.6\",\n \"browserslist\": \"^4.21.3\",\n \"lru-cache\": \"^5.1.1\",\n \"semver\": \"^6.3.0\"\n }\n },\n \"@babel/helper-environment-visitor\": {\n \"version\": \"7.18.9\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz\",\n \"integrity\": \"sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==\",\n \"dev\": true\n },\n \"@babel/helper-function-name\": {\n \"version\": \"7.19.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz\",\n \"integrity\": \"sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/template\": \"^7.18.10\",\n \"@babel/types\": \"^7.19.0\"\n }\n },\n \"@babel/helper-hoist-variables\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz\",\n \"integrity\": \"sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/types\": \"^7.18.6\"\n }\n },\n \"@babel/helper-module-imports\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz\",\n \"integrity\": \"sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/types\": \"^7.18.6\"\n }\n },\n \"@babel/helper-module-transforms\": {\n \"version\": \"7.20.11\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz\",\n \"integrity\": \"sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/helper-environment-visitor\": \"^7.18.9\",\n \"@babel/helper-module-imports\": \"^7.18.6\",\n \"@babel/helper-simple-access\": \"^7.20.2\",\n \"@babel/helper-split-export-declaration\": \"^7.18.6\",\n \"@babel/helper-validator-identifier\": \"^7.19.1\",\n \"@babel/template\": \"^7.20.7\",\n \"@babel/traverse\": \"^7.20.10\",\n \"@babel/types\": \"^7.20.7\"\n }\n },\n \"@babel/helper-plugin-utils\": {\n \"version\": \"7.20.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz\",\n \"integrity\": \"sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==\",\n \"dev\": true\n },\n \"@babel/helper-simple-access\": {\n \"version\": \"7.20.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz\",\n \"integrity\": \"sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/types\": \"^7.20.2\"\n }\n },\n \"@babel/helper-split-export-declaration\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz\",\n \"integrity\": \"sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/types\": \"^7.18.6\"\n }\n },\n \"@babel/helper-string-parser\": {\n \"version\": \"7.19.4\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz\",\n \"integrity\": \"sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==\",\n \"dev\": true\n },\n \"@babel/helper-validator-identifier\": {\n \"version\": \"7.19.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz\",\n \"integrity\": \"sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==\",\n \"dev\": true\n },\n \"@babel/helper-validator-option\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz\",\n \"integrity\": \"sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==\",\n \"dev\": true\n },\n \"@babel/helpers\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz\",\n \"integrity\": \"sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/template\": \"^7.20.7\",\n \"@babel/traverse\": \"^7.20.7\",\n \"@babel/types\": \"^7.20.7\"\n }\n },\n \"@babel/highlight\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz\",\n \"integrity\": \"sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/helper-validator-identifier\": \"^7.18.6\",\n \"chalk\": \"^2.0.0\",\n \"js-tokens\": \"^4.0.0\"\n }\n },\n \"@babel/parser\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz\",\n \"integrity\": \"sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==\",\n \"dev\": true\n },\n \"@babel/plugin-syntax-jsx\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz\",\n \"integrity\": \"sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/helper-plugin-utils\": \"^7.18.6\"\n }\n },\n \"@babel/plugin-transform-react-jsx\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.7.tgz\",\n \"integrity\": \"sha512-Tfq7qqD+tRj3EoDhY00nn2uP2hsRxgYGi5mLQ5TimKav0a9Lrpd4deE+fcLXU8zFYRjlKPHZhpCvfEA6qnBxqQ==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/helper-annotate-as-pure\": \"^7.18.6\",\n \"@babel/helper-module-imports\": \"^7.18.6\",\n \"@babel/helper-plugin-utils\": \"^7.20.2\",\n \"@babel/plugin-syntax-jsx\": \"^7.18.6\",\n \"@babel/types\": \"^7.20.7\"\n }\n },\n \"@babel/plugin-transform-react-jsx-development\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz\",\n \"integrity\": \"sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/plugin-transform-react-jsx\": \"^7.18.6\"\n }\n },\n \"@babel/plugin-transform-react-jsx-self\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz\",\n \"integrity\": \"sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/helper-plugin-utils\": \"^7.18.6\"\n }\n },\n \"@babel/plugin-transform-react-jsx-source\": {\n \"version\": \"7.19.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz\",\n \"integrity\": \"sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/helper-plugin-utils\": \"^7.19.0\"\n }\n },\n \"@babel/runtime\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz\",\n \"integrity\": \"sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==\",\n \"requires\": {\n \"regenerator-runtime\": \"^0.13.11\"\n }\n },\n \"@babel/template\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz\",\n \"integrity\": \"sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/code-frame\": \"^7.18.6\",\n \"@babel/parser\": \"^7.20.7\",\n \"@babel/types\": \"^7.20.7\"\n }\n },\n \"@babel/traverse\": {\n \"version\": \"7.20.12\",\n \"resolved\": \"https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz\",\n \"integrity\": \"sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/code-frame\": \"^7.18.6\",\n \"@babel/generator\": \"^7.20.7\",\n \"@babel/helper-environment-visitor\": \"^7.18.9\",\n \"@babel/helper-function-name\": \"^7.19.0\",\n \"@babel/helper-hoist-variables\": \"^7.18.6\",\n \"@babel/helper-split-export-declaration\": \"^7.18.6\",\n \"@babel/parser\": \"^7.20.7\",\n \"@babel/types\": \"^7.20.7\",\n \"debug\": \"^4.1.0\",\n \"globals\": \"^11.1.0\"\n }\n },\n \"@babel/types\": {\n \"version\": \"7.20.7\",\n \"resolved\": \"https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz\",\n \"integrity\": \"sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/helper-string-parser\": \"^7.19.4\",\n \"@babel/helper-validator-identifier\": \"^7.19.1\",\n \"to-fast-properties\": \"^2.0.0\"\n }\n },\n \"@esbuild/android-arm\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz\",\n \"integrity\": \"sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"@esbuild/linux-loong64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz\",\n \"integrity\": \"sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"@floating-ui/core\": {\n \"version\": \"0.7.3\",\n \"resolved\": \"https://registry.npmjs.org/@floating-ui/core/-/core-0.7.3.tgz\",\n \"integrity\": \"sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==\"\n },\n \"@floating-ui/dom\": {\n \"version\": \"0.5.4\",\n \"resolved\": \"https://registry.npmjs.org/@floating-ui/dom/-/dom-0.5.4.tgz\",\n \"integrity\": \"sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==\",\n \"requires\": {\n \"@floating-ui/core\": \"^0.7.3\"\n }\n },\n \"@floating-ui/react-dom\": {\n \"version\": \"0.7.2\",\n \"resolved\": \"https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-0.7.2.tgz\",\n \"integrity\": \"sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg==\",\n \"requires\": {\n \"@floating-ui/dom\": \"^0.5.3\",\n \"use-isomorphic-layout-effect\": \"^1.1.1\"\n }\n },\n \"@formatjs/ecma402-abstract\": {\n \"version\": \"1.14.3\",\n \"resolved\": \"https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.14.3.tgz\",\n \"integrity\": \"sha512-SlsbRC/RX+/zg4AApWIFNDdkLtFbkq3LNoZWXZCE/nHVKqoIJyaoQyge/I0Y38vLxowUn9KTtXgusLD91+orbg==\",\n \"requires\": {\n \"@formatjs/intl-localematcher\": \"0.2.32\",\n \"tslib\": \"^2.4.0\"\n }\n },\n \"@formatjs/fast-memoize\": {\n \"version\": \"1.2.7\",\n \"resolved\": \"https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-1.2.7.tgz\",\n \"integrity\": \"sha512-hPeM5LXUUjtCKPybWOUAWpv8lpja8Xz+uKprFPJcg5F2Rd+/bf1E0UUsLRpaAgOReAf5HMRtoIgv/UcyPICrTQ==\",\n \"requires\": {\n \"tslib\": \"^2.4.0\"\n }\n },\n \"@formatjs/icu-messageformat-parser\": {\n \"version\": \"2.1.14\",\n \"resolved\": \"https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.14.tgz\",\n \"integrity\": \"sha512-0KqeVOb72losEhUW+59vhZGGd14s1f35uThfEMVKZHKLEObvJdFTiI3ZQwvTMUCzLEMxnS6mtnYPmG4mTvwd3Q==\",\n \"requires\": {\n \"@formatjs/ecma402-abstract\": \"1.14.3\",\n \"@formatjs/icu-skeleton-parser\": \"1.3.18\",\n \"tslib\": \"^2.4.0\"\n }\n },\n \"@formatjs/icu-skeleton-parser\": {\n \"version\": \"1.3.18\",\n \"resolved\": \"https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.18.tgz\",\n \"integrity\": \"sha512-ND1ZkZfmLPcHjAH1sVpkpQxA+QYfOX3py3SjKWMUVGDow18gZ0WPqz3F+pJLYQMpS2LnnQ5zYR2jPVYTbRwMpg==\",\n \"requires\": {\n \"@formatjs/ecma402-abstract\": \"1.14.3\",\n \"tslib\": \"^2.4.0\"\n }\n },\n \"@formatjs/intl\": {\n \"version\": \"2.6.3\",\n \"resolved\": \"https://registry.npmjs.org/@formatjs/intl/-/intl-2.6.3.tgz\",\n \"integrity\": \"sha512-JaVZk14U/GypVfCZPevQ0KdruFkq16FXx7g398/Dm+YEx/W7sRiftbZeDy4wQ7WGryb45e763XycxD9o/vm9BA==\",\n \"requires\": {\n \"@formatjs/ecma402-abstract\": \"1.14.3\",\n \"@formatjs/fast-memoize\": \"1.2.7\",\n \"@formatjs/icu-messageformat-parser\": \"2.1.14\",\n \"@formatjs/intl-displaynames\": \"6.2.3\",\n \"@formatjs/intl-listformat\": \"7.1.7\",\n \"intl-messageformat\": \"10.2.5\",\n \"tslib\": \"^2.4.0\"\n }\n },\n \"@formatjs/intl-displaynames\": {\n \"version\": \"6.2.3\",\n \"resolved\": \"https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-6.2.3.tgz\",\n \"integrity\": \"sha512-teB0L68MDGM8jEKQg55w7nvFjzeLHE6e3eK/04s+iuEVYYmvjjiHJKHrthKENzcJ0F6mHf/AwXrbX+1mKxT6AQ==\",\n \"requires\": {\n \"@formatjs/ecma402-abstract\": \"1.14.3\",\n \"@formatjs/intl-localematcher\": \"0.2.32\",\n \"tslib\": \"^2.4.0\"\n }\n },\n \"@formatjs/intl-listformat\": {\n \"version\": \"7.1.7\",\n \"resolved\": \"https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-7.1.7.tgz\",\n \"integrity\": \"sha512-Zzf5ruPpfJnrAA2hGgf/6pMgQ3tx9oJVhpqycFDavHl3eEzrwdHddGqGdSNwhd0bB4NAFttZNQdmKDldc5iDZw==\",\n \"requires\": {\n \"@formatjs/ecma402-abstract\": \"1.14.3\",\n \"@formatjs/intl-localematcher\": \"0.2.32\",\n \"tslib\": \"^2.4.0\"\n }\n },\n \"@formatjs/intl-localematcher\": {\n \"version\": \"0.2.32\",\n \"resolved\": \"https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.32.tgz\",\n \"integrity\": \"sha512-k/MEBstff4sttohyEpXxCmC3MqbUn9VvHGlZ8fauLzkbwXmVrEeyzS+4uhrvAk9DWU9/7otYWxyDox4nT/KVLQ==\",\n \"requires\": {\n \"tslib\": \"^2.4.0\"\n }\n },\n \"@jridgewell/gen-mapping\": {\n \"version\": \"0.1.1\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz\",\n \"integrity\": \"sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==\",\n \"dev\": true,\n \"requires\": {\n \"@jridgewell/set-array\": \"^1.0.0\",\n \"@jridgewell/sourcemap-codec\": \"^1.4.10\"\n }\n },\n \"@jridgewell/resolve-uri\": {\n \"version\": \"3.1.0\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz\",\n \"integrity\": \"sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==\",\n \"dev\": true\n },\n \"@jridgewell/set-array\": {\n \"version\": \"1.1.2\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz\",\n \"integrity\": \"sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==\",\n \"dev\": true\n },\n \"@jridgewell/sourcemap-codec\": {\n \"version\": \"1.4.14\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz\",\n \"integrity\": \"sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==\",\n \"dev\": true\n },\n \"@jridgewell/trace-mapping\": {\n \"version\": \"0.3.17\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz\",\n \"integrity\": \"sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==\",\n \"dev\": true,\n \"requires\": {\n \"@jridgewell/resolve-uri\": \"3.1.0\",\n \"@jridgewell/sourcemap-codec\": \"1.4.14\"\n }\n },\n \"@radix-ui/primitive\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz\",\n \"integrity\": \"sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\"\n }\n },\n \"@radix-ui/react-alert-dialog\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.0.2.tgz\",\n \"integrity\": \"sha512-0MtxV53FaEEBOKRgyLnEqHZKKDS5BldQ9oUBsKVXWI5FHbl2jp35qs+0aJET+K5hJDsc40kQUzP7g+wC7tqrqA==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/primitive\": \"1.0.0\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-dialog\": \"1.0.2\",\n \"@radix-ui/react-primitive\": \"1.0.1\",\n \"@radix-ui/react-slot\": \"1.0.1\"\n }\n },\n \"@radix-ui/react-arrow\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.0.tgz\",\n \"integrity\": \"sha512-1MUuv24HCdepi41+qfv125EwMuxgQ+U+h0A9K3BjCO/J8nVRREKHHpkD9clwfnjEDk9hgGzCnff4aUKCPiRepw==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-primitive\": \"1.0.0\"\n },\n \"dependencies\": {\n \"@radix-ui/react-primitive\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz\",\n \"integrity\": \"sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-slot\": \"1.0.0\"\n }\n },\n \"@radix-ui/react-slot\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz\",\n \"integrity\": \"sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\"\n }\n }\n }\n },\n \"@radix-ui/react-collection\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.0.tgz\",\n \"integrity\": \"sha512-8i1pf5dKjnq90Z8udnnXKzdCEV3/FYrfw0n/b6NvB6piXEn3fO1bOh7HBcpG8XrnIXzxlYu2oCcR38QpyLS/mg==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.0\",\n \"@radix-ui/react-slot\": \"1.0.0\"\n },\n \"dependencies\": {\n \"@radix-ui/react-primitive\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz\",\n \"integrity\": \"sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-slot\": \"1.0.0\"\n }\n },\n \"@radix-ui/react-slot\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz\",\n \"integrity\": \"sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\"\n }\n }\n }\n },\n \"@radix-ui/react-compose-refs\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz\",\n \"integrity\": \"sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\"\n }\n },\n \"@radix-ui/react-context\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz\",\n \"integrity\": \"sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\"\n }\n },\n \"@radix-ui/react-context-menu\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-1.0.0.tgz\",\n \"integrity\": \"sha512-JkwOgdXwErwEEpsmgu0Ob8zD3gzWS1brPXnNGPyZEtR6/EYyDgruQYKiihXVsCrPCdrNUHawop9I1+6JTdXPTA==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/primitive\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-menu\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.0\",\n \"@radix-ui/react-use-callback-ref\": \"1.0.0\",\n \"@radix-ui/react-use-controllable-state\": \"1.0.0\"\n },\n \"dependencies\": {\n \"@radix-ui/react-primitive\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz\",\n \"integrity\": \"sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-slot\": \"1.0.0\"\n }\n },\n \"@radix-ui/react-slot\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz\",\n \"integrity\": \"sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\"\n }\n }\n }\n },\n \"@radix-ui/react-dialog\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.2.tgz\",\n \"integrity\": \"sha512-EKxxp2WNSmUPkx4trtWNmZ4/vAYEg7JkAfa1HKBUnaubw9eHzf1Orr9B472lJYaYz327RHDrd4R95fsw7VR8DA==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/primitive\": \"1.0.0\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-dismissable-layer\": \"1.0.2\",\n \"@radix-ui/react-focus-guards\": \"1.0.0\",\n \"@radix-ui/react-focus-scope\": \"1.0.1\",\n \"@radix-ui/react-id\": \"1.0.0\",\n \"@radix-ui/react-portal\": \"1.0.1\",\n \"@radix-ui/react-presence\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.1\",\n \"@radix-ui/react-slot\": \"1.0.1\",\n \"@radix-ui/react-use-controllable-state\": \"1.0.0\",\n \"aria-hidden\": \"^1.1.1\",\n \"react-remove-scroll\": \"2.5.5\"\n }\n },\n \"@radix-ui/react-direction\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.0.tgz\",\n \"integrity\": \"sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\"\n }\n },\n \"@radix-ui/react-dismissable-layer\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.2.tgz\",\n \"integrity\": \"sha512-WjJzMrTWROozDqLB0uRWYvj4UuXsM/2L19EmQ3Au+IJWqwvwq9Bwd+P8ivo0Deg9JDPArR1I6MbWNi1CmXsskg==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/primitive\": \"1.0.0\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.1\",\n \"@radix-ui/react-use-callback-ref\": \"1.0.0\",\n \"@radix-ui/react-use-escape-keydown\": \"1.0.2\"\n }\n },\n \"@radix-ui/react-dropdown-menu\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-1.0.0.tgz\",\n \"integrity\": \"sha512-Ptben3TxPWrZLbInO7zjAK73kmjYuStsxfg6ujgt+EywJyREoibhZYnsSNqC+UiOtl4PdW/MOHhxVDtew5fouQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/primitive\": \"1.0.0\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-id\": \"1.0.0\",\n \"@radix-ui/react-menu\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.0\",\n \"@radix-ui/react-use-controllable-state\": \"1.0.0\"\n },\n \"dependencies\": {\n \"@radix-ui/react-primitive\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz\",\n \"integrity\": \"sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-slot\": \"1.0.0\"\n }\n },\n \"@radix-ui/react-slot\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz\",\n \"integrity\": \"sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\"\n }\n }\n }\n },\n \"@radix-ui/react-focus-guards\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz\",\n \"integrity\": \"sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\"\n }\n },\n \"@radix-ui/react-focus-scope\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.1.tgz\",\n \"integrity\": \"sha512-Ej2MQTit8IWJiS2uuujGUmxXjF/y5xZptIIQnyd2JHLwtV0R2j9NRVoRj/1j/gJ7e3REdaBw4Hjf4a1ImhkZcQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.1\",\n \"@radix-ui/react-use-callback-ref\": \"1.0.0\"\n }\n },\n \"@radix-ui/react-icons\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.1.1.tgz\",\n \"integrity\": \"sha512-xc3wQC59rsFylVbSusQCrrM+6695ppF730Q6yqzhRdqDcRNWIm2R6ngpzBoSOQMcwnq4p805F+Gr7xo4fmtN1A==\",\n \"requires\": {}\n },\n \"@radix-ui/react-id\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz\",\n \"integrity\": \"sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-use-layout-effect\": \"1.0.0\"\n }\n },\n \"@radix-ui/react-menu\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-1.0.0.tgz\",\n \"integrity\": \"sha512-icW4C64T6nHh3Z4Q1fxO1RlSShouFF4UpUmPV8FLaJZfphDljannKErDuALDx4ClRLihAPZ9i+PrLNPoWS2DMA==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/primitive\": \"1.0.0\",\n \"@radix-ui/react-collection\": \"1.0.0\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-direction\": \"1.0.0\",\n \"@radix-ui/react-dismissable-layer\": \"1.0.0\",\n \"@radix-ui/react-focus-guards\": \"1.0.0\",\n \"@radix-ui/react-focus-scope\": \"1.0.0\",\n \"@radix-ui/react-id\": \"1.0.0\",\n \"@radix-ui/react-popper\": \"1.0.0\",\n \"@radix-ui/react-portal\": \"1.0.0\",\n \"@radix-ui/react-presence\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.0\",\n \"@radix-ui/react-roving-focus\": \"1.0.0\",\n \"@radix-ui/react-slot\": \"1.0.0\",\n \"@radix-ui/react-use-callback-ref\": \"1.0.0\",\n \"aria-hidden\": \"^1.1.1\",\n \"react-remove-scroll\": \"2.5.4\"\n },\n \"dependencies\": {\n \"@radix-ui/react-dismissable-layer\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.0.tgz\",\n \"integrity\": \"sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/primitive\": \"1.0.0\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.0\",\n \"@radix-ui/react-use-callback-ref\": \"1.0.0\",\n \"@radix-ui/react-use-escape-keydown\": \"1.0.0\"\n }\n },\n \"@radix-ui/react-focus-scope\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.0.tgz\",\n \"integrity\": \"sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.0\",\n \"@radix-ui/react-use-callback-ref\": \"1.0.0\"\n }\n },\n \"@radix-ui/react-portal\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.0.tgz\",\n \"integrity\": \"sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-primitive\": \"1.0.0\"\n }\n },\n \"@radix-ui/react-primitive\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz\",\n \"integrity\": \"sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-slot\": \"1.0.0\"\n }\n },\n \"@radix-ui/react-slot\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz\",\n \"integrity\": \"sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\"\n }\n },\n \"@radix-ui/react-use-escape-keydown\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz\",\n \"integrity\": \"sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-use-callback-ref\": \"1.0.0\"\n }\n },\n \"react-remove-scroll\": {\n \"version\": \"2.5.4\",\n \"resolved\": \"https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz\",\n \"integrity\": \"sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==\",\n \"requires\": {\n \"react-remove-scroll-bar\": \"^2.3.3\",\n \"react-style-singleton\": \"^2.2.1\",\n \"tslib\": \"^2.1.0\",\n \"use-callback-ref\": \"^1.3.0\",\n \"use-sidecar\": \"^1.1.2\"\n }\n }\n }\n },\n \"@radix-ui/react-popover\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.2.tgz\",\n \"integrity\": \"sha512-4tqZEl9w95R5mlZ/sFdgBnfhCBOEPepLIurBA5kt/qaAhldJ1tNQd0ngr0ET0AHbPotT4mwxMPr7a+MA/wbK0g==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/primitive\": \"1.0.0\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-dismissable-layer\": \"1.0.2\",\n \"@radix-ui/react-focus-guards\": \"1.0.0\",\n \"@radix-ui/react-focus-scope\": \"1.0.1\",\n \"@radix-ui/react-id\": \"1.0.0\",\n \"@radix-ui/react-popper\": \"1.0.1\",\n \"@radix-ui/react-portal\": \"1.0.1\",\n \"@radix-ui/react-presence\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.1\",\n \"@radix-ui/react-slot\": \"1.0.1\",\n \"@radix-ui/react-use-controllable-state\": \"1.0.0\",\n \"aria-hidden\": \"^1.1.1\",\n \"react-remove-scroll\": \"2.5.5\"\n },\n \"dependencies\": {\n \"@radix-ui/react-arrow\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.1.tgz\",\n \"integrity\": \"sha512-1yientwXqXcErDHEv8av9ZVNEBldH8L9scVR3is20lL+jOCfcJyMFZFEY5cgIrgexsq1qggSXqiEL/d/4f+QXA==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-primitive\": \"1.0.1\"\n }\n },\n \"@radix-ui/react-popper\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.0.1.tgz\",\n \"integrity\": \"sha512-J4Vj7k3k+EHNWgcKrE+BLlQfpewxA7Zd76h5I0bIa+/EqaIZ3DuwrbPj49O3wqN+STnXsBuxiHLiF0iU3yfovw==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@floating-ui/react-dom\": \"0.7.2\",\n \"@radix-ui/react-arrow\": \"1.0.1\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.1\",\n \"@radix-ui/react-use-layout-effect\": \"1.0.0\",\n \"@radix-ui/react-use-rect\": \"1.0.0\",\n \"@radix-ui/react-use-size\": \"1.0.0\",\n \"@radix-ui/rect\": \"1.0.0\"\n }\n }\n }\n },\n \"@radix-ui/react-popper\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.0.0.tgz\",\n \"integrity\": \"sha512-k2dDd+1Wl0XWAMs9ZvAxxYsB9sOsEhrFQV4CINd7IUZf0wfdye4OHen9siwxvZImbzhgVeKTJi68OQmPRvVdMg==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@floating-ui/react-dom\": \"0.7.2\",\n \"@radix-ui/react-arrow\": \"1.0.0\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.0\",\n \"@radix-ui/react-use-layout-effect\": \"1.0.0\",\n \"@radix-ui/react-use-rect\": \"1.0.0\",\n \"@radix-ui/react-use-size\": \"1.0.0\",\n \"@radix-ui/rect\": \"1.0.0\"\n },\n \"dependencies\": {\n \"@radix-ui/react-primitive\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz\",\n \"integrity\": \"sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-slot\": \"1.0.0\"\n }\n },\n \"@radix-ui/react-slot\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz\",\n \"integrity\": \"sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\"\n }\n }\n }\n },\n \"@radix-ui/react-portal\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.1.tgz\",\n \"integrity\": \"sha512-NY2vUWI5WENgAT1nfC6JS7RU5xRYBfjZVLq0HmgEN1Ezy3rk/UruMV4+Rd0F40PEaFC5SrLS1ixYvcYIQrb4Ig==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-primitive\": \"1.0.1\"\n }\n },\n \"@radix-ui/react-presence\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz\",\n \"integrity\": \"sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-use-layout-effect\": \"1.0.0\"\n }\n },\n \"@radix-ui/react-primitive\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz\",\n \"integrity\": \"sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-slot\": \"1.0.1\"\n }\n },\n \"@radix-ui/react-roving-focus\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.0.tgz\",\n \"integrity\": \"sha512-lHvO4MhvoWpeNbiJAoyDsEtbKqP2jkkdwsMVJ3kfqbkC71J/aXE6Th6gkZA1xHEqSku+t+UgoDjvE7Z3gsBpcg==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/primitive\": \"1.0.0\",\n \"@radix-ui/react-collection\": \"1.0.0\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-direction\": \"1.0.0\",\n \"@radix-ui/react-id\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.0\",\n \"@radix-ui/react-use-callback-ref\": \"1.0.0\",\n \"@radix-ui/react-use-controllable-state\": \"1.0.0\"\n },\n \"dependencies\": {\n \"@radix-ui/react-primitive\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz\",\n \"integrity\": \"sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-slot\": \"1.0.0\"\n }\n },\n \"@radix-ui/react-slot\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz\",\n \"integrity\": \"sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\"\n }\n }\n }\n },\n \"@radix-ui/react-slot\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz\",\n \"integrity\": \"sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\"\n }\n },\n \"@radix-ui/react-tooltip\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.2.tgz\",\n \"integrity\": \"sha512-11gUlok2rv5mu+KBtxniOKKNKjqC/uTbgFHWoQdbF46vMV+zjDaBvCtVDK9+MTddlpmlisGPGvvojX7Qm0yr+g==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/primitive\": \"1.0.0\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-dismissable-layer\": \"1.0.2\",\n \"@radix-ui/react-id\": \"1.0.0\",\n \"@radix-ui/react-popper\": \"1.0.1\",\n \"@radix-ui/react-portal\": \"1.0.1\",\n \"@radix-ui/react-presence\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.1\",\n \"@radix-ui/react-slot\": \"1.0.1\",\n \"@radix-ui/react-use-controllable-state\": \"1.0.0\",\n \"@radix-ui/react-visually-hidden\": \"1.0.1\"\n },\n \"dependencies\": {\n \"@radix-ui/react-arrow\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.1.tgz\",\n \"integrity\": \"sha512-1yientwXqXcErDHEv8av9ZVNEBldH8L9scVR3is20lL+jOCfcJyMFZFEY5cgIrgexsq1qggSXqiEL/d/4f+QXA==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-primitive\": \"1.0.1\"\n }\n },\n \"@radix-ui/react-popper\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.0.1.tgz\",\n \"integrity\": \"sha512-J4Vj7k3k+EHNWgcKrE+BLlQfpewxA7Zd76h5I0bIa+/EqaIZ3DuwrbPj49O3wqN+STnXsBuxiHLiF0iU3yfovw==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@floating-ui/react-dom\": \"0.7.2\",\n \"@radix-ui/react-arrow\": \"1.0.1\",\n \"@radix-ui/react-compose-refs\": \"1.0.0\",\n \"@radix-ui/react-context\": \"1.0.0\",\n \"@radix-ui/react-primitive\": \"1.0.1\",\n \"@radix-ui/react-use-layout-effect\": \"1.0.0\",\n \"@radix-ui/react-use-rect\": \"1.0.0\",\n \"@radix-ui/react-use-size\": \"1.0.0\",\n \"@radix-ui/rect\": \"1.0.0\"\n }\n }\n }\n },\n \"@radix-ui/react-use-callback-ref\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz\",\n \"integrity\": \"sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\"\n }\n },\n \"@radix-ui/react-use-controllable-state\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz\",\n \"integrity\": \"sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-use-callback-ref\": \"1.0.0\"\n }\n },\n \"@radix-ui/react-use-escape-keydown\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.2.tgz\",\n \"integrity\": \"sha512-DXGim3x74WgUv+iMNCF+cAo8xUHHeqvjx8zs7trKf+FkQKPQXLk2sX7Gx1ysH7Q76xCpZuxIJE7HLPxRE+Q+GA==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-use-callback-ref\": \"1.0.0\"\n }\n },\n \"@radix-ui/react-use-layout-effect\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz\",\n \"integrity\": \"sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\"\n }\n },\n \"@radix-ui/react-use-rect\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.0.tgz\",\n \"integrity\": \"sha512-TB7pID8NRMEHxb/qQJpvSt3hQU4sqNPM1VCTjTRjEOa7cEop/QMuq8S6fb/5Tsz64kqSvB9WnwsDHtjnrM9qew==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/rect\": \"1.0.0\"\n }\n },\n \"@radix-ui/react-use-size\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.0.tgz\",\n \"integrity\": \"sha512-imZ3aYcoYCKhhgNpkNDh/aTiU05qw9hX+HHI1QDBTyIlcFjgeFlKKySNGMwTp7nYFLQg/j0VA2FmCY4WPDDHMg==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-use-layout-effect\": \"1.0.0\"\n }\n },\n \"@radix-ui/react-visually-hidden\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.1.tgz\",\n \"integrity\": \"sha512-K1hJcCMfWfiYUibRqf3V8r5Drpyf7rh44jnrwAbdvI5iCCijilBBeyQv9SKidYNZIopMdCyR9FnIjkHxHN0FcQ==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\",\n \"@radix-ui/react-primitive\": \"1.0.1\"\n }\n },\n \"@radix-ui/rect\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.0.tgz\",\n \"integrity\": \"sha512-d0O68AYy/9oeEy1DdC07bz1/ZXX+DqCskRd3i4JzLSTXwefzaepQrKjXC7aNM8lTHjFLDO0pDgaEiQ7jEk+HVg==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.13.10\"\n }\n },\n \"@react-hook/latest\": {\n \"version\": \"1.0.3\",\n \"resolved\": \"https://registry.npmjs.org/@react-hook/latest/-/latest-1.0.3.tgz\",\n \"integrity\": \"sha512-dy6duzl+JnAZcDbNTfmaP3xHiKtbXYOaz3G51MGVljh548Y8MWzTr+PHLOfvpypEVW9zwvl+VyKjbWKEVbV1Rg==\",\n \"requires\": {}\n },\n \"@react-hook/throttle\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@react-hook/throttle/-/throttle-2.2.0.tgz\",\n \"integrity\": \"sha512-LJ5eg+yMV8lXtqK3lR+OtOZ2WH/EfWvuiEEu0M3bhR7dZRfTyEJKxH1oK9uyBxiXPtWXiQggWbZirMCXam51tg==\",\n \"requires\": {\n \"@react-hook/latest\": \"^1.0.2\"\n }\n },\n \"@stitches/react\": {\n \"version\": \"1.2.8\",\n \"resolved\": \"https://registry.npmjs.org/@stitches/react/-/react-1.2.8.tgz\",\n \"integrity\": \"sha512-9g9dWI4gsSVe8bNLlb+lMkBYsnIKCZTmvqvDG+Avnn69XfmHZKiaMrx7cgTaddq7aTPPmXiTsbFcUy0xgI4+wA==\",\n \"requires\": {}\n },\n \"@tldraw/core\": {\n \"version\": \"1.20.3\",\n \"resolved\": \"https://registry.npmjs.org/@tldraw/core/-/core-1.20.3.tgz\",\n \"integrity\": \"sha512-R/HqtQOg8yedcN70m75ekdm2u6dAHQpg3uxmzd7/TsdUnbfZc5UMp3TakYlTD6JwSSRV0n2huI4AD8D/NJ5jEw==\",\n \"requires\": {\n \"@tldraw/intersect\": \"^1.8.0\",\n \"@tldraw/vec\": \"^1.8.0\",\n \"@use-gesture/react\": \"^10.2.19\",\n \"perfect-freehand\": \"^1.1.0\"\n }\n },\n \"@tldraw/intersect\": {\n \"version\": \"1.8.0\",\n \"resolved\": \"https://registry.npmjs.org/@tldraw/intersect/-/intersect-1.8.0.tgz\",\n \"integrity\": \"sha512-0UarshNpyq2+O4o0xHMJIBgF0E630mes5CkMoO+D5xgYppSBIkeqYDcv0ujsmAhMKX1O6Y0ShuuHeflBEULUoQ==\",\n \"requires\": {\n \"@tldraw/vec\": \"^1.8.0\"\n }\n },\n \"@tldraw/tldraw\": {\n \"version\": \"1.26.3\",\n \"resolved\": \"https://registry.npmjs.org/@tldraw/tldraw/-/tldraw-1.26.3.tgz\",\n \"integrity\": \"sha512-u8FfU3Q84y9E0PFLtw857bkmtlos4+/SSta9IrKQugrqVLBWzyixa2Wfk4e8h+Fr3CLCPa7uaBnlvT3Awr6dDQ==\",\n \"requires\": {\n \"@radix-ui/react-alert-dialog\": \"^1.0.0\",\n \"@radix-ui/react-context-menu\": \"^1.0.0\",\n \"@radix-ui/react-dialog\": \"^1.0.0\",\n \"@radix-ui/react-dropdown-menu\": \"^1.0.0\",\n \"@radix-ui/react-icons\": \"^1.1.1\",\n \"@radix-ui/react-popover\": \"^1.0.0\",\n \"@radix-ui/react-tooltip\": \"^1.0.0\",\n \"@stitches/react\": \"^1.2.8\",\n \"@tldraw/core\": \"^1.20.2\",\n \"@tldraw/intersect\": \"^1.8.0\",\n \"@tldraw/vec\": \"^1.8.0\",\n \"browser-fs-access\": \"^0.31.0\",\n \"idb-keyval\": \"^6.2.0\",\n \"perfect-freehand\": \"^1.2.0\",\n \"react-error-boundary\": \"^3.1.4\",\n \"react-hotkeys-hook\": \"^3.4.7\",\n \"react-intl\": \"^6.1.1\",\n \"tslib\": \"^2.4.0\",\n \"zustand\": \"^4.1.1\"\n }\n },\n \"@tldraw/vec\": {\n \"version\": \"1.8.0\",\n \"resolved\": \"https://registry.npmjs.org/@tldraw/vec/-/vec-1.8.0.tgz\",\n \"integrity\": \"sha512-GiS5Df3CzXY/fPBFcM0CKFERZfI4Cg1X33VPZX+NLo7Fwm/h9zu/aU24N1mG75Q9LuMnwKm7woxKr8BiUXGYCg==\"\n },\n \"@types/google-protobuf\": {\n \"version\": \"3.15.6\",\n \"resolved\": \"https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.6.tgz\",\n \"integrity\": \"sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==\"\n },\n \"@types/hoist-non-react-statics\": {\n \"version\": \"3.3.1\",\n \"resolved\": \"https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz\",\n \"integrity\": \"sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==\",\n \"requires\": {\n \"@types/react\": \"*\",\n \"hoist-non-react-statics\": \"^3.3.0\"\n }\n },\n \"@types/long\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz\",\n \"integrity\": \"sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==\"\n },\n \"@types/prop-types\": {\n \"version\": \"15.7.5\",\n \"resolved\": \"https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz\",\n \"integrity\": \"sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==\"\n },\n \"@types/randomcolor\": {\n \"version\": \"0.5.7\",\n \"resolved\": \"https://registry.npmjs.org/@types/randomcolor/-/randomcolor-0.5.7.tgz\",\n \"integrity\": \"sha512-LPcG96dGYRCsXlk1fslUNIg6ebEi+bKNyn84uBL/pu2cRSf5i/djD3ArJZOyzszVMVV/DB87va6pMZP+tRSl/w==\",\n \"dev\": true\n },\n \"@types/react\": {\n \"version\": \"18.0.26\",\n \"resolved\": \"https://registry.npmjs.org/@types/react/-/react-18.0.26.tgz\",\n \"integrity\": \"sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==\",\n \"requires\": {\n \"@types/prop-types\": \"*\",\n \"@types/scheduler\": \"*\",\n \"csstype\": \"^3.0.2\"\n }\n },\n \"@types/react-dom\": {\n \"version\": \"18.0.10\",\n \"resolved\": \"https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.10.tgz\",\n \"integrity\": \"sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==\",\n \"dev\": true,\n \"requires\": {\n \"@types/react\": \"*\"\n }\n },\n \"@types/scheduler\": {\n \"version\": \"0.16.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz\",\n \"integrity\": \"sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==\"\n },\n \"@use-gesture/core\": {\n \"version\": \"10.2.23\",\n \"resolved\": \"https://registry.npmjs.org/@use-gesture/core/-/core-10.2.23.tgz\",\n \"integrity\": \"sha512-Ynap/Uh6RX1Vgn3zNmFTyKapapdf7Av+GzAe6h+RsBZaxMF1z3cK6aohHPJP6T1hLrPyH/yehxa7RBqyESG9RA==\"\n },\n \"@use-gesture/react\": {\n \"version\": \"10.2.23\",\n \"resolved\": \"https://registry.npmjs.org/@use-gesture/react/-/react-10.2.23.tgz\",\n \"integrity\": \"sha512-anj9j3Lm4l+/s60Jv1FD2m13r+T+aYstSHUT62hTugojM64LPe9XatfEVHRyWOrGjRU2buQhlm03xN8oxkg/OQ==\",\n \"requires\": {\n \"@use-gesture/core\": \"10.2.23\"\n }\n },\n \"@vitejs/plugin-react\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.2.0.tgz\",\n \"integrity\": \"sha512-FFpefhvExd1toVRlokZgxgy2JtnBOdp4ZDsq7ldCWaqGSGn9UhWMAVm/1lxPL14JfNS5yGz+s9yFrQY6shoStA==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/core\": \"^7.19.6\",\n \"@babel/plugin-transform-react-jsx\": \"^7.19.0\",\n \"@babel/plugin-transform-react-jsx-development\": \"^7.18.6\",\n \"@babel/plugin-transform-react-jsx-self\": \"^7.18.6\",\n \"@babel/plugin-transform-react-jsx-source\": \"^7.19.6\",\n \"magic-string\": \"^0.26.7\",\n \"react-refresh\": \"^0.14.0\"\n }\n },\n \"ansi-styles\": {\n \"version\": \"3.2.1\",\n \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz\",\n \"integrity\": \"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==\",\n \"dev\": true,\n \"requires\": {\n \"color-convert\": \"^1.9.0\"\n }\n },\n \"aria-hidden\": {\n \"version\": \"1.2.2\",\n \"resolved\": \"https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.2.tgz\",\n \"integrity\": \"sha512-6y/ogyDTk/7YAe91T3E2PR1ALVKyM2QbTio5HwM+N1Q6CMlCKhvClyIjkckBswa0f2xJhjsfzIGa1yVSe1UMVA==\",\n \"requires\": {\n \"tslib\": \"^2.0.0\"\n }\n },\n \"browser-fs-access\": {\n \"version\": \"0.31.1\",\n \"resolved\": \"https://registry.npmjs.org/browser-fs-access/-/browser-fs-access-0.31.1.tgz\",\n \"integrity\": \"sha512-jMz9f56DkLM7LyA8wZYO7CtpoF3RdUk1/FXrnRNybgV0R5eqk/fgFWR0k5IMjPYgK4jmZecytP/UDO5WBi9Dhg==\"\n },\n \"browserslist\": {\n \"version\": \"4.21.4\",\n \"resolved\": \"https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz\",\n \"integrity\": \"sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==\",\n \"dev\": true,\n \"requires\": {\n \"caniuse-lite\": \"^1.0.30001400\",\n \"electron-to-chromium\": \"^1.4.251\",\n \"node-releases\": \"^2.0.6\",\n \"update-browserslist-db\": \"^1.0.9\"\n }\n },\n \"caniuse-lite\": {\n \"version\": \"1.0.30001442\",\n \"resolved\": \"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz\",\n \"integrity\": \"sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow==\",\n \"dev\": true\n },\n \"chalk\": {\n \"version\": \"2.4.2\",\n \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz\",\n \"integrity\": \"sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==\",\n \"dev\": true,\n \"requires\": {\n \"ansi-styles\": \"^3.2.1\",\n \"escape-string-regexp\": \"^1.0.5\",\n \"supports-color\": \"^5.3.0\"\n }\n },\n \"color-convert\": {\n \"version\": \"1.9.3\",\n \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz\",\n \"integrity\": \"sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==\",\n \"dev\": true,\n \"requires\": {\n \"color-name\": \"1.1.3\"\n }\n },\n \"color-name\": {\n \"version\": \"1.1.3\",\n \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz\",\n \"integrity\": \"sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==\",\n \"dev\": true\n },\n \"convert-source-map\": {\n \"version\": \"1.9.0\",\n \"resolved\": \"https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz\",\n \"integrity\": \"sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==\",\n \"dev\": true\n },\n \"csstype\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz\",\n \"integrity\": \"sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==\"\n },\n \"debug\": {\n \"version\": \"4.3.4\",\n \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.3.4.tgz\",\n \"integrity\": \"sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==\",\n \"dev\": true,\n \"requires\": {\n \"ms\": \"2.1.2\"\n }\n },\n \"detect-node-es\": {\n \"version\": \"1.1.0\",\n \"resolved\": \"https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz\",\n \"integrity\": \"sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==\"\n },\n \"electron-to-chromium\": {\n \"version\": \"1.4.284\",\n \"resolved\": \"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz\",\n \"integrity\": \"sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==\",\n \"dev\": true\n },\n \"esbuild\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz\",\n \"integrity\": \"sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==\",\n \"dev\": true,\n \"requires\": {\n \"@esbuild/android-arm\": \"0.15.18\",\n \"@esbuild/linux-loong64\": \"0.15.18\",\n \"esbuild-android-64\": \"0.15.18\",\n \"esbuild-android-arm64\": \"0.15.18\",\n \"esbuild-darwin-64\": \"0.15.18\",\n \"esbuild-darwin-arm64\": \"0.15.18\",\n \"esbuild-freebsd-64\": \"0.15.18\",\n \"esbuild-freebsd-arm64\": \"0.15.18\",\n \"esbuild-linux-32\": \"0.15.18\",\n \"esbuild-linux-64\": \"0.15.18\",\n \"esbuild-linux-arm\": \"0.15.18\",\n \"esbuild-linux-arm64\": \"0.15.18\",\n \"esbuild-linux-mips64le\": \"0.15.18\",\n \"esbuild-linux-ppc64le\": \"0.15.18\",\n \"esbuild-linux-riscv64\": \"0.15.18\",\n \"esbuild-linux-s390x\": \"0.15.18\",\n \"esbuild-netbsd-64\": \"0.15.18\",\n \"esbuild-openbsd-64\": \"0.15.18\",\n \"esbuild-sunos-64\": \"0.15.18\",\n \"esbuild-windows-32\": \"0.15.18\",\n \"esbuild-windows-64\": \"0.15.18\",\n \"esbuild-windows-arm64\": \"0.15.18\"\n }\n },\n \"esbuild-android-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz\",\n \"integrity\": \"sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-android-arm64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz\",\n \"integrity\": \"sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-darwin-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz\",\n \"integrity\": \"sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-darwin-arm64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz\",\n \"integrity\": \"sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-freebsd-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz\",\n \"integrity\": \"sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-freebsd-arm64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz\",\n \"integrity\": \"sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-32\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz\",\n \"integrity\": \"sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz\",\n \"integrity\": \"sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-arm\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz\",\n \"integrity\": \"sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-arm64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz\",\n \"integrity\": \"sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-mips64le\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz\",\n \"integrity\": \"sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-ppc64le\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz\",\n \"integrity\": \"sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-riscv64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz\",\n \"integrity\": \"sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-s390x\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz\",\n \"integrity\": \"sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-netbsd-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz\",\n \"integrity\": \"sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-openbsd-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz\",\n \"integrity\": \"sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-sunos-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz\",\n \"integrity\": \"sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-windows-32\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz\",\n \"integrity\": \"sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-windows-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz\",\n \"integrity\": \"sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-windows-arm64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz\",\n \"integrity\": \"sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"escalade\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz\",\n \"integrity\": \"sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==\",\n \"dev\": true\n },\n \"escape-string-regexp\": {\n \"version\": \"1.0.5\",\n \"resolved\": \"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz\",\n \"integrity\": \"sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==\",\n \"dev\": true\n },\n \"fsevents\": {\n \"version\": \"2.3.2\",\n \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz\",\n \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"function-bind\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz\",\n \"integrity\": \"sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==\",\n \"dev\": true\n },\n \"gensync\": {\n \"version\": \"1.0.0-beta.2\",\n \"resolved\": \"https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz\",\n \"integrity\": \"sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==\",\n \"dev\": true\n },\n \"get-nonce\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz\",\n \"integrity\": \"sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==\"\n },\n \"globals\": {\n \"version\": \"11.12.0\",\n \"resolved\": \"https://registry.npmjs.org/globals/-/globals-11.12.0.tgz\",\n \"integrity\": \"sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==\",\n \"dev\": true\n },\n \"google-protobuf\": {\n \"version\": \"3.21.2\",\n \"resolved\": \"https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz\",\n \"integrity\": \"sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==\"\n },\n \"grpc-web\": {\n \"version\": \"1.4.2\",\n \"resolved\": \"https://registry.npmjs.org/grpc-web/-/grpc-web-1.4.2.tgz\",\n \"integrity\": \"sha512-gUxWq42l5ldaRplcKb4Pw5O4XBONWZgz3vxIIXnfIeJj8Jc3wYiq2O4c9xzx/NGbbPEej4rhI62C9eTENwLGNw==\"\n },\n \"has\": {\n \"version\": \"1.0.3\",\n \"resolved\": \"https://registry.npmjs.org/has/-/has-1.0.3.tgz\",\n \"integrity\": \"sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==\",\n \"dev\": true,\n \"requires\": {\n \"function-bind\": \"^1.1.1\"\n }\n },\n \"has-flag\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz\",\n \"integrity\": \"sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==\",\n \"dev\": true\n },\n \"hoist-non-react-statics\": {\n \"version\": \"3.3.2\",\n \"resolved\": \"https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz\",\n \"integrity\": \"sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==\",\n \"requires\": {\n \"react-is\": \"^16.7.0\"\n }\n },\n \"hotkeys-js\": {\n \"version\": \"3.9.4\",\n \"resolved\": \"https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-3.9.4.tgz\",\n \"integrity\": \"sha512-2zuLt85Ta+gIyvs4N88pCYskNrxf1TFv3LR9t5mdAZIX8BcgQQ48F2opUptvHa6m8zsy5v/a0i9mWzTrlNWU0Q==\"\n },\n \"idb-keyval\": {\n \"version\": \"6.2.0\",\n \"resolved\": \"https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.0.tgz\",\n \"integrity\": \"sha512-uw+MIyQn2jl3+hroD7hF8J7PUviBU7BPKWw4f/ISf32D4LoGu98yHjrzWWJDASu9QNrX10tCJqk9YY0ClWm8Ng==\",\n \"requires\": {\n \"safari-14-idb-fix\": \"^3.0.0\"\n }\n },\n \"intl-messageformat\": {\n \"version\": \"10.2.5\",\n \"resolved\": \"https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.2.5.tgz\",\n \"integrity\": \"sha512-AievYMN6WLLHwBeCTv4aRKG+w3ZNyZtkObwgsKk3Q7GNTq8zDRvDbJSBQkb2OPeVCcAKcIXvak9FF/bRNavoww==\",\n \"requires\": {\n \"@formatjs/ecma402-abstract\": \"1.14.3\",\n \"@formatjs/fast-memoize\": \"1.2.7\",\n \"@formatjs/icu-messageformat-parser\": \"2.1.14\",\n \"tslib\": \"^2.4.0\"\n }\n },\n \"invariant\": {\n \"version\": \"2.2.4\",\n \"resolved\": \"https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz\",\n \"integrity\": \"sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==\",\n \"requires\": {\n \"loose-envify\": \"^1.0.0\"\n }\n },\n \"is-core-module\": {\n \"version\": \"2.11.0\",\n \"resolved\": \"https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz\",\n \"integrity\": \"sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==\",\n \"dev\": true,\n \"requires\": {\n \"has\": \"^1.0.3\"\n }\n },\n \"js-tokens\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\"\n },\n \"jsesc\": {\n \"version\": \"2.5.2\",\n \"resolved\": \"https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz\",\n \"integrity\": \"sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==\",\n \"dev\": true\n },\n \"json5\": {\n \"version\": \"2.2.3\",\n \"resolved\": \"https://registry.npmjs.org/json5/-/json5-2.2.3.tgz\",\n \"integrity\": \"sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==\",\n \"dev\": true\n },\n \"long\": {\n \"version\": \"5.2.1\",\n \"resolved\": \"https://registry.npmjs.org/long/-/long-5.2.1.tgz\",\n \"integrity\": \"sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==\"\n },\n \"loose-envify\": {\n \"version\": \"1.4.0\",\n \"resolved\": \"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz\",\n \"integrity\": \"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==\",\n \"requires\": {\n \"js-tokens\": \"^3.0.0 || ^4.0.0\"\n }\n },\n \"lru-cache\": {\n \"version\": \"5.1.1\",\n \"resolved\": \"https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz\",\n \"integrity\": \"sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==\",\n \"dev\": true,\n \"requires\": {\n \"yallist\": \"^3.0.2\"\n }\n },\n \"magic-string\": {\n \"version\": \"0.26.7\",\n \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz\",\n \"integrity\": \"sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==\",\n \"dev\": true,\n \"requires\": {\n \"sourcemap-codec\": \"^1.4.8\"\n }\n },\n \"ms\": {\n \"version\": \"2.1.2\",\n \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.2.tgz\",\n \"integrity\": \"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==\",\n \"dev\": true\n },\n \"nanoid\": {\n \"version\": \"3.3.4\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz\",\n \"integrity\": \"sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==\",\n \"dev\": true\n },\n \"node-releases\": {\n \"version\": \"2.0.8\",\n \"resolved\": \"https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz\",\n \"integrity\": \"sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==\",\n \"dev\": true\n },\n \"path-parse\": {\n \"version\": \"1.0.7\",\n \"resolved\": \"https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz\",\n \"integrity\": \"sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==\",\n \"dev\": true\n },\n \"perfect-freehand\": {\n \"version\": \"1.2.0\",\n \"resolved\": \"https://registry.npmjs.org/perfect-freehand/-/perfect-freehand-1.2.0.tgz\",\n \"integrity\": \"sha512-h/0ikF1M3phW7CwpZ5MMvKnfpHficWoOEyr//KVNTxV4F6deRK1eYMtHyBKEAKFK0aXIEUK9oBvlF6PNXMDsAw==\"\n },\n \"picocolors\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz\",\n \"integrity\": \"sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==\",\n \"dev\": true\n },\n \"postcss\": {\n \"version\": \"8.4.21\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz\",\n \"integrity\": \"sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==\",\n \"dev\": true,\n \"requires\": {\n \"nanoid\": \"^3.3.4\",\n \"picocolors\": \"^1.0.0\",\n \"source-map-js\": \"^1.0.2\"\n }\n },\n \"randomcolor\": {\n \"version\": \"0.6.2\",\n \"resolved\": \"https://registry.npmjs.org/randomcolor/-/randomcolor-0.6.2.tgz\",\n \"integrity\": \"sha512-Mn6TbyYpFgwFuQ8KJKqf3bqqY9O1y37/0jgSK/61PUxV4QfIMv0+K2ioq8DfOjkBslcjwSzRfIDEXfzA9aCx7A==\"\n },\n \"react\": {\n \"version\": \"18.2.0\",\n \"resolved\": \"https://registry.npmjs.org/react/-/react-18.2.0.tgz\",\n \"integrity\": \"sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==\",\n \"requires\": {\n \"loose-envify\": \"^1.1.0\"\n }\n },\n \"react-dom\": {\n \"version\": \"18.2.0\",\n \"resolved\": \"https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz\",\n \"integrity\": \"sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==\",\n \"requires\": {\n \"loose-envify\": \"^1.1.0\",\n \"scheduler\": \"^0.23.0\"\n }\n },\n \"react-error-boundary\": {\n \"version\": \"3.1.4\",\n \"resolved\": \"https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz\",\n \"integrity\": \"sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==\",\n \"requires\": {\n \"@babel/runtime\": \"^7.12.5\"\n }\n },\n \"react-hotkeys-hook\": {\n \"version\": \"3.4.7\",\n \"resolved\": \"https://registry.npmjs.org/react-hotkeys-hook/-/react-hotkeys-hook-3.4.7.tgz\",\n \"integrity\": \"sha512-+bbPmhPAl6ns9VkXkNNyxlmCAIyDAcWbB76O4I0ntr3uWCRuIQf/aRLartUahe9chVMPj+OEzzfk3CQSjclUEQ==\",\n \"requires\": {\n \"hotkeys-js\": \"3.9.4\"\n }\n },\n \"react-intl\": {\n \"version\": \"6.2.5\",\n \"resolved\": \"https://registry.npmjs.org/react-intl/-/react-intl-6.2.5.tgz\",\n \"integrity\": \"sha512-nz21POTKbE0sPEuEJU4o5YTZYY7VlIYCPNJaD6D2+xKyk6Noj6DoUK0LRO9LXuQNUuQ044IZl3m6ymzZRj8XFQ==\",\n \"requires\": {\n \"@formatjs/ecma402-abstract\": \"1.14.3\",\n \"@formatjs/icu-messageformat-parser\": \"2.1.14\",\n \"@formatjs/intl\": \"2.6.3\",\n \"@formatjs/intl-displaynames\": \"6.2.3\",\n \"@formatjs/intl-listformat\": \"7.1.7\",\n \"@types/hoist-non-react-statics\": \"^3.3.1\",\n \"@types/react\": \"16 || 17 || 18\",\n \"hoist-non-react-statics\": \"^3.3.2\",\n \"intl-messageformat\": \"10.2.5\",\n \"tslib\": \"^2.4.0\"\n }\n },\n \"react-is\": {\n \"version\": \"16.13.1\",\n \"resolved\": \"https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz\",\n \"integrity\": \"sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==\"\n },\n \"react-refresh\": {\n \"version\": \"0.14.0\",\n \"resolved\": \"https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz\",\n \"integrity\": \"sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==\",\n \"dev\": true\n },\n \"react-remove-scroll\": {\n \"version\": \"2.5.5\",\n \"resolved\": \"https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz\",\n \"integrity\": \"sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==\",\n \"requires\": {\n \"react-remove-scroll-bar\": \"^2.3.3\",\n \"react-style-singleton\": \"^2.2.1\",\n \"tslib\": \"^2.1.0\",\n \"use-callback-ref\": \"^1.3.0\",\n \"use-sidecar\": \"^1.1.2\"\n }\n },\n \"react-remove-scroll-bar\": {\n \"version\": \"2.3.4\",\n \"resolved\": \"https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz\",\n \"integrity\": \"sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==\",\n \"requires\": {\n \"react-style-singleton\": \"^2.2.1\",\n \"tslib\": \"^2.0.0\"\n }\n },\n \"react-style-singleton\": {\n \"version\": \"2.2.1\",\n \"resolved\": \"https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz\",\n \"integrity\": \"sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==\",\n \"requires\": {\n \"get-nonce\": \"^1.0.0\",\n \"invariant\": \"^2.2.4\",\n \"tslib\": \"^2.0.0\"\n }\n },\n \"regenerator-runtime\": {\n \"version\": \"0.13.11\",\n \"resolved\": \"https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz\",\n \"integrity\": \"sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==\"\n },\n \"resolve\": {\n \"version\": \"1.22.1\",\n \"resolved\": \"https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz\",\n \"integrity\": \"sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==\",\n \"dev\": true,\n \"requires\": {\n \"is-core-module\": \"^2.9.0\",\n \"path-parse\": \"^1.0.7\",\n \"supports-preserve-symlinks-flag\": \"^1.0.0\"\n }\n },\n \"rollup\": {\n \"version\": \"2.79.1\",\n \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz\",\n \"integrity\": \"sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==\",\n \"dev\": true,\n \"requires\": {\n \"fsevents\": \"~2.3.2\"\n }\n },\n \"safari-14-idb-fix\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/safari-14-idb-fix/-/safari-14-idb-fix-3.0.0.tgz\",\n \"integrity\": \"sha512-eBNFLob4PMq8JA1dGyFn6G97q3/WzNtFK4RnzT1fnLq+9RyrGknzYiM/9B12MnKAxuj1IXr7UKYtTNtjyKMBog==\"\n },\n \"scheduler\": {\n \"version\": \"0.23.0\",\n \"resolved\": \"https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz\",\n \"integrity\": \"sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==\",\n \"requires\": {\n \"loose-envify\": \"^1.1.0\"\n }\n },\n \"semver\": {\n \"version\": \"6.3.0\",\n \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.0.tgz\",\n \"integrity\": \"sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==\",\n \"dev\": true\n },\n \"source-map-js\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz\",\n \"integrity\": \"sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==\",\n \"dev\": true\n },\n \"sourcemap-codec\": {\n \"version\": \"1.4.8\",\n \"resolved\": \"https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz\",\n \"integrity\": \"sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==\",\n \"dev\": true\n },\n \"supports-color\": {\n \"version\": \"5.5.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz\",\n \"integrity\": \"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==\",\n \"dev\": true,\n \"requires\": {\n \"has-flag\": \"^3.0.0\"\n }\n },\n \"supports-preserve-symlinks-flag\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz\",\n \"integrity\": \"sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==\",\n \"dev\": true\n },\n \"to-fast-properties\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz\",\n \"integrity\": \"sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==\",\n \"dev\": true\n },\n \"tslib\": {\n \"version\": \"2.4.1\",\n \"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz\",\n \"integrity\": \"sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==\"\n },\n \"typescript\": {\n \"version\": \"4.9.4\",\n \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz\",\n \"integrity\": \"sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==\",\n \"devOptional\": true\n },\n \"unique-names-generator\": {\n \"version\": \"4.7.1\",\n \"resolved\": \"https://registry.npmjs.org/unique-names-generator/-/unique-names-generator-4.7.1.tgz\",\n \"integrity\": \"sha512-lMx9dX+KRmG8sq6gulYYpKWZc9RlGsgBR6aoO8Qsm3qvkSJ+3rAymr+TnV8EDMrIrwuFJ4kruzMWM/OpYzPoow==\"\n },\n \"update-browserslist-db\": {\n \"version\": \"1.0.10\",\n \"resolved\": \"https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz\",\n \"integrity\": \"sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==\",\n \"dev\": true,\n \"requires\": {\n \"escalade\": \"^3.1.1\",\n \"picocolors\": \"^1.0.0\"\n }\n },\n \"use-callback-ref\": {\n \"version\": \"1.3.0\",\n \"resolved\": \"https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz\",\n \"integrity\": \"sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==\",\n \"requires\": {\n \"tslib\": \"^2.0.0\"\n }\n },\n \"use-isomorphic-layout-effect\": {\n \"version\": \"1.1.2\",\n \"resolved\": \"https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz\",\n \"integrity\": \"sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==\",\n \"requires\": {}\n },\n \"use-sidecar\": {\n \"version\": \"1.1.2\",\n \"resolved\": \"https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz\",\n \"integrity\": \"sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==\",\n \"requires\": {\n \"detect-node-es\": \"^1.1.0\",\n \"tslib\": \"^2.0.0\"\n }\n },\n \"use-sync-external-store\": {\n \"version\": \"1.2.0\",\n \"resolved\": \"https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz\",\n \"integrity\": \"sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==\",\n \"requires\": {}\n },\n \"vite\": {\n \"version\": \"3.2.7\",\n \"resolved\": \"https://registry.npmjs.org/vite/-/vite-3.2.7.tgz\",\n \"integrity\": \"sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==\",\n \"dev\": true,\n \"requires\": {\n \"esbuild\": \"^0.15.9\",\n \"fsevents\": \"~2.3.2\",\n \"postcss\": \"^8.4.18\",\n \"resolve\": \"^1.22.1\",\n \"rollup\": \"^2.79.1\"\n }\n },\n \"yallist\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz\",\n \"integrity\": \"sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==\",\n \"dev\": true\n },\n \"yorkie-js-sdk\": {\n \"version\": \"0.3.5\",\n \"resolved\": \"https://registry.npmjs.org/yorkie-js-sdk/-/yorkie-js-sdk-0.3.5.tgz\",\n \"integrity\": \"sha512-CZdc5yUhmJUQWpulDOeDwlW9Uh5WgDBLuCyhXV8+Crb3Kr14PCmrJJ9lI3rVSReosQtq8RjPYnwMd7KbtYALyw==\",\n \"requires\": {\n \"@types/google-protobuf\": \"^3.15.5\",\n \"@types/long\": \"^4.0.1\",\n \"google-protobuf\": \"^3.19.4\",\n \"grpc-web\": \"^1.3.1\",\n \"long\": \"^5.2.0\"\n }\n },\n \"zustand\": {\n \"version\": \"4.2.0\",\n \"resolved\": \"https://registry.npmjs.org/zustand/-/zustand-4.2.0.tgz\",\n \"integrity\": \"sha512-eNwaDoD2FYVnMgtNxiMUhTJO780wonZUzJrPQTLYI0erSIMZF8cniWFW22kGQUECd8rdHRJ/ZJL2XO54c9Ttuw==\",\n \"requires\": {\n \"use-sync-external-store\": \"1.2.0\"\n }\n }\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package.json","path":"/package.json","content":"{\n \"name\": \"react-tldraw\",\n \"private\": true,\n \"version\": \"0.1.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"tsc && vite build\",\n \"preview\": \"vite preview\"\n },\n \"dependencies\": {\n \"@tldraw/tldraw\": \"1.26.3\",\n \"@react-hook/throttle\": \"^2.2.0\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"yorkie-js-sdk\": \"^0.4.2\",\n \"randomcolor\": \"^0.6.2\",\n \"unique-names-generator\": \"^4.7.1\"\n },\n \"devDependencies\": {\n \"@types/react\": \"^18.0.24\",\n \"@types/react-dom\": \"^18.0.8\",\n \"@vitejs/plugin-react\": \"^2.2.0\",\n \"@types/randomcolor\": \"^0.5.5\",\n \"typescript\": \"^4.6.4\",\n \"vite\": \"^3.2.7\"\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"jpg","name":"thumbnail.jpg","path":"/thumbnail.jpg","content":""},{"isFile":true,"isOpen":false,"language":"json","name":"tsconfig.json","path":"/tsconfig.json","content":"{\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"useDefineForClassFields\": true,\n \"lib\": [\"DOM\", \"DOM.Iterable\", \"ESNext\"],\n \"allowJs\": false,\n \"skipLibCheck\": true,\n \"esModuleInterop\": false,\n \"allowSyntheticDefaultImports\": true,\n \"strict\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Node\",\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"noEmit\": true,\n \"jsx\": \"react-jsx\"\n },\n \"include\": [\"src\"],\n \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"},{"isFile":true,"isOpen":false,"language":"json","name":"tsconfig.node.json","path":"/tsconfig.node.json","content":"{\n \"compilerOptions\": {\n \"composite\": true,\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Node\",\n \"allowSyntheticDefaultImports\": true\n },\n \"include\": [\"vite.config.ts\"]\n}\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"vite.config.ts","path":"/vite.config.ts","content":"import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n base: '',\n plugins: [react()],\n});\n"}]} \ No newline at end of file + export const FILE_INFO: DirectoryInfo = {"isFile":false,"name":"react-tldraw","path":"/","children":[{"isFile":false,"name":"src","path":"/src","children":[{"isFile":false,"name":"hooks","path":"/src/hooks","children":[{"isFile":true,"isOpen":false,"language":"typescript","name":"types.ts","path":"/src/hooks/types.ts","content":"// Yorkie type for typescript\nimport type { TDAsset, TDBinding, TDShape, TDUser } from '@tldraw/tldraw';\nimport type { JSONObject } from 'yorkie-js-sdk';\nexport type Options = {\n apiKey?: string;\n syncLoopDuration: number;\n reconnectStreamDelay: number;\n};\n\nexport type YorkieDocType = {\n shapes: JSONObject>>;\n bindings: JSONObject>>;\n assets: JSONObject>>;\n};\n\nexport type YorkiePresenceType = {\n tdUser: TDUser;\n};\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"useMultiplayerState.ts","path":"/src/hooks/useMultiplayerState.ts","content":"/* eslint-disable jsdoc/require-jsdoc */\nimport { useCallback, useEffect, useState } from 'react';\nimport {\n TDUserStatus,\n TDAsset,\n TDBinding,\n TDShape,\n TDUser,\n TldrawApp,\n} from '@tldraw/tldraw';\nimport { useThrottleCallback } from '@react-hook/throttle';\nimport * as yorkie from 'yorkie-js-sdk';\nimport randomColor from 'randomcolor';\nimport { uniqueNamesGenerator, names } from 'unique-names-generator';\nimport _ from 'lodash';\n\nimport type { Options, YorkieDocType, YorkiePresenceType } from './types';\n\n// Yorkie Client declaration\nlet client: yorkie.Client;\n\n// Yorkie Document declaration\nlet doc: yorkie.Document;\n\nexport function useMultiplayerState(roomId: string) {\n const [app, setApp] = useState();\n const [loading, setLoading] = useState(true);\n\n // Callbacks --------------\n\n const onMount = useCallback(\n (app: TldrawApp) => {\n app.loadRoom(roomId);\n app.setIsLoading(true);\n app.pause();\n setApp(app);\n\n const randomName = uniqueNamesGenerator({\n dictionaries: [names],\n });\n\n // On mount, create new user\n app.updateUsers([\n {\n id: app!.currentUser!.id,\n point: [0, 0],\n color: randomColor(),\n status: TDUserStatus.Connected,\n activeShapes: [],\n selectedIds: [],\n metadata: { name: randomName }, // <-- custom metadata\n },\n ]);\n },\n [roomId],\n );\n\n // Update Yorkie doc when the app's shapes change.\n // Prevent overloading yorkie update api call by throttle\n const onChangePage = useThrottleCallback(\n (\n app: TldrawApp,\n shapes: Record,\n bindings: Record,\n ) => {\n if (!app || client === undefined || doc === undefined) return;\n\n const getUpdatedPropertyList = (\n source: T,\n target: T,\n ) => {\n return (Object.keys(source) as Array).filter(\n (key) => !_.isEqual(source[key], target[key]),\n );\n };\n\n Object.entries(shapes).forEach(([id, shape]) => {\n doc.update((root) => {\n if (!shape) {\n delete root.shapes[id];\n } else if (!root.shapes[id]) {\n root.shapes[id] = shape;\n } else {\n const updatedPropertyList = getUpdatedPropertyList(\n shape,\n root.shapes[id]!.toJS!(),\n );\n\n updatedPropertyList.forEach((key) => {\n const newValue = shape[key];\n (root.shapes[id][key] as typeof newValue) = newValue;\n });\n }\n });\n });\n\n Object.entries(bindings).forEach(([id, binding]) => {\n doc.update((root) => {\n if (!binding) {\n delete root.bindings[id];\n } else if (!root.bindings[id]) {\n root.bindings[id] = binding;\n } else {\n const updatedPropertyList = getUpdatedPropertyList(\n binding,\n root.bindings[id]!.toJS!(),\n );\n\n updatedPropertyList.forEach((key) => {\n const newValue = binding[key];\n (root.bindings[id][key] as typeof newValue) = newValue;\n });\n }\n });\n });\n\n // Should store app.document.assets which is global asset storage referenced by inner page assets\n // Document key for assets should be asset.id (string), not index\n Object.entries(app.assets).forEach(([, asset]) => {\n doc.update((root) => {\n if (!asset.id) {\n delete root.assets[asset.id];\n } else if (root.assets[asset.id]) {\n root.assets[asset.id] = asset;\n } else {\n const updatedPropertyList = getUpdatedPropertyList(\n asset,\n root.assets[asset.id]!.toJS!(),\n );\n\n updatedPropertyList.forEach((key) => {\n const newValue = asset[key];\n (root.assets[asset.id][key] as typeof newValue) = newValue;\n });\n }\n });\n });\n },\n 60,\n false,\n );\n\n // Handle presence updates when the user's pointer / selection changes\n const onChangePresence = useThrottleCallback(\n (app: TldrawApp, user: TDUser) => {\n if (!app || client === undefined || !client.isActive()) return;\n\n doc.update((root, presence) => {\n presence.set({ tdUser: user });\n });\n },\n 60,\n false,\n );\n\n // Document Changes --------\n\n useEffect(() => {\n if (!app) return;\n\n // Detach & deactive yorkie client before unload\n function handleDisconnect() {\n if (client === undefined || doc === undefined) return;\n\n client.detach(doc);\n client.deactivate();\n }\n\n window.addEventListener('beforeunload', handleDisconnect);\n\n // Subscribe to changes\n function handleChanges() {\n const root = doc.getRoot();\n\n // Parse proxy object to record\n const shapeRecord: Record = JSON.parse(\n root.shapes.toJSON!(),\n );\n const bindingRecord: Record = JSON.parse(\n root.bindings.toJSON!(),\n );\n const assetRecord: Record = JSON.parse(\n root.assets.toJSON!(),\n );\n\n // Replace page content with changed(propagated) records\n app?.replacePageContent(shapeRecord, bindingRecord, assetRecord);\n }\n\n let stillAlive = true;\n\n // Setup the document's storage and subscriptions\n async function setupDocument() {\n try {\n // 01. Create client with RPCAddr(envoy) and options with apiKey if provided.\n // Then activate client.\n const options: Options = {\n apiKey: import.meta.env.VITE_YORKIE_API_KEY,\n syncLoopDuration: 0,\n reconnectStreamDelay: 1000,\n };\n\n client = new yorkie.Client(\n import.meta.env.VITE_YORKIE_API_ADDR,\n options,\n );\n await client.activate();\n\n // 02. Create document with tldraw custom object type.\n doc = new yorkie.Document(roomId);\n\n // 02-1. Subscribe peers-changed event and update tldraw users state\n doc.subscribe('my-presence', (event) => {\n if (event.type === yorkie.DocEventType.Initialized) {\n const allPeers = doc\n .getPresences()\n .map((peer) => peer.presence.tdUser);\n app?.updateUsers(allPeers);\n }\n });\n doc.subscribe('others', (event) => {\n // remove leaved users\n if (event.type === yorkie.DocEventType.Unwatched) {\n app?.removeUser(event.value.presence.tdUser.id);\n }\n\n // update users\n const allPeers = doc\n .getPresences()\n .map((peer) => peer.presence.tdUser);\n app?.updateUsers(allPeers);\n });\n\n // 02-2. Attach document with initialPresence.\n await client.attach(doc, {\n initialPresence: {\n tdUser: app?.currentUser,\n },\n });\n\n // 03. Initialize document if document not exists.\n doc.update((root) => {\n if (!root.shapes) {\n root.shapes = {};\n }\n if (!root.bindings) {\n root.bindings = {};\n }\n if (!root.assets) {\n root.assets = {};\n }\n }, 'create shapes/bindings/assets object if not exists');\n\n // 04. Subscribe document event and handle changes.\n doc.subscribe((event) => {\n if (event.type === 'remote-change') {\n handleChanges();\n }\n });\n\n // 05. Sync client to sync document with other peers.\n await client.sync();\n\n if (stillAlive) {\n // Update the document with initial content\n handleChanges();\n\n // Zoom to fit the content & finish loading\n if (app) {\n app.zoomToFit();\n if (app.zoom > 1) {\n app.resetZoom();\n }\n app.setIsLoading(false);\n }\n\n setLoading(false);\n }\n } catch (e) {\n console.error(e);\n }\n }\n\n setupDocument();\n\n return () => {\n window.removeEventListener('beforeunload', handleDisconnect);\n stillAlive = false;\n };\n }, [app]);\n\n return {\n onMount,\n onChangePage,\n loading,\n onChangePresence,\n };\n}\n"}]},{"isFile":true,"isOpen":false,"language":"css","name":"App.css","path":"/src/App.css","content":"html,\n* {\n box-sizing: border-box;\n}\n\nbody {\n overscroll-behavior: none;\n margin: 0px;\n padding: 0px;\n font-size: 1em;\n font-family: Arial, Helvetica, sans-serif;\n}\n\n.tldraw {\n position: fixed;\n top: 0px;\n left: 0px;\n right: 0px;\n bottom: 0px;\n width: 100%;\n height: 100%;\n}"},{"isFile":true,"isOpen":false,"language":"tsx","name":"App.tsx","path":"/src/App.tsx","content":"import { Tldraw, useFileSystem } from '@tldraw/tldraw';\nimport { useMultiplayerState } from './hooks/useMultiplayerState';\nimport CustomCursor from './CustomCursor';\nimport './App.css';\n\n/*\nThis demo shows how to integrate TLDraw with a multiplayer room\nvia Yorkie.\n\nWarning: Keeping images enabled for multiplayer applications\nwithout providing a storage bucket based solution will cause\nmassive base64 string to be written to the multiplayer storage.\nIt's recommended to use a storage bucket based solution, such as\nAmazon AWS S3.\n*/\n\nexport default function App() {\n const fileSystemEvents = useFileSystem();\n const { ...events } = useMultiplayerState(\n `tldraw-${(new Date()).toISOString().substring(0, 10).replace(/-/g, '')}`\n );\n const component = { Cursor: CustomCursor };\n\n return (\n
\n \n
\n );\n}\n"},{"isFile":true,"isOpen":false,"language":"tsx","name":"CustomCursor.tsx","path":"/src/CustomCursor.tsx","content":"import { CursorComponent } from '@tldraw/core';\n\n// A custom cursor component.\n// Component overrides for the tldraw renderer\nconst CustomCursor: CursorComponent<{ name: 'Anonymous' }> = ({\n color,\n metadata,\n}) => {\n return (\n \n \n \n {metadata!.name}\n \n \n );\n};\n\nexport default CustomCursor;\n"},{"isFile":true,"isOpen":false,"language":"tsx","name":"main.tsx","path":"/src/main.tsx","content":"import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport App from './App';\n\nReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(\n \n \n ,\n);\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"vite-env.d.ts","path":"/src/vite-env.d.ts","content":"/// \n"}]},{"isFile":true,"isOpen":false,"language":"","name":".env","path":"/.env","content":"VITE_YORKIE_API_ADDR='http://localhost:8080'\nVITE_YORKIE_API_KEY=''"},{"isFile":true,"isOpen":false,"language":"production","name":".env.production","path":"/.env.production","content":"VITE_YORKIE_API_ADDR='https://api.yorkie.dev'\nVITE_YORKIE_API_KEY='cedaovjuioqlk4pjqn6g'"},{"isFile":true,"isOpen":false,"language":"","name":".gitignore","path":"/.gitignore","content":"# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"},{"isFile":true,"isOpen":false,"language":"markdown","name":"README.md","path":"/README.md","content":"# Yorkie React tldraw Example\n\n

\n \n \"Live\n \n

\n\n\"React\n\n## How to run demo\n\nAt project root, run below command to start Yorkie server and Envoy proxy.\n\n```bash\n$ docker-compose -f docker/docker-compose.yml up --build -d\n```\n\nThen install dependencies and run the demo.\n\n```bash\n$ npm install\n```\n\nNow you can run the demo.\n\n```bash\n$ npm run dev\n```\n"},{"isFile":true,"isOpen":false,"language":"markup","name":"index.html","path":"/index.html","content":"\n\n \n \n \n react-tldraw\n \n \n
\n \n \n\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package.json","path":"/package.json","content":"{\n \"name\": \"react-tldraw\",\n \"private\": true,\n \"version\": \"0.1.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"tsc && vite build\",\n \"preview\": \"vite preview\"\n },\n \"dependencies\": {\n \"@react-hook/throttle\": \"^2.2.0\",\n \"@tldraw/tldraw\": \"1.26.3\",\n \"lodash\": \"^4.17.21\",\n \"randomcolor\": \"^0.6.2\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"unique-names-generator\": \"^4.7.1\",\n \"yorkie-js-sdk\": \"^0.4.7\"\n },\n \"devDependencies\": {\n \"@types/lodash\": \"^4.14.198\",\n \"@types/randomcolor\": \"^0.5.5\",\n \"@types/react\": \"^18.0.24\",\n \"@types/react-dom\": \"^18.0.8\",\n \"@vitejs/plugin-react\": \"^2.2.0\",\n \"typescript\": \"^4.6.4\",\n \"vite\": \"^3.2.7\"\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"jpg","name":"thumbnail.jpg","path":"/thumbnail.jpg","content":""},{"isFile":true,"isOpen":false,"language":"json","name":"tsconfig.json","path":"/tsconfig.json","content":"{\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"useDefineForClassFields\": true,\n \"lib\": [\"DOM\", \"DOM.Iterable\", \"ESNext\"],\n \"allowJs\": false,\n \"skipLibCheck\": true,\n \"esModuleInterop\": false,\n \"allowSyntheticDefaultImports\": true,\n \"strict\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Node\",\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"noEmit\": true,\n \"jsx\": \"react-jsx\"\n },\n \"include\": [\"src\"],\n \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"},{"isFile":true,"isOpen":false,"language":"json","name":"tsconfig.node.json","path":"/tsconfig.node.json","content":"{\n \"compilerOptions\": {\n \"composite\": true,\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Node\",\n \"allowSyntheticDefaultImports\": true\n },\n \"include\": [\"vite.config.ts\"]\n}\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"vite.config.ts","path":"/vite.config.ts","content":"import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n base: '',\n plugins: [react()],\n});\n"}]} \ No newline at end of file diff --git a/examples/react-todomvc/fileInfo.ts b/examples/react-todomvc/fileInfo.ts index a2a3c79..f774921 100644 --- a/examples/react-todomvc/fileInfo.ts +++ b/examples/react-todomvc/fileInfo.ts @@ -1,2 +1,2 @@ import { DirectoryInfo } from '@/utils/exampleFileUtils'; - export const FILE_INFO: DirectoryInfo = {"isFile":false,"name":"react-todomvc","path":"/","children":[{"isFile":false,"name":"src","path":"/src","children":[{"isFile":true,"isOpen":false,"language":"css","name":"App.css","path":"/src/App.css","content":"body {\n margin: 20px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n\n.filters li button {\n color: inherit;\n margin: 0px 3px 0px 3px;\n padding: 0px 3px 0px 3px;\n text-decoration: none;\n border: 1px solid transparent;\n border-radius: 3px;\n}\n\n.filters li button:hover {\n border-color: #DB7676;\n}\n\n.filters li button.selected {\n border-color: #CE4646;\n}"},{"isFile":true,"isOpen":false,"language":"tsx","name":"App.tsx","path":"/src/App.tsx","content":"import React, { useState, useEffect } from 'react';\nimport yorkie, { Document, JSONArray } from 'yorkie-js-sdk';\nimport 'todomvc-app-css/index.css';\n\nimport Header from './Header';\nimport MainSection from './MainSection';\nimport { Todo } from './model';\nimport './App.css';\n\nconst initialState = [\n {\n id: 0,\n text: 'Yorkie JS SDK',\n completed: false,\n },\n {\n id: 1,\n text: 'Garbage collection',\n completed: false,\n },\n {\n id: 2,\n text: 'RichText datatype',\n completed: false,\n },\n] as Array;\n\n/**\n * `App` is the root component of the application.\n */\nexport default function App() {\n const [doc] = useState }>>(\n () =>\n new yorkie.Document<{ todos: JSONArray }>(\n `react-todomvc-${new Date()\n .toISOString()\n .substring(0, 10)\n .replace(/-/g, '')}`,\n ),\n );\n const [todos, setTodos] = useState>([]);\n\n const actions = {\n addTodo: (text: string) => {\n doc?.update((root) => {\n root.todos.push({\n id:\n root.todos.reduce((maxId, todo) => Math.max(todo.id, maxId), -1) +\n 1,\n completed: false,\n text,\n });\n });\n },\n deleteTodo: (id: number) => {\n doc?.update((root) => {\n let target;\n for (const todo of root.todos) {\n if (todo.id === id) {\n target = todo as any;\n break;\n }\n }\n if (target) {\n root.todos.deleteByID!(target.getID());\n }\n });\n },\n editTodo: (id: number, text: string) => {\n doc?.update((root) => {\n let target;\n for (const todo of root.todos) {\n if (todo.id === id) {\n target = todo;\n break;\n }\n }\n if (target) {\n target.text = text;\n }\n });\n },\n completeTodo: (id: number) => {\n doc?.update((root) => {\n let target;\n for (const todo of root.todos) {\n if (todo.id === id) {\n target = todo;\n break;\n }\n }\n if (target) {\n target.completed = !target.completed;\n }\n });\n },\n clearCompleted: () => {\n doc?.update((root) => {\n for (const todo of root.todos) {\n if (todo.completed) {\n const t = todo as any;\n root.todos.deleteByID!(t.getID());\n }\n }\n }, '');\n },\n };\n\n useEffect(() => {\n const client = new yorkie.Client(import.meta.env.VITE_YORKIE_API_ADDR, {\n apiKey: import.meta.env.VITE_YORKIE_API_KEY,\n });\n\n /**\n * `attachDoc` is a helper function to attach the document into the client.\n */\n async function attachDoc(\n doc: Document<{ todos: JSONArray }>,\n callback: (todos: any) => void,\n ) {\n // 01. create client with RPCAddr(envoy) then activate it.\n await client.activate();\n\n // 02. attach the document into the client.\n await client.attach(doc);\n\n // 03. create default todos if not exists.\n doc.update((root) => {\n if (!root.todos) {\n root.todos = initialState;\n }\n }, 'create default todos if not exists');\n\n // 04. subscribe change event from local and remote.\n doc.subscribe((event) => {\n callback(doc.getRoot().todos);\n });\n\n // 05. set todos the attached document.\n callback(doc.getRoot().todos);\n }\n\n attachDoc(doc, (todos) => {\n setTodos(todos);\n });\n }, []);\n\n return (\n
\n
\n \n
\n );\n}\n"},{"isFile":true,"isOpen":false,"language":"tsx","name":"Footer.tsx","path":"/src/Footer.tsx","content":"import React from 'react';\nimport classnames from 'classnames';\n\nconst FILTER_TITLES: { [name: string]: string } = {\n SHOW_ALL: 'All',\n SHOW_ACTIVE: 'Active',\n SHOW_COMPLETED: 'Completed',\n};\n\ntype MouseEventHandler =\n (e: React.MouseEvent) => void;\n\ninterface FooterProps {\n completedCount: number;\n activeCount: number;\n filter: string;\n onClearCompleted: MouseEventHandler;\n onShow: Function;\n}\n\nexport default function Footer(props: FooterProps) {\n const {\n activeCount,\n completedCount,\n filter: selectedFilter,\n onClearCompleted,\n onShow\n } = props;\n return (\n
\n \n {activeCount || 'No'}\n  {activeCount === 1 ? 'item' : 'items'} left\n \n
    \n {\n ['SHOW_ALL', 'SHOW_ACTIVE', 'SHOW_COMPLETED'].map((filter) => (\n
  • \n onShow(filter)}\n >\n {FILTER_TITLES[filter]}\n \n
  • \n ))\n }\n
\n {!!completedCount && (\n \n )}\n
\n );\n}\n"},{"isFile":true,"isOpen":false,"language":"tsx","name":"Header.tsx","path":"/src/Header.tsx","content":"import React from 'react';\nimport TodoTextInput from './TodoTextInput';\n\ninterface HeaderProps {\n addTodo: Function\n}\n\nexport default function Header(props: HeaderProps) {\n return (\n
\n

todos

\n {\n if (text.length !== 0) {\n props.addTodo(text);\n }\n }}\n placeholder=\"What needs to be done?\"\n />\n
\n );\n}\n"},{"isFile":true,"isOpen":false,"language":"tsx","name":"MainSection.tsx","path":"/src/MainSection.tsx","content":"import React, { useState } from 'react';\nimport { Todo } from './model';\nimport TodoItem from './TodoItem';\nimport Footer from './Footer';\n\nconst TODO_FILTERS: { [name: string]: (todo: Todo) => boolean } = {\n SHOW_ALL: (todo: Todo) => true,\n SHOW_ACTIVE: (todo: Todo) => !todo.completed,\n SHOW_COMPLETED: (todo: Todo) => todo.completed,\n};\n\ntype ChangeEventHandler = (event: React.ChangeEvent) => void;\n\ninterface MainSectionProps {\n todos: Array;\n actions: { [name: string]: Function };\n}\n\nexport default function MainSection(props: MainSectionProps) {\n const [filter, setFilter] = useState('SHOW_ALL');\n const { todos, actions } = props;\n const filteredTodos = todos.filter(TODO_FILTERS[filter]);\n const completedCount = todos.reduce((count, todo) => {\n return todo.completed ? count + 1 : count;\n }, 0);\n const activeCount = todos.length - completedCount;\n if (todos.length === 0) {\n return null;\n }\n\n return (\n
\n \n
    \n {\n filteredTodos.map((todo) => (\n \n ))\n }\n
\n actions.clearCompleted()}\n onShow={setFilter}\n />\n
\n );\n}\n"},{"isFile":true,"isOpen":false,"language":"tsx","name":"TodoItem.tsx","path":"/src/TodoItem.tsx","content":"import React, { useState } from 'react';\nimport classnames from 'classnames';\nimport { Todo } from './model';\nimport TodoTextInput from './TodoTextInput';\n\ninterface TodoItemProps {\n todo: Todo;\n editTodo: Function;\n deleteTodo: Function;\n completeTodo: Function;\n}\n\nexport default function TodoItem(props: TodoItemProps) {\n const [editing, setEditing] = useState(false);\n const { todo, completeTodo, editTodo, deleteTodo } = props;\n \n return (\n \n {editing ? (\n {\n if (text.length === 0) {\n deleteTodo(todo.id);\n } else {\n editTodo(todo.id, text);\n }\n setEditing(false);\n }}\n />\n ) : (\n
\n completeTodo(todo.id)}\n />\n \n
\n )}\n \n );\n}\n"},{"isFile":true,"isOpen":false,"language":"tsx","name":"TodoTextInput.tsx","path":"/src/TodoTextInput.tsx","content":"import React, { useState } from 'react';\nimport classnames from 'classnames';\n\ninterface TodoInputProps {\n onSave: Function;\n placeholder?: string;\n editing?: boolean;\n text?: string;\n newTodo?: boolean;\n}\n\nexport default function TodoTextInput(props: TodoInputProps) {\n const [text, setText] = useState(props.text || '');\n\n return (\n ) => {\n if (!props.newTodo) {\n props.onSave(e.target.value);\n }\n }}\n onChange={(e: React.ChangeEvent) => {\n setText(e.target.value);\n }}\n onKeyDown={(e: React.KeyboardEvent) => {\n const target = e.target as HTMLInputElement;\n if (e.which === 13) {\n props.onSave(target.value.trim());\n if (props.newTodo) {\n setText('');\n }\n }\n }}\n />\n );\n}\n"},{"isFile":true,"isOpen":false,"language":"tsx","name":"main.tsx","path":"/src/main.tsx","content":"import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport App from './App';\n\nReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(\n ,\n);\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"model.ts","path":"/src/model.ts","content":"export interface Todo {\n id: number;\n text: string;\n completed: boolean;\n}\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"vite-env.d.ts","path":"/src/vite-env.d.ts","content":"/// \n"}]},{"isFile":true,"isOpen":false,"language":"","name":".env","path":"/.env","content":"VITE_YORKIE_API_ADDR='http://localhost:8080'\nVITE_YORKIE_API_KEY=''\n"},{"isFile":true,"isOpen":false,"language":"production","name":".env.production","path":"/.env.production","content":"VITE_YORKIE_API_ADDR='https://api.yorkie.dev'\nVITE_YORKIE_API_KEY='cedaovjuioqlk4pjqn6g'\n"},{"isFile":true,"isOpen":false,"language":"","name":".gitignore","path":"/.gitignore","content":"# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"},{"isFile":true,"isOpen":false,"language":"markdown","name":"README.md","path":"/README.md","content":"# Yorkie React TodoMVC Example\n\n

\n \n \"Live\n \n

\n\n\"React\n\n## How to run demo\n\nAt project root, run below command to start Yorkie server and Envoy proxy.\n\n```bash\n$ docker-compose up -f docker/docker-compose.yml up --build -d\n```\n\nThen install dependencies and run the demo.\n\n```bash\n$ npm install\n```\n\nNow you can run the demo.\n\n```bash\n$ npm run dev\n```\n"},{"isFile":true,"isOpen":false,"language":"markup","name":"index.html","path":"/index.html","content":"\n\n \n \n \n \n Vite + React + TS\n \n \n
\n \n \n\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package-lock.json","path":"/package-lock.json","content":"{\n \"name\": \"react-todomvc\",\n \"version\": \"0.0.0\",\n \"lockfileVersion\": 2,\n \"requires\": true,\n \"packages\": {\n \"\": {\n \"name\": \"react-todomvc\",\n \"version\": \"0.0.0\",\n \"dependencies\": {\n \"classnames\": \"^2.3.2\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"todomvc-app-css\": \"^2.4.2\",\n \"yorkie-js-sdk\": \"^0.3.5\"\n },\n \"devDependencies\": {\n \"@types/react\": \"^18.0.24\",\n \"@types/react-dom\": \"^18.0.8\",\n \"@vitejs/plugin-react\": \"^2.2.0\",\n \"typescript\": \"^4.6.4\",\n \"vite\": \"^3.2.7\"\n }\n },\n \"node_modules/@ampproject/remapping\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz\",\n \"integrity\": \"sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==\",\n \"dev\": true,\n \"dependencies\": {\n \"@jridgewell/gen-mapping\": \"^0.1.0\",\n \"@jridgewell/trace-mapping\": \"^0.3.9\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/code-frame\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz\",\n \"integrity\": \"sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/highlight\": \"^7.18.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/compat-data\": {\n \"version\": \"7.20.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz\",\n \"integrity\": \"sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/core\": {\n \"version\": \"7.20.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz\",\n \"integrity\": \"sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==\",\n \"dev\": true,\n \"dependencies\": {\n \"@ampproject/remapping\": \"^2.1.0\",\n \"@babel/code-frame\": \"^7.18.6\",\n \"@babel/generator\": \"^7.20.2\",\n \"@babel/helper-compilation-targets\": \"^7.20.0\",\n \"@babel/helper-module-transforms\": \"^7.20.2\",\n \"@babel/helpers\": \"^7.20.1\",\n \"@babel/parser\": \"^7.20.2\",\n \"@babel/template\": \"^7.18.10\",\n \"@babel/traverse\": \"^7.20.1\",\n \"@babel/types\": \"^7.20.2\",\n \"convert-source-map\": \"^1.7.0\",\n \"debug\": \"^4.1.0\",\n \"gensync\": \"^1.0.0-beta.2\",\n \"json5\": \"^2.2.1\",\n \"semver\": \"^6.3.0\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"funding\": {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/babel\"\n }\n },\n \"node_modules/@babel/generator\": {\n \"version\": \"7.20.3\",\n \"resolved\": \"https://registry.npmjs.org/@babel/generator/-/generator-7.20.3.tgz\",\n \"integrity\": \"sha512-Wl5ilw2UD1+ZYprHVprxHZJCFeBWlzZYOovE4SDYLZnqCOD11j+0QzNeEWKLLTWM7nixrZEh7vNIyb76MyJg3A==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/types\": \"^7.20.2\",\n \"@jridgewell/gen-mapping\": \"^0.3.2\",\n \"jsesc\": \"^2.5.1\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping\": {\n \"version\": \"0.3.2\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz\",\n \"integrity\": \"sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==\",\n \"dev\": true,\n \"dependencies\": {\n \"@jridgewell/set-array\": \"^1.0.1\",\n \"@jridgewell/sourcemap-codec\": \"^1.4.10\",\n \"@jridgewell/trace-mapping\": \"^0.3.9\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/helper-annotate-as-pure\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz\",\n \"integrity\": \"sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/types\": \"^7.18.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-compilation-targets\": {\n \"version\": \"7.20.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz\",\n \"integrity\": \"sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/compat-data\": \"^7.20.0\",\n \"@babel/helper-validator-option\": \"^7.18.6\",\n \"browserslist\": \"^4.21.3\",\n \"semver\": \"^6.3.0\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0\"\n }\n },\n \"node_modules/@babel/helper-environment-visitor\": {\n \"version\": \"7.18.9\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz\",\n \"integrity\": \"sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-function-name\": {\n \"version\": \"7.19.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz\",\n \"integrity\": \"sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/template\": \"^7.18.10\",\n \"@babel/types\": \"^7.19.0\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-hoist-variables\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz\",\n \"integrity\": \"sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/types\": \"^7.18.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-imports\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz\",\n \"integrity\": \"sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/types\": \"^7.18.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-module-transforms\": {\n \"version\": \"7.20.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz\",\n \"integrity\": \"sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/helper-environment-visitor\": \"^7.18.9\",\n \"@babel/helper-module-imports\": \"^7.18.6\",\n \"@babel/helper-simple-access\": \"^7.20.2\",\n \"@babel/helper-split-export-declaration\": \"^7.18.6\",\n \"@babel/helper-validator-identifier\": \"^7.19.1\",\n \"@babel/template\": \"^7.18.10\",\n \"@babel/traverse\": \"^7.20.1\",\n \"@babel/types\": \"^7.20.2\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-plugin-utils\": {\n \"version\": \"7.20.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz\",\n \"integrity\": \"sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-simple-access\": {\n \"version\": \"7.20.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz\",\n \"integrity\": \"sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/types\": \"^7.20.2\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-split-export-declaration\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz\",\n \"integrity\": \"sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/types\": \"^7.18.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-string-parser\": {\n \"version\": \"7.19.4\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz\",\n \"integrity\": \"sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-identifier\": {\n \"version\": \"7.19.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz\",\n \"integrity\": \"sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helper-validator-option\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz\",\n \"integrity\": \"sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/helpers\": {\n \"version\": \"7.20.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz\",\n \"integrity\": \"sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/template\": \"^7.18.10\",\n \"@babel/traverse\": \"^7.20.1\",\n \"@babel/types\": \"^7.20.0\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/highlight\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz\",\n \"integrity\": \"sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/helper-validator-identifier\": \"^7.18.6\",\n \"chalk\": \"^2.0.0\",\n \"js-tokens\": \"^4.0.0\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/parser\": {\n \"version\": \"7.20.3\",\n \"resolved\": \"https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz\",\n \"integrity\": \"sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==\",\n \"dev\": true,\n \"bin\": {\n \"parser\": \"bin/babel-parser.js\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@babel/plugin-syntax-jsx\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz\",\n \"integrity\": \"sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.18.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx\": {\n \"version\": \"7.19.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz\",\n \"integrity\": \"sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/helper-annotate-as-pure\": \"^7.18.6\",\n \"@babel/helper-module-imports\": \"^7.18.6\",\n \"@babel/helper-plugin-utils\": \"^7.19.0\",\n \"@babel/plugin-syntax-jsx\": \"^7.18.6\",\n \"@babel/types\": \"^7.19.0\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-development\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz\",\n \"integrity\": \"sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/plugin-transform-react-jsx\": \"^7.18.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-self\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz\",\n \"integrity\": \"sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.18.6\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/plugin-transform-react-jsx-source\": {\n \"version\": \"7.19.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz\",\n \"integrity\": \"sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/helper-plugin-utils\": \"^7.19.0\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n },\n \"peerDependencies\": {\n \"@babel/core\": \"^7.0.0-0\"\n }\n },\n \"node_modules/@babel/template\": {\n \"version\": \"7.18.10\",\n \"resolved\": \"https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz\",\n \"integrity\": \"sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.18.6\",\n \"@babel/parser\": \"^7.18.10\",\n \"@babel/types\": \"^7.18.10\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/traverse\": {\n \"version\": \"7.20.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz\",\n \"integrity\": \"sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/code-frame\": \"^7.18.6\",\n \"@babel/generator\": \"^7.20.1\",\n \"@babel/helper-environment-visitor\": \"^7.18.9\",\n \"@babel/helper-function-name\": \"^7.19.0\",\n \"@babel/helper-hoist-variables\": \"^7.18.6\",\n \"@babel/helper-split-export-declaration\": \"^7.18.6\",\n \"@babel/parser\": \"^7.20.1\",\n \"@babel/types\": \"^7.20.0\",\n \"debug\": \"^4.1.0\",\n \"globals\": \"^11.1.0\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@babel/types\": {\n \"version\": \"7.20.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz\",\n \"integrity\": \"sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/helper-string-parser\": \"^7.19.4\",\n \"@babel/helper-validator-identifier\": \"^7.19.1\",\n \"to-fast-properties\": \"^2.0.0\"\n },\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/@esbuild/android-arm\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.13.tgz\",\n \"integrity\": \"sha512-RY2fVI8O0iFUNvZirXaQ1vMvK0xhCcl0gqRj74Z6yEiO1zAUa7hbsdwZM1kzqbxHK7LFyMizipfXT3JME+12Hw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.13.tgz\",\n \"integrity\": \"sha512-+BoyIm4I8uJmH/QDIH0fu7MG0AEx9OXEDXnqptXCwKOlOqZiS4iraH1Nr7/ObLMokW3sOCeBNyD68ATcV9b9Ag==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@jridgewell/gen-mapping\": {\n \"version\": \"0.1.1\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz\",\n \"integrity\": \"sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==\",\n \"dev\": true,\n \"dependencies\": {\n \"@jridgewell/set-array\": \"^1.0.0\",\n \"@jridgewell/sourcemap-codec\": \"^1.4.10\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@jridgewell/resolve-uri\": {\n \"version\": \"3.1.0\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz\",\n \"integrity\": \"sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@jridgewell/set-array\": {\n \"version\": \"1.1.2\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz\",\n \"integrity\": \"sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@jridgewell/sourcemap-codec\": {\n \"version\": \"1.4.14\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz\",\n \"integrity\": \"sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==\",\n \"dev\": true\n },\n \"node_modules/@jridgewell/trace-mapping\": {\n \"version\": \"0.3.17\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz\",\n \"integrity\": \"sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==\",\n \"dev\": true,\n \"dependencies\": {\n \"@jridgewell/resolve-uri\": \"3.1.0\",\n \"@jridgewell/sourcemap-codec\": \"1.4.14\"\n }\n },\n \"node_modules/@types/google-protobuf\": {\n \"version\": \"3.15.6\",\n \"resolved\": \"https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.6.tgz\",\n \"integrity\": \"sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==\"\n },\n \"node_modules/@types/long\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz\",\n \"integrity\": \"sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==\"\n },\n \"node_modules/@types/prop-types\": {\n \"version\": \"15.7.5\",\n \"resolved\": \"https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz\",\n \"integrity\": \"sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==\",\n \"dev\": true\n },\n \"node_modules/@types/react\": {\n \"version\": \"18.0.25\",\n \"resolved\": \"https://registry.npmjs.org/@types/react/-/react-18.0.25.tgz\",\n \"integrity\": \"sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==\",\n \"dev\": true,\n \"dependencies\": {\n \"@types/prop-types\": \"*\",\n \"@types/scheduler\": \"*\",\n \"csstype\": \"^3.0.2\"\n }\n },\n \"node_modules/@types/react-dom\": {\n \"version\": \"18.0.8\",\n \"resolved\": \"https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.8.tgz\",\n \"integrity\": \"sha512-C3GYO0HLaOkk9dDAz3Dl4sbe4AKUGTCfFIZsz3n/82dPNN8Du533HzKatDxeUYWu24wJgMP1xICqkWk1YOLOIw==\",\n \"dev\": true,\n \"dependencies\": {\n \"@types/react\": \"*\"\n }\n },\n \"node_modules/@types/scheduler\": {\n \"version\": \"0.16.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz\",\n \"integrity\": \"sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==\",\n \"dev\": true\n },\n \"node_modules/@vitejs/plugin-react\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.2.0.tgz\",\n \"integrity\": \"sha512-FFpefhvExd1toVRlokZgxgy2JtnBOdp4ZDsq7ldCWaqGSGn9UhWMAVm/1lxPL14JfNS5yGz+s9yFrQY6shoStA==\",\n \"dev\": true,\n \"dependencies\": {\n \"@babel/core\": \"^7.19.6\",\n \"@babel/plugin-transform-react-jsx\": \"^7.19.0\",\n \"@babel/plugin-transform-react-jsx-development\": \"^7.18.6\",\n \"@babel/plugin-transform-react-jsx-self\": \"^7.18.6\",\n \"@babel/plugin-transform-react-jsx-source\": \"^7.19.6\",\n \"magic-string\": \"^0.26.7\",\n \"react-refresh\": \"^0.14.0\"\n },\n \"engines\": {\n \"node\": \"^14.18.0 || >=16.0.0\"\n },\n \"peerDependencies\": {\n \"vite\": \"^3.0.0\"\n }\n },\n \"node_modules/ansi-styles\": {\n \"version\": \"3.2.1\",\n \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz\",\n \"integrity\": \"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==\",\n \"dev\": true,\n \"dependencies\": {\n \"color-convert\": \"^1.9.0\"\n },\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/browserslist\": {\n \"version\": \"4.21.4\",\n \"resolved\": \"https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz\",\n \"integrity\": \"sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n }\n ],\n \"dependencies\": {\n \"caniuse-lite\": \"^1.0.30001400\",\n \"electron-to-chromium\": \"^1.4.251\",\n \"node-releases\": \"^2.0.6\",\n \"update-browserslist-db\": \"^1.0.9\"\n },\n \"bin\": {\n \"browserslist\": \"cli.js\"\n },\n \"engines\": {\n \"node\": \"^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7\"\n }\n },\n \"node_modules/caniuse-lite\": {\n \"version\": \"1.0.30001431\",\n \"resolved\": \"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz\",\n \"integrity\": \"sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/caniuse-lite\"\n }\n ]\n },\n \"node_modules/chalk\": {\n \"version\": \"2.4.2\",\n \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz\",\n \"integrity\": \"sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==\",\n \"dev\": true,\n \"dependencies\": {\n \"ansi-styles\": \"^3.2.1\",\n \"escape-string-regexp\": \"^1.0.5\",\n \"supports-color\": \"^5.3.0\"\n },\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/classnames\": {\n \"version\": \"2.3.2\",\n \"resolved\": \"https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz\",\n \"integrity\": \"sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==\"\n },\n \"node_modules/color-convert\": {\n \"version\": \"1.9.3\",\n \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz\",\n \"integrity\": \"sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==\",\n \"dev\": true,\n \"dependencies\": {\n \"color-name\": \"1.1.3\"\n }\n },\n \"node_modules/color-name\": {\n \"version\": \"1.1.3\",\n \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz\",\n \"integrity\": \"sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==\",\n \"dev\": true\n },\n \"node_modules/convert-source-map\": {\n \"version\": \"1.9.0\",\n \"resolved\": \"https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz\",\n \"integrity\": \"sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==\",\n \"dev\": true\n },\n \"node_modules/csstype\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz\",\n \"integrity\": \"sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==\",\n \"dev\": true\n },\n \"node_modules/debug\": {\n \"version\": \"4.3.4\",\n \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.3.4.tgz\",\n \"integrity\": \"sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==\",\n \"dev\": true,\n \"dependencies\": {\n \"ms\": \"2.1.2\"\n },\n \"engines\": {\n \"node\": \">=6.0\"\n },\n \"peerDependenciesMeta\": {\n \"supports-color\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/electron-to-chromium\": {\n \"version\": \"1.4.284\",\n \"resolved\": \"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz\",\n \"integrity\": \"sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==\",\n \"dev\": true\n },\n \"node_modules/esbuild\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.15.13.tgz\",\n \"integrity\": \"sha512-Cu3SC84oyzzhrK/YyN4iEVy2jZu5t2fz66HEOShHURcjSkOSAVL8C/gfUT+lDJxkVHpg8GZ10DD0rMHRPqMFaQ==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"optionalDependencies\": {\n \"@esbuild/android-arm\": \"0.15.13\",\n \"@esbuild/linux-loong64\": \"0.15.13\",\n \"esbuild-android-64\": \"0.15.13\",\n \"esbuild-android-arm64\": \"0.15.13\",\n \"esbuild-darwin-64\": \"0.15.13\",\n \"esbuild-darwin-arm64\": \"0.15.13\",\n \"esbuild-freebsd-64\": \"0.15.13\",\n \"esbuild-freebsd-arm64\": \"0.15.13\",\n \"esbuild-linux-32\": \"0.15.13\",\n \"esbuild-linux-64\": \"0.15.13\",\n \"esbuild-linux-arm\": \"0.15.13\",\n \"esbuild-linux-arm64\": \"0.15.13\",\n \"esbuild-linux-mips64le\": \"0.15.13\",\n \"esbuild-linux-ppc64le\": \"0.15.13\",\n \"esbuild-linux-riscv64\": \"0.15.13\",\n \"esbuild-linux-s390x\": \"0.15.13\",\n \"esbuild-netbsd-64\": \"0.15.13\",\n \"esbuild-openbsd-64\": \"0.15.13\",\n \"esbuild-sunos-64\": \"0.15.13\",\n \"esbuild-windows-32\": \"0.15.13\",\n \"esbuild-windows-64\": \"0.15.13\",\n \"esbuild-windows-arm64\": \"0.15.13\"\n }\n },\n \"node_modules/esbuild-android-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.13.tgz\",\n \"integrity\": \"sha512-yRorukXBlokwTip+Sy4MYskLhJsO0Kn0/Fj43s1krVblfwP+hMD37a4Wmg139GEsMLl+vh8WXp2mq/cTA9J97g==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-android-arm64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.13.tgz\",\n \"integrity\": \"sha512-TKzyymLD6PiVeyYa4c5wdPw87BeAiTXNtK6amWUcXZxkV51gOk5u5qzmDaYSwiWeecSNHamFsaFjLoi32QR5/w==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-darwin-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.13.tgz\",\n \"integrity\": \"sha512-WAx7c2DaOS6CrRcoYCgXgkXDliLnFv3pQLV6GeW1YcGEZq2Gnl8s9Pg7ahValZkpOa0iE/ojRVQ87sbUhF1Cbg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-darwin-arm64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.13.tgz\",\n \"integrity\": \"sha512-U6jFsPfSSxC3V1CLiQqwvDuj3GGrtQNB3P3nNC3+q99EKf94UGpsG9l4CQ83zBs1NHrk1rtCSYT0+KfK5LsD8A==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-freebsd-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.13.tgz\",\n \"integrity\": \"sha512-whItJgDiOXaDG/idy75qqevIpZjnReZkMGCgQaBWZuKHoElDJC1rh7MpoUgupMcdfOd+PgdEwNQW9DAE6i8wyA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-freebsd-arm64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.13.tgz\",\n \"integrity\": \"sha512-6pCSWt8mLUbPtygv7cufV0sZLeylaMwS5Fznj6Rsx9G2AJJsAjQ9ifA+0rQEIg7DwJmi9it+WjzNTEAzzdoM3Q==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-32\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.13.tgz\",\n \"integrity\": \"sha512-VbZdWOEdrJiYApm2kkxoTOgsoCO1krBZ3quHdYk3g3ivWaMwNIVPIfEE0f0XQQ0u5pJtBsnk2/7OPiCFIPOe/w==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.13.tgz\",\n \"integrity\": \"sha512-rXmnArVNio6yANSqDQlIO4WiP+Cv7+9EuAHNnag7rByAqFVuRusLbGi2697A5dFPNXoO//IiogVwi3AdcfPC6A==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-arm\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.13.tgz\",\n \"integrity\": \"sha512-Ac6LpfmJO8WhCMQmO253xX2IU2B3wPDbl4IvR0hnqcPrdfCaUa2j/lLMGTjmQ4W5JsJIdHEdW12dG8lFS0MbxQ==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-arm64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.13.tgz\",\n \"integrity\": \"sha512-alEMGU4Z+d17U7KQQw2IV8tQycO6T+rOrgW8OS22Ua25x6kHxoG6Ngry6Aq6uranC+pNWNMB6aHFPh7aTQdORQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-mips64le\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.13.tgz\",\n \"integrity\": \"sha512-47PgmyYEu+yN5rD/MbwS6DxP2FSGPo4Uxg5LwIdxTiyGC2XKwHhHyW7YYEDlSuXLQXEdTO7mYe8zQ74czP7W8A==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-ppc64le\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.13.tgz\",\n \"integrity\": \"sha512-z6n28h2+PC1Ayle9DjKoBRcx/4cxHoOa2e689e2aDJSaKug3jXcQw7mM+GLg+9ydYoNzj8QxNL8ihOv/OnezhA==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-riscv64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.13.tgz\",\n \"integrity\": \"sha512-+Lu4zuuXuQhgLUGyZloWCqTslcCAjMZH1k3Xc9MSEJEpEFdpsSU0sRDXAnk18FKOfEjhu4YMGaykx9xjtpA6ow==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-s390x\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.13.tgz\",\n \"integrity\": \"sha512-BMeXRljruf7J0TMxD5CIXS65y7puiZkAh+s4XFV9qy16SxOuMhxhVIXYLnbdfLrsYGFzx7U9mcdpFWkkvy/Uag==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-netbsd-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.13.tgz\",\n \"integrity\": \"sha512-EHj9QZOTel581JPj7UO3xYbltFTYnHy+SIqJVq6yd3KkCrsHRbapiPb0Lx3EOOtybBEE9EyqbmfW1NlSDsSzvQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-openbsd-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.13.tgz\",\n \"integrity\": \"sha512-nkuDlIjF/sfUhfx8SKq0+U+Fgx5K9JcPq1mUodnxI0x4kBdCv46rOGWbuJ6eof2n3wdoCLccOoJAbg9ba/bT2w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-sunos-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.13.tgz\",\n \"integrity\": \"sha512-jVeu2GfxZQ++6lRdY43CS0Tm/r4WuQQ0Pdsrxbw+aOrHQPHV0+LNOLnvbN28M7BSUGnJnHkHm2HozGgNGyeIRw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-windows-32\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.13.tgz\",\n \"integrity\": \"sha512-XoF2iBf0wnqo16SDq+aDGi/+QbaLFpkiRarPVssMh9KYbFNCqPLlGAWwDvxEVz+ywX6Si37J2AKm+AXq1kC0JA==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-windows-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.13.tgz\",\n \"integrity\": \"sha512-Et6htEfGycjDrtqb2ng6nT+baesZPYQIW+HUEHK4D1ncggNrDNk3yoboYQ5KtiVrw/JaDMNttz8rrPubV/fvPQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-windows-arm64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.13.tgz\",\n \"integrity\": \"sha512-3bv7tqntThQC9SWLRouMDmZnlOukBhOCTlkzNqzGCmrkCJI7io5LLjwJBOVY6kOUlIvdxbooNZwjtBvj+7uuVg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/escalade\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz\",\n \"integrity\": \"sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/escape-string-regexp\": {\n \"version\": \"1.0.5\",\n \"resolved\": \"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz\",\n \"integrity\": \"sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=0.8.0\"\n }\n },\n \"node_modules/fsevents\": {\n \"version\": \"2.3.2\",\n \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz\",\n \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n }\n },\n \"node_modules/function-bind\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz\",\n \"integrity\": \"sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==\",\n \"dev\": true\n },\n \"node_modules/gensync\": {\n \"version\": \"1.0.0-beta.2\",\n \"resolved\": \"https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz\",\n \"integrity\": \"sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=6.9.0\"\n }\n },\n \"node_modules/globals\": {\n \"version\": \"11.12.0\",\n \"resolved\": \"https://registry.npmjs.org/globals/-/globals-11.12.0.tgz\",\n \"integrity\": \"sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/google-protobuf\": {\n \"version\": \"3.21.2\",\n \"resolved\": \"https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz\",\n \"integrity\": \"sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==\"\n },\n \"node_modules/grpc-web\": {\n \"version\": \"1.4.2\",\n \"resolved\": \"https://registry.npmjs.org/grpc-web/-/grpc-web-1.4.2.tgz\",\n \"integrity\": \"sha512-gUxWq42l5ldaRplcKb4Pw5O4XBONWZgz3vxIIXnfIeJj8Jc3wYiq2O4c9xzx/NGbbPEej4rhI62C9eTENwLGNw==\"\n },\n \"node_modules/has\": {\n \"version\": \"1.0.3\",\n \"resolved\": \"https://registry.npmjs.org/has/-/has-1.0.3.tgz\",\n \"integrity\": \"sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==\",\n \"dev\": true,\n \"dependencies\": {\n \"function-bind\": \"^1.1.1\"\n },\n \"engines\": {\n \"node\": \">= 0.4.0\"\n }\n },\n \"node_modules/has-flag\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz\",\n \"integrity\": \"sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/is-core-module\": {\n \"version\": \"2.11.0\",\n \"resolved\": \"https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz\",\n \"integrity\": \"sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==\",\n \"dev\": true,\n \"dependencies\": {\n \"has\": \"^1.0.3\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/js-tokens\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\"\n },\n \"node_modules/jsesc\": {\n \"version\": \"2.5.2\",\n \"resolved\": \"https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz\",\n \"integrity\": \"sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==\",\n \"dev\": true,\n \"bin\": {\n \"jsesc\": \"bin/jsesc\"\n },\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/json5\": {\n \"version\": \"2.2.3\",\n \"resolved\": \"https://registry.npmjs.org/json5/-/json5-2.2.3.tgz\",\n \"integrity\": \"sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==\",\n \"dev\": true,\n \"bin\": {\n \"json5\": \"lib/cli.js\"\n },\n \"engines\": {\n \"node\": \">=6\"\n }\n },\n \"node_modules/long\": {\n \"version\": \"5.2.1\",\n \"resolved\": \"https://registry.npmjs.org/long/-/long-5.2.1.tgz\",\n \"integrity\": \"sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==\"\n },\n \"node_modules/loose-envify\": {\n \"version\": \"1.4.0\",\n \"resolved\": \"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz\",\n \"integrity\": \"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==\",\n \"dependencies\": {\n \"js-tokens\": \"^3.0.0 || ^4.0.0\"\n },\n \"bin\": {\n \"loose-envify\": \"cli.js\"\n }\n },\n \"node_modules/magic-string\": {\n \"version\": \"0.26.7\",\n \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz\",\n \"integrity\": \"sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==\",\n \"dev\": true,\n \"dependencies\": {\n \"sourcemap-codec\": \"^1.4.8\"\n },\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/ms\": {\n \"version\": \"2.1.2\",\n \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.2.tgz\",\n \"integrity\": \"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==\",\n \"dev\": true\n },\n \"node_modules/nanoid\": {\n \"version\": \"3.3.4\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz\",\n \"integrity\": \"sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==\",\n \"dev\": true,\n \"bin\": {\n \"nanoid\": \"bin/nanoid.cjs\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || ^13.7 || ^14 || >=15.0.1\"\n }\n },\n \"node_modules/node-releases\": {\n \"version\": \"2.0.6\",\n \"resolved\": \"https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz\",\n \"integrity\": \"sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==\",\n \"dev\": true\n },\n \"node_modules/path-parse\": {\n \"version\": \"1.0.7\",\n \"resolved\": \"https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz\",\n \"integrity\": \"sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==\",\n \"dev\": true\n },\n \"node_modules/picocolors\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz\",\n \"integrity\": \"sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==\",\n \"dev\": true\n },\n \"node_modules/postcss\": {\n \"version\": \"8.4.18\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz\",\n \"integrity\": \"sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/postcss/\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/postcss\"\n }\n ],\n \"dependencies\": {\n \"nanoid\": \"^3.3.4\",\n \"picocolors\": \"^1.0.0\",\n \"source-map-js\": \"^1.0.2\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || >=14\"\n }\n },\n \"node_modules/react\": {\n \"version\": \"18.2.0\",\n \"resolved\": \"https://registry.npmjs.org/react/-/react-18.2.0.tgz\",\n \"integrity\": \"sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n },\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/react-dom\": {\n \"version\": \"18.2.0\",\n \"resolved\": \"https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz\",\n \"integrity\": \"sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\",\n \"scheduler\": \"^0.23.0\"\n },\n \"peerDependencies\": {\n \"react\": \"^18.2.0\"\n }\n },\n \"node_modules/react-refresh\": {\n \"version\": \"0.14.0\",\n \"resolved\": \"https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz\",\n \"integrity\": \"sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/resolve\": {\n \"version\": \"1.22.1\",\n \"resolved\": \"https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz\",\n \"integrity\": \"sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==\",\n \"dev\": true,\n \"dependencies\": {\n \"is-core-module\": \"^2.9.0\",\n \"path-parse\": \"^1.0.7\",\n \"supports-preserve-symlinks-flag\": \"^1.0.0\"\n },\n \"bin\": {\n \"resolve\": \"bin/resolve\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/rollup\": {\n \"version\": \"2.79.1\",\n \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz\",\n \"integrity\": \"sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==\",\n \"dev\": true,\n \"bin\": {\n \"rollup\": \"dist/bin/rollup\"\n },\n \"engines\": {\n \"node\": \">=10.0.0\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.2\"\n }\n },\n \"node_modules/scheduler\": {\n \"version\": \"0.23.0\",\n \"resolved\": \"https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz\",\n \"integrity\": \"sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==\",\n \"dependencies\": {\n \"loose-envify\": \"^1.1.0\"\n }\n },\n \"node_modules/semver\": {\n \"version\": \"6.3.0\",\n \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.0.tgz\",\n \"integrity\": \"sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==\",\n \"dev\": true,\n \"bin\": {\n \"semver\": \"bin/semver.js\"\n }\n },\n \"node_modules/source-map-js\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz\",\n \"integrity\": \"sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/sourcemap-codec\": {\n \"version\": \"1.4.8\",\n \"resolved\": \"https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz\",\n \"integrity\": \"sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==\",\n \"dev\": true\n },\n \"node_modules/supports-color\": {\n \"version\": \"5.5.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz\",\n \"integrity\": \"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==\",\n \"dev\": true,\n \"dependencies\": {\n \"has-flag\": \"^3.0.0\"\n },\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/supports-preserve-symlinks-flag\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz\",\n \"integrity\": \"sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">= 0.4\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/to-fast-properties\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz\",\n \"integrity\": \"sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=4\"\n }\n },\n \"node_modules/todomvc-app-css\": {\n \"version\": \"2.4.2\",\n \"resolved\": \"https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-2.4.2.tgz\",\n \"integrity\": \"sha512-ViAkQ7ed89rmhFIGRsT36njN+97z8+s3XsJnB8E2IKOq+/SLD/6PtSvmTtiwUcVk39qPcjAc/OyeDys4LoJUVg==\"\n },\n \"node_modules/typescript\": {\n \"version\": \"4.8.4\",\n \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz\",\n \"integrity\": \"sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==\",\n \"dev\": true,\n \"bin\": {\n \"tsc\": \"bin/tsc\",\n \"tsserver\": \"bin/tsserver\"\n },\n \"engines\": {\n \"node\": \">=4.2.0\"\n }\n },\n \"node_modules/update-browserslist-db\": {\n \"version\": \"1.0.10\",\n \"resolved\": \"https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz\",\n \"integrity\": \"sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/browserslist\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/browserslist\"\n }\n ],\n \"dependencies\": {\n \"escalade\": \"^3.1.1\",\n \"picocolors\": \"^1.0.0\"\n },\n \"bin\": {\n \"browserslist-lint\": \"cli.js\"\n },\n \"peerDependencies\": {\n \"browserslist\": \">= 4.21.0\"\n }\n },\n \"node_modules/vite\": {\n \"version\": \"3.2.7\",\n \"resolved\": \"https://registry.npmjs.org/vite/-/vite-3.2.7.tgz\",\n \"integrity\": \"sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==\",\n \"dev\": true,\n \"dependencies\": {\n \"esbuild\": \"^0.15.9\",\n \"postcss\": \"^8.4.18\",\n \"resolve\": \"^1.22.1\",\n \"rollup\": \"^2.79.1\"\n },\n \"bin\": {\n \"vite\": \"bin/vite.js\"\n },\n \"engines\": {\n \"node\": \"^14.18.0 || >=16.0.0\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.2\"\n },\n \"peerDependencies\": {\n \"@types/node\": \">= 14\",\n \"less\": \"*\",\n \"sass\": \"*\",\n \"stylus\": \"*\",\n \"sugarss\": \"*\",\n \"terser\": \"^5.4.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/node\": {\n \"optional\": true\n },\n \"less\": {\n \"optional\": true\n },\n \"sass\": {\n \"optional\": true\n },\n \"stylus\": {\n \"optional\": true\n },\n \"sugarss\": {\n \"optional\": true\n },\n \"terser\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/yorkie-js-sdk\": {\n \"version\": \"0.3.5\",\n \"resolved\": \"https://registry.npmjs.org/yorkie-js-sdk/-/yorkie-js-sdk-0.3.5.tgz\",\n \"integrity\": \"sha512-CZdc5yUhmJUQWpulDOeDwlW9Uh5WgDBLuCyhXV8+Crb3Kr14PCmrJJ9lI3rVSReosQtq8RjPYnwMd7KbtYALyw==\",\n \"dependencies\": {\n \"@types/google-protobuf\": \"^3.15.5\",\n \"@types/long\": \"^4.0.1\",\n \"google-protobuf\": \"^3.19.4\",\n \"grpc-web\": \"^1.3.1\",\n \"long\": \"^5.2.0\"\n }\n }\n },\n \"dependencies\": {\n \"@ampproject/remapping\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz\",\n \"integrity\": \"sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==\",\n \"dev\": true,\n \"requires\": {\n \"@jridgewell/gen-mapping\": \"^0.1.0\",\n \"@jridgewell/trace-mapping\": \"^0.3.9\"\n }\n },\n \"@babel/code-frame\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz\",\n \"integrity\": \"sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/highlight\": \"^7.18.6\"\n }\n },\n \"@babel/compat-data\": {\n \"version\": \"7.20.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz\",\n \"integrity\": \"sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==\",\n \"dev\": true\n },\n \"@babel/core\": {\n \"version\": \"7.20.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz\",\n \"integrity\": \"sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==\",\n \"dev\": true,\n \"requires\": {\n \"@ampproject/remapping\": \"^2.1.0\",\n \"@babel/code-frame\": \"^7.18.6\",\n \"@babel/generator\": \"^7.20.2\",\n \"@babel/helper-compilation-targets\": \"^7.20.0\",\n \"@babel/helper-module-transforms\": \"^7.20.2\",\n \"@babel/helpers\": \"^7.20.1\",\n \"@babel/parser\": \"^7.20.2\",\n \"@babel/template\": \"^7.18.10\",\n \"@babel/traverse\": \"^7.20.1\",\n \"@babel/types\": \"^7.20.2\",\n \"convert-source-map\": \"^1.7.0\",\n \"debug\": \"^4.1.0\",\n \"gensync\": \"^1.0.0-beta.2\",\n \"json5\": \"^2.2.1\",\n \"semver\": \"^6.3.0\"\n }\n },\n \"@babel/generator\": {\n \"version\": \"7.20.3\",\n \"resolved\": \"https://registry.npmjs.org/@babel/generator/-/generator-7.20.3.tgz\",\n \"integrity\": \"sha512-Wl5ilw2UD1+ZYprHVprxHZJCFeBWlzZYOovE4SDYLZnqCOD11j+0QzNeEWKLLTWM7nixrZEh7vNIyb76MyJg3A==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/types\": \"^7.20.2\",\n \"@jridgewell/gen-mapping\": \"^0.3.2\",\n \"jsesc\": \"^2.5.1\"\n },\n \"dependencies\": {\n \"@jridgewell/gen-mapping\": {\n \"version\": \"0.3.2\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz\",\n \"integrity\": \"sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==\",\n \"dev\": true,\n \"requires\": {\n \"@jridgewell/set-array\": \"^1.0.1\",\n \"@jridgewell/sourcemap-codec\": \"^1.4.10\",\n \"@jridgewell/trace-mapping\": \"^0.3.9\"\n }\n }\n }\n },\n \"@babel/helper-annotate-as-pure\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz\",\n \"integrity\": \"sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/types\": \"^7.18.6\"\n }\n },\n \"@babel/helper-compilation-targets\": {\n \"version\": \"7.20.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz\",\n \"integrity\": \"sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/compat-data\": \"^7.20.0\",\n \"@babel/helper-validator-option\": \"^7.18.6\",\n \"browserslist\": \"^4.21.3\",\n \"semver\": \"^6.3.0\"\n }\n },\n \"@babel/helper-environment-visitor\": {\n \"version\": \"7.18.9\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz\",\n \"integrity\": \"sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==\",\n \"dev\": true\n },\n \"@babel/helper-function-name\": {\n \"version\": \"7.19.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz\",\n \"integrity\": \"sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/template\": \"^7.18.10\",\n \"@babel/types\": \"^7.19.0\"\n }\n },\n \"@babel/helper-hoist-variables\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz\",\n \"integrity\": \"sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/types\": \"^7.18.6\"\n }\n },\n \"@babel/helper-module-imports\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz\",\n \"integrity\": \"sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/types\": \"^7.18.6\"\n }\n },\n \"@babel/helper-module-transforms\": {\n \"version\": \"7.20.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz\",\n \"integrity\": \"sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/helper-environment-visitor\": \"^7.18.9\",\n \"@babel/helper-module-imports\": \"^7.18.6\",\n \"@babel/helper-simple-access\": \"^7.20.2\",\n \"@babel/helper-split-export-declaration\": \"^7.18.6\",\n \"@babel/helper-validator-identifier\": \"^7.19.1\",\n \"@babel/template\": \"^7.18.10\",\n \"@babel/traverse\": \"^7.20.1\",\n \"@babel/types\": \"^7.20.2\"\n }\n },\n \"@babel/helper-plugin-utils\": {\n \"version\": \"7.20.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz\",\n \"integrity\": \"sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==\",\n \"dev\": true\n },\n \"@babel/helper-simple-access\": {\n \"version\": \"7.20.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz\",\n \"integrity\": \"sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/types\": \"^7.20.2\"\n }\n },\n \"@babel/helper-split-export-declaration\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz\",\n \"integrity\": \"sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/types\": \"^7.18.6\"\n }\n },\n \"@babel/helper-string-parser\": {\n \"version\": \"7.19.4\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz\",\n \"integrity\": \"sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==\",\n \"dev\": true\n },\n \"@babel/helper-validator-identifier\": {\n \"version\": \"7.19.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz\",\n \"integrity\": \"sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==\",\n \"dev\": true\n },\n \"@babel/helper-validator-option\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz\",\n \"integrity\": \"sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==\",\n \"dev\": true\n },\n \"@babel/helpers\": {\n \"version\": \"7.20.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz\",\n \"integrity\": \"sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/template\": \"^7.18.10\",\n \"@babel/traverse\": \"^7.20.1\",\n \"@babel/types\": \"^7.20.0\"\n }\n },\n \"@babel/highlight\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz\",\n \"integrity\": \"sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/helper-validator-identifier\": \"^7.18.6\",\n \"chalk\": \"^2.0.0\",\n \"js-tokens\": \"^4.0.0\"\n }\n },\n \"@babel/parser\": {\n \"version\": \"7.20.3\",\n \"resolved\": \"https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz\",\n \"integrity\": \"sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==\",\n \"dev\": true\n },\n \"@babel/plugin-syntax-jsx\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz\",\n \"integrity\": \"sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/helper-plugin-utils\": \"^7.18.6\"\n }\n },\n \"@babel/plugin-transform-react-jsx\": {\n \"version\": \"7.19.0\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz\",\n \"integrity\": \"sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/helper-annotate-as-pure\": \"^7.18.6\",\n \"@babel/helper-module-imports\": \"^7.18.6\",\n \"@babel/helper-plugin-utils\": \"^7.19.0\",\n \"@babel/plugin-syntax-jsx\": \"^7.18.6\",\n \"@babel/types\": \"^7.19.0\"\n }\n },\n \"@babel/plugin-transform-react-jsx-development\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz\",\n \"integrity\": \"sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/plugin-transform-react-jsx\": \"^7.18.6\"\n }\n },\n \"@babel/plugin-transform-react-jsx-self\": {\n \"version\": \"7.18.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz\",\n \"integrity\": \"sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/helper-plugin-utils\": \"^7.18.6\"\n }\n },\n \"@babel/plugin-transform-react-jsx-source\": {\n \"version\": \"7.19.6\",\n \"resolved\": \"https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz\",\n \"integrity\": \"sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/helper-plugin-utils\": \"^7.19.0\"\n }\n },\n \"@babel/template\": {\n \"version\": \"7.18.10\",\n \"resolved\": \"https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz\",\n \"integrity\": \"sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/code-frame\": \"^7.18.6\",\n \"@babel/parser\": \"^7.18.10\",\n \"@babel/types\": \"^7.18.10\"\n }\n },\n \"@babel/traverse\": {\n \"version\": \"7.20.1\",\n \"resolved\": \"https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz\",\n \"integrity\": \"sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/code-frame\": \"^7.18.6\",\n \"@babel/generator\": \"^7.20.1\",\n \"@babel/helper-environment-visitor\": \"^7.18.9\",\n \"@babel/helper-function-name\": \"^7.19.0\",\n \"@babel/helper-hoist-variables\": \"^7.18.6\",\n \"@babel/helper-split-export-declaration\": \"^7.18.6\",\n \"@babel/parser\": \"^7.20.1\",\n \"@babel/types\": \"^7.20.0\",\n \"debug\": \"^4.1.0\",\n \"globals\": \"^11.1.0\"\n }\n },\n \"@babel/types\": {\n \"version\": \"7.20.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz\",\n \"integrity\": \"sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/helper-string-parser\": \"^7.19.4\",\n \"@babel/helper-validator-identifier\": \"^7.19.1\",\n \"to-fast-properties\": \"^2.0.0\"\n }\n },\n \"@esbuild/android-arm\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.13.tgz\",\n \"integrity\": \"sha512-RY2fVI8O0iFUNvZirXaQ1vMvK0xhCcl0gqRj74Z6yEiO1zAUa7hbsdwZM1kzqbxHK7LFyMizipfXT3JME+12Hw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"@esbuild/linux-loong64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.13.tgz\",\n \"integrity\": \"sha512-+BoyIm4I8uJmH/QDIH0fu7MG0AEx9OXEDXnqptXCwKOlOqZiS4iraH1Nr7/ObLMokW3sOCeBNyD68ATcV9b9Ag==\",\n \"dev\": true,\n \"optional\": true\n },\n \"@jridgewell/gen-mapping\": {\n \"version\": \"0.1.1\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz\",\n \"integrity\": \"sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==\",\n \"dev\": true,\n \"requires\": {\n \"@jridgewell/set-array\": \"^1.0.0\",\n \"@jridgewell/sourcemap-codec\": \"^1.4.10\"\n }\n },\n \"@jridgewell/resolve-uri\": {\n \"version\": \"3.1.0\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz\",\n \"integrity\": \"sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==\",\n \"dev\": true\n },\n \"@jridgewell/set-array\": {\n \"version\": \"1.1.2\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz\",\n \"integrity\": \"sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==\",\n \"dev\": true\n },\n \"@jridgewell/sourcemap-codec\": {\n \"version\": \"1.4.14\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz\",\n \"integrity\": \"sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==\",\n \"dev\": true\n },\n \"@jridgewell/trace-mapping\": {\n \"version\": \"0.3.17\",\n \"resolved\": \"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz\",\n \"integrity\": \"sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==\",\n \"dev\": true,\n \"requires\": {\n \"@jridgewell/resolve-uri\": \"3.1.0\",\n \"@jridgewell/sourcemap-codec\": \"1.4.14\"\n }\n },\n \"@types/google-protobuf\": {\n \"version\": \"3.15.6\",\n \"resolved\": \"https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.6.tgz\",\n \"integrity\": \"sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==\"\n },\n \"@types/long\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz\",\n \"integrity\": \"sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==\"\n },\n \"@types/prop-types\": {\n \"version\": \"15.7.5\",\n \"resolved\": \"https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz\",\n \"integrity\": \"sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==\",\n \"dev\": true\n },\n \"@types/react\": {\n \"version\": \"18.0.25\",\n \"resolved\": \"https://registry.npmjs.org/@types/react/-/react-18.0.25.tgz\",\n \"integrity\": \"sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==\",\n \"dev\": true,\n \"requires\": {\n \"@types/prop-types\": \"*\",\n \"@types/scheduler\": \"*\",\n \"csstype\": \"^3.0.2\"\n }\n },\n \"@types/react-dom\": {\n \"version\": \"18.0.8\",\n \"resolved\": \"https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.8.tgz\",\n \"integrity\": \"sha512-C3GYO0HLaOkk9dDAz3Dl4sbe4AKUGTCfFIZsz3n/82dPNN8Du533HzKatDxeUYWu24wJgMP1xICqkWk1YOLOIw==\",\n \"dev\": true,\n \"requires\": {\n \"@types/react\": \"*\"\n }\n },\n \"@types/scheduler\": {\n \"version\": \"0.16.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz\",\n \"integrity\": \"sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==\",\n \"dev\": true\n },\n \"@vitejs/plugin-react\": {\n \"version\": \"2.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.2.0.tgz\",\n \"integrity\": \"sha512-FFpefhvExd1toVRlokZgxgy2JtnBOdp4ZDsq7ldCWaqGSGn9UhWMAVm/1lxPL14JfNS5yGz+s9yFrQY6shoStA==\",\n \"dev\": true,\n \"requires\": {\n \"@babel/core\": \"^7.19.6\",\n \"@babel/plugin-transform-react-jsx\": \"^7.19.0\",\n \"@babel/plugin-transform-react-jsx-development\": \"^7.18.6\",\n \"@babel/plugin-transform-react-jsx-self\": \"^7.18.6\",\n \"@babel/plugin-transform-react-jsx-source\": \"^7.19.6\",\n \"magic-string\": \"^0.26.7\",\n \"react-refresh\": \"^0.14.0\"\n }\n },\n \"ansi-styles\": {\n \"version\": \"3.2.1\",\n \"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz\",\n \"integrity\": \"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==\",\n \"dev\": true,\n \"requires\": {\n \"color-convert\": \"^1.9.0\"\n }\n },\n \"browserslist\": {\n \"version\": \"4.21.4\",\n \"resolved\": \"https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz\",\n \"integrity\": \"sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==\",\n \"dev\": true,\n \"requires\": {\n \"caniuse-lite\": \"^1.0.30001400\",\n \"electron-to-chromium\": \"^1.4.251\",\n \"node-releases\": \"^2.0.6\",\n \"update-browserslist-db\": \"^1.0.9\"\n }\n },\n \"caniuse-lite\": {\n \"version\": \"1.0.30001431\",\n \"resolved\": \"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz\",\n \"integrity\": \"sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==\",\n \"dev\": true\n },\n \"chalk\": {\n \"version\": \"2.4.2\",\n \"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz\",\n \"integrity\": \"sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==\",\n \"dev\": true,\n \"requires\": {\n \"ansi-styles\": \"^3.2.1\",\n \"escape-string-regexp\": \"^1.0.5\",\n \"supports-color\": \"^5.3.0\"\n }\n },\n \"classnames\": {\n \"version\": \"2.3.2\",\n \"resolved\": \"https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz\",\n \"integrity\": \"sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==\"\n },\n \"color-convert\": {\n \"version\": \"1.9.3\",\n \"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz\",\n \"integrity\": \"sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==\",\n \"dev\": true,\n \"requires\": {\n \"color-name\": \"1.1.3\"\n }\n },\n \"color-name\": {\n \"version\": \"1.1.3\",\n \"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz\",\n \"integrity\": \"sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==\",\n \"dev\": true\n },\n \"convert-source-map\": {\n \"version\": \"1.9.0\",\n \"resolved\": \"https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz\",\n \"integrity\": \"sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==\",\n \"dev\": true\n },\n \"csstype\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz\",\n \"integrity\": \"sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==\",\n \"dev\": true\n },\n \"debug\": {\n \"version\": \"4.3.4\",\n \"resolved\": \"https://registry.npmjs.org/debug/-/debug-4.3.4.tgz\",\n \"integrity\": \"sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==\",\n \"dev\": true,\n \"requires\": {\n \"ms\": \"2.1.2\"\n }\n },\n \"electron-to-chromium\": {\n \"version\": \"1.4.284\",\n \"resolved\": \"https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz\",\n \"integrity\": \"sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==\",\n \"dev\": true\n },\n \"esbuild\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.15.13.tgz\",\n \"integrity\": \"sha512-Cu3SC84oyzzhrK/YyN4iEVy2jZu5t2fz66HEOShHURcjSkOSAVL8C/gfUT+lDJxkVHpg8GZ10DD0rMHRPqMFaQ==\",\n \"dev\": true,\n \"requires\": {\n \"@esbuild/android-arm\": \"0.15.13\",\n \"@esbuild/linux-loong64\": \"0.15.13\",\n \"esbuild-android-64\": \"0.15.13\",\n \"esbuild-android-arm64\": \"0.15.13\",\n \"esbuild-darwin-64\": \"0.15.13\",\n \"esbuild-darwin-arm64\": \"0.15.13\",\n \"esbuild-freebsd-64\": \"0.15.13\",\n \"esbuild-freebsd-arm64\": \"0.15.13\",\n \"esbuild-linux-32\": \"0.15.13\",\n \"esbuild-linux-64\": \"0.15.13\",\n \"esbuild-linux-arm\": \"0.15.13\",\n \"esbuild-linux-arm64\": \"0.15.13\",\n \"esbuild-linux-mips64le\": \"0.15.13\",\n \"esbuild-linux-ppc64le\": \"0.15.13\",\n \"esbuild-linux-riscv64\": \"0.15.13\",\n \"esbuild-linux-s390x\": \"0.15.13\",\n \"esbuild-netbsd-64\": \"0.15.13\",\n \"esbuild-openbsd-64\": \"0.15.13\",\n \"esbuild-sunos-64\": \"0.15.13\",\n \"esbuild-windows-32\": \"0.15.13\",\n \"esbuild-windows-64\": \"0.15.13\",\n \"esbuild-windows-arm64\": \"0.15.13\"\n }\n },\n \"esbuild-android-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.13.tgz\",\n \"integrity\": \"sha512-yRorukXBlokwTip+Sy4MYskLhJsO0Kn0/Fj43s1krVblfwP+hMD37a4Wmg139GEsMLl+vh8WXp2mq/cTA9J97g==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-android-arm64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.13.tgz\",\n \"integrity\": \"sha512-TKzyymLD6PiVeyYa4c5wdPw87BeAiTXNtK6amWUcXZxkV51gOk5u5qzmDaYSwiWeecSNHamFsaFjLoi32QR5/w==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-darwin-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.13.tgz\",\n \"integrity\": \"sha512-WAx7c2DaOS6CrRcoYCgXgkXDliLnFv3pQLV6GeW1YcGEZq2Gnl8s9Pg7ahValZkpOa0iE/ojRVQ87sbUhF1Cbg==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-darwin-arm64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.13.tgz\",\n \"integrity\": \"sha512-U6jFsPfSSxC3V1CLiQqwvDuj3GGrtQNB3P3nNC3+q99EKf94UGpsG9l4CQ83zBs1NHrk1rtCSYT0+KfK5LsD8A==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-freebsd-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.13.tgz\",\n \"integrity\": \"sha512-whItJgDiOXaDG/idy75qqevIpZjnReZkMGCgQaBWZuKHoElDJC1rh7MpoUgupMcdfOd+PgdEwNQW9DAE6i8wyA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-freebsd-arm64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.13.tgz\",\n \"integrity\": \"sha512-6pCSWt8mLUbPtygv7cufV0sZLeylaMwS5Fznj6Rsx9G2AJJsAjQ9ifA+0rQEIg7DwJmi9it+WjzNTEAzzdoM3Q==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-32\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.13.tgz\",\n \"integrity\": \"sha512-VbZdWOEdrJiYApm2kkxoTOgsoCO1krBZ3quHdYk3g3ivWaMwNIVPIfEE0f0XQQ0u5pJtBsnk2/7OPiCFIPOe/w==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.13.tgz\",\n \"integrity\": \"sha512-rXmnArVNio6yANSqDQlIO4WiP+Cv7+9EuAHNnag7rByAqFVuRusLbGi2697A5dFPNXoO//IiogVwi3AdcfPC6A==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-arm\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.13.tgz\",\n \"integrity\": \"sha512-Ac6LpfmJO8WhCMQmO253xX2IU2B3wPDbl4IvR0hnqcPrdfCaUa2j/lLMGTjmQ4W5JsJIdHEdW12dG8lFS0MbxQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-arm64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.13.tgz\",\n \"integrity\": \"sha512-alEMGU4Z+d17U7KQQw2IV8tQycO6T+rOrgW8OS22Ua25x6kHxoG6Ngry6Aq6uranC+pNWNMB6aHFPh7aTQdORQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-mips64le\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.13.tgz\",\n \"integrity\": \"sha512-47PgmyYEu+yN5rD/MbwS6DxP2FSGPo4Uxg5LwIdxTiyGC2XKwHhHyW7YYEDlSuXLQXEdTO7mYe8zQ74czP7W8A==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-ppc64le\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.13.tgz\",\n \"integrity\": \"sha512-z6n28h2+PC1Ayle9DjKoBRcx/4cxHoOa2e689e2aDJSaKug3jXcQw7mM+GLg+9ydYoNzj8QxNL8ihOv/OnezhA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-riscv64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.13.tgz\",\n \"integrity\": \"sha512-+Lu4zuuXuQhgLUGyZloWCqTslcCAjMZH1k3Xc9MSEJEpEFdpsSU0sRDXAnk18FKOfEjhu4YMGaykx9xjtpA6ow==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-s390x\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.13.tgz\",\n \"integrity\": \"sha512-BMeXRljruf7J0TMxD5CIXS65y7puiZkAh+s4XFV9qy16SxOuMhxhVIXYLnbdfLrsYGFzx7U9mcdpFWkkvy/Uag==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-netbsd-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.13.tgz\",\n \"integrity\": \"sha512-EHj9QZOTel581JPj7UO3xYbltFTYnHy+SIqJVq6yd3KkCrsHRbapiPb0Lx3EOOtybBEE9EyqbmfW1NlSDsSzvQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-openbsd-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.13.tgz\",\n \"integrity\": \"sha512-nkuDlIjF/sfUhfx8SKq0+U+Fgx5K9JcPq1mUodnxI0x4kBdCv46rOGWbuJ6eof2n3wdoCLccOoJAbg9ba/bT2w==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-sunos-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.13.tgz\",\n \"integrity\": \"sha512-jVeu2GfxZQ++6lRdY43CS0Tm/r4WuQQ0Pdsrxbw+aOrHQPHV0+LNOLnvbN28M7BSUGnJnHkHm2HozGgNGyeIRw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-windows-32\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.13.tgz\",\n \"integrity\": \"sha512-XoF2iBf0wnqo16SDq+aDGi/+QbaLFpkiRarPVssMh9KYbFNCqPLlGAWwDvxEVz+ywX6Si37J2AKm+AXq1kC0JA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-windows-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.13.tgz\",\n \"integrity\": \"sha512-Et6htEfGycjDrtqb2ng6nT+baesZPYQIW+HUEHK4D1ncggNrDNk3yoboYQ5KtiVrw/JaDMNttz8rrPubV/fvPQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-windows-arm64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.13.tgz\",\n \"integrity\": \"sha512-3bv7tqntThQC9SWLRouMDmZnlOukBhOCTlkzNqzGCmrkCJI7io5LLjwJBOVY6kOUlIvdxbooNZwjtBvj+7uuVg==\",\n \"dev\": true,\n \"optional\": true\n },\n \"escalade\": {\n \"version\": \"3.1.1\",\n \"resolved\": \"https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz\",\n \"integrity\": \"sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==\",\n \"dev\": true\n },\n \"escape-string-regexp\": {\n \"version\": \"1.0.5\",\n \"resolved\": \"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz\",\n \"integrity\": \"sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==\",\n \"dev\": true\n },\n \"fsevents\": {\n \"version\": \"2.3.2\",\n \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz\",\n \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"function-bind\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz\",\n \"integrity\": \"sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==\",\n \"dev\": true\n },\n \"gensync\": {\n \"version\": \"1.0.0-beta.2\",\n \"resolved\": \"https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz\",\n \"integrity\": \"sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==\",\n \"dev\": true\n },\n \"globals\": {\n \"version\": \"11.12.0\",\n \"resolved\": \"https://registry.npmjs.org/globals/-/globals-11.12.0.tgz\",\n \"integrity\": \"sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==\",\n \"dev\": true\n },\n \"google-protobuf\": {\n \"version\": \"3.21.2\",\n \"resolved\": \"https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz\",\n \"integrity\": \"sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==\"\n },\n \"grpc-web\": {\n \"version\": \"1.4.2\",\n \"resolved\": \"https://registry.npmjs.org/grpc-web/-/grpc-web-1.4.2.tgz\",\n \"integrity\": \"sha512-gUxWq42l5ldaRplcKb4Pw5O4XBONWZgz3vxIIXnfIeJj8Jc3wYiq2O4c9xzx/NGbbPEej4rhI62C9eTENwLGNw==\"\n },\n \"has\": {\n \"version\": \"1.0.3\",\n \"resolved\": \"https://registry.npmjs.org/has/-/has-1.0.3.tgz\",\n \"integrity\": \"sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==\",\n \"dev\": true,\n \"requires\": {\n \"function-bind\": \"^1.1.1\"\n }\n },\n \"has-flag\": {\n \"version\": \"3.0.0\",\n \"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz\",\n \"integrity\": \"sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==\",\n \"dev\": true\n },\n \"is-core-module\": {\n \"version\": \"2.11.0\",\n \"resolved\": \"https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz\",\n \"integrity\": \"sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==\",\n \"dev\": true,\n \"requires\": {\n \"has\": \"^1.0.3\"\n }\n },\n \"js-tokens\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz\",\n \"integrity\": \"sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==\"\n },\n \"jsesc\": {\n \"version\": \"2.5.2\",\n \"resolved\": \"https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz\",\n \"integrity\": \"sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==\",\n \"dev\": true\n },\n \"json5\": {\n \"version\": \"2.2.3\",\n \"resolved\": \"https://registry.npmjs.org/json5/-/json5-2.2.3.tgz\",\n \"integrity\": \"sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==\",\n \"dev\": true\n },\n \"long\": {\n \"version\": \"5.2.1\",\n \"resolved\": \"https://registry.npmjs.org/long/-/long-5.2.1.tgz\",\n \"integrity\": \"sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==\"\n },\n \"loose-envify\": {\n \"version\": \"1.4.0\",\n \"resolved\": \"https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz\",\n \"integrity\": \"sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==\",\n \"requires\": {\n \"js-tokens\": \"^3.0.0 || ^4.0.0\"\n }\n },\n \"magic-string\": {\n \"version\": \"0.26.7\",\n \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz\",\n \"integrity\": \"sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==\",\n \"dev\": true,\n \"requires\": {\n \"sourcemap-codec\": \"^1.4.8\"\n }\n },\n \"ms\": {\n \"version\": \"2.1.2\",\n \"resolved\": \"https://registry.npmjs.org/ms/-/ms-2.1.2.tgz\",\n \"integrity\": \"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==\",\n \"dev\": true\n },\n \"nanoid\": {\n \"version\": \"3.3.4\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz\",\n \"integrity\": \"sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==\",\n \"dev\": true\n },\n \"node-releases\": {\n \"version\": \"2.0.6\",\n \"resolved\": \"https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz\",\n \"integrity\": \"sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==\",\n \"dev\": true\n },\n \"path-parse\": {\n \"version\": \"1.0.7\",\n \"resolved\": \"https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz\",\n \"integrity\": \"sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==\",\n \"dev\": true\n },\n \"picocolors\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz\",\n \"integrity\": \"sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==\",\n \"dev\": true\n },\n \"postcss\": {\n \"version\": \"8.4.18\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz\",\n \"integrity\": \"sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==\",\n \"dev\": true,\n \"requires\": {\n \"nanoid\": \"^3.3.4\",\n \"picocolors\": \"^1.0.0\",\n \"source-map-js\": \"^1.0.2\"\n }\n },\n \"react\": {\n \"version\": \"18.2.0\",\n \"resolved\": \"https://registry.npmjs.org/react/-/react-18.2.0.tgz\",\n \"integrity\": \"sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==\",\n \"requires\": {\n \"loose-envify\": \"^1.1.0\"\n }\n },\n \"react-dom\": {\n \"version\": \"18.2.0\",\n \"resolved\": \"https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz\",\n \"integrity\": \"sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==\",\n \"requires\": {\n \"loose-envify\": \"^1.1.0\",\n \"scheduler\": \"^0.23.0\"\n }\n },\n \"react-refresh\": {\n \"version\": \"0.14.0\",\n \"resolved\": \"https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz\",\n \"integrity\": \"sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==\",\n \"dev\": true\n },\n \"resolve\": {\n \"version\": \"1.22.1\",\n \"resolved\": \"https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz\",\n \"integrity\": \"sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==\",\n \"dev\": true,\n \"requires\": {\n \"is-core-module\": \"^2.9.0\",\n \"path-parse\": \"^1.0.7\",\n \"supports-preserve-symlinks-flag\": \"^1.0.0\"\n }\n },\n \"rollup\": {\n \"version\": \"2.79.1\",\n \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz\",\n \"integrity\": \"sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==\",\n \"dev\": true,\n \"requires\": {\n \"fsevents\": \"~2.3.2\"\n }\n },\n \"scheduler\": {\n \"version\": \"0.23.0\",\n \"resolved\": \"https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz\",\n \"integrity\": \"sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==\",\n \"requires\": {\n \"loose-envify\": \"^1.1.0\"\n }\n },\n \"semver\": {\n \"version\": \"6.3.0\",\n \"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.0.tgz\",\n \"integrity\": \"sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==\",\n \"dev\": true\n },\n \"source-map-js\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz\",\n \"integrity\": \"sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==\",\n \"dev\": true\n },\n \"sourcemap-codec\": {\n \"version\": \"1.4.8\",\n \"resolved\": \"https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz\",\n \"integrity\": \"sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==\",\n \"dev\": true\n },\n \"supports-color\": {\n \"version\": \"5.5.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz\",\n \"integrity\": \"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==\",\n \"dev\": true,\n \"requires\": {\n \"has-flag\": \"^3.0.0\"\n }\n },\n \"supports-preserve-symlinks-flag\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz\",\n \"integrity\": \"sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==\",\n \"dev\": true\n },\n \"to-fast-properties\": {\n \"version\": \"2.0.0\",\n \"resolved\": \"https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz\",\n \"integrity\": \"sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==\",\n \"dev\": true\n },\n \"todomvc-app-css\": {\n \"version\": \"2.4.2\",\n \"resolved\": \"https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-2.4.2.tgz\",\n \"integrity\": \"sha512-ViAkQ7ed89rmhFIGRsT36njN+97z8+s3XsJnB8E2IKOq+/SLD/6PtSvmTtiwUcVk39qPcjAc/OyeDys4LoJUVg==\"\n },\n \"typescript\": {\n \"version\": \"4.8.4\",\n \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz\",\n \"integrity\": \"sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==\",\n \"dev\": true\n },\n \"update-browserslist-db\": {\n \"version\": \"1.0.10\",\n \"resolved\": \"https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz\",\n \"integrity\": \"sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==\",\n \"dev\": true,\n \"requires\": {\n \"escalade\": \"^3.1.1\",\n \"picocolors\": \"^1.0.0\"\n }\n },\n \"vite\": {\n \"version\": \"3.2.7\",\n \"resolved\": \"https://registry.npmjs.org/vite/-/vite-3.2.7.tgz\",\n \"integrity\": \"sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==\",\n \"dev\": true,\n \"requires\": {\n \"esbuild\": \"^0.15.9\",\n \"fsevents\": \"~2.3.2\",\n \"postcss\": \"^8.4.18\",\n \"resolve\": \"^1.22.1\",\n \"rollup\": \"^2.79.1\"\n }\n },\n \"yorkie-js-sdk\": {\n \"version\": \"0.3.5\",\n \"resolved\": \"https://registry.npmjs.org/yorkie-js-sdk/-/yorkie-js-sdk-0.3.5.tgz\",\n \"integrity\": \"sha512-CZdc5yUhmJUQWpulDOeDwlW9Uh5WgDBLuCyhXV8+Crb3Kr14PCmrJJ9lI3rVSReosQtq8RjPYnwMd7KbtYALyw==\",\n \"requires\": {\n \"@types/google-protobuf\": \"^3.15.5\",\n \"@types/long\": \"^4.0.1\",\n \"google-protobuf\": \"^3.19.4\",\n \"grpc-web\": \"^1.3.1\",\n \"long\": \"^5.2.0\"\n }\n }\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package.json","path":"/package.json","content":"{\n \"name\": \"react-todomvc\",\n \"private\": true,\n \"version\": \"0.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"tsc && vite build\",\n \"preview\": \"vite preview\"\n },\n \"dependencies\": {\n \"classnames\": \"^2.3.2\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"todomvc-app-css\": \"^2.4.2\",\n \"yorkie-js-sdk\": \"^0.4.2\"\n },\n \"devDependencies\": {\n \"@types/react\": \"^18.0.24\",\n \"@types/react-dom\": \"^18.0.8\",\n \"@vitejs/plugin-react\": \"^2.2.0\",\n \"typescript\": \"^4.6.4\",\n \"vite\": \"^3.2.7\"\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"jpg","name":"thumbnail.jpg","path":"/thumbnail.jpg","content":""},{"isFile":true,"isOpen":false,"language":"json","name":"tsconfig.json","path":"/tsconfig.json","content":"{\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"useDefineForClassFields\": true,\n \"lib\": [\"DOM\", \"DOM.Iterable\", \"ESNext\"],\n \"allowJs\": false,\n \"skipLibCheck\": true,\n \"esModuleInterop\": false,\n \"allowSyntheticDefaultImports\": true,\n \"strict\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Node\",\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"noEmit\": true,\n \"jsx\": \"react-jsx\"\n },\n \"include\": [\"src\"],\n \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"},{"isFile":true,"isOpen":false,"language":"json","name":"tsconfig.node.json","path":"/tsconfig.node.json","content":"{\n \"compilerOptions\": {\n \"composite\": true,\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Node\",\n \"allowSyntheticDefaultImports\": true\n },\n \"include\": [\"vite.config.ts\"]\n}\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"vite.config.ts","path":"/vite.config.ts","content":"import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n base: '',\n plugins: [react()],\n});\n"}]} \ No newline at end of file + export const FILE_INFO: DirectoryInfo = {"isFile":false,"name":"react-todomvc","path":"/","children":[{"isFile":false,"name":"src","path":"/src","children":[{"isFile":true,"isOpen":false,"language":"css","name":"App.css","path":"/src/App.css","content":"body {\n margin: 20px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n\n.filters li button {\n color: inherit;\n margin: 0px 3px 0px 3px;\n padding: 0px 3px 0px 3px;\n text-decoration: none;\n border: 1px solid transparent;\n border-radius: 3px;\n}\n\n.filters li button:hover {\n border-color: #DB7676;\n}\n\n.filters li button.selected {\n border-color: #CE4646;\n}"},{"isFile":true,"isOpen":false,"language":"tsx","name":"App.tsx","path":"/src/App.tsx","content":"import React, { useState, useEffect } from 'react';\nimport yorkie, { Document, JSONArray } from 'yorkie-js-sdk';\nimport 'todomvc-app-css/index.css';\n\nimport Header from './Header';\nimport MainSection from './MainSection';\nimport { Todo } from './model';\nimport './App.css';\n\nconst initialState = [\n {\n id: 0,\n text: 'Yorkie JS SDK',\n completed: false,\n },\n {\n id: 1,\n text: 'Garbage collection',\n completed: false,\n },\n {\n id: 2,\n text: 'RichText datatype',\n completed: false,\n },\n] as Array;\n\n/**\n * `App` is the root component of the application.\n */\nexport default function App() {\n const [doc] = useState }>>(\n () =>\n new yorkie.Document<{ todos: JSONArray }>(\n `react-todomvc-${new Date()\n .toISOString()\n .substring(0, 10)\n .replace(/-/g, '')}`,\n ),\n );\n const [todos, setTodos] = useState>([]);\n\n const actions = {\n addTodo: (text: string) => {\n doc?.update((root) => {\n root.todos.push({\n id:\n root.todos.reduce((maxId, todo) => Math.max(todo.id, maxId), -1) +\n 1,\n completed: false,\n text,\n });\n });\n },\n deleteTodo: (id: number) => {\n doc?.update((root) => {\n let target;\n for (const todo of root.todos) {\n if (todo.id === id) {\n target = todo as any;\n break;\n }\n }\n if (target) {\n root.todos.deleteByID!(target.getID());\n }\n });\n },\n editTodo: (id: number, text: string) => {\n doc?.update((root) => {\n let target;\n for (const todo of root.todos) {\n if (todo.id === id) {\n target = todo;\n break;\n }\n }\n if (target) {\n target.text = text;\n }\n });\n },\n completeTodo: (id: number) => {\n doc?.update((root) => {\n let target;\n for (const todo of root.todos) {\n if (todo.id === id) {\n target = todo;\n break;\n }\n }\n if (target) {\n target.completed = !target.completed;\n }\n });\n },\n clearCompleted: () => {\n doc?.update((root) => {\n for (const todo of root.todos) {\n if (todo.completed) {\n const t = todo as any;\n root.todos.deleteByID!(t.getID());\n }\n }\n }, '');\n },\n };\n\n useEffect(() => {\n const client = new yorkie.Client(import.meta.env.VITE_YORKIE_API_ADDR, {\n apiKey: import.meta.env.VITE_YORKIE_API_KEY,\n });\n\n /**\n * `attachDoc` is a helper function to attach the document into the client.\n */\n async function attachDoc(\n doc: Document<{ todos: JSONArray }>,\n callback: (todos: any) => void,\n ) {\n // 01. create client with RPCAddr(envoy) then activate it.\n await client.activate();\n\n // 02. attach the document into the client.\n await client.attach(doc);\n\n // 03. create default todos if not exists.\n doc.update((root) => {\n if (!root.todos) {\n root.todos = initialState;\n }\n }, 'create default todos if not exists');\n\n // 04. subscribe change event from local and remote.\n doc.subscribe((event) => {\n callback(doc.getRoot().todos);\n });\n\n // 05. set todos the attached document.\n callback(doc.getRoot().todos);\n }\n\n attachDoc(doc, (todos) => {\n setTodos(todos);\n });\n }, []);\n\n return (\n
\n
\n \n
\n );\n}\n"},{"isFile":true,"isOpen":false,"language":"tsx","name":"Footer.tsx","path":"/src/Footer.tsx","content":"import React from 'react';\nimport classnames from 'classnames';\n\nconst FILTER_TITLES: { [name: string]: string } = {\n SHOW_ALL: 'All',\n SHOW_ACTIVE: 'Active',\n SHOW_COMPLETED: 'Completed',\n};\n\ntype MouseEventHandler =\n (e: React.MouseEvent) => void;\n\ninterface FooterProps {\n completedCount: number;\n activeCount: number;\n filter: string;\n onClearCompleted: MouseEventHandler;\n onShow: Function;\n}\n\nexport default function Footer(props: FooterProps) {\n const {\n activeCount,\n completedCount,\n filter: selectedFilter,\n onClearCompleted,\n onShow\n } = props;\n return (\n
\n \n {activeCount || 'No'}\n  {activeCount === 1 ? 'item' : 'items'} left\n \n
    \n {\n ['SHOW_ALL', 'SHOW_ACTIVE', 'SHOW_COMPLETED'].map((filter) => (\n
  • \n onShow(filter)}\n >\n {FILTER_TITLES[filter]}\n \n
  • \n ))\n }\n
\n {!!completedCount && (\n \n )}\n
\n );\n}\n"},{"isFile":true,"isOpen":false,"language":"tsx","name":"Header.tsx","path":"/src/Header.tsx","content":"import React from 'react';\nimport TodoTextInput from './TodoTextInput';\n\ninterface HeaderProps {\n addTodo: Function\n}\n\nexport default function Header(props: HeaderProps) {\n return (\n
\n

todos

\n {\n if (text.length !== 0) {\n props.addTodo(text);\n }\n }}\n placeholder=\"What needs to be done?\"\n />\n
\n );\n}\n"},{"isFile":true,"isOpen":false,"language":"tsx","name":"MainSection.tsx","path":"/src/MainSection.tsx","content":"import React, { useState } from 'react';\nimport { Todo } from './model';\nimport TodoItem from './TodoItem';\nimport Footer from './Footer';\n\nconst TODO_FILTERS: { [name: string]: (todo: Todo) => boolean } = {\n SHOW_ALL: (todo: Todo) => true,\n SHOW_ACTIVE: (todo: Todo) => !todo.completed,\n SHOW_COMPLETED: (todo: Todo) => todo.completed,\n};\n\ntype ChangeEventHandler = (event: React.ChangeEvent) => void;\n\ninterface MainSectionProps {\n todos: Array;\n actions: { [name: string]: Function };\n}\n\nexport default function MainSection(props: MainSectionProps) {\n const [filter, setFilter] = useState('SHOW_ALL');\n const { todos, actions } = props;\n const filteredTodos = todos.filter(TODO_FILTERS[filter]);\n const completedCount = todos.reduce((count, todo) => {\n return todo.completed ? count + 1 : count;\n }, 0);\n const activeCount = todos.length - completedCount;\n if (todos.length === 0) {\n return null;\n }\n\n return (\n
\n \n
    \n {\n filteredTodos.map((todo) => (\n \n ))\n }\n
\n actions.clearCompleted()}\n onShow={setFilter}\n />\n
\n );\n}\n"},{"isFile":true,"isOpen":false,"language":"tsx","name":"TodoItem.tsx","path":"/src/TodoItem.tsx","content":"import React, { useState } from 'react';\nimport classnames from 'classnames';\nimport { Todo } from './model';\nimport TodoTextInput from './TodoTextInput';\n\ninterface TodoItemProps {\n todo: Todo;\n editTodo: Function;\n deleteTodo: Function;\n completeTodo: Function;\n}\n\nexport default function TodoItem(props: TodoItemProps) {\n const [editing, setEditing] = useState(false);\n const { todo, completeTodo, editTodo, deleteTodo } = props;\n \n return (\n \n {editing ? (\n {\n if (text.length === 0) {\n deleteTodo(todo.id);\n } else {\n editTodo(todo.id, text);\n }\n setEditing(false);\n }}\n />\n ) : (\n
\n completeTodo(todo.id)}\n />\n \n
\n )}\n \n );\n}\n"},{"isFile":true,"isOpen":false,"language":"tsx","name":"TodoTextInput.tsx","path":"/src/TodoTextInput.tsx","content":"import React, { useState } from 'react';\nimport classnames from 'classnames';\n\ninterface TodoInputProps {\n onSave: Function;\n placeholder?: string;\n editing?: boolean;\n text?: string;\n newTodo?: boolean;\n}\n\nexport default function TodoTextInput(props: TodoInputProps) {\n const [text, setText] = useState(props.text || '');\n\n return (\n ) => {\n if (!props.newTodo) {\n props.onSave(e.target.value);\n }\n }}\n onChange={(e: React.ChangeEvent) => {\n setText(e.target.value);\n }}\n onKeyDown={(e: React.KeyboardEvent) => {\n const target = e.target as HTMLInputElement;\n if (e.which === 13) {\n props.onSave(target.value.trim());\n if (props.newTodo) {\n setText('');\n }\n }\n }}\n />\n );\n}\n"},{"isFile":true,"isOpen":false,"language":"tsx","name":"main.tsx","path":"/src/main.tsx","content":"import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport App from './App';\n\nReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(\n ,\n);\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"model.ts","path":"/src/model.ts","content":"export interface Todo {\n id: number;\n text: string;\n completed: boolean;\n}\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"vite-env.d.ts","path":"/src/vite-env.d.ts","content":"/// \n"}]},{"isFile":true,"isOpen":false,"language":"","name":".env","path":"/.env","content":"VITE_YORKIE_API_ADDR='http://localhost:8080'\nVITE_YORKIE_API_KEY=''\n"},{"isFile":true,"isOpen":false,"language":"production","name":".env.production","path":"/.env.production","content":"VITE_YORKIE_API_ADDR='https://api.yorkie.dev'\nVITE_YORKIE_API_KEY='cedaovjuioqlk4pjqn6g'\n"},{"isFile":true,"isOpen":false,"language":"","name":".gitignore","path":"/.gitignore","content":"# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"},{"isFile":true,"isOpen":false,"language":"markdown","name":"README.md","path":"/README.md","content":"# Yorkie React TodoMVC Example\n\n

\n \n \"Live\n \n

\n\n\"React\n\n## How to run demo\n\nAt project root, run below command to start Yorkie server and Envoy proxy.\n\n```bash\n$ docker-compose up -f docker/docker-compose.yml up --build -d\n```\n\nThen install dependencies and run the demo.\n\n```bash\n$ npm install\n```\n\nNow you can run the demo.\n\n```bash\n$ npm run dev\n```\n"},{"isFile":true,"isOpen":false,"language":"markup","name":"index.html","path":"/index.html","content":"\n\n \n \n \n \n Vite + React + TS\n \n \n
\n \n \n\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package.json","path":"/package.json","content":"{\n \"name\": \"react-todomvc\",\n \"private\": true,\n \"version\": \"0.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"tsc && vite build\",\n \"preview\": \"vite preview\"\n },\n \"dependencies\": {\n \"classnames\": \"^2.3.2\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"todomvc-app-css\": \"^2.4.2\",\n \"yorkie-js-sdk\": \"^0.4.7\"\n },\n \"devDependencies\": {\n \"@types/react\": \"^18.0.24\",\n \"@types/react-dom\": \"^18.0.8\",\n \"@vitejs/plugin-react\": \"^2.2.0\",\n \"typescript\": \"^4.6.4\",\n \"vite\": \"^3.2.7\"\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"jpg","name":"thumbnail.jpg","path":"/thumbnail.jpg","content":""},{"isFile":true,"isOpen":false,"language":"json","name":"tsconfig.json","path":"/tsconfig.json","content":"{\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"useDefineForClassFields\": true,\n \"lib\": [\"DOM\", \"DOM.Iterable\", \"ESNext\"],\n \"allowJs\": false,\n \"skipLibCheck\": true,\n \"esModuleInterop\": false,\n \"allowSyntheticDefaultImports\": true,\n \"strict\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Node\",\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"noEmit\": true,\n \"jsx\": \"react-jsx\"\n },\n \"include\": [\"src\"],\n \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"},{"isFile":true,"isOpen":false,"language":"json","name":"tsconfig.node.json","path":"/tsconfig.node.json","content":"{\n \"compilerOptions\": {\n \"composite\": true,\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Node\",\n \"allowSyntheticDefaultImports\": true\n },\n \"include\": [\"vite.config.ts\"]\n}\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"vite.config.ts","path":"/vite.config.ts","content":"import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n base: '',\n plugins: [react()],\n});\n"}]} \ No newline at end of file diff --git a/examples/simultaneous-cursors/fileInfo.ts b/examples/simultaneous-cursors/fileInfo.ts new file mode 100644 index 0000000..e73d11e --- /dev/null +++ b/examples/simultaneous-cursors/fileInfo.ts @@ -0,0 +1,2 @@ +import { DirectoryInfo } from '@/utils/exampleFileUtils'; + export const FILE_INFO: DirectoryInfo = {"isFile":false,"name":"simultaneous-cursors","path":"/","children":[{"isFile":false,"name":"src","path":"/src","children":[{"isFile":false,"name":"hooks","path":"/src/hooks","children":[{"isFile":true,"isOpen":false,"language":"jsx","name":"useInterval.jsx","path":"/src/hooks/useInterval.jsx","content":"import { useRef, useEffect } from 'react';\n\nexport default function useInterval(callback, delay) {\n const savedCallback = useRef(callback);\n\n useEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n useEffect(() => {\n function tick() {\n savedCallback.current();\n }\n if (delay !== null) {\n let id = setInterval(tick, delay);\n return () => clearInterval(id);\n }\n }, [delay]);\n}\n"}]},{"isFile":false,"name":"components","path":"/src/components","children":[{"isFile":true,"isOpen":false,"language":"jsx","name":"Cursor.jsx","path":"/src/components/Cursor.jsx","content":"import PenCursor from './PenCursor';\nimport FullAnimation from './FullAnimation';\n\nconst Cursor = ({ selectedCursorShape, x, y, pointerDown }) => {\n return (\n <>\n \n {(selectedCursorShape === 'heart' ||\n selectedCursorShape === 'thumbs') && (\n \n )}\n {selectedCursorShape === 'pen' && pointerDown && (\n \n )}\n \n );\n};\n\nexport default Cursor;\n"},{"isFile":true,"isOpen":false,"language":"jsx","name":"CursorSelections.jsx","path":"/src/components/CursorSelections.jsx","content":"import { useState } from 'react';\n\nconst CursorSelections = ({ handleCursorShapeSelect, clientsLength }) => {\n const [selectedCursorShape, setSelectedCursorShape] = useState('cursor');\n\n const cursorShapes = ['heart', 'thumbs', 'pen', 'cursor'];\n\n return (\n
\n
\n {cursorShapes.map((shape) => (\n {\n handleCursorShapeSelect(shape);\n setSelectedCursorShape(shape);\n }}\n className={`${\n selectedCursorShape === shape\n ? 'cursor-shape-selected'\n : 'cursor-shape-not-selected'\n }`}\n src={`src/assets/icons/icon_${shape}.svg`}\n />\n ))}\n
\n\n
\n

\n {clientsLength !== 1\n ? `${clientsLength} users are here`\n : '1 user here'}\n

\n
\n
\n );\n};\n\nexport default CursorSelections;\n"},{"isFile":true,"isOpen":false,"language":"jsx","name":"FullAnimation.jsx","path":"/src/components/FullAnimation.jsx","content":"import { useState } from 'react';\nimport SingleAnimation from './SingleAnimation';\nimport useInterval from '../hooks/useInterval';\n\nconst FullAnimation = ({ pointerDown, xPos, yPos, selectedCursorShape }) => {\n const [singleAnimationsArray, setSingleAnimationsArray] = useState([]);\n\n const animationBubbleRate = 100;\n\n useInterval(() => {\n setSingleAnimationsArray((singleAnimationsArray) =>\n singleAnimationsArray.filter(\n (animation) => animation.timestamp > Date.now() - 4000,\n ),\n );\n }, 1000);\n\n useInterval(() => {\n if (pointerDown) {\n setSingleAnimationsArray((singleAnimationsArray) =>\n singleAnimationsArray.concat([\n {\n point: { x: xPos, y: yPos },\n timestamp: Date.now(),\n },\n ]),\n );\n }\n }, animationBubbleRate);\n\n return (\n \n {singleAnimationsArray.map((animation) => {\n return (\n \n );\n })}\n \n );\n};\n\nexport default FullAnimation;\n"},{"isFile":true,"isOpen":false,"language":"jsx","name":"PenCursor.jsx","path":"/src/components/PenCursor.jsx","content":"import React, { useRef, useEffect, useState } from 'react';\n\nclass Point {\n constructor(x, y) {\n this.x = x;\n this.y = y;\n this.lifetime = 0;\n }\n}\n\nconst PenCursor = ({ xPos, yPos }) => {\n const [allPoints, setAllPoints] = useState([]);\n const canvasRef = useRef(null);\n const [points, setPoints] = useState([]);\n\n const addPoint = (x, y) => {\n const point = new Point(x, y);\n\n points.push(point);\n setPoints(points);\n\n allPoints.push(point);\n setAllPoints(allPoints);\n };\n\n useEffect(() => {\n const canvas = canvasRef.current;\n const ctx = canvas.getContext('2d');\n\n const animatePoints = () => {\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n const duration = (0.7 * (1 * 4000)) / 60;\n\n for (let i = 0; i < points.length; ++i) {\n const point = points[i];\n let lastPoint;\n\n if (points[i - 1] !== undefined) {\n lastPoint = points[i - 1];\n } else lastPoint = point;\n\n point.lifetime += 1;\n\n if (point.lifetime > duration) {\n points.shift();\n } else {\n ctx.lineWidth = 5;\n\n ctx.lineJoin = 'round';\n\n const red = 0;\n const green = 0;\n const blue = 0;\n ctx.strokeStyle = `rgb(${red},${green},${blue})`;\n\n ctx.beginPath();\n\n ctx.moveTo(lastPoint.x, lastPoint.y);\n ctx.lineTo(point.x, point.y);\n\n ctx.stroke();\n ctx.closePath();\n }\n }\n requestAnimationFrame(animatePoints);\n };\n\n animatePoints();\n }, [points]);\n\n useEffect(() => {\n addPoint(xPos, yPos);\n }, [xPos, yPos]);\n\n return (\n \n );\n};\n\nexport default PenCursor;\n"},{"isFile":true,"isOpen":false,"language":"jsx","name":"SingleAnimation.jsx","path":"/src/components/SingleAnimation.jsx","content":"import styles from './SingleAnimation.module.css';\n\nexport default function SingleAnimation({\n x,\n y,\n timestamp,\n selectedCursorShape,\n}) {\n return (\n
\n \n
\n
\n \n
\n
\n
\n \n );\n}\n"},{"isFile":true,"isOpen":false,"language":"css","name":"SingleAnimation.module.css","path":"/src/components/SingleAnimation.module.css","content":".goUp0 {\n opacity: 0;\n animation: goUpAnimation0 2s, fadeOut 2s;\n}\n\n@keyframes goUpAnimation0 {\n from {\n transform: translate(0px, 0px);\n }\n\n to {\n transform: translate(0px, -400px);\n }\n}\n\n.goUp1 {\n opacity: 0;\n animation: goUpAnimation1 2s, fadeOut 2s;\n}\n\n@keyframes goUpAnimation1 {\n from {\n transform: translate(0px, 0px);\n }\n\n to {\n transform: translate(0px, -300px);\n }\n}\n\n.goUp2 {\n opacity: 0;\n animation: goUpAnimation2 2s, fadeOut 2s;\n}\n\n@keyframes goUpAnimation2 {\n from {\n transform: translate(0px, 0px);\n }\n\n to {\n transform: translate(0px, -200px);\n }\n}\n\n.leftRight0 {\n animation: leftRightAnimation0 0.3s alternate infinite ease-in-out;\n}\n\n@keyframes leftRightAnimation0 {\n from {\n transform: translate(0px, 0px);\n }\n\n to {\n transform: translate(50px, 0px);\n }\n}\n\n.leftRight1 {\n animation: leftRightAnimation1 0.3s alternate infinite ease-in-out;\n}\n\n@keyframes leftRightAnimation1 {\n from {\n transform: translate(0px, 0px);\n }\n\n to {\n transform: translate(100px, 0px);\n }\n}\n\n.leftRight2 {\n animation: leftRightAnimation2 0.3s alternate infinite ease-in-out;\n}\n\n@keyframes leftRightAnimation2 {\n from {\n transform: translate(0px, 0px);\n }\n\n to {\n transform: translate(-50px, 0px);\n }\n}\n\n@keyframes fadeOut {\n from {\n opacity: 1;\n }\n\n to {\n opacity: 0;\n }\n}\n"}]},{"isFile":false,"name":"assets","path":"/src/assets","children":[{"isFile":false,"name":"icons","path":"/src/assets/icons","children":[{"isFile":true,"isOpen":false,"language":"svg","name":"icon_cursor.svg","path":"/src/assets/icons/icon_cursor.svg","content":"\n\n\n\n"},{"isFile":true,"isOpen":false,"language":"svg","name":"icon_heart.svg","path":"/src/assets/icons/icon_heart.svg","content":"\n\n\n\n\n\n\n\n\n\n"},{"isFile":true,"isOpen":false,"language":"svg","name":"icon_pen.svg","path":"/src/assets/icons/icon_pen.svg","content":"\n\n\n\n\n\n\n\n\n\n\n\n\n"},{"isFile":true,"isOpen":false,"language":"svg","name":"icon_thumbs.svg","path":"/src/assets/icons/icon_thumbs.svg","content":"\n\n\n\n\n\n\n\n\n\n"}]}]},{"isFile":true,"isOpen":false,"language":"css","name":"App.css","path":"/src/App.css","content":"body {\n max-width: 100vw;\n min-height: 100vh;\n overflow-x: hidden;\n}\n\n.general-container {\n max-width: 100%;\n}\n\n.cursor-selector-container {\n user-select: none;\n\n height: 92px;\n width: 192px;\n\n position: fixed;\n bottom: 0;\n right: 0;\n\n padding: 20px;\n\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n}\n\n.cursor-selections-container {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.num-users-container {\n border-radius: 8px;\n background-color: rgba(27, 26, 26, 0.8);\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n color: white;\n\n height: 40px;\n width: 192px;\n}\n\n.cursor-shape-selected {\n background-color: rgb(81, 76, 73);\n border-radius: 9px;\n}\n\n.cursor-shape-not-selected {\n background-color: rgb(81, 76, 73);\n opacity: 0.5;\n border-radius: 9px;\n}\n.cursor-shape-not-selected:hover {\n background-color: rgb(81, 76, 73);\n opacity: 0.7;\n border-radius: 9px;\n}\n\n.single-animation-container {\n user-select: none;\n pointer-events: none;\n position: absolute;\n left: -20px;\n top: -10px;\n}\n\n* {\n cursor: none;\n}\n\n.pen-cursor {\n user-select: none;\n pointer-events: none;\n position: fixed;\n left: -10px;\n top: -30px;\n}\n.pen-cursor-canvas {\n position: fixed;\n top: 0;\n left: 0;\n}\n\n.heart-cursor {\n user-select: none;\n pointer-events: none;\n position: fixed;\n left: -17px;\n top: -17px;\n}\n\n.thumbs-cursor {\n user-select: none;\n pointer-events: none;\n position: fixed;\n left: -17px;\n top: -17px;\n}\n\n.cursor-cursor {\n user-select: none;\n pointer-events: none;\n position: fixed;\n left: -5px;\n top: -5px;\n}\n\n.cursor-name {\n position: fixed;\n left: 35px;\n top: -10px;\n}\n"},{"isFile":true,"isOpen":false,"language":"jsx","name":"App.jsx","path":"/src/App.jsx","content":"import { useEffect, useState } from 'react';\nimport yorkie from 'yorkie-js-sdk';\nimport Cursor from './components/Cursor';\nimport CursorSelections from './components/CursorSelections';\nimport './App.css';\n\nconst client = new yorkie.Client(import.meta.env.VITE_YORKIE_API_ADDR, {\n apiKey: import.meta.env.VITE_YORKIE_API_KEY,\n});\n\nconst doc = new yorkie.Document('simultaneous-cursors');\n\nconst App = () => {\n const [clients, setClients] = useState([]);\n\n const handleCursorShapeSelect = (cursorShape) => {\n doc.update((root, presence) => {\n presence.set({\n cursorShape,\n });\n });\n };\n\n useEffect(() => {\n const setup = async () => {\n await client.activate();\n\n doc.subscribe('presence', (event) => {\n setClients(doc.getPresences());\n });\n\n await client.attach(doc, {\n initialPresence: {\n cursorShape: 'cursor',\n cursor: {\n xPos: 0,\n yPos: 0,\n },\n pointerDown: false,\n },\n });\n\n window.addEventListener('beforeunload', () => {\n client.deactivate();\n });\n };\n\n setup();\n\n const handlePointerUp = () => {\n doc.update((root, presence) => {\n presence.set({\n pointerDown: false,\n });\n });\n };\n const handlePointerDown = () => {\n doc.update((root, presence) => {\n presence.set({\n pointerDown: true,\n });\n });\n };\n const handleMouseMove = (event) => {\n doc.update((root, presence) => {\n presence.set({\n cursor: {\n xPos: event.clientX,\n yPos: event.clientY,\n },\n });\n });\n };\n\n window.addEventListener('mousedown', handlePointerDown);\n window.addEventListener('mouseup', handlePointerUp);\n window.addEventListener('mousemove', handleMouseMove);\n\n return () => {\n window.removeEventListener('mousedown', handlePointerDown);\n window.removeEventListener('mouseup', handlePointerUp);\n window.removeEventListener('mousemove', handleMouseMove);\n };\n }, []);\n\n return (\n
\n {clients.map(\n ({ clientID, presence: { cursorShape, cursor, pointerDown } }) => {\n return (\n \n );\n },\n )}\n\n \n
\n );\n};\n\nexport default App;\n"},{"isFile":true,"isOpen":false,"language":"jsx","name":"main.jsx","path":"/src/main.jsx","content":"import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport App from './App.jsx';\n\nReactDOM.createRoot(document.getElementById('root')).render();\n"}]},{"isFile":false,"name":"public","path":"/public","children":[{"isFile":true,"isOpen":false,"language":"ico","name":"favicon.ico","path":"/public/favicon.ico","content":""}]},{"isFile":true,"isOpen":false,"language":"","name":".env","path":"/.env","content":"VITE_YORKIE_API_ADDR='http://localhost:8080'\nVITE_YORKIE_API_KEY=''\n"},{"isFile":true,"isOpen":false,"language":"production","name":".env.production","path":"/.env.production","content":"VITE_YORKIE_API_ADDR='https://api.yorkie.dev'\nVITE_YORKIE_API_KEY='cedaovjuioqlk4pjqn6g'\n"},{"isFile":true,"isOpen":false,"language":"","name":".gitignore","path":"/.gitignore","content":"# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"},{"isFile":true,"isOpen":false,"language":"markup","name":"index.html","path":"/index.html","content":"\n\n \n \n \n \n Simultaneous Cursors - Yorkie Example\n \n \n
\n \n \n\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package.json","path":"/package.json","content":"{\n \"name\": \"simultaneous-cursors\",\n \"private\": true,\n \"version\": \"0.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"vite build\",\n \"preview\": \"vite preview\"\n },\n \"dependencies\": {\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\",\n \"yorkie-js-sdk\": \"^0.4.7\"\n },\n \"devDependencies\": {\n \"@types/react\": \"^18.0.37\",\n \"@types/react-dom\": \"^18.0.11\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"vite\": \"^4.3.9\"\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"javascript","name":"vite.config.js","path":"/vite.config.js","content":"import { defineConfig } from 'vite'\nimport react from '@vitejs/plugin-react'\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n plugins: [react()],\n})\n"}]} \ No newline at end of file diff --git a/examples/vanilla-codemirror6/fileInfo.ts b/examples/vanilla-codemirror6/fileInfo.ts index c750bcd..38d47fd 100644 --- a/examples/vanilla-codemirror6/fileInfo.ts +++ b/examples/vanilla-codemirror6/fileInfo.ts @@ -1,2 +1,2 @@ import { DirectoryInfo } from '@/utils/exampleFileUtils'; - export const FILE_INFO: DirectoryInfo = {"isFile":false,"name":"vanilla-codemirror6","path":"/","children":[{"isFile":false,"name":"src","path":"/src","children":[{"isFile":true,"isOpen":false,"language":"typescript","name":"main.ts","path":"/src/main.ts","content":"/* eslint-disable jsdoc/require-jsdoc */\nimport yorkie, { type Text as YorkieText, OperationInfo } from 'yorkie-js-sdk';\nimport { basicSetup, EditorView } from 'codemirror';\nimport { keymap } from '@codemirror/view';\nimport {\n markdown,\n markdownKeymap,\n markdownLanguage,\n} from '@codemirror/lang-markdown';\nimport { Transaction } from '@codemirror/state';\nimport { network } from './network';\nimport { displayLog, displayPeers } from './utils';\nimport './style.css';\n\ntype YorkieDoc = {\n content: YorkieText;\n};\n\nconst editorParentElem = document.getElementById('editor')!;\nconst peersElem = document.getElementById('peers')!;\nconst documentElem = document.getElementById('document')!;\nconst documentTextElem = document.getElementById('document-text')!;\nconst networkStatusElem = document.getElementById('network-status')!;\n\nasync function main() {\n // 01. create client with RPCAddr(envoy) then activate it.\n const client = new yorkie.Client(import.meta.env.VITE_YORKIE_API_ADDR, {\n apiKey: import.meta.env.VITE_YORKIE_API_KEY,\n });\n await client.activate();\n\n // subscribe peer change event\n client.subscribe((event) => {\n network.statusListener(networkStatusElem)(event);\n if (event.type === 'peers-changed') {\n displayPeers(\n peersElem,\n client.getPeersByDocKey(doc.getKey()),\n client.getID()!,\n );\n }\n });\n\n // 02-1. create a document then attach it into the client.\n const doc = new yorkie.Document(\n `codemirror6-${new Date()\n .toISOString()\n .substring(0, 10)\n .replace(/-/g, '')}`,\n );\n await client.attach(doc);\n doc.update((root) => {\n if (!root.content) {\n root.content = new yorkie.Text();\n }\n }, 'create content if not exists');\n\n // 02-2. subscribe document event.\n const syncText = () => {\n const text = doc.getRoot().content;\n view.dispatch({\n changes: { from: 0, to: view.state.doc.length, insert: text.toString() },\n annotations: [Transaction.remote.of(true)],\n });\n };\n doc.subscribe((event) => {\n if (event.type === 'snapshot') {\n // The text is replaced to snapshot and must be re-synced.\n syncText();\n }\n displayLog(documentElem, documentTextElem, doc);\n });\n\n doc.subscribe('$.content', (event) => {\n if (event.type === 'remote-change') {\n const { operations } = event.value;\n handleOperations(operations);\n }\n });\n\n await client.sync();\n\n // 03-1. define function that bind the document with the codemirror(broadcast local changes to peers)\n const updateListener = EditorView.updateListener.of((viewUpdate) => {\n if (viewUpdate.docChanged) {\n for (const tr of viewUpdate.transactions) {\n const events = ['select', 'input', 'delete', 'move', 'undo', 'redo'];\n if (!events.map((event) => tr.isUserEvent(event)).some(Boolean)) {\n continue;\n }\n if (tr.annotation(Transaction.remote)) {\n continue;\n }\n tr.changes.iterChanges((fromA, toA, _, __, inserted) => {\n doc.update((root) => {\n root.content.edit(fromA, toA, inserted.toJSON().join('\\n'));\n }, `update content byA ${client.getID()}`);\n });\n }\n }\n });\n\n // 03-2. create codemirror instance\n const view = new EditorView({\n doc: '',\n extensions: [\n basicSetup,\n markdown({ base: markdownLanguage }),\n keymap.of(markdownKeymap),\n updateListener,\n ],\n parent: editorParentElem,\n });\n\n // 03-3. define event handler that apply remote changes to local\n function handleOperations(operations: Array) {\n operations.forEach((op) => {\n if (op.type === 'edit') {\n handleEditOp(op);\n }\n });\n }\n function handleEditOp(op: any) {\n const changes = [\n {\n from: Math.max(0, op.from),\n to: Math.max(0, op.to),\n insert: op.value!.content,\n },\n ];\n\n view.dispatch({\n changes,\n annotations: [Transaction.remote.of(true)],\n });\n }\n\n syncText();\n displayLog(documentElem, documentTextElem, doc);\n}\n\nmain();\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"network.ts","path":"/src/network.ts","content":"import type { ClientEvent } from 'yorkie-js-sdk';\nexport const network = {\n isOnline: false,\n showOffline: (elem: HTMLElement) => {\n network.isOnline = false;\n elem.innerHTML = ' ';\n },\n showOnline: (elem: HTMLElement) => {\n network.isOnline = true;\n elem.innerHTML = ' ';\n },\n statusListener: (elem: HTMLElement) => {\n return (event: ClientEvent) => {\n if (\n network.isOnline &&\n ((event.type == 'status-changed' && event.value == 'deactivated') ||\n (event.type == 'stream-connection-status-changed' &&\n event.value == 'disconnected') ||\n (event.type == 'document-synced' && event.value == 'sync-failed'))\n ) {\n network.showOffline(elem);\n } else if (\n !network.isOnline &&\n ((event.type == 'status-changed' && event.value == 'activated') ||\n (event.type == 'stream-connection-status-changed' &&\n event.value == 'connected') ||\n (event.type == 'document-synced' && event.value == 'synced') ||\n event.type == 'peers-changed' ||\n event.type == 'documents-changed')\n ) {\n network.showOnline(elem);\n }\n };\n },\n};\n"},{"isFile":true,"isOpen":false,"language":"css","name":"style.css","path":"/src/style.css","content":"body {\n background: white;\n}\n\n.green {\n background-color: green;\n}\n.red {\n background-color: red;\n}\n\n#network-status span {\n display: inline-block;\n height: 0.8rem;\n width: 0.8rem;\n border-radius: 0.4rem;\n}\n\n#network-status:before {\n content: 'network: ';\n font-size: 1rem;\n}\n\n#peers:before {\n display: block;\n content: 'peers: ';\n font-size: 1rem;\n}\n\n#document:before {\n display: block;\n content: 'document: ';\n font-size: 1rem;\n}\n\n#document-text:before {\n display: block;\n content: 'text: ';\n font-size: 1rem;\n}\n\n#network-status,\n#peers,\n#document,\n#document-text {\n margin-top: 1rem;\n margin-bottom: 1rem;\n\n font-family: monospace;\n}\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"utils.ts","path":"/src/utils.ts","content":"/* eslint-disable jsdoc/require-jsdoc */\nimport { Document, Indexable, Text } from 'yorkie-js-sdk';\n\n// function to display peers\nexport function displayPeers(\n elem: HTMLElement,\n peers: Array<{ clientID: string; presence: Indexable }>,\n myClientID: string,\n) {\n const usernames = [];\n for (const { clientID } of peers) {\n usernames.push(myClientID === clientID ? `${clientID}` : clientID);\n }\n elem.innerHTML = JSON.stringify(usernames);\n}\n\n// function to display document content\nexport function displayLog(\n elem: HTMLElement,\n textElem: HTMLElement,\n doc: Document,\n) {\n elem.innerText = doc.toJSON();\n textElem.innerText = doc.getRoot().content.getStructureAsString();\n}\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"vite-env.d.ts","path":"/src/vite-env.d.ts","content":"/// \n"}]},{"isFile":true,"isOpen":false,"language":"","name":".env","path":"/.env","content":"VITE_YORKIE_API_ADDR='http://localhost:8080'\nVITE_YORKIE_API_KEY=''\n"},{"isFile":true,"isOpen":false,"language":"production","name":".env.production","path":"/.env.production","content":"VITE_YORKIE_API_ADDR='https://api.yorkie.dev'\nVITE_YORKIE_API_KEY='cedaovjuioqlk4pjqn6g'\n"},{"isFile":true,"isOpen":false,"language":"","name":".gitignore","path":"/.gitignore","content":"# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"},{"isFile":true,"isOpen":false,"language":"markdown","name":"README.md","path":"/README.md","content":"# Yorkie CodeMirror6 Example\n\n

\n \n \"Live\n \n

\n\n\"CodeMirror6\"\n\n## How to run demo\n\nAt project root, run below command to start Yorkie and Envoy proxy.\n\n```bash\n$ docker-compose -f docker/docker-compose.yml up --build -d\n```\n\nInstall dependencies\n\n```bash\n$ npm install\n```\n\nStart demo project\n\n```bash\n$ npm run dev\n```\n"},{"isFile":true,"isOpen":false,"language":"markup","name":"index.html","path":"/index.html","content":"\n\n \n \n \n Yorkie + CodeMirror 6 Example\n \n \n
\n
\n
\n
\n
\n \n \n\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package-lock.json","path":"/package-lock.json","content":"{\n \"name\": \"vanilla-codemirror6\",\n \"version\": \"0.0.0\",\n \"lockfileVersion\": 2,\n \"requires\": true,\n \"packages\": {\n \"\": {\n \"name\": \"vanilla-codemirror6\",\n \"version\": \"0.0.0\",\n \"dependencies\": {\n \"@codemirror/commands\": \"^6.1.2\",\n \"@codemirror/highlight\": \"^0.19.8\",\n \"@codemirror/lang-markdown\": \"^6.0.2\",\n \"@codemirror/language-data\": \"^6.1.0\",\n \"@codemirror/state\": \"^6.1.2\",\n \"@codemirror/view\": \"^6.3.1\",\n \"codemirror\": \"^6.0.1\",\n \"yorkie-js-sdk\": \"^0.3.5\"\n },\n \"devDependencies\": {\n \"typescript\": \"^4.6.4\",\n \"vite\": \"^3.2.7\"\n }\n },\n \"node_modules/@codemirror/autocomplete\": {\n \"version\": \"6.3.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.3.0.tgz\",\n \"integrity\": \"sha512-4jEvh3AjJZTDKazd10J6ZsCIqaYxDMCeua5ouQxY8hlFIml+nr7le0SgBhT3SIytFBmdzPK3AUhXGuW3T79nVg==\",\n \"dependencies\": {\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@codemirror/view\": \"^6.0.0\",\n \"@lezer/common\": \"^1.0.0\"\n },\n \"peerDependencies\": {\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@codemirror/view\": \"^6.0.0\",\n \"@lezer/common\": \"^1.0.0\"\n }\n },\n \"node_modules/@codemirror/commands\": {\n \"version\": \"6.1.2\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/commands/-/commands-6.1.2.tgz\",\n \"integrity\": \"sha512-sO3jdX1s0pam6lIdeSJLMN3DQ6mPEbM4yLvyKkdqtmd/UDwhXA5+AwFJ89rRXm6vTeOXBsE5cAmlos/t7MJdgg==\",\n \"dependencies\": {\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@codemirror/view\": \"^6.0.0\",\n \"@lezer/common\": \"^1.0.0\"\n }\n },\n \"node_modules/@codemirror/highlight\": {\n \"version\": \"0.19.8\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/highlight/-/highlight-0.19.8.tgz\",\n \"integrity\": \"sha512-v/lzuHjrYR8MN2mEJcUD6fHSTXXli9C1XGYpr+ElV6fLBIUhMTNKR3qThp611xuWfXfwDxeL7ppcbkM/MzPV3A==\",\n \"deprecated\": \"As of 0.20.0, this package has been split between @lezer/highlight and @codemirror/language\",\n \"dependencies\": {\n \"@codemirror/language\": \"^0.19.0\",\n \"@codemirror/rangeset\": \"^0.19.0\",\n \"@codemirror/state\": \"^0.19.3\",\n \"@codemirror/view\": \"^0.19.39\",\n \"@lezer/common\": \"^0.15.0\",\n \"style-mod\": \"^4.0.0\"\n }\n },\n \"node_modules/@codemirror/highlight/node_modules/@codemirror/language\": {\n \"version\": \"0.19.10\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/language/-/language-0.19.10.tgz\",\n \"integrity\": \"sha512-yA0DZ3RYn2CqAAGW62VrU8c4YxscMQn45y/I9sjBlqB1e2OTQLg4CCkMBuMSLXk4xaqjlsgazeOQWaJQOKfV8Q==\",\n \"dependencies\": {\n \"@codemirror/state\": \"^0.19.0\",\n \"@codemirror/text\": \"^0.19.0\",\n \"@codemirror/view\": \"^0.19.0\",\n \"@lezer/common\": \"^0.15.5\",\n \"@lezer/lr\": \"^0.15.0\"\n }\n },\n \"node_modules/@codemirror/highlight/node_modules/@codemirror/state\": {\n \"version\": \"0.19.9\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/state/-/state-0.19.9.tgz\",\n \"integrity\": \"sha512-psOzDolKTZkx4CgUqhBQ8T8gBc0xN5z4gzed109aF6x7D7umpDRoimacI/O6d9UGuyl4eYuDCZmDFr2Rq7aGOw==\",\n \"dependencies\": {\n \"@codemirror/text\": \"^0.19.0\"\n }\n },\n \"node_modules/@codemirror/highlight/node_modules/@codemirror/view\": {\n \"version\": \"0.19.48\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/view/-/view-0.19.48.tgz\",\n \"integrity\": \"sha512-0eg7D2Nz4S8/caetCTz61rK0tkHI17V/d15Jy0kLOT8dTLGGNJUponDnW28h2B6bERmPlVHKh8MJIr5OCp1nGw==\",\n \"dependencies\": {\n \"@codemirror/rangeset\": \"^0.19.5\",\n \"@codemirror/state\": \"^0.19.3\",\n \"@codemirror/text\": \"^0.19.0\",\n \"style-mod\": \"^4.0.0\",\n \"w3c-keyname\": \"^2.2.4\"\n }\n },\n \"node_modules/@codemirror/highlight/node_modules/@lezer/common\": {\n \"version\": \"0.15.12\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/common/-/common-0.15.12.tgz\",\n \"integrity\": \"sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==\"\n },\n \"node_modules/@codemirror/highlight/node_modules/@lezer/lr\": {\n \"version\": \"0.15.8\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/lr/-/lr-0.15.8.tgz\",\n \"integrity\": \"sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==\",\n \"dependencies\": {\n \"@lezer/common\": \"^0.15.0\"\n }\n },\n \"node_modules/@codemirror/lang-cpp\": {\n \"version\": \"6.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-cpp/-/lang-cpp-6.0.1.tgz\",\n \"integrity\": \"sha512-46p3ohfhjzkLWJ3VwvzX0aqlXh8UkEqX1xo2Eds9l6Ql3uDoxI2IZEjR9cgJaGOZTXCkDzQuQH7sfYAxMvzLjA==\",\n \"dependencies\": {\n \"@codemirror/language\": \"^6.0.0\",\n \"@lezer/cpp\": \"^1.0.0\"\n }\n },\n \"node_modules/@codemirror/lang-css\": {\n \"version\": \"6.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.0.0.tgz\",\n \"integrity\": \"sha512-jBqc+BTuwhNOTlrimFghLlSrN6iFuE44HULKWoR4qKYObhOIl9Lci1iYj6zMIte1XTQmZguNvjXMyr43LUKwSw==\",\n \"dependencies\": {\n \"@codemirror/autocomplete\": \"^6.0.0\",\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@lezer/css\": \"^1.0.0\"\n }\n },\n \"node_modules/@codemirror/lang-html\": {\n \"version\": \"6.1.2\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.1.2.tgz\",\n \"integrity\": \"sha512-e8JAUWyOo7N26tmek+WK0+Zg+pZRe+dQi8TZq0OOVVygpLV+mNAT2n5b5JhknY+TVZIVGLjuhdsoizw1SDFfPg==\",\n \"dependencies\": {\n \"@codemirror/autocomplete\": \"^6.0.0\",\n \"@codemirror/lang-css\": \"^6.0.0\",\n \"@codemirror/lang-javascript\": \"^6.0.0\",\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@codemirror/view\": \"^6.2.2\",\n \"@lezer/common\": \"^1.0.0\",\n \"@lezer/html\": \"^1.0.1\"\n }\n },\n \"node_modules/@codemirror/lang-java\": {\n \"version\": \"6.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-java/-/lang-java-6.0.0.tgz\",\n \"integrity\": \"sha512-aeWq+ikUS6Eubk6RBbiMgxuBIT4Ih8Asb1qc2pSiMcstrwr4ODbazPXsBHbLBYg3aObvFyOm2bNQncbQJjZ3sQ==\",\n \"dependencies\": {\n \"@codemirror/language\": \"^6.0.0\",\n \"@lezer/java\": \"^1.0.0\"\n }\n },\n \"node_modules/@codemirror/lang-javascript\": {\n \"version\": \"6.1.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.1.0.tgz\",\n \"integrity\": \"sha512-wAWEY1Wdis2cKDy9A5q/rUmzLHFbZgoupJBcGaeMMsDPi68Rm90NsmzAEODE5kW8mYdRKFhQ157WJghOZ3yYdg==\",\n \"dependencies\": {\n \"@codemirror/autocomplete\": \"^6.0.0\",\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/lint\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@codemirror/view\": \"^6.0.0\",\n \"@lezer/common\": \"^1.0.0\",\n \"@lezer/javascript\": \"^1.0.0\"\n }\n },\n \"node_modules/@codemirror/lang-json\": {\n \"version\": \"6.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.0.tgz\",\n \"integrity\": \"sha512-DvTcYTKLmg2viADXlTdufrT334M9jowe1qO02W28nvm+nejcvhM5vot5mE8/kPrxYw/HJHhwu1z2PyBpnMLCNQ==\",\n \"dependencies\": {\n \"@codemirror/language\": \"^6.0.0\",\n \"@lezer/json\": \"^1.0.0\"\n }\n },\n \"node_modules/@codemirror/lang-markdown\": {\n \"version\": \"6.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.0.2.tgz\",\n \"integrity\": \"sha512-wsUGGP8ihCVJKzVciOpsZXteSY1IRTe/C4eYb2QUEDl41ZiRfmdhA4llechqDaRdGOJuc45oCjBVjOo94CBHtA==\",\n \"dependencies\": {\n \"@codemirror/lang-html\": \"^6.0.0\",\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@codemirror/view\": \"^6.0.0\",\n \"@lezer/common\": \"^1.0.0\",\n \"@lezer/markdown\": \"^1.0.0\"\n }\n },\n \"node_modules/@codemirror/lang-php\": {\n \"version\": \"6.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-php/-/lang-php-6.0.0.tgz\",\n \"integrity\": \"sha512-96CEjq0xEgbzc6bdFPwILPfZ6m8917JRbh2oPszZJABlYxG4Y+eYjtYkUTDb4yuyjQKyigHoeGC6zoIOYA1NWA==\",\n \"dependencies\": {\n \"@codemirror/lang-html\": \"^6.0.0\",\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@lezer/common\": \"^1.0.0\",\n \"@lezer/php\": \"^1.0.0\"\n }\n },\n \"node_modules/@codemirror/lang-python\": {\n \"version\": \"6.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-python/-/lang-python-6.0.2.tgz\",\n \"integrity\": \"sha512-5BidNrfhab3s9LYNSN7JWFjL1+1zGAIw0dxUyalNwsUN+uCVE62sTk3uJlMZux4SsyT6fR8LbOLtWu52XQL6Yw==\",\n \"dependencies\": {\n \"@codemirror/language\": \"^6.0.0\",\n \"@lezer/python\": \"^1.0.0\"\n }\n },\n \"node_modules/@codemirror/lang-rust\": {\n \"version\": \"6.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-rust/-/lang-rust-6.0.0.tgz\",\n \"integrity\": \"sha512-VQql3Qk1BwoXb3SUkeWll/EEwhsgQWc1bpia7CFqqp2PhQBb5A6r4Vj2JCkU/nE6A7TDPSGHTOoqJSG5s/VXtQ==\",\n \"dependencies\": {\n \"@codemirror/language\": \"^6.0.0\",\n \"@lezer/rust\": \"^1.0.0\"\n }\n },\n \"node_modules/@codemirror/lang-sql\": {\n \"version\": \"6.3.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-sql/-/lang-sql-6.3.0.tgz\",\n \"integrity\": \"sha512-+4vyqZMmvseeORW44RMYF3rDGhQG9f7GOXZitrIqSrUHI33DgIudK2qTcaf9TfCuJdOxPEp4xEGvm0H+FBAhVw==\",\n \"dependencies\": {\n \"@codemirror/autocomplete\": \"^6.0.0\",\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"node_modules/@codemirror/lang-wast\": {\n \"version\": \"6.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-wast/-/lang-wast-6.0.0.tgz\",\n \"integrity\": \"sha512-vSbtLrxuB95PC5LJ+yszKVmBUkLmMdowNFjjn0e+LHeBzvpdQJHVomgE76UUFeZGW+Ht0VfM6rxEd9SL85FuhA==\",\n \"dependencies\": {\n \"@codemirror/language\": \"^6.0.0\",\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"node_modules/@codemirror/lang-xml\": {\n \"version\": \"6.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-xml/-/lang-xml-6.0.0.tgz\",\n \"integrity\": \"sha512-M/HLWxIiP956xGjtrxkeHkCmDGVQGKu782x8pOH5CLJIMkWtiB1DWfDoDHqpFjdEE9dkfcqPWvYfVi6GbhuXEg==\",\n \"dependencies\": {\n \"@codemirror/autocomplete\": \"^6.0.0\",\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@lezer/common\": \"^1.0.0\",\n \"@lezer/xml\": \"^1.0.0\"\n }\n },\n \"node_modules/@codemirror/language\": {\n \"version\": \"6.2.1\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/language/-/language-6.2.1.tgz\",\n \"integrity\": \"sha512-MC3svxuvIj0MRpFlGHxLS6vPyIdbTr2KKPEW46kCoCXw2ktb4NTkpkPBI/lSP/FoNXLCBJ0mrnUi1OoZxtpW1Q==\",\n \"dependencies\": {\n \"@codemirror/state\": \"^6.0.0\",\n \"@codemirror/view\": \"^6.0.0\",\n \"@lezer/common\": \"^1.0.0\",\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\",\n \"style-mod\": \"^4.0.0\"\n }\n },\n \"node_modules/@codemirror/language-data\": {\n \"version\": \"6.1.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/language-data/-/language-data-6.1.0.tgz\",\n \"integrity\": \"sha512-g9V23fuLRI9AEbpM6bDy1oquqgpFlIDHTihUhL21NPmxp+x67ZJbsKk+V71W7/Bj8SCqEO1PtqQA/tDGgt1nfw==\",\n \"dependencies\": {\n \"@codemirror/lang-cpp\": \"^6.0.0\",\n \"@codemirror/lang-css\": \"^6.0.0\",\n \"@codemirror/lang-html\": \"^6.0.0\",\n \"@codemirror/lang-java\": \"^6.0.0\",\n \"@codemirror/lang-javascript\": \"^6.0.0\",\n \"@codemirror/lang-json\": \"^6.0.0\",\n \"@codemirror/lang-markdown\": \"^6.0.0\",\n \"@codemirror/lang-php\": \"^6.0.0\",\n \"@codemirror/lang-python\": \"^6.0.0\",\n \"@codemirror/lang-rust\": \"^6.0.0\",\n \"@codemirror/lang-sql\": \"^6.0.0\",\n \"@codemirror/lang-wast\": \"^6.0.0\",\n \"@codemirror/lang-xml\": \"^6.0.0\",\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/legacy-modes\": \"^6.1.0\"\n }\n },\n \"node_modules/@codemirror/legacy-modes\": {\n \"version\": \"6.1.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-6.1.0.tgz\",\n \"integrity\": \"sha512-V/PgGpndkZeTn3Hdlg/gd8MLFdyvTCIX+iwJzjUw5iNziWiNsAY8X0jvf7m3gSfxnKkNzmid6l0g4rYSpiDaCw==\",\n \"dependencies\": {\n \"@codemirror/language\": \"^6.0.0\"\n }\n },\n \"node_modules/@codemirror/lint\": {\n \"version\": \"6.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lint/-/lint-6.0.0.tgz\",\n \"integrity\": \"sha512-nUUXcJW1Xp54kNs+a1ToPLK8MadO0rMTnJB8Zk4Z8gBdrN0kqV7uvUraU/T2yqg+grDNR38Vmy/MrhQN/RgwiA==\",\n \"dependencies\": {\n \"@codemirror/state\": \"^6.0.0\",\n \"@codemirror/view\": \"^6.0.0\",\n \"crelt\": \"^1.0.5\"\n }\n },\n \"node_modules/@codemirror/rangeset\": {\n \"version\": \"0.19.9\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/rangeset/-/rangeset-0.19.9.tgz\",\n \"integrity\": \"sha512-V8YUuOvK+ew87Xem+71nKcqu1SXd5QROMRLMS/ljT5/3MCxtgrRie1Cvild0G/Z2f1fpWxzX78V0U4jjXBorBQ==\",\n \"deprecated\": \"As of 0.20.0, this package has been merged into @codemirror/state\",\n \"dependencies\": {\n \"@codemirror/state\": \"^0.19.0\"\n }\n },\n \"node_modules/@codemirror/rangeset/node_modules/@codemirror/state\": {\n \"version\": \"0.19.9\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/state/-/state-0.19.9.tgz\",\n \"integrity\": \"sha512-psOzDolKTZkx4CgUqhBQ8T8gBc0xN5z4gzed109aF6x7D7umpDRoimacI/O6d9UGuyl4eYuDCZmDFr2Rq7aGOw==\",\n \"dependencies\": {\n \"@codemirror/text\": \"^0.19.0\"\n }\n },\n \"node_modules/@codemirror/search\": {\n \"version\": \"6.2.1\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/search/-/search-6.2.1.tgz\",\n \"integrity\": \"sha512-Q1JgUSBjQZRPIddlXzad/AVDigdhriLxQNFyP0gfrDTq6LDHNhr95U/tW3bpVssGenkaLzujtu/7XoK4kyvL3g==\",\n \"dependencies\": {\n \"@codemirror/state\": \"^6.0.0\",\n \"@codemirror/view\": \"^6.0.0\",\n \"crelt\": \"^1.0.5\"\n }\n },\n \"node_modules/@codemirror/state\": {\n \"version\": \"6.1.2\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/state/-/state-6.1.2.tgz\",\n \"integrity\": \"sha512-Mxff85Hp5va+zuj+H748KbubXjrinX/k28lj43H14T2D0+4kuvEFIEIO7hCEcvBT8ubZyIelt9yGOjj2MWOEQA==\"\n },\n \"node_modules/@codemirror/text\": {\n \"version\": \"0.19.6\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/text/-/text-0.19.6.tgz\",\n \"integrity\": \"sha512-T9jnREMIygx+TPC1bOuepz18maGq/92q2a+n4qTqObKwvNMg+8cMTslb8yxeEDEq7S3kpgGWxgO1UWbQRij0dA==\",\n \"deprecated\": \"As of 0.20.0, this package has been merged into @codemirror/state\"\n },\n \"node_modules/@codemirror/view\": {\n \"version\": \"6.3.1\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/view/-/view-6.3.1.tgz\",\n \"integrity\": \"sha512-NKPBphoV9W2Q6tKXk+ge4q5EhMOOC0rpwdGS80/slNSfsVqkN4gwXIEqSprXJFlf9aUKZU7WhPvqRBMNH+hJkQ==\",\n \"dependencies\": {\n \"@codemirror/state\": \"^6.0.0\",\n \"style-mod\": \"^4.0.0\",\n \"w3c-keyname\": \"^2.2.4\"\n }\n },\n \"node_modules/@esbuild/android-arm\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.11.tgz\",\n \"integrity\": \"sha512-PzMcQLazLBkwDEkrNPi9AbjFt6+3I7HKbiYF2XtWQ7wItrHvEOeO3T8Am434zAozWtVP7lrTue1bEfc2nYWeCA==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.11.tgz\",\n \"integrity\": \"sha512-geWp637tUhNmhL3Xgy4Bj703yXB9dqiLJe05lCUfjSFDrQf9C/8pArusyPUbUbPwlC/EAUjBw32sxuIl/11dZw==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@lezer/common\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/common/-/common-1.0.1.tgz\",\n \"integrity\": \"sha512-8TR5++Q/F//tpDsLd5zkrvEX5xxeemafEaek7mUp7Y+bI8cKQXdSqhzTOBaOogETcMOVr0pT3BBPXp13477ciw==\"\n },\n \"node_modules/@lezer/cpp\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/cpp/-/cpp-1.0.0.tgz\",\n \"integrity\": \"sha512-Klk3/AIEKoptmm6cNm7xTulNXjdTKkD+hVOEcz/NeRg8tIestP5hsGHJeFDR/XtyDTxsjoPjKZRIGohht7zbKw==\",\n \"dependencies\": {\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"node_modules/@lezer/css\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/css/-/css-1.0.1.tgz\",\n \"integrity\": \"sha512-kLGsbzXdp1ntzO2jDwFf+2w76EBlLiD4FKofx7tgkdqeFRoslFiMS2qqbNtAauXw8ihZ4cE5YpxSpfsKXSs5Sg==\",\n \"dependencies\": {\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"node_modules/@lezer/highlight\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/highlight/-/highlight-1.1.1.tgz\",\n \"integrity\": \"sha512-duv9D23O9ghEDnnUDmxu+L8pJy4nYo4AbCOHIudUhscrLSazqeJeK1V50EU6ZufWF1zv0KJwu/frFRyZWXxHBQ==\",\n \"dependencies\": {\n \"@lezer/common\": \"^1.0.0\"\n }\n },\n \"node_modules/@lezer/html\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/html/-/html-1.0.1.tgz\",\n \"integrity\": \"sha512-sC00zEt3GBh3vVO6QaGX4YZCl41S9dHWN/WGBsDixy9G+sqOC7gsa4cxA/fmRVAiBvhqYkJk+5Ul4oul92CPVw==\",\n \"dependencies\": {\n \"@lezer/common\": \"^1.0.0\",\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"node_modules/@lezer/java\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/java/-/java-1.0.0.tgz\",\n \"integrity\": \"sha512-z2EA0JHq2WoiKfQy5uOOd4t17PJtq8guh58gPkSzOnNcQ7DNbkrU+Axak+jL8+Noinwyz2tRNOseQFj+Tg+P0A==\",\n \"dependencies\": {\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"node_modules/@lezer/javascript\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/javascript/-/javascript-1.0.2.tgz\",\n \"integrity\": \"sha512-IjOVeIRhM8IuafWNnk+UzRz7p4/JSOKBNINLYLsdSGuJS9Ju7vFdc82AlTt0jgtV5D8eBZf4g0vK4d3ttBNz7A==\",\n \"dependencies\": {\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"node_modules/@lezer/json\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/json/-/json-1.0.0.tgz\",\n \"integrity\": \"sha512-zbAuUY09RBzCoCA3lJ1+ypKw5WSNvLqGMtasdW6HvVOqZoCpPr8eWrsGnOVWGKGn8Rh21FnrKRVlJXrGAVUqRw==\",\n \"dependencies\": {\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"node_modules/@lezer/lr\": {\n \"version\": \"1.2.3\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/lr/-/lr-1.2.3.tgz\",\n \"integrity\": \"sha512-qpB7rBzH8f6Mzjv2AVZRahcm+2Cf7nbIH++uXbvVOL1yIRvVWQ3HAM/saeBLCyz/togB7LGo76qdJYL1uKQlqA==\",\n \"dependencies\": {\n \"@lezer/common\": \"^1.0.0\"\n }\n },\n \"node_modules/@lezer/markdown\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/markdown/-/markdown-1.0.2.tgz\",\n \"integrity\": \"sha512-8CY0OoZ6V5EzPjSPeJ4KLVbtXdLBd8V6sRCooN5kHnO28ytreEGTyrtU/zUwo/XLRzGr/e1g44KlzKi3yWGB5A==\",\n \"dependencies\": {\n \"@lezer/common\": \"^1.0.0\",\n \"@lezer/highlight\": \"^1.0.0\"\n }\n },\n \"node_modules/@lezer/php\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/php/-/php-1.0.0.tgz\",\n \"integrity\": \"sha512-kFQu/mk/vmjpA+fjQU87d9eimqKJ9PFCa8CZCPFWGEwNnm7Ahpw32N+HYEU/YAQ0XcfmOAnW/YJCEa8WpUOMMw==\",\n \"dependencies\": {\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"node_modules/@lezer/python\": {\n \"version\": \"1.1.0\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/python/-/python-1.1.0.tgz\",\n \"integrity\": \"sha512-FVPp2usfj3zZuc+2RidXAY94WAcsHQ3dbKDbXuZgoAwUungAcXwd3EWXiWQvwNqbae+ek51bWi8dwbiQqweWCg==\",\n \"dependencies\": {\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"node_modules/@lezer/rust\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/rust/-/rust-1.0.0.tgz\",\n \"integrity\": \"sha512-IpGAxIjNxYmX9ra6GfQTSPegdCAWNeq23WNmrsMMQI7YNSvKtYxO4TX5rgZUmbhEucWn0KTBMeDEPXg99YKtTA==\",\n \"dependencies\": {\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"node_modules/@lezer/xml\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/xml/-/xml-1.0.0.tgz\",\n \"integrity\": \"sha512-73iI9UK8iqSvWtLlOEl/g+50ivwQn8Ge6foHVN66AXUS1RccFnAoc7BYU8b3c8/rP6dfCOGqAGaWLxBzhj60MA==\",\n \"dependencies\": {\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"node_modules/@types/google-protobuf\": {\n \"version\": \"3.15.6\",\n \"resolved\": \"https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.6.tgz\",\n \"integrity\": \"sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==\"\n },\n \"node_modules/@types/long\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz\",\n \"integrity\": \"sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==\"\n },\n \"node_modules/codemirror\": {\n \"version\": \"6.0.1\",\n \"resolved\": \"https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz\",\n \"integrity\": \"sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==\",\n \"dependencies\": {\n \"@codemirror/autocomplete\": \"^6.0.0\",\n \"@codemirror/commands\": \"^6.0.0\",\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/lint\": \"^6.0.0\",\n \"@codemirror/search\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@codemirror/view\": \"^6.0.0\"\n }\n },\n \"node_modules/crelt\": {\n \"version\": \"1.0.5\",\n \"resolved\": \"https://registry.npmjs.org/crelt/-/crelt-1.0.5.tgz\",\n \"integrity\": \"sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==\"\n },\n \"node_modules/esbuild\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.15.11.tgz\",\n \"integrity\": \"sha512-OgHGuhlfZ//mToxjte1D5iiiQgWfJ2GByVMwEC/IuoXsBGkuyK1+KrjYu0laSpnN/L1UmLUCv0s25vObdc1bVg==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"optionalDependencies\": {\n \"@esbuild/android-arm\": \"0.15.11\",\n \"@esbuild/linux-loong64\": \"0.15.11\",\n \"esbuild-android-64\": \"0.15.11\",\n \"esbuild-android-arm64\": \"0.15.11\",\n \"esbuild-darwin-64\": \"0.15.11\",\n \"esbuild-darwin-arm64\": \"0.15.11\",\n \"esbuild-freebsd-64\": \"0.15.11\",\n \"esbuild-freebsd-arm64\": \"0.15.11\",\n \"esbuild-linux-32\": \"0.15.11\",\n \"esbuild-linux-64\": \"0.15.11\",\n \"esbuild-linux-arm\": \"0.15.11\",\n \"esbuild-linux-arm64\": \"0.15.11\",\n \"esbuild-linux-mips64le\": \"0.15.11\",\n \"esbuild-linux-ppc64le\": \"0.15.11\",\n \"esbuild-linux-riscv64\": \"0.15.11\",\n \"esbuild-linux-s390x\": \"0.15.11\",\n \"esbuild-netbsd-64\": \"0.15.11\",\n \"esbuild-openbsd-64\": \"0.15.11\",\n \"esbuild-sunos-64\": \"0.15.11\",\n \"esbuild-windows-32\": \"0.15.11\",\n \"esbuild-windows-64\": \"0.15.11\",\n \"esbuild-windows-arm64\": \"0.15.11\"\n }\n },\n \"node_modules/esbuild-android-64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.11.tgz\",\n \"integrity\": \"sha512-rrwoXEiuI1kaw4k475NJpexs8GfJqQUKcD08VR8sKHmuW9RUuTR2VxcupVvHdiGh9ihxL9m3lpqB1kju92Ialw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-android-arm64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.11.tgz\",\n \"integrity\": \"sha512-/hDubOg7BHOhUUsT8KUIU7GfZm5bihqssvqK5PfO4apag7YuObZRZSzViyEKcFn2tPeHx7RKbSBXvAopSHDZJQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-darwin-64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.11.tgz\",\n \"integrity\": \"sha512-1DqHD0ms3AhiwkKnjRUzmiW7JnaJJr5FKrPiR7xuyMwnjDqvNWDdMq4rKSD9OC0piFNK6n0LghsglNMe2MwJtA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-darwin-arm64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.11.tgz\",\n \"integrity\": \"sha512-OMzhxSbS0lwwrW40HHjRCeVIJTURdXFA8c3GU30MlHKuPCcvWNUIKVucVBtNpJySXmbkQMDJdJNrXzNDyvoqvQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-freebsd-64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.11.tgz\",\n \"integrity\": \"sha512-8dKP26r0/Qyez8nTCwpq60QbuYKOeBygdgOAWGCRalunyeqWRoSZj9TQjPDnTTI9joxd3QYw3UhVZTKxO9QdRg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-freebsd-arm64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.11.tgz\",\n \"integrity\": \"sha512-aSGiODiukLGGnSg/O9+cGO2QxEacrdCtCawehkWYTt5VX1ni2b9KoxpHCT9h9Y6wGqNHmXFnB47RRJ8BIqZgmQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-32\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.11.tgz\",\n \"integrity\": \"sha512-lsrAfdyJBGx+6aHIQmgqUonEzKYeBnyfJPkT6N2dOf1RoXYYV1BkWB6G02tjsrz1d5wZzaTc3cF+TKmuTo/ZwA==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.11.tgz\",\n \"integrity\": \"sha512-Y2Rh+PcyVhQqXKBTacPCltINN3uIw2xC+dsvLANJ1SpK5NJUtxv8+rqWpjmBgaNWKQT1/uGpMmA9olALy9PLVA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-arm\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.11.tgz\",\n \"integrity\": \"sha512-TJllTVk5aSyqPFvvcHTvf6Wu1ZKhWpJ/qNmZO8LL/XeB+LXCclm7HQHNEIz6MT7IX8PmlC1BZYrOiw2sXSB95A==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-arm64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.11.tgz\",\n \"integrity\": \"sha512-uhcXiTwTmD4OpxJu3xC5TzAAw6Wzf9O1XGWL448EE9bqGjgV1j+oK3lIHAfsHnuIn8K4nDW8yjX0Sv5S++oRuw==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-mips64le\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.11.tgz\",\n \"integrity\": \"sha512-WD61y/R1M4BLe4gxXRypoQ0Ci+Vjf714QYzcPNkiYv5I8K8WDz2ZR8Bm6cqKxd6rD+e/rZgPDbhQ9PCf7TMHmA==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-ppc64le\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.11.tgz\",\n \"integrity\": \"sha512-JVleZS9oPVLTlBhPTWgOwxFWU/wMUdlBwTbGA4GF8c38sLbS13cupj+C8bLq929jU7EMWry4SaL+tKGIaTlqKg==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-riscv64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.11.tgz\",\n \"integrity\": \"sha512-9aLIalZ2HFHIOZpmVU11sEAS9F8TnHw49daEjcgMpBXHFF57VuT9f9/9LKJhw781Gda0P9jDkuCWJ0tFbErvJw==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-s390x\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.11.tgz\",\n \"integrity\": \"sha512-sZHtiXXOKsLI3XGBGoYO4qKBzJlb8xNsWmvFiwFMHFzA4AXgDP1KDp7Dawe9C2pavTRBDvl+Ok4n/DHQ59oaTg==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-netbsd-64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.11.tgz\",\n \"integrity\": \"sha512-hUC9yN06K9sg7ju4Vgu9ChAPdsEgtcrcLfyNT5IKwKyfpLvKUwCMZSdF+gRD3WpyZelgTQfJ+pDx5XFbXTlB0A==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-openbsd-64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.11.tgz\",\n \"integrity\": \"sha512-0bBo9SQR4t66Wd91LGMAqmWorzO0TTzVjYiifwoFtel8luFeXuPThQnEm5ztN4g0fnvcp7AnUPPzS/Depf17wQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-sunos-64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.11.tgz\",\n \"integrity\": \"sha512-EuBdTGlsMTjEl1sQnBX2jfygy7iR6CKfvOzi+gEOfhDqbHXsmY1dcpbVtcwHAg9/2yUZSfMJHMAgf1z8M4yyyw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-windows-32\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.11.tgz\",\n \"integrity\": \"sha512-O0/Wo1Wk6dc0rZSxkvGpmTNIycEznHmkObTFz2VHBhjPsO4ZpCgfGxNkCpz4AdAIeMczpTXt/8d5vdJNKEGC+Q==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-windows-64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.11.tgz\",\n \"integrity\": \"sha512-x977Q4HhNjnHx00b4XLAnTtj5vfbdEvkxaQwC1Zh5AN8g5EX+izgZ6e5QgqJgpzyRNJqh4hkgIJF1pyy1be0mQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-windows-arm64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.11.tgz\",\n \"integrity\": \"sha512-VwUHFACuBahrvntdcMKZteUZ9HaYrBRODoKe4tIWxguQRvvYoYb7iu5LrcRS/FQx8KPZNaa72zuqwVtHeXsITw==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/fsevents\": {\n \"version\": \"2.3.2\",\n \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz\",\n \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n }\n },\n \"node_modules/function-bind\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz\",\n \"integrity\": \"sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==\",\n \"dev\": true\n },\n \"node_modules/google-protobuf\": {\n \"version\": \"3.21.2\",\n \"resolved\": \"https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz\",\n \"integrity\": \"sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==\"\n },\n \"node_modules/grpc-web\": {\n \"version\": \"1.4.1\",\n \"resolved\": \"https://registry.npmjs.org/grpc-web/-/grpc-web-1.4.1.tgz\",\n \"integrity\": \"sha512-rZb/vubTg58iWjytpq/aXDpDaAePuXby7kpQqOgrGkVy4FxM2LPz5vjxAcFhWf7peKvLQDhYFk8f7dvH3cZTlw==\"\n },\n \"node_modules/has\": {\n \"version\": \"1.0.3\",\n \"resolved\": \"https://registry.npmjs.org/has/-/has-1.0.3.tgz\",\n \"integrity\": \"sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==\",\n \"dev\": true,\n \"dependencies\": {\n \"function-bind\": \"^1.1.1\"\n },\n \"engines\": {\n \"node\": \">= 0.4.0\"\n }\n },\n \"node_modules/is-core-module\": {\n \"version\": \"2.10.0\",\n \"resolved\": \"https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz\",\n \"integrity\": \"sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==\",\n \"dev\": true,\n \"dependencies\": {\n \"has\": \"^1.0.3\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/long\": {\n \"version\": \"5.2.0\",\n \"resolved\": \"https://registry.npmjs.org/long/-/long-5.2.0.tgz\",\n \"integrity\": \"sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w==\"\n },\n \"node_modules/nanoid\": {\n \"version\": \"3.3.4\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz\",\n \"integrity\": \"sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==\",\n \"dev\": true,\n \"bin\": {\n \"nanoid\": \"bin/nanoid.cjs\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || ^13.7 || ^14 || >=15.0.1\"\n }\n },\n \"node_modules/path-parse\": {\n \"version\": \"1.0.7\",\n \"resolved\": \"https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz\",\n \"integrity\": \"sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==\",\n \"dev\": true\n },\n \"node_modules/picocolors\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz\",\n \"integrity\": \"sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==\",\n \"dev\": true\n },\n \"node_modules/postcss\": {\n \"version\": \"8.4.18\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz\",\n \"integrity\": \"sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==\",\n \"dev\": true,\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/postcss/\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/postcss\"\n }\n ],\n \"dependencies\": {\n \"nanoid\": \"^3.3.4\",\n \"picocolors\": \"^1.0.0\",\n \"source-map-js\": \"^1.0.2\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || >=14\"\n }\n },\n \"node_modules/resolve\": {\n \"version\": \"1.22.1\",\n \"resolved\": \"https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz\",\n \"integrity\": \"sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==\",\n \"dev\": true,\n \"dependencies\": {\n \"is-core-module\": \"^2.9.0\",\n \"path-parse\": \"^1.0.7\",\n \"supports-preserve-symlinks-flag\": \"^1.0.0\"\n },\n \"bin\": {\n \"resolve\": \"bin/resolve\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/rollup\": {\n \"version\": \"2.79.1\",\n \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz\",\n \"integrity\": \"sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==\",\n \"dev\": true,\n \"bin\": {\n \"rollup\": \"dist/bin/rollup\"\n },\n \"engines\": {\n \"node\": \">=10.0.0\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.2\"\n }\n },\n \"node_modules/source-map-js\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz\",\n \"integrity\": \"sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/style-mod\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz\",\n \"integrity\": \"sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==\"\n },\n \"node_modules/supports-preserve-symlinks-flag\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz\",\n \"integrity\": \"sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">= 0.4\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/typescript\": {\n \"version\": \"4.8.4\",\n \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz\",\n \"integrity\": \"sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==\",\n \"dev\": true,\n \"bin\": {\n \"tsc\": \"bin/tsc\",\n \"tsserver\": \"bin/tsserver\"\n },\n \"engines\": {\n \"node\": \">=4.2.0\"\n }\n },\n \"node_modules/vite\": {\n \"version\": \"3.2.7\",\n \"resolved\": \"https://registry.npmjs.org/vite/-/vite-3.2.7.tgz\",\n \"integrity\": \"sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==\",\n \"dev\": true,\n \"dependencies\": {\n \"esbuild\": \"^0.15.9\",\n \"postcss\": \"^8.4.18\",\n \"resolve\": \"^1.22.1\",\n \"rollup\": \"^2.79.1\"\n },\n \"bin\": {\n \"vite\": \"bin/vite.js\"\n },\n \"engines\": {\n \"node\": \"^14.18.0 || >=16.0.0\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.2\"\n },\n \"peerDependencies\": {\n \"@types/node\": \">= 14\",\n \"less\": \"*\",\n \"sass\": \"*\",\n \"stylus\": \"*\",\n \"sugarss\": \"*\",\n \"terser\": \"^5.4.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/node\": {\n \"optional\": true\n },\n \"less\": {\n \"optional\": true\n },\n \"sass\": {\n \"optional\": true\n },\n \"stylus\": {\n \"optional\": true\n },\n \"sugarss\": {\n \"optional\": true\n },\n \"terser\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/w3c-keyname\": {\n \"version\": \"2.2.6\",\n \"resolved\": \"https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz\",\n \"integrity\": \"sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==\"\n },\n \"node_modules/yorkie-js-sdk\": {\n \"version\": \"0.3.5\",\n \"resolved\": \"https://registry.npmjs.org/yorkie-js-sdk/-/yorkie-js-sdk-0.3.5.tgz\",\n \"integrity\": \"sha512-CZdc5yUhmJUQWpulDOeDwlW9Uh5WgDBLuCyhXV8+Crb3Kr14PCmrJJ9lI3rVSReosQtq8RjPYnwMd7KbtYALyw==\",\n \"dependencies\": {\n \"@types/google-protobuf\": \"^3.15.5\",\n \"@types/long\": \"^4.0.1\",\n \"google-protobuf\": \"^3.19.4\",\n \"grpc-web\": \"^1.3.1\",\n \"long\": \"^5.2.0\"\n }\n }\n },\n \"dependencies\": {\n \"@codemirror/autocomplete\": {\n \"version\": \"6.3.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.3.0.tgz\",\n \"integrity\": \"sha512-4jEvh3AjJZTDKazd10J6ZsCIqaYxDMCeua5ouQxY8hlFIml+nr7le0SgBhT3SIytFBmdzPK3AUhXGuW3T79nVg==\",\n \"requires\": {\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@codemirror/view\": \"^6.0.0\",\n \"@lezer/common\": \"^1.0.0\"\n }\n },\n \"@codemirror/commands\": {\n \"version\": \"6.1.2\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/commands/-/commands-6.1.2.tgz\",\n \"integrity\": \"sha512-sO3jdX1s0pam6lIdeSJLMN3DQ6mPEbM4yLvyKkdqtmd/UDwhXA5+AwFJ89rRXm6vTeOXBsE5cAmlos/t7MJdgg==\",\n \"requires\": {\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@codemirror/view\": \"^6.0.0\",\n \"@lezer/common\": \"^1.0.0\"\n }\n },\n \"@codemirror/highlight\": {\n \"version\": \"0.19.8\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/highlight/-/highlight-0.19.8.tgz\",\n \"integrity\": \"sha512-v/lzuHjrYR8MN2mEJcUD6fHSTXXli9C1XGYpr+ElV6fLBIUhMTNKR3qThp611xuWfXfwDxeL7ppcbkM/MzPV3A==\",\n \"requires\": {\n \"@codemirror/language\": \"^0.19.0\",\n \"@codemirror/rangeset\": \"^0.19.0\",\n \"@codemirror/state\": \"^0.19.3\",\n \"@codemirror/view\": \"^0.19.39\",\n \"@lezer/common\": \"^0.15.0\",\n \"style-mod\": \"^4.0.0\"\n },\n \"dependencies\": {\n \"@codemirror/language\": {\n \"version\": \"0.19.10\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/language/-/language-0.19.10.tgz\",\n \"integrity\": \"sha512-yA0DZ3RYn2CqAAGW62VrU8c4YxscMQn45y/I9sjBlqB1e2OTQLg4CCkMBuMSLXk4xaqjlsgazeOQWaJQOKfV8Q==\",\n \"requires\": {\n \"@codemirror/state\": \"^0.19.0\",\n \"@codemirror/text\": \"^0.19.0\",\n \"@codemirror/view\": \"^0.19.0\",\n \"@lezer/common\": \"^0.15.5\",\n \"@lezer/lr\": \"^0.15.0\"\n }\n },\n \"@codemirror/state\": {\n \"version\": \"0.19.9\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/state/-/state-0.19.9.tgz\",\n \"integrity\": \"sha512-psOzDolKTZkx4CgUqhBQ8T8gBc0xN5z4gzed109aF6x7D7umpDRoimacI/O6d9UGuyl4eYuDCZmDFr2Rq7aGOw==\",\n \"requires\": {\n \"@codemirror/text\": \"^0.19.0\"\n }\n },\n \"@codemirror/view\": {\n \"version\": \"0.19.48\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/view/-/view-0.19.48.tgz\",\n \"integrity\": \"sha512-0eg7D2Nz4S8/caetCTz61rK0tkHI17V/d15Jy0kLOT8dTLGGNJUponDnW28h2B6bERmPlVHKh8MJIr5OCp1nGw==\",\n \"requires\": {\n \"@codemirror/rangeset\": \"^0.19.5\",\n \"@codemirror/state\": \"^0.19.3\",\n \"@codemirror/text\": \"^0.19.0\",\n \"style-mod\": \"^4.0.0\",\n \"w3c-keyname\": \"^2.2.4\"\n }\n },\n \"@lezer/common\": {\n \"version\": \"0.15.12\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/common/-/common-0.15.12.tgz\",\n \"integrity\": \"sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==\"\n },\n \"@lezer/lr\": {\n \"version\": \"0.15.8\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/lr/-/lr-0.15.8.tgz\",\n \"integrity\": \"sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==\",\n \"requires\": {\n \"@lezer/common\": \"^0.15.0\"\n }\n }\n }\n },\n \"@codemirror/lang-cpp\": {\n \"version\": \"6.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-cpp/-/lang-cpp-6.0.1.tgz\",\n \"integrity\": \"sha512-46p3ohfhjzkLWJ3VwvzX0aqlXh8UkEqX1xo2Eds9l6Ql3uDoxI2IZEjR9cgJaGOZTXCkDzQuQH7sfYAxMvzLjA==\",\n \"requires\": {\n \"@codemirror/language\": \"^6.0.0\",\n \"@lezer/cpp\": \"^1.0.0\"\n }\n },\n \"@codemirror/lang-css\": {\n \"version\": \"6.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.0.0.tgz\",\n \"integrity\": \"sha512-jBqc+BTuwhNOTlrimFghLlSrN6iFuE44HULKWoR4qKYObhOIl9Lci1iYj6zMIte1XTQmZguNvjXMyr43LUKwSw==\",\n \"requires\": {\n \"@codemirror/autocomplete\": \"^6.0.0\",\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@lezer/css\": \"^1.0.0\"\n }\n },\n \"@codemirror/lang-html\": {\n \"version\": \"6.1.2\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.1.2.tgz\",\n \"integrity\": \"sha512-e8JAUWyOo7N26tmek+WK0+Zg+pZRe+dQi8TZq0OOVVygpLV+mNAT2n5b5JhknY+TVZIVGLjuhdsoizw1SDFfPg==\",\n \"requires\": {\n \"@codemirror/autocomplete\": \"^6.0.0\",\n \"@codemirror/lang-css\": \"^6.0.0\",\n \"@codemirror/lang-javascript\": \"^6.0.0\",\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@codemirror/view\": \"^6.2.2\",\n \"@lezer/common\": \"^1.0.0\",\n \"@lezer/html\": \"^1.0.1\"\n }\n },\n \"@codemirror/lang-java\": {\n \"version\": \"6.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-java/-/lang-java-6.0.0.tgz\",\n \"integrity\": \"sha512-aeWq+ikUS6Eubk6RBbiMgxuBIT4Ih8Asb1qc2pSiMcstrwr4ODbazPXsBHbLBYg3aObvFyOm2bNQncbQJjZ3sQ==\",\n \"requires\": {\n \"@codemirror/language\": \"^6.0.0\",\n \"@lezer/java\": \"^1.0.0\"\n }\n },\n \"@codemirror/lang-javascript\": {\n \"version\": \"6.1.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.1.0.tgz\",\n \"integrity\": \"sha512-wAWEY1Wdis2cKDy9A5q/rUmzLHFbZgoupJBcGaeMMsDPi68Rm90NsmzAEODE5kW8mYdRKFhQ157WJghOZ3yYdg==\",\n \"requires\": {\n \"@codemirror/autocomplete\": \"^6.0.0\",\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/lint\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@codemirror/view\": \"^6.0.0\",\n \"@lezer/common\": \"^1.0.0\",\n \"@lezer/javascript\": \"^1.0.0\"\n }\n },\n \"@codemirror/lang-json\": {\n \"version\": \"6.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.0.tgz\",\n \"integrity\": \"sha512-DvTcYTKLmg2viADXlTdufrT334M9jowe1qO02W28nvm+nejcvhM5vot5mE8/kPrxYw/HJHhwu1z2PyBpnMLCNQ==\",\n \"requires\": {\n \"@codemirror/language\": \"^6.0.0\",\n \"@lezer/json\": \"^1.0.0\"\n }\n },\n \"@codemirror/lang-markdown\": {\n \"version\": \"6.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.0.2.tgz\",\n \"integrity\": \"sha512-wsUGGP8ihCVJKzVciOpsZXteSY1IRTe/C4eYb2QUEDl41ZiRfmdhA4llechqDaRdGOJuc45oCjBVjOo94CBHtA==\",\n \"requires\": {\n \"@codemirror/lang-html\": \"^6.0.0\",\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@codemirror/view\": \"^6.0.0\",\n \"@lezer/common\": \"^1.0.0\",\n \"@lezer/markdown\": \"^1.0.0\"\n }\n },\n \"@codemirror/lang-php\": {\n \"version\": \"6.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-php/-/lang-php-6.0.0.tgz\",\n \"integrity\": \"sha512-96CEjq0xEgbzc6bdFPwILPfZ6m8917JRbh2oPszZJABlYxG4Y+eYjtYkUTDb4yuyjQKyigHoeGC6zoIOYA1NWA==\",\n \"requires\": {\n \"@codemirror/lang-html\": \"^6.0.0\",\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@lezer/common\": \"^1.0.0\",\n \"@lezer/php\": \"^1.0.0\"\n }\n },\n \"@codemirror/lang-python\": {\n \"version\": \"6.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-python/-/lang-python-6.0.2.tgz\",\n \"integrity\": \"sha512-5BidNrfhab3s9LYNSN7JWFjL1+1zGAIw0dxUyalNwsUN+uCVE62sTk3uJlMZux4SsyT6fR8LbOLtWu52XQL6Yw==\",\n \"requires\": {\n \"@codemirror/language\": \"^6.0.0\",\n \"@lezer/python\": \"^1.0.0\"\n }\n },\n \"@codemirror/lang-rust\": {\n \"version\": \"6.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-rust/-/lang-rust-6.0.0.tgz\",\n \"integrity\": \"sha512-VQql3Qk1BwoXb3SUkeWll/EEwhsgQWc1bpia7CFqqp2PhQBb5A6r4Vj2JCkU/nE6A7TDPSGHTOoqJSG5s/VXtQ==\",\n \"requires\": {\n \"@codemirror/language\": \"^6.0.0\",\n \"@lezer/rust\": \"^1.0.0\"\n }\n },\n \"@codemirror/lang-sql\": {\n \"version\": \"6.3.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-sql/-/lang-sql-6.3.0.tgz\",\n \"integrity\": \"sha512-+4vyqZMmvseeORW44RMYF3rDGhQG9f7GOXZitrIqSrUHI33DgIudK2qTcaf9TfCuJdOxPEp4xEGvm0H+FBAhVw==\",\n \"requires\": {\n \"@codemirror/autocomplete\": \"^6.0.0\",\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"@codemirror/lang-wast\": {\n \"version\": \"6.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-wast/-/lang-wast-6.0.0.tgz\",\n \"integrity\": \"sha512-vSbtLrxuB95PC5LJ+yszKVmBUkLmMdowNFjjn0e+LHeBzvpdQJHVomgE76UUFeZGW+Ht0VfM6rxEd9SL85FuhA==\",\n \"requires\": {\n \"@codemirror/language\": \"^6.0.0\",\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"@codemirror/lang-xml\": {\n \"version\": \"6.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lang-xml/-/lang-xml-6.0.0.tgz\",\n \"integrity\": \"sha512-M/HLWxIiP956xGjtrxkeHkCmDGVQGKu782x8pOH5CLJIMkWtiB1DWfDoDHqpFjdEE9dkfcqPWvYfVi6GbhuXEg==\",\n \"requires\": {\n \"@codemirror/autocomplete\": \"^6.0.0\",\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@lezer/common\": \"^1.0.0\",\n \"@lezer/xml\": \"^1.0.0\"\n }\n },\n \"@codemirror/language\": {\n \"version\": \"6.2.1\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/language/-/language-6.2.1.tgz\",\n \"integrity\": \"sha512-MC3svxuvIj0MRpFlGHxLS6vPyIdbTr2KKPEW46kCoCXw2ktb4NTkpkPBI/lSP/FoNXLCBJ0mrnUi1OoZxtpW1Q==\",\n \"requires\": {\n \"@codemirror/state\": \"^6.0.0\",\n \"@codemirror/view\": \"^6.0.0\",\n \"@lezer/common\": \"^1.0.0\",\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\",\n \"style-mod\": \"^4.0.0\"\n }\n },\n \"@codemirror/language-data\": {\n \"version\": \"6.1.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/language-data/-/language-data-6.1.0.tgz\",\n \"integrity\": \"sha512-g9V23fuLRI9AEbpM6bDy1oquqgpFlIDHTihUhL21NPmxp+x67ZJbsKk+V71W7/Bj8SCqEO1PtqQA/tDGgt1nfw==\",\n \"requires\": {\n \"@codemirror/lang-cpp\": \"^6.0.0\",\n \"@codemirror/lang-css\": \"^6.0.0\",\n \"@codemirror/lang-html\": \"^6.0.0\",\n \"@codemirror/lang-java\": \"^6.0.0\",\n \"@codemirror/lang-javascript\": \"^6.0.0\",\n \"@codemirror/lang-json\": \"^6.0.0\",\n \"@codemirror/lang-markdown\": \"^6.0.0\",\n \"@codemirror/lang-php\": \"^6.0.0\",\n \"@codemirror/lang-python\": \"^6.0.0\",\n \"@codemirror/lang-rust\": \"^6.0.0\",\n \"@codemirror/lang-sql\": \"^6.0.0\",\n \"@codemirror/lang-wast\": \"^6.0.0\",\n \"@codemirror/lang-xml\": \"^6.0.0\",\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/legacy-modes\": \"^6.1.0\"\n }\n },\n \"@codemirror/legacy-modes\": {\n \"version\": \"6.1.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/legacy-modes/-/legacy-modes-6.1.0.tgz\",\n \"integrity\": \"sha512-V/PgGpndkZeTn3Hdlg/gd8MLFdyvTCIX+iwJzjUw5iNziWiNsAY8X0jvf7m3gSfxnKkNzmid6l0g4rYSpiDaCw==\",\n \"requires\": {\n \"@codemirror/language\": \"^6.0.0\"\n }\n },\n \"@codemirror/lint\": {\n \"version\": \"6.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/lint/-/lint-6.0.0.tgz\",\n \"integrity\": \"sha512-nUUXcJW1Xp54kNs+a1ToPLK8MadO0rMTnJB8Zk4Z8gBdrN0kqV7uvUraU/T2yqg+grDNR38Vmy/MrhQN/RgwiA==\",\n \"requires\": {\n \"@codemirror/state\": \"^6.0.0\",\n \"@codemirror/view\": \"^6.0.0\",\n \"crelt\": \"^1.0.5\"\n }\n },\n \"@codemirror/rangeset\": {\n \"version\": \"0.19.9\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/rangeset/-/rangeset-0.19.9.tgz\",\n \"integrity\": \"sha512-V8YUuOvK+ew87Xem+71nKcqu1SXd5QROMRLMS/ljT5/3MCxtgrRie1Cvild0G/Z2f1fpWxzX78V0U4jjXBorBQ==\",\n \"requires\": {\n \"@codemirror/state\": \"^0.19.0\"\n },\n \"dependencies\": {\n \"@codemirror/state\": {\n \"version\": \"0.19.9\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/state/-/state-0.19.9.tgz\",\n \"integrity\": \"sha512-psOzDolKTZkx4CgUqhBQ8T8gBc0xN5z4gzed109aF6x7D7umpDRoimacI/O6d9UGuyl4eYuDCZmDFr2Rq7aGOw==\",\n \"requires\": {\n \"@codemirror/text\": \"^0.19.0\"\n }\n }\n }\n },\n \"@codemirror/search\": {\n \"version\": \"6.2.1\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/search/-/search-6.2.1.tgz\",\n \"integrity\": \"sha512-Q1JgUSBjQZRPIddlXzad/AVDigdhriLxQNFyP0gfrDTq6LDHNhr95U/tW3bpVssGenkaLzujtu/7XoK4kyvL3g==\",\n \"requires\": {\n \"@codemirror/state\": \"^6.0.0\",\n \"@codemirror/view\": \"^6.0.0\",\n \"crelt\": \"^1.0.5\"\n }\n },\n \"@codemirror/state\": {\n \"version\": \"6.1.2\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/state/-/state-6.1.2.tgz\",\n \"integrity\": \"sha512-Mxff85Hp5va+zuj+H748KbubXjrinX/k28lj43H14T2D0+4kuvEFIEIO7hCEcvBT8ubZyIelt9yGOjj2MWOEQA==\"\n },\n \"@codemirror/text\": {\n \"version\": \"0.19.6\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/text/-/text-0.19.6.tgz\",\n \"integrity\": \"sha512-T9jnREMIygx+TPC1bOuepz18maGq/92q2a+n4qTqObKwvNMg+8cMTslb8yxeEDEq7S3kpgGWxgO1UWbQRij0dA==\"\n },\n \"@codemirror/view\": {\n \"version\": \"6.3.1\",\n \"resolved\": \"https://registry.npmjs.org/@codemirror/view/-/view-6.3.1.tgz\",\n \"integrity\": \"sha512-NKPBphoV9W2Q6tKXk+ge4q5EhMOOC0rpwdGS80/slNSfsVqkN4gwXIEqSprXJFlf9aUKZU7WhPvqRBMNH+hJkQ==\",\n \"requires\": {\n \"@codemirror/state\": \"^6.0.0\",\n \"style-mod\": \"^4.0.0\",\n \"w3c-keyname\": \"^2.2.4\"\n }\n },\n \"@esbuild/android-arm\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.11.tgz\",\n \"integrity\": \"sha512-PzMcQLazLBkwDEkrNPi9AbjFt6+3I7HKbiYF2XtWQ7wItrHvEOeO3T8Am434zAozWtVP7lrTue1bEfc2nYWeCA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"@esbuild/linux-loong64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.11.tgz\",\n \"integrity\": \"sha512-geWp637tUhNmhL3Xgy4Bj703yXB9dqiLJe05lCUfjSFDrQf9C/8pArusyPUbUbPwlC/EAUjBw32sxuIl/11dZw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"@lezer/common\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/common/-/common-1.0.1.tgz\",\n \"integrity\": \"sha512-8TR5++Q/F//tpDsLd5zkrvEX5xxeemafEaek7mUp7Y+bI8cKQXdSqhzTOBaOogETcMOVr0pT3BBPXp13477ciw==\"\n },\n \"@lezer/cpp\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/cpp/-/cpp-1.0.0.tgz\",\n \"integrity\": \"sha512-Klk3/AIEKoptmm6cNm7xTulNXjdTKkD+hVOEcz/NeRg8tIestP5hsGHJeFDR/XtyDTxsjoPjKZRIGohht7zbKw==\",\n \"requires\": {\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"@lezer/css\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/css/-/css-1.0.1.tgz\",\n \"integrity\": \"sha512-kLGsbzXdp1ntzO2jDwFf+2w76EBlLiD4FKofx7tgkdqeFRoslFiMS2qqbNtAauXw8ihZ4cE5YpxSpfsKXSs5Sg==\",\n \"requires\": {\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"@lezer/highlight\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/highlight/-/highlight-1.1.1.tgz\",\n \"integrity\": \"sha512-duv9D23O9ghEDnnUDmxu+L8pJy4nYo4AbCOHIudUhscrLSazqeJeK1V50EU6ZufWF1zv0KJwu/frFRyZWXxHBQ==\",\n \"requires\": {\n \"@lezer/common\": \"^1.0.0\"\n }\n },\n \"@lezer/html\": {\n \"version\": \"1.0.1\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/html/-/html-1.0.1.tgz\",\n \"integrity\": \"sha512-sC00zEt3GBh3vVO6QaGX4YZCl41S9dHWN/WGBsDixy9G+sqOC7gsa4cxA/fmRVAiBvhqYkJk+5Ul4oul92CPVw==\",\n \"requires\": {\n \"@lezer/common\": \"^1.0.0\",\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"@lezer/java\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/java/-/java-1.0.0.tgz\",\n \"integrity\": \"sha512-z2EA0JHq2WoiKfQy5uOOd4t17PJtq8guh58gPkSzOnNcQ7DNbkrU+Axak+jL8+Noinwyz2tRNOseQFj+Tg+P0A==\",\n \"requires\": {\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"@lezer/javascript\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/javascript/-/javascript-1.0.2.tgz\",\n \"integrity\": \"sha512-IjOVeIRhM8IuafWNnk+UzRz7p4/JSOKBNINLYLsdSGuJS9Ju7vFdc82AlTt0jgtV5D8eBZf4g0vK4d3ttBNz7A==\",\n \"requires\": {\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"@lezer/json\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/json/-/json-1.0.0.tgz\",\n \"integrity\": \"sha512-zbAuUY09RBzCoCA3lJ1+ypKw5WSNvLqGMtasdW6HvVOqZoCpPr8eWrsGnOVWGKGn8Rh21FnrKRVlJXrGAVUqRw==\",\n \"requires\": {\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"@lezer/lr\": {\n \"version\": \"1.2.3\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/lr/-/lr-1.2.3.tgz\",\n \"integrity\": \"sha512-qpB7rBzH8f6Mzjv2AVZRahcm+2Cf7nbIH++uXbvVOL1yIRvVWQ3HAM/saeBLCyz/togB7LGo76qdJYL1uKQlqA==\",\n \"requires\": {\n \"@lezer/common\": \"^1.0.0\"\n }\n },\n \"@lezer/markdown\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/markdown/-/markdown-1.0.2.tgz\",\n \"integrity\": \"sha512-8CY0OoZ6V5EzPjSPeJ4KLVbtXdLBd8V6sRCooN5kHnO28ytreEGTyrtU/zUwo/XLRzGr/e1g44KlzKi3yWGB5A==\",\n \"requires\": {\n \"@lezer/common\": \"^1.0.0\",\n \"@lezer/highlight\": \"^1.0.0\"\n }\n },\n \"@lezer/php\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/php/-/php-1.0.0.tgz\",\n \"integrity\": \"sha512-kFQu/mk/vmjpA+fjQU87d9eimqKJ9PFCa8CZCPFWGEwNnm7Ahpw32N+HYEU/YAQ0XcfmOAnW/YJCEa8WpUOMMw==\",\n \"requires\": {\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"@lezer/python\": {\n \"version\": \"1.1.0\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/python/-/python-1.1.0.tgz\",\n \"integrity\": \"sha512-FVPp2usfj3zZuc+2RidXAY94WAcsHQ3dbKDbXuZgoAwUungAcXwd3EWXiWQvwNqbae+ek51bWi8dwbiQqweWCg==\",\n \"requires\": {\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"@lezer/rust\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/rust/-/rust-1.0.0.tgz\",\n \"integrity\": \"sha512-IpGAxIjNxYmX9ra6GfQTSPegdCAWNeq23WNmrsMMQI7YNSvKtYxO4TX5rgZUmbhEucWn0KTBMeDEPXg99YKtTA==\",\n \"requires\": {\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"@lezer/xml\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/@lezer/xml/-/xml-1.0.0.tgz\",\n \"integrity\": \"sha512-73iI9UK8iqSvWtLlOEl/g+50ivwQn8Ge6foHVN66AXUS1RccFnAoc7BYU8b3c8/rP6dfCOGqAGaWLxBzhj60MA==\",\n \"requires\": {\n \"@lezer/highlight\": \"^1.0.0\",\n \"@lezer/lr\": \"^1.0.0\"\n }\n },\n \"@types/google-protobuf\": {\n \"version\": \"3.15.6\",\n \"resolved\": \"https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.6.tgz\",\n \"integrity\": \"sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==\"\n },\n \"@types/long\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz\",\n \"integrity\": \"sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==\"\n },\n \"codemirror\": {\n \"version\": \"6.0.1\",\n \"resolved\": \"https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz\",\n \"integrity\": \"sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==\",\n \"requires\": {\n \"@codemirror/autocomplete\": \"^6.0.0\",\n \"@codemirror/commands\": \"^6.0.0\",\n \"@codemirror/language\": \"^6.0.0\",\n \"@codemirror/lint\": \"^6.0.0\",\n \"@codemirror/search\": \"^6.0.0\",\n \"@codemirror/state\": \"^6.0.0\",\n \"@codemirror/view\": \"^6.0.0\"\n }\n },\n \"crelt\": {\n \"version\": \"1.0.5\",\n \"resolved\": \"https://registry.npmjs.org/crelt/-/crelt-1.0.5.tgz\",\n \"integrity\": \"sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==\"\n },\n \"esbuild\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.15.11.tgz\",\n \"integrity\": \"sha512-OgHGuhlfZ//mToxjte1D5iiiQgWfJ2GByVMwEC/IuoXsBGkuyK1+KrjYu0laSpnN/L1UmLUCv0s25vObdc1bVg==\",\n \"dev\": true,\n \"requires\": {\n \"@esbuild/android-arm\": \"0.15.11\",\n \"@esbuild/linux-loong64\": \"0.15.11\",\n \"esbuild-android-64\": \"0.15.11\",\n \"esbuild-android-arm64\": \"0.15.11\",\n \"esbuild-darwin-64\": \"0.15.11\",\n \"esbuild-darwin-arm64\": \"0.15.11\",\n \"esbuild-freebsd-64\": \"0.15.11\",\n \"esbuild-freebsd-arm64\": \"0.15.11\",\n \"esbuild-linux-32\": \"0.15.11\",\n \"esbuild-linux-64\": \"0.15.11\",\n \"esbuild-linux-arm\": \"0.15.11\",\n \"esbuild-linux-arm64\": \"0.15.11\",\n \"esbuild-linux-mips64le\": \"0.15.11\",\n \"esbuild-linux-ppc64le\": \"0.15.11\",\n \"esbuild-linux-riscv64\": \"0.15.11\",\n \"esbuild-linux-s390x\": \"0.15.11\",\n \"esbuild-netbsd-64\": \"0.15.11\",\n \"esbuild-openbsd-64\": \"0.15.11\",\n \"esbuild-sunos-64\": \"0.15.11\",\n \"esbuild-windows-32\": \"0.15.11\",\n \"esbuild-windows-64\": \"0.15.11\",\n \"esbuild-windows-arm64\": \"0.15.11\"\n }\n },\n \"esbuild-android-64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.11.tgz\",\n \"integrity\": \"sha512-rrwoXEiuI1kaw4k475NJpexs8GfJqQUKcD08VR8sKHmuW9RUuTR2VxcupVvHdiGh9ihxL9m3lpqB1kju92Ialw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-android-arm64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.11.tgz\",\n \"integrity\": \"sha512-/hDubOg7BHOhUUsT8KUIU7GfZm5bihqssvqK5PfO4apag7YuObZRZSzViyEKcFn2tPeHx7RKbSBXvAopSHDZJQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-darwin-64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.11.tgz\",\n \"integrity\": \"sha512-1DqHD0ms3AhiwkKnjRUzmiW7JnaJJr5FKrPiR7xuyMwnjDqvNWDdMq4rKSD9OC0piFNK6n0LghsglNMe2MwJtA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-darwin-arm64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.11.tgz\",\n \"integrity\": \"sha512-OMzhxSbS0lwwrW40HHjRCeVIJTURdXFA8c3GU30MlHKuPCcvWNUIKVucVBtNpJySXmbkQMDJdJNrXzNDyvoqvQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-freebsd-64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.11.tgz\",\n \"integrity\": \"sha512-8dKP26r0/Qyez8nTCwpq60QbuYKOeBygdgOAWGCRalunyeqWRoSZj9TQjPDnTTI9joxd3QYw3UhVZTKxO9QdRg==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-freebsd-arm64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.11.tgz\",\n \"integrity\": \"sha512-aSGiODiukLGGnSg/O9+cGO2QxEacrdCtCawehkWYTt5VX1ni2b9KoxpHCT9h9Y6wGqNHmXFnB47RRJ8BIqZgmQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-32\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.11.tgz\",\n \"integrity\": \"sha512-lsrAfdyJBGx+6aHIQmgqUonEzKYeBnyfJPkT6N2dOf1RoXYYV1BkWB6G02tjsrz1d5wZzaTc3cF+TKmuTo/ZwA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.11.tgz\",\n \"integrity\": \"sha512-Y2Rh+PcyVhQqXKBTacPCltINN3uIw2xC+dsvLANJ1SpK5NJUtxv8+rqWpjmBgaNWKQT1/uGpMmA9olALy9PLVA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-arm\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.11.tgz\",\n \"integrity\": \"sha512-TJllTVk5aSyqPFvvcHTvf6Wu1ZKhWpJ/qNmZO8LL/XeB+LXCclm7HQHNEIz6MT7IX8PmlC1BZYrOiw2sXSB95A==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-arm64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.11.tgz\",\n \"integrity\": \"sha512-uhcXiTwTmD4OpxJu3xC5TzAAw6Wzf9O1XGWL448EE9bqGjgV1j+oK3lIHAfsHnuIn8K4nDW8yjX0Sv5S++oRuw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-mips64le\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.11.tgz\",\n \"integrity\": \"sha512-WD61y/R1M4BLe4gxXRypoQ0Ci+Vjf714QYzcPNkiYv5I8K8WDz2ZR8Bm6cqKxd6rD+e/rZgPDbhQ9PCf7TMHmA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-ppc64le\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.11.tgz\",\n \"integrity\": \"sha512-JVleZS9oPVLTlBhPTWgOwxFWU/wMUdlBwTbGA4GF8c38sLbS13cupj+C8bLq929jU7EMWry4SaL+tKGIaTlqKg==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-riscv64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.11.tgz\",\n \"integrity\": \"sha512-9aLIalZ2HFHIOZpmVU11sEAS9F8TnHw49daEjcgMpBXHFF57VuT9f9/9LKJhw781Gda0P9jDkuCWJ0tFbErvJw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-s390x\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.11.tgz\",\n \"integrity\": \"sha512-sZHtiXXOKsLI3XGBGoYO4qKBzJlb8xNsWmvFiwFMHFzA4AXgDP1KDp7Dawe9C2pavTRBDvl+Ok4n/DHQ59oaTg==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-netbsd-64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.11.tgz\",\n \"integrity\": \"sha512-hUC9yN06K9sg7ju4Vgu9ChAPdsEgtcrcLfyNT5IKwKyfpLvKUwCMZSdF+gRD3WpyZelgTQfJ+pDx5XFbXTlB0A==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-openbsd-64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.11.tgz\",\n \"integrity\": \"sha512-0bBo9SQR4t66Wd91LGMAqmWorzO0TTzVjYiifwoFtel8luFeXuPThQnEm5ztN4g0fnvcp7AnUPPzS/Depf17wQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-sunos-64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.11.tgz\",\n \"integrity\": \"sha512-EuBdTGlsMTjEl1sQnBX2jfygy7iR6CKfvOzi+gEOfhDqbHXsmY1dcpbVtcwHAg9/2yUZSfMJHMAgf1z8M4yyyw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-windows-32\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.11.tgz\",\n \"integrity\": \"sha512-O0/Wo1Wk6dc0rZSxkvGpmTNIycEznHmkObTFz2VHBhjPsO4ZpCgfGxNkCpz4AdAIeMczpTXt/8d5vdJNKEGC+Q==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-windows-64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.11.tgz\",\n \"integrity\": \"sha512-x977Q4HhNjnHx00b4XLAnTtj5vfbdEvkxaQwC1Zh5AN8g5EX+izgZ6e5QgqJgpzyRNJqh4hkgIJF1pyy1be0mQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-windows-arm64\": {\n \"version\": \"0.15.11\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.11.tgz\",\n \"integrity\": \"sha512-VwUHFACuBahrvntdcMKZteUZ9HaYrBRODoKe4tIWxguQRvvYoYb7iu5LrcRS/FQx8KPZNaa72zuqwVtHeXsITw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"fsevents\": {\n \"version\": \"2.3.2\",\n \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz\",\n \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"function-bind\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz\",\n \"integrity\": \"sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==\",\n \"dev\": true\n },\n \"google-protobuf\": {\n \"version\": \"3.21.2\",\n \"resolved\": \"https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz\",\n \"integrity\": \"sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==\"\n },\n \"grpc-web\": {\n \"version\": \"1.4.1\",\n \"resolved\": \"https://registry.npmjs.org/grpc-web/-/grpc-web-1.4.1.tgz\",\n \"integrity\": \"sha512-rZb/vubTg58iWjytpq/aXDpDaAePuXby7kpQqOgrGkVy4FxM2LPz5vjxAcFhWf7peKvLQDhYFk8f7dvH3cZTlw==\"\n },\n \"has\": {\n \"version\": \"1.0.3\",\n \"resolved\": \"https://registry.npmjs.org/has/-/has-1.0.3.tgz\",\n \"integrity\": \"sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==\",\n \"dev\": true,\n \"requires\": {\n \"function-bind\": \"^1.1.1\"\n }\n },\n \"is-core-module\": {\n \"version\": \"2.10.0\",\n \"resolved\": \"https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz\",\n \"integrity\": \"sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==\",\n \"dev\": true,\n \"requires\": {\n \"has\": \"^1.0.3\"\n }\n },\n \"long\": {\n \"version\": \"5.2.0\",\n \"resolved\": \"https://registry.npmjs.org/long/-/long-5.2.0.tgz\",\n \"integrity\": \"sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w==\"\n },\n \"nanoid\": {\n \"version\": \"3.3.4\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz\",\n \"integrity\": \"sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==\",\n \"dev\": true\n },\n \"path-parse\": {\n \"version\": \"1.0.7\",\n \"resolved\": \"https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz\",\n \"integrity\": \"sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==\",\n \"dev\": true\n },\n \"picocolors\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz\",\n \"integrity\": \"sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==\",\n \"dev\": true\n },\n \"postcss\": {\n \"version\": \"8.4.18\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz\",\n \"integrity\": \"sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==\",\n \"dev\": true,\n \"requires\": {\n \"nanoid\": \"^3.3.4\",\n \"picocolors\": \"^1.0.0\",\n \"source-map-js\": \"^1.0.2\"\n }\n },\n \"resolve\": {\n \"version\": \"1.22.1\",\n \"resolved\": \"https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz\",\n \"integrity\": \"sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==\",\n \"dev\": true,\n \"requires\": {\n \"is-core-module\": \"^2.9.0\",\n \"path-parse\": \"^1.0.7\",\n \"supports-preserve-symlinks-flag\": \"^1.0.0\"\n }\n },\n \"rollup\": {\n \"version\": \"2.79.1\",\n \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz\",\n \"integrity\": \"sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==\",\n \"dev\": true,\n \"requires\": {\n \"fsevents\": \"~2.3.2\"\n }\n },\n \"source-map-js\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz\",\n \"integrity\": \"sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==\",\n \"dev\": true\n },\n \"style-mod\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz\",\n \"integrity\": \"sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==\"\n },\n \"supports-preserve-symlinks-flag\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz\",\n \"integrity\": \"sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==\",\n \"dev\": true\n },\n \"typescript\": {\n \"version\": \"4.8.4\",\n \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz\",\n \"integrity\": \"sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==\",\n \"dev\": true\n },\n \"vite\": {\n \"version\": \"3.2.7\",\n \"resolved\": \"https://registry.npmjs.org/vite/-/vite-3.2.7.tgz\",\n \"integrity\": \"sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==\",\n \"dev\": true,\n \"requires\": {\n \"esbuild\": \"^0.15.9\",\n \"fsevents\": \"~2.3.2\",\n \"postcss\": \"^8.4.18\",\n \"resolve\": \"^1.22.1\",\n \"rollup\": \"^2.79.1\"\n }\n },\n \"w3c-keyname\": {\n \"version\": \"2.2.6\",\n \"resolved\": \"https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz\",\n \"integrity\": \"sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==\"\n },\n \"yorkie-js-sdk\": {\n \"version\": \"0.3.5\",\n \"resolved\": \"https://registry.npmjs.org/yorkie-js-sdk/-/yorkie-js-sdk-0.3.5.tgz\",\n \"integrity\": \"sha512-CZdc5yUhmJUQWpulDOeDwlW9Uh5WgDBLuCyhXV8+Crb3Kr14PCmrJJ9lI3rVSReosQtq8RjPYnwMd7KbtYALyw==\",\n \"requires\": {\n \"@types/google-protobuf\": \"^3.15.5\",\n \"@types/long\": \"^4.0.1\",\n \"google-protobuf\": \"^3.19.4\",\n \"grpc-web\": \"^1.3.1\",\n \"long\": \"^5.2.0\"\n }\n }\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package.json","path":"/package.json","content":"{\n \"name\": \"vanilla-codemirror6\",\n \"private\": true,\n \"version\": \"0.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"tsc && vite build\",\n \"preview\": \"vite preview\"\n },\n \"devDependencies\": {\n \"typescript\": \"^4.6.4\",\n \"vite\": \"^3.2.7\"\n },\n \"dependencies\": {\n \"@codemirror/commands\": \"^6.1.2\",\n \"@codemirror/highlight\": \"^0.19.8\",\n \"@codemirror/lang-markdown\": \"^6.0.2\",\n \"@codemirror/language-data\": \"^6.1.0\",\n \"@codemirror/state\": \"^6.1.2\",\n \"@codemirror/view\": \"^6.3.1\",\n \"codemirror\": \"^6.0.1\",\n \"yorkie-js-sdk\": \"^0.4.2\"\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"jpg","name":"thumbnail.jpg","path":"/thumbnail.jpg","content":""},{"isFile":true,"isOpen":false,"language":"json","name":"tsconfig.json","path":"/tsconfig.json","content":"{\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"useDefineForClassFields\": true,\n \"module\": \"ESNext\",\n \"lib\": [\"ESNext\", \"DOM\"],\n \"moduleResolution\": \"Node\",\n \"strict\": true,\n \"sourceMap\": true,\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"esModuleInterop\": true,\n \"noEmit\": true,\n \"noUnusedLocals\": true,\n \"noUnusedParameters\": true,\n \"noImplicitReturns\": true,\n \"skipLibCheck\": true\n },\n \"include\": [\"src\"]\n}\n"},{"isFile":true,"isOpen":false,"language":"javascript","name":"vite.config.js","path":"/vite.config.js","content":"import { defineConfig } from 'vite';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n base: '',\n})\n"}]} \ No newline at end of file + export const FILE_INFO: DirectoryInfo = {"isFile":false,"name":"vanilla-codemirror6","path":"/","children":[{"isFile":false,"name":"src","path":"/src","children":[{"isFile":true,"isOpen":false,"language":"typescript","name":"main.ts","path":"/src/main.ts","content":"/* eslint-disable jsdoc/require-jsdoc */\nimport yorkie, { DocEventType, OperationInfo } from 'yorkie-js-sdk';\nimport { basicSetup, EditorView } from 'codemirror';\nimport { keymap } from '@codemirror/view';\nimport {\n markdown,\n markdownKeymap,\n markdownLanguage,\n} from '@codemirror/lang-markdown';\nimport { Transaction } from '@codemirror/state';\nimport { network } from './network';\nimport { displayLog, displayPeers } from './utils';\nimport { YorkieDoc } from './type';\nimport './style.css';\n\nconst editorParentElem = document.getElementById('editor')!;\nconst peersElem = document.getElementById('peers')!;\nconst documentElem = document.getElementById('document')!;\nconst documentTextElem = document.getElementById('document-text')!;\nconst networkStatusElem = document.getElementById('network-status')!;\n\nasync function main() {\n // 01. create client with RPCAddr(envoy) then activate it.\n const client = new yorkie.Client(import.meta.env.VITE_YORKIE_API_ADDR, {\n apiKey: import.meta.env.VITE_YORKIE_API_KEY,\n });\n await client.activate();\n\n // subscribe peer change event\n client.subscribe((event) => {\n network.statusListener(networkStatusElem)(event);\n });\n\n // 02-1. create a document then attach it into the client.\n const doc = new yorkie.Document(\n `codemirror6-${new Date()\n .toISOString()\n .substring(0, 10)\n .replace(/-/g, '')}`,\n );\n doc.subscribe('presence', (event) => {\n if (event.type !== DocEventType.PresenceChanged) {\n displayPeers(peersElem, doc.getPresences(), client.getID()!);\n }\n });\n await client.attach(doc);\n doc.update((root) => {\n if (!root.content) {\n root.content = new yorkie.Text();\n }\n }, 'create content if not exists');\n\n // 02-2. subscribe document event.\n const syncText = () => {\n const text = doc.getRoot().content;\n view.dispatch({\n changes: { from: 0, to: view.state.doc.length, insert: text.toString() },\n annotations: [Transaction.remote.of(true)],\n });\n };\n doc.subscribe((event) => {\n if (event.type === 'snapshot') {\n // The text is replaced to snapshot and must be re-synced.\n syncText();\n }\n displayLog(documentElem, documentTextElem, doc);\n });\n\n doc.subscribe('$.content', (event) => {\n if (event.type === 'remote-change') {\n const { operations } = event.value;\n handleOperations(operations);\n }\n });\n\n await client.sync();\n\n // 03-1. define function that bind the document with the codemirror(broadcast local changes to peers)\n const updateListener = EditorView.updateListener.of((viewUpdate) => {\n if (viewUpdate.docChanged) {\n for (const tr of viewUpdate.transactions) {\n const events = ['select', 'input', 'delete', 'move', 'undo', 'redo'];\n if (!events.map((event) => tr.isUserEvent(event)).some(Boolean)) {\n continue;\n }\n if (tr.annotation(Transaction.remote)) {\n continue;\n }\n tr.changes.iterChanges((fromA, toA, _, __, inserted) => {\n doc.update((root) => {\n root.content.edit(fromA, toA, inserted.toJSON().join('\\n'));\n }, `update content byA ${client.getID()}`);\n });\n }\n }\n });\n\n // 03-2. create codemirror instance\n const view = new EditorView({\n doc: '',\n extensions: [\n basicSetup,\n markdown({ base: markdownLanguage }),\n keymap.of(markdownKeymap),\n updateListener,\n ],\n parent: editorParentElem,\n });\n\n // 03-3. define event handler that apply remote changes to local\n function handleOperations(operations: Array) {\n operations.forEach((op) => {\n if (op.type === 'edit') {\n handleEditOp(op);\n }\n });\n }\n function handleEditOp(op: any) {\n const changes = [\n {\n from: Math.max(0, op.from),\n to: Math.max(0, op.to),\n insert: op.value!.content,\n },\n ];\n\n view.dispatch({\n changes,\n annotations: [Transaction.remote.of(true)],\n });\n }\n\n syncText();\n displayLog(documentElem, documentTextElem, doc);\n}\n\nmain();\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"network.ts","path":"/src/network.ts","content":"import {\n ClientEvent,\n ClientEventType,\n ClientStatus,\n StreamConnectionStatus,\n DocumentSyncResultType,\n} from 'yorkie-js-sdk';\nexport const network = {\n isOnline: false,\n showOffline: (elem: HTMLElement) => {\n network.isOnline = false;\n elem.innerHTML = ' ';\n },\n showOnline: (elem: HTMLElement) => {\n network.isOnline = true;\n elem.innerHTML = ' ';\n },\n statusListener: (elem: HTMLElement) => {\n return (event: ClientEvent) => {\n if (\n network.isOnline &&\n ((event.type == ClientEventType.StatusChanged &&\n event.value == ClientStatus.Deactivated) ||\n (event.type == ClientEventType.StreamConnectionStatusChanged &&\n event.value == StreamConnectionStatus.Disconnected) ||\n (event.type == ClientEventType.DocumentSynced &&\n event.value == DocumentSyncResultType.SyncFailed))\n ) {\n network.showOffline(elem);\n } else if (\n !network.isOnline &&\n ((event.type == ClientEventType.StatusChanged &&\n event.value == ClientStatus.Activated) ||\n (event.type == ClientEventType.StreamConnectionStatusChanged &&\n event.value == StreamConnectionStatus.Connected) ||\n (event.type == ClientEventType.DocumentSynced &&\n event.value == DocumentSyncResultType.Synced) ||\n event.type == ClientEventType.DocumentChanged)\n ) {\n network.showOnline(elem);\n }\n };\n },\n};\n"},{"isFile":true,"isOpen":false,"language":"css","name":"style.css","path":"/src/style.css","content":"body {\n background: white;\n}\n\n.green {\n background-color: green;\n}\n.red {\n background-color: red;\n}\n\n#network-status span {\n display: inline-block;\n height: 0.8rem;\n width: 0.8rem;\n border-radius: 0.4rem;\n}\n\n#network-status:before {\n content: 'network: ';\n font-size: 1rem;\n}\n\n#peers:before {\n display: block;\n content: 'peers: ';\n font-size: 1rem;\n}\n\n#document:before {\n display: block;\n content: 'document: ';\n font-size: 1rem;\n}\n\n#document-text:before {\n display: block;\n content: 'text: ';\n font-size: 1rem;\n}\n\n#network-status,\n#peers,\n#document,\n#document-text {\n margin-top: 1rem;\n margin-bottom: 1rem;\n\n font-family: monospace;\n}\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"type.ts","path":"/src/type.ts","content":"import { type Text } from 'yorkie-js-sdk';\n\nexport type YorkieDoc = {\n content: Text;\n};\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"utils.ts","path":"/src/utils.ts","content":"/* eslint-disable jsdoc/require-jsdoc */\nimport { Document, Indexable } from 'yorkie-js-sdk';\nimport { YorkieDoc } from './type';\n\n// function to display peers\nexport function displayPeers(\n elem: HTMLElement,\n peers: Array<{ clientID: string; presence: Indexable }>,\n myClientID: string,\n) {\n const usernames = [];\n for (const { clientID } of peers) {\n usernames.push(myClientID === clientID ? `${clientID}` : clientID);\n }\n elem.innerHTML = JSON.stringify(usernames);\n}\n\n// function to display document content\nexport function displayLog(\n elem: HTMLElement,\n textElem: HTMLElement,\n doc: Document,\n) {\n elem.innerText = doc.toJSON();\n textElem.innerText = doc.getRoot().content.toTestString();\n}\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"vite-env.d.ts","path":"/src/vite-env.d.ts","content":"/// \n"}]},{"isFile":true,"isOpen":false,"language":"","name":".env","path":"/.env","content":"VITE_YORKIE_API_ADDR='http://localhost:8080'\nVITE_YORKIE_API_KEY=''\n"},{"isFile":true,"isOpen":false,"language":"production","name":".env.production","path":"/.env.production","content":"VITE_YORKIE_API_ADDR='https://api.yorkie.dev'\nVITE_YORKIE_API_KEY='cedaovjuioqlk4pjqn6g'\n"},{"isFile":true,"isOpen":false,"language":"","name":".gitignore","path":"/.gitignore","content":"# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"},{"isFile":true,"isOpen":false,"language":"markdown","name":"README.md","path":"/README.md","content":"# Yorkie CodeMirror6 Example\n\n

\n \n \"Live\n \n

\n\n\"CodeMirror6\"\n\n## How to run demo\n\nAt project root, run below command to start Yorkie and Envoy proxy.\n\n```bash\n$ docker-compose -f docker/docker-compose.yml up --build -d\n```\n\nInstall dependencies\n\n```bash\n$ npm install\n```\n\nStart demo project\n\n```bash\n$ npm run dev\n```\n"},{"isFile":true,"isOpen":false,"language":"markup","name":"index.html","path":"/index.html","content":"\n\n \n \n \n Yorkie + CodeMirror 6 Example\n \n \n
\n
\n
\n
\n
\n \n \n\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package.json","path":"/package.json","content":"{\n \"name\": \"vanilla-codemirror6\",\n \"private\": true,\n \"version\": \"0.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"tsc && vite build\",\n \"preview\": \"vite preview\"\n },\n \"devDependencies\": {\n \"typescript\": \"^4.6.4\",\n \"vite\": \"^3.2.7\"\n },\n \"dependencies\": {\n \"@codemirror/commands\": \"^6.1.2\",\n \"@codemirror/highlight\": \"^0.19.8\",\n \"@codemirror/lang-markdown\": \"^6.0.2\",\n \"@codemirror/language-data\": \"^6.1.0\",\n \"@codemirror/state\": \"^6.1.2\",\n \"@codemirror/view\": \"^6.3.1\",\n \"codemirror\": \"^6.0.1\",\n \"yorkie-js-sdk\": \"^0.4.7\"\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"jpg","name":"thumbnail.jpg","path":"/thumbnail.jpg","content":""},{"isFile":true,"isOpen":false,"language":"json","name":"tsconfig.json","path":"/tsconfig.json","content":"{\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"useDefineForClassFields\": true,\n \"module\": \"ESNext\",\n \"lib\": [\"ESNext\", \"DOM\"],\n \"moduleResolution\": \"Node\",\n \"strict\": true,\n \"sourceMap\": true,\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"esModuleInterop\": true,\n \"noEmit\": true,\n \"noUnusedLocals\": true,\n \"noUnusedParameters\": true,\n \"noImplicitReturns\": true,\n \"skipLibCheck\": true\n },\n \"include\": [\"src\"]\n}\n"},{"isFile":true,"isOpen":false,"language":"javascript","name":"vite.config.js","path":"/vite.config.js","content":"import { defineConfig } from 'vite';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n base: '',\n})\n"}]} \ No newline at end of file diff --git a/examples/vanilla-quill/fileInfo.ts b/examples/vanilla-quill/fileInfo.ts index 5e14a65..b4a2c12 100644 --- a/examples/vanilla-quill/fileInfo.ts +++ b/examples/vanilla-quill/fileInfo.ts @@ -1,2 +1,2 @@ import { DirectoryInfo } from '@/utils/exampleFileUtils'; - export const FILE_INFO: DirectoryInfo = {"isFile":false,"name":"vanilla-quill","path":"/","children":[{"isFile":false,"name":"src","path":"/src","children":[{"isFile":true,"isOpen":false,"language":"typescript","name":"main.ts","path":"/src/main.ts","content":"/* eslint-disable jsdoc/require-jsdoc */\nimport yorkie, { Text, Indexable, OperationInfo } from 'yorkie-js-sdk';\nimport Quill, { type DeltaOperation, type DeltaStatic } from 'quill';\nimport QuillCursors from 'quill-cursors';\nimport ShortUniqueId from 'short-unique-id';\nimport ColorHash from 'color-hash';\nimport { network } from './network';\nimport { displayLog, displayPeers } from './utils';\nimport 'quill/dist/quill.snow.css';\nimport './style.css';\n\ntype YorkieDoc = {\n content: Text;\n};\n\ntype TextValueType = {\n attributes?: Indexable;\n content?: string;\n};\n\nconst peersElem = document.getElementById('peers')!;\nconst documentElem = document.getElementById('document')!;\nconst documentTextElem = document.getElementById('document-text')!;\nconst networkStatusElem = document.getElementById('network-status')!;\nconst shortUniqueID = new ShortUniqueId();\nconst colorHash = new ColorHash();\nconst documentKey = `vanilla-quill-${new Date()\n .toISOString()\n .substring(0, 10)\n .replace(/-/g, '')}`;\n\nfunction toDeltaOperation(\n textValue: T,\n): DeltaOperation {\n const { embed, ...restAttributes } = textValue.attributes ?? {};\n if (embed) {\n return { insert: JSON.parse(embed), attributes: restAttributes };\n }\n\n return {\n insert: textValue.content || '',\n attributes: textValue.attributes,\n };\n}\n\nasync function main() {\n // 01-1. create client with RPCAddr(envoy) then activate it.\n const client = new yorkie.Client(import.meta.env.VITE_YORKIE_API_ADDR, {\n apiKey: import.meta.env.VITE_YORKIE_API_KEY,\n presence: {\n username: `username-${shortUniqueID()}`,\n },\n });\n await client.activate();\n\n // 01-2. subscribe client event.\n client.subscribe((event) => {\n network.statusListener(networkStatusElem)(event);\n if (event.type !== 'peers-changed') return;\n\n const { type, peers } = event.value;\n if (type === 'unwatched') {\n peers[doc.getKey()].map((peer) => {\n cursors.removeCursor(peer.presence.username);\n });\n }\n displayPeers(\n peersElem,\n client.getPeersByDocKey(doc.getKey()),\n client.getID()!,\n );\n });\n\n // 02-1. create a document then attach it into the client.\n const doc = new yorkie.Document(documentKey);\n await client.attach(doc);\n\n doc.update((root) => {\n if (!root.content) {\n root.content = new yorkie.Text();\n root.content.edit(0, 0, '\\n');\n }\n }, 'create content if not exists');\n\n // 02-2. subscribe document event.\n doc.subscribe((event) => {\n if (event.type === 'snapshot') {\n // The text is replaced to snapshot and must be re-synced.\n syncText();\n }\n displayLog(documentElem, documentTextElem, doc);\n });\n\n doc.subscribe('$.content', (event) => {\n if (event.type === 'remote-change') {\n const { actor, operations } = event.value;\n handleOperations(operations, actor);\n }\n });\n\n await client.sync();\n\n // 03. create an instance of Quill\n Quill.register('modules/cursors', QuillCursors);\n const quill = new Quill('#editor', {\n modules: {\n toolbar: [\n ['bold', 'italic', 'underline', 'strike'],\n ['blockquote', 'code-block'],\n [{ header: 1 }, { header: 2 }],\n [{ list: 'ordered' }, { list: 'bullet' }],\n [{ script: 'sub' }, { script: 'super' }],\n [{ indent: '-1' }, { indent: '+1' }],\n [{ direction: 'rtl' }],\n [{ size: ['small', false, 'large', 'huge'] }],\n [{ header: [1, 2, 3, 4, 5, 6, false] }],\n [{ color: [] }, { background: [] }],\n [{ font: [] }],\n [{ align: [] }],\n ['image', 'video'],\n ['clean'],\n ],\n cursors: true,\n },\n theme: 'snow',\n });\n const cursors = quill.getModule('cursors');\n\n // 04. bind the document with the Quill.\n // 04-1. Quill to Document.\n quill\n .on('text-change', (delta, _, source) => {\n if (source === 'api' || !delta.ops) {\n return;\n }\n\n let from = 0,\n to = 0;\n console.log(`%c quill: ${JSON.stringify(delta.ops)}`, 'color: green');\n for (const op of delta.ops) {\n if (op.attributes !== undefined || op.insert !== undefined) {\n if (op.retain !== undefined) {\n to = from + op.retain;\n }\n console.log(\n `%c local: ${from}-${to}: ${op.insert} ${\n op.attributes ? JSON.stringify(op.attributes) : '{}'\n }`,\n 'color: green',\n );\n\n doc.update((root) => {\n if (op.attributes !== undefined && op.insert === undefined) {\n root.content.setStyle(from, to, op.attributes);\n } else if (op.insert !== undefined) {\n if (to < from) {\n to = from;\n }\n\n if (typeof op.insert === 'object') {\n root.content.edit(from, to, ' ', {\n embed: JSON.stringify(op.insert),\n ...op.attributes,\n });\n } else {\n root.content.edit(from, to, op.insert, op.attributes);\n }\n from = to + op.insert.length;\n }\n }, `update style by ${client.getID()}`);\n } else if (op.delete !== undefined) {\n to = from + op.delete;\n console.log(`%c local: ${from}-${to}: ''`, 'color: green');\n\n doc.update((root) => {\n root.content.edit(from, to, '');\n }, `update content by ${client.getID()}`);\n } else if (op.retain !== undefined) {\n from = to + op.retain;\n to = from;\n }\n }\n })\n .on('selection-change', (range, _, source) => {\n if (source === 'api' || !range) {\n return;\n }\n\n doc.update((root) => {\n root.content.select(range.index, range.index + range.length);\n }, `update selection by ${client.getID()}`);\n });\n\n // 04-2. document to Quill(remote).\n function handleOperations(\n ops: Array,\n actor: string | undefined,\n ) {\n const deltaOperations = [];\n let prevTo = 0;\n for (const op of ops) {\n const actorName = client.getPeerPresence(\n doc.getKey(),\n `${actor}`,\n )?.username;\n\n if (op.type === 'edit') {\n const from = op.from;\n const to = op.to;\n const retainFrom = from - prevTo;\n const retainTo = to - from;\n\n const { insert, attributes } = toDeltaOperation(op.value!);\n console.log(`%c remote: ${from}-${to}: ${insert}`, 'color: skyblue');\n\n if (retainFrom) {\n deltaOperations.push({ retain: retainFrom });\n }\n if (retainTo) {\n deltaOperations.push({ delete: retainTo });\n }\n if (insert) {\n const op: DeltaOperation = { insert };\n if (attributes) {\n op.attributes = attributes;\n }\n deltaOperations.push(op);\n }\n prevTo = to;\n } else if (op.type === 'style') {\n const from = op.from;\n const to = op.to;\n const retainFrom = from - prevTo;\n const retainTo = to - from;\n const { attributes } = toDeltaOperation(op.value!);\n console.log(\n `%c remote: ${from}-${to}: ${JSON.stringify(attributes)}`,\n 'color: skyblue',\n );\n\n if (retainFrom) {\n deltaOperations.push({ retain: retainFrom });\n }\n if (attributes) {\n const op: DeltaOperation = { attributes };\n if (retainTo) {\n op.retain = retainTo;\n }\n\n deltaOperations.push(op);\n }\n prevTo = to;\n } else if (actorName && op.type === 'select') {\n const from = op.from;\n const to = op.to;\n const retainTo = to - from;\n cursors.createCursor(actorName, actorName, colorHash.hex(actorName));\n cursors.moveCursor(actorName, {\n index: from,\n length: retainTo,\n });\n\n prevTo = to;\n }\n }\n\n if (deltaOperations.length) {\n console.log(\n `%c to quill: ${JSON.stringify(deltaOperations)}`,\n 'color: green',\n );\n const delta = {\n ops: deltaOperations,\n } as DeltaStatic;\n quill.updateContents(delta, 'api');\n }\n }\n\n // 05. synchronize text of document and Quill.\n function syncText() {\n const text = doc.getRoot().content;\n\n const delta = {\n ops: text.values().map((val) => toDeltaOperation(val)),\n } as DeltaStatic;\n quill.setContents(delta, 'api');\n }\n\n syncText();\n displayLog(documentElem, documentTextElem, doc);\n}\n\nmain();\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"network.ts","path":"/src/network.ts","content":"import type { ClientEvent } from 'yorkie-js-sdk';\nexport const network = {\n isOnline: false,\n showOffline: (elem: HTMLElement) => {\n network.isOnline = false;\n elem.innerHTML = ' ';\n },\n showOnline: (elem: HTMLElement) => {\n network.isOnline = true;\n elem.innerHTML = ' ';\n },\n statusListener: (elem: HTMLElement) => {\n return (event: ClientEvent) => {\n if (\n network.isOnline &&\n ((event.type == 'status-changed' && event.value == 'deactivated') ||\n (event.type == 'stream-connection-status-changed' &&\n event.value == 'disconnected') ||\n (event.type == 'document-synced' && event.value == 'sync-failed'))\n ) {\n network.showOffline(elem);\n } else if (\n !network.isOnline &&\n ((event.type == 'status-changed' && event.value == 'activated') ||\n (event.type == 'stream-connection-status-changed' &&\n event.value == 'connected') ||\n (event.type == 'document-synced' && event.value == 'synced') ||\n event.type == 'peers-changed' ||\n event.type == 'documents-changed')\n ) {\n network.showOnline(elem);\n }\n };\n },\n};\n"},{"isFile":true,"isOpen":false,"language":"css","name":"style.css","path":"/src/style.css","content":"body {\n background: white;\n}\n\n.green {\n background-color: green;\n}\n.red {\n background-color: red;\n}\n\n#network-status span {\n display: inline-block;\n height: 0.8rem;\n width: 0.8rem;\n border-radius: 0.4rem;\n}\n\n#network-status:before {\n content: 'network: ';\n font-size: 1rem;\n}\n\n#peers:before {\n display: block;\n content: 'peers: ';\n font-size: 1rem;\n}\n\n#document:before {\n display: block;\n content: 'document: ';\n font-size: 1rem;\n}\n\n#document-text:before {\n display: block;\n content: 'text: ';\n font-size: 1rem;\n}\n\n#network-status,\n#peers,\n#document,\n#document-text {\n margin: 1rem 0;\n font-family: monospace;\n}\n\n.ql-editor {\n min-height: 300px;\n overflow-y: auto;\n resize: vertical;\n}\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"utils.ts","path":"/src/utils.ts","content":"/* eslint-disable jsdoc/require-jsdoc */\nimport { Document, Indexable, Text } from 'yorkie-js-sdk';\n\n// function to display peers\nexport function displayPeers(\n elem: HTMLElement,\n peers: Array<{ clientID: string; presence: Indexable }>,\n myClientID: string,\n) {\n const usernames = [];\n for (const { clientID, presence } of peers) {\n usernames.push(\n myClientID === clientID\n ? `${presence.username}`\n : presence.username,\n );\n }\n elem.innerHTML = JSON.stringify(usernames);\n}\n\n// function to display document content\nexport function displayLog(\n elem: HTMLElement,\n textElem: HTMLElement,\n doc: Document,\n) {\n elem.innerText = doc.toJSON();\n textElem.innerText = doc.getRoot().content.getStructureAsString();\n}\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"vite-env.d.ts","path":"/src/vite-env.d.ts","content":"/// \n"}]},{"isFile":true,"isOpen":false,"language":"","name":".env","path":"/.env","content":"VITE_YORKIE_API_ADDR='http://localhost:8080'\nVITE_YORKIE_API_KEY=''\n"},{"isFile":true,"isOpen":false,"language":"production","name":".env.production","path":"/.env.production","content":"VITE_YORKIE_API_ADDR='https://api.yorkie.dev'\nVITE_YORKIE_API_KEY='cedaovjuioqlk4pjqn6g'\n"},{"isFile":true,"isOpen":false,"language":"","name":".gitignore","path":"/.gitignore","content":"# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"},{"isFile":true,"isOpen":false,"language":"markdown","name":"README.md","path":"/README.md","content":"# Yorkie Quill Example\n\n

\n \n \"Live\n \n

\n\nThis demo shows the real-time collaborative version of the [Quill](https://quilljs.com/) editor with [Yorkie](https://yorkie.dev/) and [Vite](https://vitejs.dev/).\n\n## How to run demo\n\n### With Yorkie Dashboard\n\nInstall dependencies\n\n```bash\n$ npm install\n```\n\nCreate an account on [Yorkie Dashboard](https://yorkie.dev/dashboard)\nCreate a new project and copy your public key from the dashboard\nUpdate the `.env` file like so:\n\n```\nVITE_YORKIE_API_ADDR='https://api.yorkie.dev'\nVITE_YORKIE_API_KEY='your_key_xxxx'\n```\n\nStart demo project\n\n```bash\n$ npm run dev\n```\n\n### With local Yorkie server\n\nInstall dependencies\n\n```bash\n$ npm install\n```\n\nAt project root, run below command to start Yorkie and Envoy proxy.\n\n```bash\n$ docker-compose -f docker/docker-compose.yml up --build -d\n```\n\nUpdate the `.env` file like so:\n\n```\nVITE_YORKIE_API_ADDR='http://localhost:8080'\nVITE_YORKIE_API_KEY=''\n```\n\nStart demo project\n\n```bash\n$ npm run dev\n```\n"},{"isFile":true,"isOpen":false,"language":"markup","name":"index.html","path":"/index.html","content":"\n\n \n \n \n Yorkie + Quill Example\n \n \n
\n
\n
\n
\n
\n \n \n\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package-lock.json","path":"/package-lock.json","content":"{\n \"name\": \"vanilla-quill\",\n \"version\": \"0.0.0\",\n \"lockfileVersion\": 1,\n \"requires\": true,\n \"dependencies\": {\n \"@esbuild/android-arm\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz\",\n \"integrity\": \"sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"@esbuild/linux-loong64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz\",\n \"integrity\": \"sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"@types/color-hash\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/color-hash/-/color-hash-1.0.2.tgz\",\n \"integrity\": \"sha512-QJCVXSVRse+mMvzWQ8vH6AcKxtqCgHPHf5abAdGn86DEeQdUpSJnKAeCa1+hZuohaUF3l4RhigC9akRx82Bwig==\",\n \"dev\": true\n },\n \"@types/google-protobuf\": {\n \"version\": \"3.15.6\",\n \"resolved\": \"https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.6.tgz\",\n \"integrity\": \"sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==\"\n },\n \"@types/long\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz\",\n \"integrity\": \"sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==\"\n },\n \"@types/quill\": {\n \"version\": \"1.3.10\",\n \"resolved\": \"https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz\",\n \"integrity\": \"sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==\",\n \"dev\": true,\n \"requires\": {\n \"parchment\": \"^1.1.2\"\n }\n },\n \"call-bind\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz\",\n \"integrity\": \"sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==\",\n \"requires\": {\n \"function-bind\": \"^1.1.1\",\n \"get-intrinsic\": \"^1.0.2\"\n }\n },\n \"clone\": {\n \"version\": \"2.1.2\",\n \"resolved\": \"https://registry.npmjs.org/clone/-/clone-2.1.2.tgz\",\n \"integrity\": \"sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==\"\n },\n \"color-hash\": {\n \"version\": \"2.0.2\",\n \"resolved\": \"https://registry.npmjs.org/color-hash/-/color-hash-2.0.2.tgz\",\n \"integrity\": \"sha512-6exeENAqBTuIR1wIo36mR8xVVBv6l1hSLd7Qmvf6158Ld1L15/dbahR9VUOiX7GmGJBCnQyS0EY+I8x+wa7egg==\"\n },\n \"deep-equal\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz\",\n \"integrity\": \"sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==\",\n \"requires\": {\n \"is-arguments\": \"^1.0.4\",\n \"is-date-object\": \"^1.0.1\",\n \"is-regex\": \"^1.0.4\",\n \"object-is\": \"^1.0.1\",\n \"object-keys\": \"^1.1.1\",\n \"regexp.prototype.flags\": \"^1.2.0\"\n }\n },\n \"define-properties\": {\n \"version\": \"1.1.4\",\n \"resolved\": \"https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz\",\n \"integrity\": \"sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==\",\n \"requires\": {\n \"has-property-descriptors\": \"^1.0.0\",\n \"object-keys\": \"^1.1.1\"\n }\n },\n \"esbuild\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz\",\n \"integrity\": \"sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==\",\n \"dev\": true,\n \"requires\": {\n \"@esbuild/android-arm\": \"0.15.18\",\n \"@esbuild/linux-loong64\": \"0.15.18\",\n \"esbuild-android-64\": \"0.15.18\",\n \"esbuild-android-arm64\": \"0.15.18\",\n \"esbuild-darwin-64\": \"0.15.18\",\n \"esbuild-darwin-arm64\": \"0.15.18\",\n \"esbuild-freebsd-64\": \"0.15.18\",\n \"esbuild-freebsd-arm64\": \"0.15.18\",\n \"esbuild-linux-32\": \"0.15.18\",\n \"esbuild-linux-64\": \"0.15.18\",\n \"esbuild-linux-arm\": \"0.15.18\",\n \"esbuild-linux-arm64\": \"0.15.18\",\n \"esbuild-linux-mips64le\": \"0.15.18\",\n \"esbuild-linux-ppc64le\": \"0.15.18\",\n \"esbuild-linux-riscv64\": \"0.15.18\",\n \"esbuild-linux-s390x\": \"0.15.18\",\n \"esbuild-netbsd-64\": \"0.15.18\",\n \"esbuild-openbsd-64\": \"0.15.18\",\n \"esbuild-sunos-64\": \"0.15.18\",\n \"esbuild-windows-32\": \"0.15.18\",\n \"esbuild-windows-64\": \"0.15.18\",\n \"esbuild-windows-arm64\": \"0.15.18\"\n }\n },\n \"esbuild-android-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz\",\n \"integrity\": \"sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-android-arm64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz\",\n \"integrity\": \"sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-darwin-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz\",\n \"integrity\": \"sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-darwin-arm64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz\",\n \"integrity\": \"sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-freebsd-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz\",\n \"integrity\": \"sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-freebsd-arm64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz\",\n \"integrity\": \"sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-32\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz\",\n \"integrity\": \"sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz\",\n \"integrity\": \"sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-arm\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz\",\n \"integrity\": \"sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-arm64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz\",\n \"integrity\": \"sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-mips64le\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz\",\n \"integrity\": \"sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-ppc64le\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz\",\n \"integrity\": \"sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-riscv64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz\",\n \"integrity\": \"sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-s390x\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz\",\n \"integrity\": \"sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-netbsd-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz\",\n \"integrity\": \"sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-openbsd-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz\",\n \"integrity\": \"sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-sunos-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz\",\n \"integrity\": \"sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-windows-32\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz\",\n \"integrity\": \"sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-windows-64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz\",\n \"integrity\": \"sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-windows-arm64\": {\n \"version\": \"0.15.18\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz\",\n \"integrity\": \"sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"eventemitter3\": {\n \"version\": \"2.0.3\",\n \"resolved\": \"https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz\",\n \"integrity\": \"sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==\"\n },\n \"extend\": {\n \"version\": \"3.0.2\",\n \"resolved\": \"https://registry.npmjs.org/extend/-/extend-3.0.2.tgz\",\n \"integrity\": \"sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==\"\n },\n \"fast-diff\": {\n \"version\": \"1.1.2\",\n \"resolved\": \"https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz\",\n \"integrity\": \"sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==\"\n },\n \"fsevents\": {\n \"version\": \"2.3.2\",\n \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz\",\n \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"function-bind\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz\",\n \"integrity\": \"sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==\"\n },\n \"functions-have-names\": {\n \"version\": \"1.2.3\",\n \"resolved\": \"https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz\",\n \"integrity\": \"sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==\"\n },\n \"get-intrinsic\": {\n \"version\": \"1.1.3\",\n \"resolved\": \"https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz\",\n \"integrity\": \"sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==\",\n \"requires\": {\n \"function-bind\": \"^1.1.1\",\n \"has\": \"^1.0.3\",\n \"has-symbols\": \"^1.0.3\"\n }\n },\n \"google-protobuf\": {\n \"version\": \"3.21.2\",\n \"resolved\": \"https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz\",\n \"integrity\": \"sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==\"\n },\n \"grpc-web\": {\n \"version\": \"1.4.2\",\n \"resolved\": \"https://registry.npmjs.org/grpc-web/-/grpc-web-1.4.2.tgz\",\n \"integrity\": \"sha512-gUxWq42l5ldaRplcKb4Pw5O4XBONWZgz3vxIIXnfIeJj8Jc3wYiq2O4c9xzx/NGbbPEej4rhI62C9eTENwLGNw==\"\n },\n \"has\": {\n \"version\": \"1.0.3\",\n \"resolved\": \"https://registry.npmjs.org/has/-/has-1.0.3.tgz\",\n \"integrity\": \"sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==\",\n \"requires\": {\n \"function-bind\": \"^1.1.1\"\n }\n },\n \"has-property-descriptors\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz\",\n \"integrity\": \"sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==\",\n \"requires\": {\n \"get-intrinsic\": \"^1.1.1\"\n }\n },\n \"has-symbols\": {\n \"version\": \"1.0.3\",\n \"resolved\": \"https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz\",\n \"integrity\": \"sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==\"\n },\n \"has-tostringtag\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz\",\n \"integrity\": \"sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==\",\n \"requires\": {\n \"has-symbols\": \"^1.0.2\"\n }\n },\n \"is-arguments\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz\",\n \"integrity\": \"sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==\",\n \"requires\": {\n \"call-bind\": \"^1.0.2\",\n \"has-tostringtag\": \"^1.0.0\"\n }\n },\n \"is-core-module\": {\n \"version\": \"2.12.1\",\n \"resolved\": \"https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz\",\n \"integrity\": \"sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==\",\n \"dev\": true,\n \"requires\": {\n \"has\": \"^1.0.3\"\n }\n },\n \"is-date-object\": {\n \"version\": \"1.0.5\",\n \"resolved\": \"https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz\",\n \"integrity\": \"sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==\",\n \"requires\": {\n \"has-tostringtag\": \"^1.0.0\"\n }\n },\n \"is-regex\": {\n \"version\": \"1.1.4\",\n \"resolved\": \"https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz\",\n \"integrity\": \"sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==\",\n \"requires\": {\n \"call-bind\": \"^1.0.2\",\n \"has-tostringtag\": \"^1.0.0\"\n }\n },\n \"lodash.clonedeep\": {\n \"version\": \"4.5.0\",\n \"resolved\": \"https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz\",\n \"integrity\": \"sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==\"\n },\n \"lodash.isequal\": {\n \"version\": \"4.5.0\",\n \"resolved\": \"https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz\",\n \"integrity\": \"sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==\"\n },\n \"long\": {\n \"version\": \"5.2.3\",\n \"resolved\": \"https://registry.npmjs.org/long/-/long-5.2.3.tgz\",\n \"integrity\": \"sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==\"\n },\n \"nanoid\": {\n \"version\": \"3.3.6\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz\",\n \"integrity\": \"sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==\",\n \"dev\": true\n },\n \"object-is\": {\n \"version\": \"1.1.5\",\n \"resolved\": \"https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz\",\n \"integrity\": \"sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==\",\n \"requires\": {\n \"call-bind\": \"^1.0.2\",\n \"define-properties\": \"^1.1.3\"\n }\n },\n \"object-keys\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz\",\n \"integrity\": \"sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==\"\n },\n \"parchment\": {\n \"version\": \"1.1.4\",\n \"resolved\": \"https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz\",\n \"integrity\": \"sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==\"\n },\n \"path-parse\": {\n \"version\": \"1.0.7\",\n \"resolved\": \"https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz\",\n \"integrity\": \"sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==\",\n \"dev\": true\n },\n \"picocolors\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz\",\n \"integrity\": \"sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==\",\n \"dev\": true\n },\n \"postcss\": {\n \"version\": \"8.4.24\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz\",\n \"integrity\": \"sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==\",\n \"dev\": true,\n \"requires\": {\n \"nanoid\": \"^3.3.6\",\n \"picocolors\": \"^1.0.0\",\n \"source-map-js\": \"^1.0.2\"\n }\n },\n \"quill\": {\n \"version\": \"1.3.7\",\n \"resolved\": \"https://registry.npmjs.org/quill/-/quill-1.3.7.tgz\",\n \"integrity\": \"sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==\",\n \"requires\": {\n \"clone\": \"^2.1.1\",\n \"deep-equal\": \"^1.0.1\",\n \"eventemitter3\": \"^2.0.3\",\n \"extend\": \"^3.0.2\",\n \"parchment\": \"^1.1.4\",\n \"quill-delta\": \"^3.6.2\"\n },\n \"dependencies\": {\n \"quill-delta\": {\n \"version\": \"3.6.3\",\n \"resolved\": \"https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz\",\n \"integrity\": \"sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==\",\n \"requires\": {\n \"deep-equal\": \"^1.0.1\",\n \"extend\": \"^3.0.2\",\n \"fast-diff\": \"1.1.2\"\n }\n }\n }\n },\n \"quill-cursors\": {\n \"version\": \"4.0.0\",\n \"resolved\": \"https://registry.npmjs.org/quill-cursors/-/quill-cursors-4.0.0.tgz\",\n \"integrity\": \"sha512-nCwCZtQPl4EnxJSheHtb067Jo48A6mc8/t7waGSLqXvbE68a5vHBFfMOQPZI7jxjksbDhpfzQta3a3/MoPvKzQ==\"\n },\n \"quill-delta\": {\n \"version\": \"5.0.0\",\n \"resolved\": \"https://registry.npmjs.org/quill-delta/-/quill-delta-5.0.0.tgz\",\n \"integrity\": \"sha512-lVORU8dBPJdxPmwtdGhfRcz2cekn8Osuj5kwHoPMQ3MNlDT/IZ0CGUnQ/tLsAaTn31LWcDC1KyL+gkiGbBlBBw==\",\n \"requires\": {\n \"fast-diff\": \"1.2.0\",\n \"lodash.clonedeep\": \"^4.5.0\",\n \"lodash.isequal\": \"^4.5.0\"\n },\n \"dependencies\": {\n \"fast-diff\": {\n \"version\": \"1.2.0\",\n \"resolved\": \"https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz\",\n \"integrity\": \"sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==\"\n }\n }\n },\n \"regexp.prototype.flags\": {\n \"version\": \"1.4.3\",\n \"resolved\": \"https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz\",\n \"integrity\": \"sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==\",\n \"requires\": {\n \"call-bind\": \"^1.0.2\",\n \"define-properties\": \"^1.1.3\",\n \"functions-have-names\": \"^1.2.2\"\n }\n },\n \"resolve\": {\n \"version\": \"1.22.2\",\n \"resolved\": \"https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz\",\n \"integrity\": \"sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==\",\n \"dev\": true,\n \"requires\": {\n \"is-core-module\": \"^2.11.0\",\n \"path-parse\": \"^1.0.7\",\n \"supports-preserve-symlinks-flag\": \"^1.0.0\"\n }\n },\n \"rollup\": {\n \"version\": \"2.79.1\",\n \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz\",\n \"integrity\": \"sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==\",\n \"dev\": true,\n \"requires\": {\n \"fsevents\": \"~2.3.2\"\n }\n },\n \"short-unique-id\": {\n \"version\": \"4.4.4\",\n \"resolved\": \"https://registry.npmjs.org/short-unique-id/-/short-unique-id-4.4.4.tgz\",\n \"integrity\": \"sha512-oLF1NCmtbiTWl2SqdXZQbo5KM1b7axdp0RgQLq8qCBBLoq+o3A5wmLrNM6bZIh54/a8BJ3l69kTXuxwZ+XCYuw==\"\n },\n \"source-map-js\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz\",\n \"integrity\": \"sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==\",\n \"dev\": true\n },\n \"supports-preserve-symlinks-flag\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz\",\n \"integrity\": \"sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==\",\n \"dev\": true\n },\n \"typescript\": {\n \"version\": \"4.9.4\",\n \"resolved\": \"https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz\",\n \"integrity\": \"sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==\",\n \"dev\": true\n },\n \"vite\": {\n \"version\": \"3.2.7\",\n \"resolved\": \"https://registry.npmjs.org/vite/-/vite-3.2.7.tgz\",\n \"integrity\": \"sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==\",\n \"dev\": true,\n \"requires\": {\n \"esbuild\": \"^0.15.9\",\n \"fsevents\": \"~2.3.2\",\n \"postcss\": \"^8.4.18\",\n \"resolve\": \"^1.22.1\",\n \"rollup\": \"^2.79.1\"\n }\n },\n \"yorkie-js-sdk\": {\n \"version\": \"0.3.5\",\n \"resolved\": \"https://registry.npmjs.org/yorkie-js-sdk/-/yorkie-js-sdk-0.3.5.tgz\",\n \"integrity\": \"sha512-CZdc5yUhmJUQWpulDOeDwlW9Uh5WgDBLuCyhXV8+Crb3Kr14PCmrJJ9lI3rVSReosQtq8RjPYnwMd7KbtYALyw==\",\n \"requires\": {\n \"@types/google-protobuf\": \"^3.15.5\",\n \"@types/long\": \"^4.0.1\",\n \"google-protobuf\": \"^3.19.4\",\n \"grpc-web\": \"^1.3.1\",\n \"long\": \"^5.2.0\"\n }\n }\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package.json","path":"/package.json","content":"{\n \"name\": \"vanilla-quill\",\n \"private\": true,\n \"version\": \"0.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"tsc && vite build\",\n \"preview\": \"vite preview\"\n },\n \"devDependencies\": {\n \"@types/color-hash\": \"^1.0.2\",\n \"@types/quill\": \"^1.3.10\",\n \"typescript\": \"^4.6.4\",\n \"vite\": \"^3.2.7\"\n },\n \"dependencies\": {\n \"color-hash\": \"^2.0.2\",\n \"quill\": \"^1.3.7\",\n \"quill-cursors\": \"^4.0.0\",\n \"quill-delta\": \"^5.0.0\",\n \"short-unique-id\": \"^4.4.4\",\n \"yorkie-js-sdk\": \"^0.4.2\"\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"json","name":"tsconfig.json","path":"/tsconfig.json","content":"{\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"useDefineForClassFields\": true,\n \"module\": \"ESNext\",\n \"lib\": [\"ESNext\", \"DOM\"],\n \"moduleResolution\": \"Node\",\n \"strict\": true,\n \"sourceMap\": true,\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"esModuleInterop\": true,\n \"noEmit\": true,\n \"noUnusedLocals\": true,\n \"noUnusedParameters\": true,\n \"noImplicitReturns\": true,\n \"skipLibCheck\": true\n },\n \"include\": [\"src\"]\n}\n"},{"isFile":true,"isOpen":false,"language":"javascript","name":"vite.config.js","path":"/vite.config.js","content":"import { defineConfig } from 'vite';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n base: '',\n})\n"}]} \ No newline at end of file + export const FILE_INFO: DirectoryInfo = {"isFile":false,"name":"vanilla-quill","path":"/","children":[{"isFile":false,"name":"src","path":"/src","children":[{"isFile":true,"isOpen":false,"language":"typescript","name":"main.ts","path":"/src/main.ts","content":"/* eslint-disable jsdoc/require-jsdoc */\nimport yorkie, { DocEventType, Indexable, OperationInfo } from 'yorkie-js-sdk';\nimport Quill, { type DeltaOperation, type DeltaStatic } from 'quill';\nimport QuillCursors from 'quill-cursors';\nimport ShortUniqueId from 'short-unique-id';\nimport ColorHash from 'color-hash';\nimport { network } from './network';\nimport { displayLog, displayPeers } from './utils';\nimport { YorkieDoc, YorkiePresence } from './type';\nimport 'quill/dist/quill.snow.css';\nimport './style.css';\n\ntype TextValueType = {\n attributes?: Indexable;\n content?: string;\n};\n\nconst peersElem = document.getElementById('peers')!;\nconst documentElem = document.getElementById('document')!;\nconst documentTextElem = document.getElementById('document-text')!;\nconst networkStatusElem = document.getElementById('network-status')!;\nconst shortUniqueID = new ShortUniqueId();\nconst colorHash = new ColorHash();\nconst documentKey = `vanilla-quill-${new Date()\n .toISOString()\n .substring(0, 10)\n .replace(/-/g, '')}`;\n\nfunction toDeltaOperation(\n textValue: T,\n): DeltaOperation {\n const { embed, ...restAttributes } = textValue.attributes ?? {};\n if (embed) {\n return { insert: JSON.parse(embed), attributes: restAttributes };\n }\n\n return {\n insert: textValue.content || '',\n attributes: textValue.attributes,\n };\n}\n\nasync function main() {\n // 01-1. create client with RPCAddr(envoy) then activate it.\n const client = new yorkie.Client(import.meta.env.VITE_YORKIE_API_ADDR, {\n apiKey: import.meta.env.VITE_YORKIE_API_KEY,\n });\n await client.activate();\n\n // 01-2. subscribe client event.\n client.subscribe((event) => {\n network.statusListener(networkStatusElem)(event);\n });\n\n // 02-1. create a document then attach it into the client.\n const doc = new yorkie.Document(documentKey);\n doc.subscribe('presence', (event) => {\n if (event.type !== DocEventType.PresenceChanged) {\n displayPeers(peersElem, doc.getPresences(), client.getID()!);\n }\n });\n\n await client.attach(doc, {\n initialPresence: {\n username: `username-${shortUniqueID()}`,\n selection: undefined,\n },\n });\n\n doc.update((root) => {\n if (!root.content) {\n root.content = new yorkie.Text();\n root.content.edit(0, 0, '\\n');\n }\n }, 'create content if not exists');\n\n // 02-2. subscribe document event.\n doc.subscribe((event) => {\n if (event.type === 'snapshot') {\n // The text is replaced to snapshot and must be re-synced.\n syncText();\n }\n displayLog(documentElem, documentTextElem, doc);\n });\n\n doc.subscribe('$.content', (event) => {\n if (event.type === 'remote-change') {\n handleOperations(event.value.operations);\n }\n });\n doc.subscribe('others', (event) => {\n if (event.type === DocEventType.Unwatched) {\n cursors.removeCursor(event.value.presence.username);\n } else if (event.type === DocEventType.PresenceChanged) {\n displayRemoteCursors([event.value]);\n }\n });\n\n function displayRemoteCursors(\n peers: Array<{ clientID: string; presence: YorkiePresence }>,\n ) {\n for (const peer of peers) {\n const {\n presence: { username, selection },\n } = peer;\n if (!selection) continue;\n const [fromIdx, toIdx] = doc\n .getRoot()\n .content.posRangeToIndexRange(selection);\n\n cursors.createCursor(username, username, colorHash.hex(username));\n cursors.moveCursor(username, {\n index: fromIdx,\n length: toIdx - fromIdx,\n });\n }\n }\n\n await client.sync();\n\n // 03. create an instance of Quill\n Quill.register('modules/cursors', QuillCursors);\n const quill = new Quill('#editor', {\n modules: {\n toolbar: [\n ['bold', 'italic', 'underline', 'strike'],\n ['blockquote', 'code-block'],\n [{ header: 1 }, { header: 2 }],\n [{ list: 'ordered' }, { list: 'bullet' }],\n [{ script: 'sub' }, { script: 'super' }],\n [{ indent: '-1' }, { indent: '+1' }],\n [{ direction: 'rtl' }],\n [{ size: ['small', false, 'large', 'huge'] }],\n [{ header: [1, 2, 3, 4, 5, 6, false] }],\n [{ color: [] }, { background: [] }],\n [{ font: [] }],\n [{ align: [] }],\n ['image', 'video'],\n ['clean'],\n ],\n cursors: true,\n },\n theme: 'snow',\n });\n const cursors = quill.getModule('cursors');\n\n // 04. bind the document with the Quill.\n // 04-1. Quill to Document.\n quill\n .on('text-change', (delta, _, source) => {\n if (source === 'api' || !delta.ops) {\n return;\n }\n\n let from = 0,\n to = 0;\n console.log(`%c quill: ${JSON.stringify(delta.ops)}`, 'color: green');\n for (const op of delta.ops) {\n if (op.attributes !== undefined || op.insert !== undefined) {\n if (op.retain !== undefined) {\n to = from + op.retain;\n }\n console.log(\n `%c local: ${from}-${to}: ${op.insert} ${\n op.attributes ? JSON.stringify(op.attributes) : '{}'\n }`,\n 'color: green',\n );\n\n doc.update((root, presence) => {\n let range;\n if (op.attributes !== undefined && op.insert === undefined) {\n root.content.setStyle(from, to, op.attributes);\n } else if (op.insert !== undefined) {\n if (to < from) {\n to = from;\n }\n\n if (typeof op.insert === 'object') {\n range = root.content.edit(from, to, ' ', {\n embed: JSON.stringify(op.insert),\n ...op.attributes,\n });\n } else {\n range = root.content.edit(from, to, op.insert, op.attributes);\n }\n from = to + op.insert.length;\n }\n\n range &&\n presence.set({\n selection: root.content.indexRangeToPosRange(range),\n });\n }, `update style by ${client.getID()}`);\n } else if (op.delete !== undefined) {\n to = from + op.delete;\n console.log(`%c local: ${from}-${to}: ''`, 'color: green');\n\n doc.update((root, presence) => {\n const range = root.content.edit(from, to, '');\n range &&\n presence.set({\n selection: root.content.indexRangeToPosRange(range),\n });\n }, `update content by ${client.getID()}`);\n } else if (op.retain !== undefined) {\n from = to + op.retain;\n to = from;\n }\n }\n })\n .on('selection-change', (range, _, source) => {\n if (source === 'api' || !range) {\n return;\n }\n\n doc.update((root, presence) => {\n presence.set({\n selection: root.content.indexRangeToPosRange([\n range.index,\n range.index + range.length,\n ]),\n });\n }, `update selection by ${client.getID()}`);\n });\n\n // 04-2. document to Quill(remote).\n function handleOperations(ops: Array) {\n const deltaOperations = [];\n let prevTo = 0;\n for (const op of ops) {\n if (op.type === 'edit') {\n const from = op.from;\n const to = op.to;\n const retainFrom = from - prevTo;\n const retainTo = to - from;\n\n const { insert, attributes } = toDeltaOperation(op.value!);\n console.log(`%c remote: ${from}-${to}: ${insert}`, 'color: skyblue');\n\n if (retainFrom) {\n deltaOperations.push({ retain: retainFrom });\n }\n if (retainTo) {\n deltaOperations.push({ delete: retainTo });\n }\n if (insert) {\n const op: DeltaOperation = { insert };\n if (attributes) {\n op.attributes = attributes;\n }\n deltaOperations.push(op);\n }\n prevTo = to;\n } else if (op.type === 'style') {\n const from = op.from;\n const to = op.to;\n const retainFrom = from - prevTo;\n const retainTo = to - from;\n const { attributes } = toDeltaOperation(op.value!);\n console.log(\n `%c remote: ${from}-${to}: ${JSON.stringify(attributes)}`,\n 'color: skyblue',\n );\n\n if (retainFrom) {\n deltaOperations.push({ retain: retainFrom });\n }\n if (attributes) {\n const op: DeltaOperation = { attributes };\n if (retainTo) {\n op.retain = retainTo;\n }\n\n deltaOperations.push(op);\n }\n prevTo = to;\n }\n }\n\n if (deltaOperations.length) {\n console.log(\n `%c to quill: ${JSON.stringify(deltaOperations)}`,\n 'color: green',\n );\n const delta = {\n ops: deltaOperations,\n } as DeltaStatic;\n quill.updateContents(delta, 'api');\n }\n }\n\n // 05. synchronize text of document and Quill.\n function syncText() {\n const text = doc.getRoot().content;\n\n const delta = {\n ops: text.values().map((val) => toDeltaOperation(val)),\n } as DeltaStatic;\n quill.setContents(delta, 'api');\n }\n\n syncText();\n displayRemoteCursors(doc.getPresences());\n displayLog(documentElem, documentTextElem, doc);\n}\n\nmain();\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"network.ts","path":"/src/network.ts","content":"import {\n ClientEvent,\n ClientEventType,\n ClientStatus,\n StreamConnectionStatus,\n DocumentSyncResultType,\n} from 'yorkie-js-sdk';\nexport const network = {\n isOnline: false,\n showOffline: (elem: HTMLElement) => {\n network.isOnline = false;\n elem.innerHTML = ' ';\n },\n showOnline: (elem: HTMLElement) => {\n network.isOnline = true;\n elem.innerHTML = ' ';\n },\n statusListener: (elem: HTMLElement) => {\n return (event: ClientEvent) => {\n if (\n network.isOnline &&\n ((event.type == ClientEventType.StatusChanged &&\n event.value == ClientStatus.Deactivated) ||\n (event.type == ClientEventType.StreamConnectionStatusChanged &&\n event.value == StreamConnectionStatus.Disconnected) ||\n (event.type == ClientEventType.DocumentSynced &&\n event.value == DocumentSyncResultType.SyncFailed))\n ) {\n network.showOffline(elem);\n } else if (\n !network.isOnline &&\n ((event.type == ClientEventType.StatusChanged &&\n event.value == ClientStatus.Activated) ||\n (event.type == ClientEventType.StreamConnectionStatusChanged &&\n event.value == StreamConnectionStatus.Connected) ||\n (event.type == ClientEventType.DocumentSynced &&\n event.value == DocumentSyncResultType.Synced) ||\n event.type == ClientEventType.DocumentChanged)\n ) {\n network.showOnline(elem);\n }\n };\n },\n};\n"},{"isFile":true,"isOpen":false,"language":"css","name":"style.css","path":"/src/style.css","content":"body {\n background: white;\n}\n\n.green {\n background-color: green;\n}\n.red {\n background-color: red;\n}\n\n#network-status span {\n display: inline-block;\n height: 0.8rem;\n width: 0.8rem;\n border-radius: 0.4rem;\n}\n\n#network-status:before {\n content: 'network: ';\n font-size: 1rem;\n}\n\n#peers:before {\n display: block;\n content: 'peers: ';\n font-size: 1rem;\n}\n\n#document:before {\n display: block;\n content: 'document: ';\n font-size: 1rem;\n}\n\n#document-text:before {\n display: block;\n content: 'text: ';\n font-size: 1rem;\n}\n\n#network-status,\n#peers,\n#document,\n#document-text {\n margin: 1rem 0;\n font-family: monospace;\n}\n\n.ql-editor {\n min-height: 300px;\n overflow-y: auto;\n resize: vertical;\n}\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"type.ts","path":"/src/type.ts","content":"import { type Text, TextPosStructRange } from 'yorkie-js-sdk';\n\nexport type YorkieDoc = {\n content: Text;\n};\n\nexport type YorkiePresence = {\n username: string;\n selection: TextPosStructRange | undefined;\n};\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"utils.ts","path":"/src/utils.ts","content":"/* eslint-disable jsdoc/require-jsdoc */\nimport { Document, Indexable } from 'yorkie-js-sdk';\nimport { YorkieDoc } from './type';\n\n// function to display peers\nexport function displayPeers(\n elem: HTMLElement,\n peers: Array<{ clientID: string; presence: Indexable }>,\n myClientID: string,\n) {\n const usernames = [];\n for (const { clientID, presence } of peers) {\n usernames.push(\n myClientID === clientID\n ? `${presence.username}`\n : presence.username,\n );\n }\n elem.innerHTML = JSON.stringify(usernames);\n}\n\n// function to display document content\nexport function displayLog(\n elem: HTMLElement,\n textElem: HTMLElement,\n doc: Document,\n) {\n elem.innerText = doc.toJSON();\n textElem.innerText = doc.getRoot().content.toTestString();\n}\n"},{"isFile":true,"isOpen":false,"language":"typescript","name":"vite-env.d.ts","path":"/src/vite-env.d.ts","content":"/// \n"}]},{"isFile":true,"isOpen":false,"language":"","name":".env","path":"/.env","content":"VITE_YORKIE_API_ADDR='http://localhost:8080'\nVITE_YORKIE_API_KEY=''\n"},{"isFile":true,"isOpen":false,"language":"production","name":".env.production","path":"/.env.production","content":"VITE_YORKIE_API_ADDR='https://api.yorkie.dev'\nVITE_YORKIE_API_KEY='cedaovjuioqlk4pjqn6g'\n"},{"isFile":true,"isOpen":false,"language":"","name":".gitignore","path":"/.gitignore","content":"# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"},{"isFile":true,"isOpen":false,"language":"markdown","name":"README.md","path":"/README.md","content":"# Yorkie Quill Example\n\n

\n \n \"Live\n \n

\n\nThis demo shows the real-time collaborative version of the [Quill](https://quilljs.com/) editor with [Yorkie](https://yorkie.dev/) and [Vite](https://vitejs.dev/).\n\n## How to run demo\n\n### With Yorkie Dashboard\n\nInstall dependencies\n\n```bash\n$ npm install\n```\n\nCreate an account on [Yorkie Dashboard](https://yorkie.dev/dashboard)\nCreate a new project and copy your public key from the dashboard\nUpdate the `.env` file like so:\n\n```\nVITE_YORKIE_API_ADDR='https://api.yorkie.dev'\nVITE_YORKIE_API_KEY='your_key_xxxx'\n```\n\nStart demo project\n\n```bash\n$ npm run dev\n```\n\n### With local Yorkie server\n\nInstall dependencies\n\n```bash\n$ npm install\n```\n\nAt project root, run below command to start Yorkie and Envoy proxy.\n\n```bash\n$ docker-compose -f docker/docker-compose.yml up --build -d\n```\n\nUpdate the `.env` file like so:\n\n```\nVITE_YORKIE_API_ADDR='http://localhost:8080'\nVITE_YORKIE_API_KEY=''\n```\n\nStart demo project\n\n```bash\n$ npm run dev\n```\n"},{"isFile":true,"isOpen":false,"language":"markup","name":"index.html","path":"/index.html","content":"\n\n \n \n \n Yorkie + Quill Example\n \n \n
\n
\n
\n
\n
\n \n \n\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package.json","path":"/package.json","content":"{\n \"name\": \"vanilla-quill\",\n \"private\": true,\n \"version\": \"0.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"tsc && vite build\",\n \"preview\": \"vite preview\"\n },\n \"devDependencies\": {\n \"@types/color-hash\": \"^1.0.2\",\n \"@types/quill\": \"^1.3.10\",\n \"typescript\": \"^4.6.4\",\n \"vite\": \"^3.2.7\"\n },\n \"dependencies\": {\n \"color-hash\": \"^2.0.2\",\n \"quill\": \"^1.3.7\",\n \"quill-cursors\": \"^4.0.0\",\n \"quill-delta\": \"^5.0.0\",\n \"short-unique-id\": \"^4.4.4\",\n \"yorkie-js-sdk\": \"^0.4.7\"\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"json","name":"tsconfig.json","path":"/tsconfig.json","content":"{\n \"compilerOptions\": {\n \"target\": \"ESNext\",\n \"useDefineForClassFields\": true,\n \"module\": \"ESNext\",\n \"lib\": [\"ESNext\", \"DOM\"],\n \"moduleResolution\": \"Node\",\n \"strict\": true,\n \"sourceMap\": true,\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"esModuleInterop\": true,\n \"noEmit\": true,\n \"noUnusedLocals\": true,\n \"noUnusedParameters\": true,\n \"noImplicitReturns\": true,\n \"skipLibCheck\": true\n },\n \"include\": [\"src\"]\n}\n"},{"isFile":true,"isOpen":false,"language":"javascript","name":"vite.config.js","path":"/vite.config.js","content":"import { defineConfig } from 'vite';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n base: '',\n})\n"}]} \ No newline at end of file diff --git a/examples/vuejs-kanban/fileInfo.ts b/examples/vuejs-kanban/fileInfo.ts index 3e8f041..3ee49f7 100644 --- a/examples/vuejs-kanban/fileInfo.ts +++ b/examples/vuejs-kanban/fileInfo.ts @@ -1,2 +1,2 @@ import { DirectoryInfo } from '@/utils/exampleFileUtils'; - export const FILE_INFO: DirectoryInfo = {"isFile":false,"name":"vuejs-kanban","path":"/","children":[{"isFile":false,"name":"src","path":"/src","children":[{"isFile":false,"name":"assets","path":"/src/assets","children":[{"isFile":true,"isOpen":false,"language":"css","name":"main.css","path":"/src/assets/main.css","content":"body {\n margin: 0;\n padding: 0;\n background: #807b77;\n}\n\n.kanban {\n margin: 20px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: flex-start;\n user-select: none;\n}\n\n.kanban .add-list {\n padding: 10px;\n color: #fff;\n cursor: pointer;\n background: #ffffff3d;\n margin-right: 10px;\n width: 260px;\n border-radius: 3px;\n flex-shrink: 0;\n}\n\n.kanban .add-list:hover {\n background: #ffffff52;\n}\n\n.kaban .add-list-opener::before {\n content: '+ ';\n}\n\n.delete {\n position: absolute;\n cursor: pointer;\n top: 2px;\n right: 2px;\n display: none;\n}\n\n.add-form {\n display: flex;\n flex-direction: column;\n}\n\n.add-form input[type='text'] {\n border: none;\n overflow: auto;\n outline: none;\n\n font-size: 1em;\n\n margin: 5px 0;\n padding: 5px;\n background: #fff;\n border-radius: 3px;\n box-shadow: 0 1px 0 rgba(9, 30, 66, 0.25);\n position: relative;\n word-break: break-word;\n}\n\n.add-form input[type='button'] {\n font-size: 1em;\n padding: 5px;\n}\n\n.add-form input[type='button'].pull-right {\n float: right;\n}\n\n.list {\n background: #ebecf0;\n margin-right: 10px;\n border-radius: 3px;\n padding: 10px;\n width: 260px;\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n position: relative;\n}\n\n.list:hover > .delete {\n display: inherit;\n}\n\n.list .title {\n font-weight: bold;\n padding: 3px;\n}\n\n.list .card {\n margin: 5px 0;\n padding: 5px;\n background: #fff;\n border-radius: 3px;\n box-shadow: 0 1px 0 rgba(9, 30, 66, 0.25);\n position: relative;\n word-break: break-word;\n font-size: 1em;\n}\n\n.list .card:hover {\n background: #091e4214;\n}\n\n.list .card:hover .delete {\n display: inherit;\n}\n\n.add-card-opener {\n margin: 5px 0;\n padding: 5px;\n color: #444;\n font-size: 0.9em;\n cursor: pointer;\n}\n\n.add-card-opener:hover {\n background: #091e4214;\n}\n\n.add-card-opener::before {\n content: '+ ';\n}\n"}]},{"isFile":true,"isOpen":false,"language":"javascript","name":"App.vue","path":"/src/App.vue","content":"\n\n\n"},{"isFile":true,"isOpen":false,"language":"javascript","name":"main.js","path":"/src/main.js","content":"import { createApp } from 'vue'\nimport App from './App.vue'\n\nimport './assets/main.css'\n\ncreateApp(App).mount('#app')\n"}]},{"isFile":true,"isOpen":false,"language":"","name":".env","path":"/.env","content":"VITE_YORKIE_API_ADDR='http://localhost:8080'\nVITE_YORKIE_API_KEY=''\n"},{"isFile":true,"isOpen":false,"language":"production","name":".env.production","path":"/.env.production","content":"VITE_YORKIE_API_ADDR='https://api.yorkie.dev'\nVITE_YORKIE_API_KEY='cedaovjuioqlk4pjqn6g'\n"},{"isFile":true,"isOpen":false,"language":"","name":".gitignore","path":"/.gitignore","content":"# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\n.DS_Store\ndist\ndist-ssr\ncoverage\n*.local\n\n/cypress/videos/\n/cypress/screenshots/\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"},{"isFile":true,"isOpen":false,"language":"markdown","name":"README.md","path":"/README.md","content":"# Yorkie Vue Kanban Example\n\n

\n \n \"Live\n \n

\n\n\"Vue\n\n## How to run demo\n\nAt project root, run below command to start Yorkie and Envoy proxy.\n\n```bash\n$ docker-compose -f docker/docker-compose.yml up --build -d\n```\n\nInstall dependencies\n\n```bash\n$ npm install\n```\n\nStart demo project\n\n```bash\n$ npm run dev\n```\n"},{"isFile":true,"isOpen":false,"language":"markup","name":"index.html","path":"/index.html","content":"\n\n\n\n \n \n \n Vite App\n\n\n\n
\n \n\n\n\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package-lock.json","path":"/package-lock.json","content":"{\n \"name\": \"vuejs-kanban\",\n \"version\": \"0.0.0\",\n \"lockfileVersion\": 2,\n \"requires\": true,\n \"packages\": {\n \"\": {\n \"name\": \"vuejs-kanban\",\n \"version\": \"0.0.0\",\n \"dependencies\": {\n \"vue\": \"^3.2.41\",\n \"yorkie-js-sdk\": \"^0.3.5\"\n },\n \"devDependencies\": {\n \"@vitejs/plugin-vue\": \"^3.1.2\",\n \"vite\": \"^3.2.7\"\n }\n },\n \"node_modules/@babel/parser\": {\n \"version\": \"7.20.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/parser/-/parser-7.20.2.tgz\",\n \"integrity\": \"sha512-afk318kh2uKbo7BEj2QtEi8HVCGrwHUffrYDy7dgVcSa2j9lY3LDjPzcyGdpX7xgm35aWqvciZJ4WKmdF/SxYg==\",\n \"bin\": {\n \"parser\": \"bin/babel-parser.js\"\n },\n \"engines\": {\n \"node\": \">=6.0.0\"\n }\n },\n \"node_modules/@esbuild/android-arm\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.13.tgz\",\n \"integrity\": \"sha512-RY2fVI8O0iFUNvZirXaQ1vMvK0xhCcl0gqRj74Z6yEiO1zAUa7hbsdwZM1kzqbxHK7LFyMizipfXT3JME+12Hw==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@esbuild/linux-loong64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.13.tgz\",\n \"integrity\": \"sha512-+BoyIm4I8uJmH/QDIH0fu7MG0AEx9OXEDXnqptXCwKOlOqZiS4iraH1Nr7/ObLMokW3sOCeBNyD68ATcV9b9Ag==\",\n \"cpu\": [\n \"loong64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/@types/google-protobuf\": {\n \"version\": \"3.15.6\",\n \"resolved\": \"https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.6.tgz\",\n \"integrity\": \"sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==\"\n },\n \"node_modules/@types/long\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz\",\n \"integrity\": \"sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==\"\n },\n \"node_modules/@vitejs/plugin-vue\": {\n \"version\": \"3.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz\",\n \"integrity\": \"sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \"^14.18.0 || >=16.0.0\"\n },\n \"peerDependencies\": {\n \"vite\": \"^3.0.0\",\n \"vue\": \"^3.2.25\"\n }\n },\n \"node_modules/@vue/compiler-core\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.41.tgz\",\n \"integrity\": \"sha512-oA4mH6SA78DT+96/nsi4p9DX97PHcNROxs51lYk7gb9Z4BPKQ3Mh+BLn6CQZBw857Iuhu28BfMSRHAlPvD4vlw==\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.16.4\",\n \"@vue/shared\": \"3.2.41\",\n \"estree-walker\": \"^2.0.2\",\n \"source-map\": \"^0.6.1\"\n }\n },\n \"node_modules/@vue/compiler-dom\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.41.tgz\",\n \"integrity\": \"sha512-xe5TbbIsonjENxJsYRbDJvthzqxLNk+tb3d/c47zgREDa/PCp6/Y4gC/skM4H6PIuX5DAxm7fFJdbjjUH2QTMw==\",\n \"dependencies\": {\n \"@vue/compiler-core\": \"3.2.41\",\n \"@vue/shared\": \"3.2.41\"\n }\n },\n \"node_modules/@vue/compiler-sfc\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.41.tgz\",\n \"integrity\": \"sha512-+1P2m5kxOeaxVmJNXnBskAn3BenbTmbxBxWOtBq3mQTCokIreuMULFantBUclP0+KnzNCMOvcnKinqQZmiOF8w==\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.16.4\",\n \"@vue/compiler-core\": \"3.2.41\",\n \"@vue/compiler-dom\": \"3.2.41\",\n \"@vue/compiler-ssr\": \"3.2.41\",\n \"@vue/reactivity-transform\": \"3.2.41\",\n \"@vue/shared\": \"3.2.41\",\n \"estree-walker\": \"^2.0.2\",\n \"magic-string\": \"^0.25.7\",\n \"postcss\": \"^8.1.10\",\n \"source-map\": \"^0.6.1\"\n }\n },\n \"node_modules/@vue/compiler-ssr\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.41.tgz\",\n \"integrity\": \"sha512-Y5wPiNIiaMz/sps8+DmhaKfDm1xgj6GrH99z4gq2LQenfVQcYXmHIOBcs5qPwl7jaW3SUQWjkAPKMfQemEQZwQ==\",\n \"dependencies\": {\n \"@vue/compiler-dom\": \"3.2.41\",\n \"@vue/shared\": \"3.2.41\"\n }\n },\n \"node_modules/@vue/reactivity\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.41.tgz\",\n \"integrity\": \"sha512-9JvCnlj8uc5xRiQGZ28MKGjuCoPhhTwcoAdv3o31+cfGgonwdPNuvqAXLhlzu4zwqavFEG5tvaoINQEfxz+l6g==\",\n \"dependencies\": {\n \"@vue/shared\": \"3.2.41\"\n }\n },\n \"node_modules/@vue/reactivity-transform\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.41.tgz\",\n \"integrity\": \"sha512-mK5+BNMsL4hHi+IR3Ft/ho6Za+L3FA5j8WvreJ7XzHrqkPq8jtF/SMo7tuc9gHjLDwKZX1nP1JQOKo9IEAn54A==\",\n \"dependencies\": {\n \"@babel/parser\": \"^7.16.4\",\n \"@vue/compiler-core\": \"3.2.41\",\n \"@vue/shared\": \"3.2.41\",\n \"estree-walker\": \"^2.0.2\",\n \"magic-string\": \"^0.25.7\"\n }\n },\n \"node_modules/@vue/runtime-core\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.41.tgz\",\n \"integrity\": \"sha512-0LBBRwqnI0p4FgIkO9q2aJBBTKDSjzhnxrxHYengkAF6dMOjeAIZFDADAlcf2h3GDALWnblbeprYYpItiulSVQ==\",\n \"dependencies\": {\n \"@vue/reactivity\": \"3.2.41\",\n \"@vue/shared\": \"3.2.41\"\n }\n },\n \"node_modules/@vue/runtime-dom\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.41.tgz\",\n \"integrity\": \"sha512-U7zYuR1NVIP8BL6jmOqmapRAHovEFp7CSw4pR2FacqewXNGqZaRfHoNLQsqQvVQ8yuZNZtxSZy0FFyC70YXPpA==\",\n \"dependencies\": {\n \"@vue/runtime-core\": \"3.2.41\",\n \"@vue/shared\": \"3.2.41\",\n \"csstype\": \"^2.6.8\"\n }\n },\n \"node_modules/@vue/server-renderer\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.41.tgz\",\n \"integrity\": \"sha512-7YHLkfJdTlsZTV0ae5sPwl9Gn/EGr2hrlbcS/8naXm2CDpnKUwC68i1wGlrYAfIgYWL7vUZwk2GkYLQH5CvFig==\",\n \"dependencies\": {\n \"@vue/compiler-ssr\": \"3.2.41\",\n \"@vue/shared\": \"3.2.41\"\n },\n \"peerDependencies\": {\n \"vue\": \"3.2.41\"\n }\n },\n \"node_modules/@vue/shared\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/@vue/shared/-/shared-3.2.41.tgz\",\n \"integrity\": \"sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw==\"\n },\n \"node_modules/csstype\": {\n \"version\": \"2.6.21\",\n \"resolved\": \"https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz\",\n \"integrity\": \"sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==\"\n },\n \"node_modules/esbuild\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.15.13.tgz\",\n \"integrity\": \"sha512-Cu3SC84oyzzhrK/YyN4iEVy2jZu5t2fz66HEOShHURcjSkOSAVL8C/gfUT+lDJxkVHpg8GZ10DD0rMHRPqMFaQ==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"bin\": {\n \"esbuild\": \"bin/esbuild\"\n },\n \"engines\": {\n \"node\": \">=12\"\n },\n \"optionalDependencies\": {\n \"@esbuild/android-arm\": \"0.15.13\",\n \"@esbuild/linux-loong64\": \"0.15.13\",\n \"esbuild-android-64\": \"0.15.13\",\n \"esbuild-android-arm64\": \"0.15.13\",\n \"esbuild-darwin-64\": \"0.15.13\",\n \"esbuild-darwin-arm64\": \"0.15.13\",\n \"esbuild-freebsd-64\": \"0.15.13\",\n \"esbuild-freebsd-arm64\": \"0.15.13\",\n \"esbuild-linux-32\": \"0.15.13\",\n \"esbuild-linux-64\": \"0.15.13\",\n \"esbuild-linux-arm\": \"0.15.13\",\n \"esbuild-linux-arm64\": \"0.15.13\",\n \"esbuild-linux-mips64le\": \"0.15.13\",\n \"esbuild-linux-ppc64le\": \"0.15.13\",\n \"esbuild-linux-riscv64\": \"0.15.13\",\n \"esbuild-linux-s390x\": \"0.15.13\",\n \"esbuild-netbsd-64\": \"0.15.13\",\n \"esbuild-openbsd-64\": \"0.15.13\",\n \"esbuild-sunos-64\": \"0.15.13\",\n \"esbuild-windows-32\": \"0.15.13\",\n \"esbuild-windows-64\": \"0.15.13\",\n \"esbuild-windows-arm64\": \"0.15.13\"\n }\n },\n \"node_modules/esbuild-android-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.13.tgz\",\n \"integrity\": \"sha512-yRorukXBlokwTip+Sy4MYskLhJsO0Kn0/Fj43s1krVblfwP+hMD37a4Wmg139GEsMLl+vh8WXp2mq/cTA9J97g==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-android-arm64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.13.tgz\",\n \"integrity\": \"sha512-TKzyymLD6PiVeyYa4c5wdPw87BeAiTXNtK6amWUcXZxkV51gOk5u5qzmDaYSwiWeecSNHamFsaFjLoi32QR5/w==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"android\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-darwin-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.13.tgz\",\n \"integrity\": \"sha512-WAx7c2DaOS6CrRcoYCgXgkXDliLnFv3pQLV6GeW1YcGEZq2Gnl8s9Pg7ahValZkpOa0iE/ojRVQ87sbUhF1Cbg==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-darwin-arm64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.13.tgz\",\n \"integrity\": \"sha512-U6jFsPfSSxC3V1CLiQqwvDuj3GGrtQNB3P3nNC3+q99EKf94UGpsG9l4CQ83zBs1NHrk1rtCSYT0+KfK5LsD8A==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-freebsd-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.13.tgz\",\n \"integrity\": \"sha512-whItJgDiOXaDG/idy75qqevIpZjnReZkMGCgQaBWZuKHoElDJC1rh7MpoUgupMcdfOd+PgdEwNQW9DAE6i8wyA==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-freebsd-arm64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.13.tgz\",\n \"integrity\": \"sha512-6pCSWt8mLUbPtygv7cufV0sZLeylaMwS5Fznj6Rsx9G2AJJsAjQ9ifA+0rQEIg7DwJmi9it+WjzNTEAzzdoM3Q==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"freebsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-32\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.13.tgz\",\n \"integrity\": \"sha512-VbZdWOEdrJiYApm2kkxoTOgsoCO1krBZ3quHdYk3g3ivWaMwNIVPIfEE0f0XQQ0u5pJtBsnk2/7OPiCFIPOe/w==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.13.tgz\",\n \"integrity\": \"sha512-rXmnArVNio6yANSqDQlIO4WiP+Cv7+9EuAHNnag7rByAqFVuRusLbGi2697A5dFPNXoO//IiogVwi3AdcfPC6A==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-arm\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.13.tgz\",\n \"integrity\": \"sha512-Ac6LpfmJO8WhCMQmO253xX2IU2B3wPDbl4IvR0hnqcPrdfCaUa2j/lLMGTjmQ4W5JsJIdHEdW12dG8lFS0MbxQ==\",\n \"cpu\": [\n \"arm\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-arm64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.13.tgz\",\n \"integrity\": \"sha512-alEMGU4Z+d17U7KQQw2IV8tQycO6T+rOrgW8OS22Ua25x6kHxoG6Ngry6Aq6uranC+pNWNMB6aHFPh7aTQdORQ==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-mips64le\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.13.tgz\",\n \"integrity\": \"sha512-47PgmyYEu+yN5rD/MbwS6DxP2FSGPo4Uxg5LwIdxTiyGC2XKwHhHyW7YYEDlSuXLQXEdTO7mYe8zQ74czP7W8A==\",\n \"cpu\": [\n \"mips64el\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-ppc64le\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.13.tgz\",\n \"integrity\": \"sha512-z6n28h2+PC1Ayle9DjKoBRcx/4cxHoOa2e689e2aDJSaKug3jXcQw7mM+GLg+9ydYoNzj8QxNL8ihOv/OnezhA==\",\n \"cpu\": [\n \"ppc64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-riscv64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.13.tgz\",\n \"integrity\": \"sha512-+Lu4zuuXuQhgLUGyZloWCqTslcCAjMZH1k3Xc9MSEJEpEFdpsSU0sRDXAnk18FKOfEjhu4YMGaykx9xjtpA6ow==\",\n \"cpu\": [\n \"riscv64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-linux-s390x\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.13.tgz\",\n \"integrity\": \"sha512-BMeXRljruf7J0TMxD5CIXS65y7puiZkAh+s4XFV9qy16SxOuMhxhVIXYLnbdfLrsYGFzx7U9mcdpFWkkvy/Uag==\",\n \"cpu\": [\n \"s390x\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"linux\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-netbsd-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.13.tgz\",\n \"integrity\": \"sha512-EHj9QZOTel581JPj7UO3xYbltFTYnHy+SIqJVq6yd3KkCrsHRbapiPb0Lx3EOOtybBEE9EyqbmfW1NlSDsSzvQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"netbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-openbsd-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.13.tgz\",\n \"integrity\": \"sha512-nkuDlIjF/sfUhfx8SKq0+U+Fgx5K9JcPq1mUodnxI0x4kBdCv46rOGWbuJ6eof2n3wdoCLccOoJAbg9ba/bT2w==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"openbsd\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-sunos-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.13.tgz\",\n \"integrity\": \"sha512-jVeu2GfxZQ++6lRdY43CS0Tm/r4WuQQ0Pdsrxbw+aOrHQPHV0+LNOLnvbN28M7BSUGnJnHkHm2HozGgNGyeIRw==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"sunos\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-windows-32\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.13.tgz\",\n \"integrity\": \"sha512-XoF2iBf0wnqo16SDq+aDGi/+QbaLFpkiRarPVssMh9KYbFNCqPLlGAWwDvxEVz+ywX6Si37J2AKm+AXq1kC0JA==\",\n \"cpu\": [\n \"ia32\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-windows-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.13.tgz\",\n \"integrity\": \"sha512-Et6htEfGycjDrtqb2ng6nT+baesZPYQIW+HUEHK4D1ncggNrDNk3yoboYQ5KtiVrw/JaDMNttz8rrPubV/fvPQ==\",\n \"cpu\": [\n \"x64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/esbuild-windows-arm64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.13.tgz\",\n \"integrity\": \"sha512-3bv7tqntThQC9SWLRouMDmZnlOukBhOCTlkzNqzGCmrkCJI7io5LLjwJBOVY6kOUlIvdxbooNZwjtBvj+7uuVg==\",\n \"cpu\": [\n \"arm64\"\n ],\n \"dev\": true,\n \"optional\": true,\n \"os\": [\n \"win32\"\n ],\n \"engines\": {\n \"node\": \">=12\"\n }\n },\n \"node_modules/estree-walker\": {\n \"version\": \"2.0.2\",\n \"resolved\": \"https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz\",\n \"integrity\": \"sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==\"\n },\n \"node_modules/fsevents\": {\n \"version\": \"2.3.2\",\n \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz\",\n \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n \"dev\": true,\n \"hasInstallScript\": true,\n \"optional\": true,\n \"os\": [\n \"darwin\"\n ],\n \"engines\": {\n \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n }\n },\n \"node_modules/function-bind\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz\",\n \"integrity\": \"sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==\",\n \"dev\": true\n },\n \"node_modules/google-protobuf\": {\n \"version\": \"3.21.2\",\n \"resolved\": \"https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz\",\n \"integrity\": \"sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==\"\n },\n \"node_modules/grpc-web\": {\n \"version\": \"1.4.2\",\n \"resolved\": \"https://registry.npmjs.org/grpc-web/-/grpc-web-1.4.2.tgz\",\n \"integrity\": \"sha512-gUxWq42l5ldaRplcKb4Pw5O4XBONWZgz3vxIIXnfIeJj8Jc3wYiq2O4c9xzx/NGbbPEej4rhI62C9eTENwLGNw==\"\n },\n \"node_modules/has\": {\n \"version\": \"1.0.3\",\n \"resolved\": \"https://registry.npmjs.org/has/-/has-1.0.3.tgz\",\n \"integrity\": \"sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==\",\n \"dev\": true,\n \"dependencies\": {\n \"function-bind\": \"^1.1.1\"\n },\n \"engines\": {\n \"node\": \">= 0.4.0\"\n }\n },\n \"node_modules/is-core-module\": {\n \"version\": \"2.11.0\",\n \"resolved\": \"https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz\",\n \"integrity\": \"sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==\",\n \"dev\": true,\n \"dependencies\": {\n \"has\": \"^1.0.3\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/long\": {\n \"version\": \"5.2.1\",\n \"resolved\": \"https://registry.npmjs.org/long/-/long-5.2.1.tgz\",\n \"integrity\": \"sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==\"\n },\n \"node_modules/magic-string\": {\n \"version\": \"0.25.9\",\n \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz\",\n \"integrity\": \"sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==\",\n \"dependencies\": {\n \"sourcemap-codec\": \"^1.4.8\"\n }\n },\n \"node_modules/nanoid\": {\n \"version\": \"3.3.4\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz\",\n \"integrity\": \"sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==\",\n \"bin\": {\n \"nanoid\": \"bin/nanoid.cjs\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || ^13.7 || ^14 || >=15.0.1\"\n }\n },\n \"node_modules/path-parse\": {\n \"version\": \"1.0.7\",\n \"resolved\": \"https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz\",\n \"integrity\": \"sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==\",\n \"dev\": true\n },\n \"node_modules/picocolors\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz\",\n \"integrity\": \"sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==\"\n },\n \"node_modules/postcss\": {\n \"version\": \"8.4.18\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz\",\n \"integrity\": \"sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==\",\n \"funding\": [\n {\n \"type\": \"opencollective\",\n \"url\": \"https://opencollective.com/postcss/\"\n },\n {\n \"type\": \"tidelift\",\n \"url\": \"https://tidelift.com/funding/github/npm/postcss\"\n }\n ],\n \"dependencies\": {\n \"nanoid\": \"^3.3.4\",\n \"picocolors\": \"^1.0.0\",\n \"source-map-js\": \"^1.0.2\"\n },\n \"engines\": {\n \"node\": \"^10 || ^12 || >=14\"\n }\n },\n \"node_modules/resolve\": {\n \"version\": \"1.22.1\",\n \"resolved\": \"https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz\",\n \"integrity\": \"sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==\",\n \"dev\": true,\n \"dependencies\": {\n \"is-core-module\": \"^2.9.0\",\n \"path-parse\": \"^1.0.7\",\n \"supports-preserve-symlinks-flag\": \"^1.0.0\"\n },\n \"bin\": {\n \"resolve\": \"bin/resolve\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/rollup\": {\n \"version\": \"2.79.1\",\n \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz\",\n \"integrity\": \"sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==\",\n \"dev\": true,\n \"bin\": {\n \"rollup\": \"dist/bin/rollup\"\n },\n \"engines\": {\n \"node\": \">=10.0.0\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.2\"\n }\n },\n \"node_modules/source-map\": {\n \"version\": \"0.6.1\",\n \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz\",\n \"integrity\": \"sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/source-map-js\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz\",\n \"integrity\": \"sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==\",\n \"engines\": {\n \"node\": \">=0.10.0\"\n }\n },\n \"node_modules/sourcemap-codec\": {\n \"version\": \"1.4.8\",\n \"resolved\": \"https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz\",\n \"integrity\": \"sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==\"\n },\n \"node_modules/supports-preserve-symlinks-flag\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz\",\n \"integrity\": \"sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==\",\n \"dev\": true,\n \"engines\": {\n \"node\": \">= 0.4\"\n },\n \"funding\": {\n \"url\": \"https://github.com/sponsors/ljharb\"\n }\n },\n \"node_modules/vite\": {\n \"version\": \"3.2.7\",\n \"resolved\": \"https://registry.npmjs.org/vite/-/vite-3.2.7.tgz\",\n \"integrity\": \"sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==\",\n \"dev\": true,\n \"dependencies\": {\n \"esbuild\": \"^0.15.9\",\n \"postcss\": \"^8.4.18\",\n \"resolve\": \"^1.22.1\",\n \"rollup\": \"^2.79.1\"\n },\n \"bin\": {\n \"vite\": \"bin/vite.js\"\n },\n \"engines\": {\n \"node\": \"^14.18.0 || >=16.0.0\"\n },\n \"optionalDependencies\": {\n \"fsevents\": \"~2.3.2\"\n },\n \"peerDependencies\": {\n \"@types/node\": \">= 14\",\n \"less\": \"*\",\n \"sass\": \"*\",\n \"stylus\": \"*\",\n \"sugarss\": \"*\",\n \"terser\": \"^5.4.0\"\n },\n \"peerDependenciesMeta\": {\n \"@types/node\": {\n \"optional\": true\n },\n \"less\": {\n \"optional\": true\n },\n \"sass\": {\n \"optional\": true\n },\n \"stylus\": {\n \"optional\": true\n },\n \"sugarss\": {\n \"optional\": true\n },\n \"terser\": {\n \"optional\": true\n }\n }\n },\n \"node_modules/vue\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/vue/-/vue-3.2.41.tgz\",\n \"integrity\": \"sha512-uuuvnrDXEeZ9VUPljgHkqB5IaVO8SxhPpqF2eWOukVrBnRBx2THPSGQBnVRt0GrIG1gvCmFXMGbd7FqcT1ixNQ==\",\n \"dependencies\": {\n \"@vue/compiler-dom\": \"3.2.41\",\n \"@vue/compiler-sfc\": \"3.2.41\",\n \"@vue/runtime-dom\": \"3.2.41\",\n \"@vue/server-renderer\": \"3.2.41\",\n \"@vue/shared\": \"3.2.41\"\n }\n },\n \"node_modules/yorkie-js-sdk\": {\n \"version\": \"0.3.5\",\n \"resolved\": \"https://registry.npmjs.org/yorkie-js-sdk/-/yorkie-js-sdk-0.3.5.tgz\",\n \"integrity\": \"sha512-CZdc5yUhmJUQWpulDOeDwlW9Uh5WgDBLuCyhXV8+Crb3Kr14PCmrJJ9lI3rVSReosQtq8RjPYnwMd7KbtYALyw==\",\n \"dependencies\": {\n \"@types/google-protobuf\": \"^3.15.5\",\n \"@types/long\": \"^4.0.1\",\n \"google-protobuf\": \"^3.19.4\",\n \"grpc-web\": \"^1.3.1\",\n \"long\": \"^5.2.0\"\n }\n }\n },\n \"dependencies\": {\n \"@babel/parser\": {\n \"version\": \"7.20.2\",\n \"resolved\": \"https://registry.npmjs.org/@babel/parser/-/parser-7.20.2.tgz\",\n \"integrity\": \"sha512-afk318kh2uKbo7BEj2QtEi8HVCGrwHUffrYDy7dgVcSa2j9lY3LDjPzcyGdpX7xgm35aWqvciZJ4WKmdF/SxYg==\"\n },\n \"@esbuild/android-arm\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.13.tgz\",\n \"integrity\": \"sha512-RY2fVI8O0iFUNvZirXaQ1vMvK0xhCcl0gqRj74Z6yEiO1zAUa7hbsdwZM1kzqbxHK7LFyMizipfXT3JME+12Hw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"@esbuild/linux-loong64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.13.tgz\",\n \"integrity\": \"sha512-+BoyIm4I8uJmH/QDIH0fu7MG0AEx9OXEDXnqptXCwKOlOqZiS4iraH1Nr7/ObLMokW3sOCeBNyD68ATcV9b9Ag==\",\n \"dev\": true,\n \"optional\": true\n },\n \"@types/google-protobuf\": {\n \"version\": \"3.15.6\",\n \"resolved\": \"https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.6.tgz\",\n \"integrity\": \"sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==\"\n },\n \"@types/long\": {\n \"version\": \"4.0.2\",\n \"resolved\": \"https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz\",\n \"integrity\": \"sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==\"\n },\n \"@vitejs/plugin-vue\": {\n \"version\": \"3.2.0\",\n \"resolved\": \"https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz\",\n \"integrity\": \"sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==\",\n \"dev\": true,\n \"requires\": {}\n },\n \"@vue/compiler-core\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.41.tgz\",\n \"integrity\": \"sha512-oA4mH6SA78DT+96/nsi4p9DX97PHcNROxs51lYk7gb9Z4BPKQ3Mh+BLn6CQZBw857Iuhu28BfMSRHAlPvD4vlw==\",\n \"requires\": {\n \"@babel/parser\": \"^7.16.4\",\n \"@vue/shared\": \"3.2.41\",\n \"estree-walker\": \"^2.0.2\",\n \"source-map\": \"^0.6.1\"\n }\n },\n \"@vue/compiler-dom\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.41.tgz\",\n \"integrity\": \"sha512-xe5TbbIsonjENxJsYRbDJvthzqxLNk+tb3d/c47zgREDa/PCp6/Y4gC/skM4H6PIuX5DAxm7fFJdbjjUH2QTMw==\",\n \"requires\": {\n \"@vue/compiler-core\": \"3.2.41\",\n \"@vue/shared\": \"3.2.41\"\n }\n },\n \"@vue/compiler-sfc\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.41.tgz\",\n \"integrity\": \"sha512-+1P2m5kxOeaxVmJNXnBskAn3BenbTmbxBxWOtBq3mQTCokIreuMULFantBUclP0+KnzNCMOvcnKinqQZmiOF8w==\",\n \"requires\": {\n \"@babel/parser\": \"^7.16.4\",\n \"@vue/compiler-core\": \"3.2.41\",\n \"@vue/compiler-dom\": \"3.2.41\",\n \"@vue/compiler-ssr\": \"3.2.41\",\n \"@vue/reactivity-transform\": \"3.2.41\",\n \"@vue/shared\": \"3.2.41\",\n \"estree-walker\": \"^2.0.2\",\n \"magic-string\": \"^0.25.7\",\n \"postcss\": \"^8.1.10\",\n \"source-map\": \"^0.6.1\"\n }\n },\n \"@vue/compiler-ssr\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.41.tgz\",\n \"integrity\": \"sha512-Y5wPiNIiaMz/sps8+DmhaKfDm1xgj6GrH99z4gq2LQenfVQcYXmHIOBcs5qPwl7jaW3SUQWjkAPKMfQemEQZwQ==\",\n \"requires\": {\n \"@vue/compiler-dom\": \"3.2.41\",\n \"@vue/shared\": \"3.2.41\"\n }\n },\n \"@vue/reactivity\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.41.tgz\",\n \"integrity\": \"sha512-9JvCnlj8uc5xRiQGZ28MKGjuCoPhhTwcoAdv3o31+cfGgonwdPNuvqAXLhlzu4zwqavFEG5tvaoINQEfxz+l6g==\",\n \"requires\": {\n \"@vue/shared\": \"3.2.41\"\n }\n },\n \"@vue/reactivity-transform\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.41.tgz\",\n \"integrity\": \"sha512-mK5+BNMsL4hHi+IR3Ft/ho6Za+L3FA5j8WvreJ7XzHrqkPq8jtF/SMo7tuc9gHjLDwKZX1nP1JQOKo9IEAn54A==\",\n \"requires\": {\n \"@babel/parser\": \"^7.16.4\",\n \"@vue/compiler-core\": \"3.2.41\",\n \"@vue/shared\": \"3.2.41\",\n \"estree-walker\": \"^2.0.2\",\n \"magic-string\": \"^0.25.7\"\n }\n },\n \"@vue/runtime-core\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.41.tgz\",\n \"integrity\": \"sha512-0LBBRwqnI0p4FgIkO9q2aJBBTKDSjzhnxrxHYengkAF6dMOjeAIZFDADAlcf2h3GDALWnblbeprYYpItiulSVQ==\",\n \"requires\": {\n \"@vue/reactivity\": \"3.2.41\",\n \"@vue/shared\": \"3.2.41\"\n }\n },\n \"@vue/runtime-dom\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.41.tgz\",\n \"integrity\": \"sha512-U7zYuR1NVIP8BL6jmOqmapRAHovEFp7CSw4pR2FacqewXNGqZaRfHoNLQsqQvVQ8yuZNZtxSZy0FFyC70YXPpA==\",\n \"requires\": {\n \"@vue/runtime-core\": \"3.2.41\",\n \"@vue/shared\": \"3.2.41\",\n \"csstype\": \"^2.6.8\"\n }\n },\n \"@vue/server-renderer\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.41.tgz\",\n \"integrity\": \"sha512-7YHLkfJdTlsZTV0ae5sPwl9Gn/EGr2hrlbcS/8naXm2CDpnKUwC68i1wGlrYAfIgYWL7vUZwk2GkYLQH5CvFig==\",\n \"requires\": {\n \"@vue/compiler-ssr\": \"3.2.41\",\n \"@vue/shared\": \"3.2.41\"\n }\n },\n \"@vue/shared\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/@vue/shared/-/shared-3.2.41.tgz\",\n \"integrity\": \"sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw==\"\n },\n \"csstype\": {\n \"version\": \"2.6.21\",\n \"resolved\": \"https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz\",\n \"integrity\": \"sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==\"\n },\n \"esbuild\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild/-/esbuild-0.15.13.tgz\",\n \"integrity\": \"sha512-Cu3SC84oyzzhrK/YyN4iEVy2jZu5t2fz66HEOShHURcjSkOSAVL8C/gfUT+lDJxkVHpg8GZ10DD0rMHRPqMFaQ==\",\n \"dev\": true,\n \"requires\": {\n \"@esbuild/android-arm\": \"0.15.13\",\n \"@esbuild/linux-loong64\": \"0.15.13\",\n \"esbuild-android-64\": \"0.15.13\",\n \"esbuild-android-arm64\": \"0.15.13\",\n \"esbuild-darwin-64\": \"0.15.13\",\n \"esbuild-darwin-arm64\": \"0.15.13\",\n \"esbuild-freebsd-64\": \"0.15.13\",\n \"esbuild-freebsd-arm64\": \"0.15.13\",\n \"esbuild-linux-32\": \"0.15.13\",\n \"esbuild-linux-64\": \"0.15.13\",\n \"esbuild-linux-arm\": \"0.15.13\",\n \"esbuild-linux-arm64\": \"0.15.13\",\n \"esbuild-linux-mips64le\": \"0.15.13\",\n \"esbuild-linux-ppc64le\": \"0.15.13\",\n \"esbuild-linux-riscv64\": \"0.15.13\",\n \"esbuild-linux-s390x\": \"0.15.13\",\n \"esbuild-netbsd-64\": \"0.15.13\",\n \"esbuild-openbsd-64\": \"0.15.13\",\n \"esbuild-sunos-64\": \"0.15.13\",\n \"esbuild-windows-32\": \"0.15.13\",\n \"esbuild-windows-64\": \"0.15.13\",\n \"esbuild-windows-arm64\": \"0.15.13\"\n }\n },\n \"esbuild-android-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.13.tgz\",\n \"integrity\": \"sha512-yRorukXBlokwTip+Sy4MYskLhJsO0Kn0/Fj43s1krVblfwP+hMD37a4Wmg139GEsMLl+vh8WXp2mq/cTA9J97g==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-android-arm64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.13.tgz\",\n \"integrity\": \"sha512-TKzyymLD6PiVeyYa4c5wdPw87BeAiTXNtK6amWUcXZxkV51gOk5u5qzmDaYSwiWeecSNHamFsaFjLoi32QR5/w==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-darwin-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.13.tgz\",\n \"integrity\": \"sha512-WAx7c2DaOS6CrRcoYCgXgkXDliLnFv3pQLV6GeW1YcGEZq2Gnl8s9Pg7ahValZkpOa0iE/ojRVQ87sbUhF1Cbg==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-darwin-arm64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.13.tgz\",\n \"integrity\": \"sha512-U6jFsPfSSxC3V1CLiQqwvDuj3GGrtQNB3P3nNC3+q99EKf94UGpsG9l4CQ83zBs1NHrk1rtCSYT0+KfK5LsD8A==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-freebsd-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.13.tgz\",\n \"integrity\": \"sha512-whItJgDiOXaDG/idy75qqevIpZjnReZkMGCgQaBWZuKHoElDJC1rh7MpoUgupMcdfOd+PgdEwNQW9DAE6i8wyA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-freebsd-arm64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.13.tgz\",\n \"integrity\": \"sha512-6pCSWt8mLUbPtygv7cufV0sZLeylaMwS5Fznj6Rsx9G2AJJsAjQ9ifA+0rQEIg7DwJmi9it+WjzNTEAzzdoM3Q==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-32\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.13.tgz\",\n \"integrity\": \"sha512-VbZdWOEdrJiYApm2kkxoTOgsoCO1krBZ3quHdYk3g3ivWaMwNIVPIfEE0f0XQQ0u5pJtBsnk2/7OPiCFIPOe/w==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.13.tgz\",\n \"integrity\": \"sha512-rXmnArVNio6yANSqDQlIO4WiP+Cv7+9EuAHNnag7rByAqFVuRusLbGi2697A5dFPNXoO//IiogVwi3AdcfPC6A==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-arm\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.13.tgz\",\n \"integrity\": \"sha512-Ac6LpfmJO8WhCMQmO253xX2IU2B3wPDbl4IvR0hnqcPrdfCaUa2j/lLMGTjmQ4W5JsJIdHEdW12dG8lFS0MbxQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-arm64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.13.tgz\",\n \"integrity\": \"sha512-alEMGU4Z+d17U7KQQw2IV8tQycO6T+rOrgW8OS22Ua25x6kHxoG6Ngry6Aq6uranC+pNWNMB6aHFPh7aTQdORQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-mips64le\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.13.tgz\",\n \"integrity\": \"sha512-47PgmyYEu+yN5rD/MbwS6DxP2FSGPo4Uxg5LwIdxTiyGC2XKwHhHyW7YYEDlSuXLQXEdTO7mYe8zQ74czP7W8A==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-ppc64le\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.13.tgz\",\n \"integrity\": \"sha512-z6n28h2+PC1Ayle9DjKoBRcx/4cxHoOa2e689e2aDJSaKug3jXcQw7mM+GLg+9ydYoNzj8QxNL8ihOv/OnezhA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-riscv64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.13.tgz\",\n \"integrity\": \"sha512-+Lu4zuuXuQhgLUGyZloWCqTslcCAjMZH1k3Xc9MSEJEpEFdpsSU0sRDXAnk18FKOfEjhu4YMGaykx9xjtpA6ow==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-linux-s390x\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.13.tgz\",\n \"integrity\": \"sha512-BMeXRljruf7J0TMxD5CIXS65y7puiZkAh+s4XFV9qy16SxOuMhxhVIXYLnbdfLrsYGFzx7U9mcdpFWkkvy/Uag==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-netbsd-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.13.tgz\",\n \"integrity\": \"sha512-EHj9QZOTel581JPj7UO3xYbltFTYnHy+SIqJVq6yd3KkCrsHRbapiPb0Lx3EOOtybBEE9EyqbmfW1NlSDsSzvQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-openbsd-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.13.tgz\",\n \"integrity\": \"sha512-nkuDlIjF/sfUhfx8SKq0+U+Fgx5K9JcPq1mUodnxI0x4kBdCv46rOGWbuJ6eof2n3wdoCLccOoJAbg9ba/bT2w==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-sunos-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.13.tgz\",\n \"integrity\": \"sha512-jVeu2GfxZQ++6lRdY43CS0Tm/r4WuQQ0Pdsrxbw+aOrHQPHV0+LNOLnvbN28M7BSUGnJnHkHm2HozGgNGyeIRw==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-windows-32\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.13.tgz\",\n \"integrity\": \"sha512-XoF2iBf0wnqo16SDq+aDGi/+QbaLFpkiRarPVssMh9KYbFNCqPLlGAWwDvxEVz+ywX6Si37J2AKm+AXq1kC0JA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-windows-64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.13.tgz\",\n \"integrity\": \"sha512-Et6htEfGycjDrtqb2ng6nT+baesZPYQIW+HUEHK4D1ncggNrDNk3yoboYQ5KtiVrw/JaDMNttz8rrPubV/fvPQ==\",\n \"dev\": true,\n \"optional\": true\n },\n \"esbuild-windows-arm64\": {\n \"version\": \"0.15.13\",\n \"resolved\": \"https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.13.tgz\",\n \"integrity\": \"sha512-3bv7tqntThQC9SWLRouMDmZnlOukBhOCTlkzNqzGCmrkCJI7io5LLjwJBOVY6kOUlIvdxbooNZwjtBvj+7uuVg==\",\n \"dev\": true,\n \"optional\": true\n },\n \"estree-walker\": {\n \"version\": \"2.0.2\",\n \"resolved\": \"https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz\",\n \"integrity\": \"sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==\"\n },\n \"fsevents\": {\n \"version\": \"2.3.2\",\n \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz\",\n \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n \"dev\": true,\n \"optional\": true\n },\n \"function-bind\": {\n \"version\": \"1.1.1\",\n \"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz\",\n \"integrity\": \"sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==\",\n \"dev\": true\n },\n \"google-protobuf\": {\n \"version\": \"3.21.2\",\n \"resolved\": \"https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz\",\n \"integrity\": \"sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==\"\n },\n \"grpc-web\": {\n \"version\": \"1.4.2\",\n \"resolved\": \"https://registry.npmjs.org/grpc-web/-/grpc-web-1.4.2.tgz\",\n \"integrity\": \"sha512-gUxWq42l5ldaRplcKb4Pw5O4XBONWZgz3vxIIXnfIeJj8Jc3wYiq2O4c9xzx/NGbbPEej4rhI62C9eTENwLGNw==\"\n },\n \"has\": {\n \"version\": \"1.0.3\",\n \"resolved\": \"https://registry.npmjs.org/has/-/has-1.0.3.tgz\",\n \"integrity\": \"sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==\",\n \"dev\": true,\n \"requires\": {\n \"function-bind\": \"^1.1.1\"\n }\n },\n \"is-core-module\": {\n \"version\": \"2.11.0\",\n \"resolved\": \"https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz\",\n \"integrity\": \"sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==\",\n \"dev\": true,\n \"requires\": {\n \"has\": \"^1.0.3\"\n }\n },\n \"long\": {\n \"version\": \"5.2.1\",\n \"resolved\": \"https://registry.npmjs.org/long/-/long-5.2.1.tgz\",\n \"integrity\": \"sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==\"\n },\n \"magic-string\": {\n \"version\": \"0.25.9\",\n \"resolved\": \"https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz\",\n \"integrity\": \"sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==\",\n \"requires\": {\n \"sourcemap-codec\": \"^1.4.8\"\n }\n },\n \"nanoid\": {\n \"version\": \"3.3.4\",\n \"resolved\": \"https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz\",\n \"integrity\": \"sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==\"\n },\n \"path-parse\": {\n \"version\": \"1.0.7\",\n \"resolved\": \"https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz\",\n \"integrity\": \"sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==\",\n \"dev\": true\n },\n \"picocolors\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz\",\n \"integrity\": \"sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==\"\n },\n \"postcss\": {\n \"version\": \"8.4.18\",\n \"resolved\": \"https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz\",\n \"integrity\": \"sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==\",\n \"requires\": {\n \"nanoid\": \"^3.3.4\",\n \"picocolors\": \"^1.0.0\",\n \"source-map-js\": \"^1.0.2\"\n }\n },\n \"resolve\": {\n \"version\": \"1.22.1\",\n \"resolved\": \"https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz\",\n \"integrity\": \"sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==\",\n \"dev\": true,\n \"requires\": {\n \"is-core-module\": \"^2.9.0\",\n \"path-parse\": \"^1.0.7\",\n \"supports-preserve-symlinks-flag\": \"^1.0.0\"\n }\n },\n \"rollup\": {\n \"version\": \"2.79.1\",\n \"resolved\": \"https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz\",\n \"integrity\": \"sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==\",\n \"dev\": true,\n \"requires\": {\n \"fsevents\": \"~2.3.2\"\n }\n },\n \"source-map\": {\n \"version\": \"0.6.1\",\n \"resolved\": \"https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz\",\n \"integrity\": \"sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==\"\n },\n \"source-map-js\": {\n \"version\": \"1.0.2\",\n \"resolved\": \"https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz\",\n \"integrity\": \"sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==\"\n },\n \"sourcemap-codec\": {\n \"version\": \"1.4.8\",\n \"resolved\": \"https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz\",\n \"integrity\": \"sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==\"\n },\n \"supports-preserve-symlinks-flag\": {\n \"version\": \"1.0.0\",\n \"resolved\": \"https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz\",\n \"integrity\": \"sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==\",\n \"dev\": true\n },\n \"vite\": {\n \"version\": \"3.2.7\",\n \"resolved\": \"https://registry.npmjs.org/vite/-/vite-3.2.7.tgz\",\n \"integrity\": \"sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==\",\n \"dev\": true,\n \"requires\": {\n \"esbuild\": \"^0.15.9\",\n \"fsevents\": \"~2.3.2\",\n \"postcss\": \"^8.4.18\",\n \"resolve\": \"^1.22.1\",\n \"rollup\": \"^2.79.1\"\n }\n },\n \"vue\": {\n \"version\": \"3.2.41\",\n \"resolved\": \"https://registry.npmjs.org/vue/-/vue-3.2.41.tgz\",\n \"integrity\": \"sha512-uuuvnrDXEeZ9VUPljgHkqB5IaVO8SxhPpqF2eWOukVrBnRBx2THPSGQBnVRt0GrIG1gvCmFXMGbd7FqcT1ixNQ==\",\n \"requires\": {\n \"@vue/compiler-dom\": \"3.2.41\",\n \"@vue/compiler-sfc\": \"3.2.41\",\n \"@vue/runtime-dom\": \"3.2.41\",\n \"@vue/server-renderer\": \"3.2.41\",\n \"@vue/shared\": \"3.2.41\"\n }\n },\n \"yorkie-js-sdk\": {\n \"version\": \"0.3.5\",\n \"resolved\": \"https://registry.npmjs.org/yorkie-js-sdk/-/yorkie-js-sdk-0.3.5.tgz\",\n \"integrity\": \"sha512-CZdc5yUhmJUQWpulDOeDwlW9Uh5WgDBLuCyhXV8+Crb3Kr14PCmrJJ9lI3rVSReosQtq8RjPYnwMd7KbtYALyw==\",\n \"requires\": {\n \"@types/google-protobuf\": \"^3.15.5\",\n \"@types/long\": \"^4.0.1\",\n \"google-protobuf\": \"^3.19.4\",\n \"grpc-web\": \"^1.3.1\",\n \"long\": \"^5.2.0\"\n }\n }\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package.json","path":"/package.json","content":"{\n \"name\": \"vuejs-kanban\",\n \"version\": \"0.0.0\",\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"vite build\",\n \"preview\": \"vite preview\"\n },\n \"dependencies\": {\n \"vue\": \"^3.2.41\",\n \"yorkie-js-sdk\": \"^0.4.2\"\n },\n \"devDependencies\": {\n \"@vitejs/plugin-vue\": \"^3.1.2\",\n \"vite\": \"^3.2.7\"\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"jpg","name":"thumbnail.jpg","path":"/thumbnail.jpg","content":""},{"isFile":true,"isOpen":false,"language":"javascript","name":"vite.config.js","path":"/vite.config.js","content":"import { fileURLToPath, URL } from 'node:url'\n\nimport { defineConfig } from 'vite'\nimport vue from '@vitejs/plugin-vue'\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n base: '',\n plugins: [vue()],\n resolve: {\n alias: {\n '@': fileURLToPath(new URL('./src', import.meta.url))\n }\n }\n})\n"}]} \ No newline at end of file + export const FILE_INFO: DirectoryInfo = {"isFile":false,"name":"vuejs-kanban","path":"/","children":[{"isFile":false,"name":"src","path":"/src","children":[{"isFile":false,"name":"assets","path":"/src/assets","children":[{"isFile":true,"isOpen":false,"language":"css","name":"main.css","path":"/src/assets/main.css","content":"body {\n margin: 0;\n padding: 0;\n background: #807b77;\n}\n\n.kanban {\n margin: 20px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: flex-start;\n user-select: none;\n}\n\n.kanban .add-list {\n padding: 10px;\n color: #fff;\n cursor: pointer;\n background: #ffffff3d;\n margin-right: 10px;\n width: 260px;\n border-radius: 3px;\n flex-shrink: 0;\n}\n\n.kanban .add-list:hover {\n background: #ffffff52;\n}\n\n.kaban .add-list-opener::before {\n content: '+ ';\n}\n\n.delete {\n position: absolute;\n cursor: pointer;\n top: 2px;\n right: 2px;\n display: none;\n}\n\n.add-form {\n display: flex;\n flex-direction: column;\n}\n\n.add-form input[type='text'] {\n border: none;\n overflow: auto;\n outline: none;\n\n font-size: 1em;\n\n margin: 5px 0;\n padding: 5px;\n background: #fff;\n border-radius: 3px;\n box-shadow: 0 1px 0 rgba(9, 30, 66, 0.25);\n position: relative;\n word-break: break-word;\n}\n\n.add-form input[type='button'] {\n font-size: 1em;\n padding: 5px;\n}\n\n.add-form input[type='button'].pull-right {\n float: right;\n}\n\n.list {\n background: #ebecf0;\n margin-right: 10px;\n border-radius: 3px;\n padding: 10px;\n width: 260px;\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n position: relative;\n}\n\n.list:hover > .delete {\n display: inherit;\n}\n\n.list .title {\n font-weight: bold;\n padding: 3px;\n}\n\n.list .card {\n margin: 5px 0;\n padding: 5px;\n background: #fff;\n border-radius: 3px;\n box-shadow: 0 1px 0 rgba(9, 30, 66, 0.25);\n position: relative;\n word-break: break-word;\n font-size: 1em;\n}\n\n.list .card:hover {\n background: #091e4214;\n}\n\n.list .card:hover .delete {\n display: inherit;\n}\n\n.add-card-opener {\n margin: 5px 0;\n padding: 5px;\n color: #444;\n font-size: 0.9em;\n cursor: pointer;\n}\n\n.add-card-opener:hover {\n background: #091e4214;\n}\n\n.add-card-opener::before {\n content: '+ ';\n}\n"}]},{"isFile":true,"isOpen":false,"language":"javascript","name":"App.vue","path":"/src/App.vue","content":"\n\n\n"},{"isFile":true,"isOpen":false,"language":"javascript","name":"main.js","path":"/src/main.js","content":"import { createApp } from 'vue'\nimport App from './App.vue'\n\nimport './assets/main.css'\n\ncreateApp(App).mount('#app')\n"}]},{"isFile":true,"isOpen":false,"language":"","name":".env","path":"/.env","content":"VITE_YORKIE_API_ADDR='http://localhost:8080'\nVITE_YORKIE_API_KEY=''\n"},{"isFile":true,"isOpen":false,"language":"production","name":".env.production","path":"/.env.production","content":"VITE_YORKIE_API_ADDR='https://api.yorkie.dev'\nVITE_YORKIE_API_KEY='cedaovjuioqlk4pjqn6g'\n"},{"isFile":true,"isOpen":false,"language":"","name":".gitignore","path":"/.gitignore","content":"# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\n.DS_Store\ndist\ndist-ssr\ncoverage\n*.local\n\n/cypress/videos/\n/cypress/screenshots/\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n"},{"isFile":true,"isOpen":false,"language":"markdown","name":"README.md","path":"/README.md","content":"# Yorkie Vue Kanban Example\n\n

\n \n \"Live\n \n

\n\n\"Vue\n\n## How to run demo\n\nAt project root, run below command to start Yorkie and Envoy proxy.\n\n```bash\n$ docker-compose -f docker/docker-compose.yml up --build -d\n```\n\nInstall dependencies\n\n```bash\n$ npm install\n```\n\nStart demo project\n\n```bash\n$ npm run dev\n```\n"},{"isFile":true,"isOpen":false,"language":"markup","name":"index.html","path":"/index.html","content":"\n\n\n\n \n \n \n Vite App\n\n\n\n
\n \n\n\n\n"},{"isFile":true,"isOpen":false,"language":"json","name":"package.json","path":"/package.json","content":"{\n \"name\": \"vuejs-kanban\",\n \"version\": \"0.0.0\",\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"vite build\",\n \"preview\": \"vite preview\"\n },\n \"dependencies\": {\n \"vue\": \"^3.2.41\",\n \"yorkie-js-sdk\": \"^0.4.7\"\n },\n \"devDependencies\": {\n \"@vitejs/plugin-vue\": \"^3.1.2\",\n \"vite\": \"^3.2.7\"\n }\n}\n"},{"isFile":true,"isOpen":false,"language":"jpg","name":"thumbnail.jpg","path":"/thumbnail.jpg","content":""},{"isFile":true,"isOpen":false,"language":"javascript","name":"vite.config.js","path":"/vite.config.js","content":"import { fileURLToPath, URL } from 'node:url'\n\nimport { defineConfig } from 'vite'\nimport vue from '@vitejs/plugin-vue'\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n base: '',\n plugins: [vue()],\n resolve: {\n alias: {\n '@': fileURLToPath(new URL('./src', import.meta.url))\n }\n }\n})\n"}]} \ No newline at end of file diff --git a/pages/examples/calendar.tsx b/pages/examples/calendar.tsx new file mode 100644 index 0000000..273043b --- /dev/null +++ b/pages/examples/calendar.tsx @@ -0,0 +1,69 @@ +import { NextPage } from 'next'; +import Head from 'next/head'; +import { ExampleLayout } from '@/components'; +import { + Sidebar, + BasicExampleView, + ProjectCodes, + COMMON_IGNORE_FILES, + EXAMPLE_CODE_URL, + EXAMPLE_PREVIEW_URL, +} from '@/components/exampleView'; +import { FILE_INFO } from '@/examples/nextjs-scheduler/fileInfo'; + +const exampleKey = 'nextjs-scheduler'; +const exampleTitle = 'Calendar'; + +const CalendarExampleView: NextPage = () => { + return ( + + {() => ( + <> + + {`${exampleTitle} · Yorkie Examples`} + + + + + + Code + + + + {exampleTitle} + + This demo shows the real-time collaborative version of the{' '} + + Quill + {' '} + editor with{' '} + + Yorkie + {' '} + and{' '} + + Vite + + . + + + + + + + + + )} + + ); +}; +export default CalendarExampleView; diff --git a/pages/examples/index.tsx b/pages/examples/index.tsx index a611f43..8a13fbe 100644 --- a/pages/examples/index.tsx +++ b/pages/examples/index.tsx @@ -215,6 +215,19 @@ const Examples: NextPage = () => { +
  • + +
    + +
    +
    + Calendar +

    + This demo shows the real-time collaborative version of the Calendar with Yorkie and Next.js. +

    +
    + +
  • diff --git a/public/assets/images/examples/nextjs-scheduler.jpg b/public/assets/images/examples/nextjs-scheduler.jpg new file mode 100644 index 0000000..7253328 Binary files /dev/null and b/public/assets/images/examples/nextjs-scheduler.jpg differ diff --git a/utils/exampleFileUtils.ts b/utils/exampleFileUtils.ts index 3b1c9fb..068fd80 100644 --- a/utils/exampleFileUtils.ts +++ b/utils/exampleFileUtils.ts @@ -90,18 +90,27 @@ export const setFirstFileOpen = (directoryInfo: DirectoryInfo): [DirectoryInfo, return [directoryInfoResult, openedFileInfo]; }; -export const setFileOpen = (directoryInfo: DirectoryInfo, targetFile: string): [DirectoryInfo, FileInfo | null] => { - const cloneDirectoryInfo = cloneDeep(directoryInfo); - let _openedFileInfo: FileInfo | null = null; - cloneDirectoryInfo.children.forEach((child, i) => { +export const setFileOpen = (directoryInfo: DirectoryInfo, targetFilePath: string): [DirectoryInfo, FileInfo | null] => { + const clonedDirectoryInfo = cloneDeep(directoryInfo); + const openedFileInfo = findOpenedFileInfo(clonedDirectoryInfo, targetFilePath); + return [clonedDirectoryInfo, openedFileInfo]; +}; + +const findOpenedFileInfo = (directoryInfo: DirectoryInfo, targetFilePath: string): FileInfo | null => { + let opendFileInfo: FileInfo | null = null; + for (const child of directoryInfo.children) { + if (opendFileInfo != null) { + break; + } if (child.isFile) { - child.isOpen = child.path === targetFile; - _openedFileInfo = child.path === targetFile ? child : _openedFileInfo; + child.isOpen = child.path === targetFilePath; + if (child.isOpen) { + opendFileInfo = child; + break; + } } else { - const [childInfo, openedFileInfo] = setFileOpen(child, targetFile); - cloneDirectoryInfo.children[i] = childInfo; - _openedFileInfo = openedFileInfo; + opendFileInfo = opendFileInfo ?? findOpenedFileInfo(child, targetFilePath); } - }); - return [cloneDirectoryInfo, _openedFileInfo]; -}; + } + return opendFileInfo; +}