├── .eslintrc.cjs
├── .gitignore
├── README.md
├── index.html
├── package.json
├── pnpm-lock.yaml
├── postcss.config.js
├── public
├── icons
│ ├── icon128.png
│ ├── icon16.png
│ ├── icon32.png
│ └── icon48.png
└── manifest.json
├── src
├── App.css
├── App.tsx
├── View.tsx
├── assets
│ ├── animeskyline.jpeg
│ └── realskyline.jpeg
├── contentScript.ts
├── index.css
├── main.tsx
├── utils.ts
└── vite-env.d.ts
├── tailwind.config.js
├── tsconfig.json
├── tsconfig.node.json
└── vite.config.ts
/.eslintrc.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | root: true,
3 | env: { browser: true, es2020: true },
4 | extends: [
5 | 'eslint:recommended',
6 | 'plugin:@typescript-eslint/recommended',
7 | 'plugin:react-hooks/recommended',
8 | ],
9 | ignorePatterns: ['dist', '.eslintrc.cjs'],
10 | parser: '@typescript-eslint/parser',
11 | plugins: ['react-refresh'],
12 | rules: {
13 | 'react-refresh/only-export-components': [
14 | 'warn',
15 | { allowConstantExport: true },
16 | ],
17 | },
18 | }
19 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 | .env
26 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # BrowserDiffusion
2 |
3 | BrowserDiffusion is a chrome extension that runs stable diffusion with LCM at near real-time on page images.
4 |
5 | [Demo Video](https://twitter.com/justoutquan/status/1760195318757654609)
6 |
7 | Built by [Justin](https://twitter.com/justoutquan) and [Michael](https://twitter.com/michaelbzhu) at [Mapo Labs](https://www.mapolabs.com/)
8 |
9 | ## Getting Started
10 |
11 | After cloning the repo, install dependencies.
12 |
13 | ```
14 | pnpm install
15 | ```
16 |
17 | This implementation uses Fal AI's serverless GPUs for generations to make it accessible to users without their own compute.
18 | Create a free account at [Fal AI](https://fal.ai/), which should start you with $10 in free credits.
19 | Go to Fal's [keys page](https://fal.ai/dashboard/keys) and create a new API key with the API scope.
20 | Copy the revealed key value to the `.env` file at root.
21 |
22 | ```
23 | VITE_FAL_CREDENTIALS="insert_key_value_here"
24 | ```
25 |
26 | Then run
27 |
28 | ```
29 | pnpm run build
30 | ```
31 |
32 | The build will be in `./dist`.
33 |
34 | To add it to your browser, open Google Chrome and click on the extensions puzzle icon on the top right > manage extension (Or navigate to [`chrome://extensions/`](chrome://extensions/)).
35 |
36 | Make sure Developer Mode is on (check toggle in top right corner). Click 'Load unpacked' and select the `./dist` folder in the project directory.
37 |
38 | The extension will now show up as a card on the screen and in your extensions bar to the right of the tab search bar! If you don't see it, you can click on the extensions puzzle icon, find BrowserDiffusion, and pin it.
39 |
40 | You're all set! Try visiting a site, typing a style, e.g. "((anime))", and it'll start to transform the site's images.
41 |
42 | Note: If you're using Fal, generation times may vary depending on their load.
43 |
44 | ## Making Changes
45 |
46 | While making changes to the code, on the Manage Extensions page, you can click the refresh icon on the card after making updates to ensure that its been reset.
47 |
48 | ## Current Limitations
49 |
50 | - Not all sites work. For example, it works on Instagram, but not Twitter at the moment, since Twitter uses an unusual pattern for images in its DOM.
51 | - It doesn't work on videos.
52 | - In this version, the extension popup must be open for conversions to take place. It is possible to do this by making the Fal requests in a background.ts file, but it's flakey because of Google's [manifest v3 updates](https://discourse.mozilla.org/t/impossible-to-upgrade-to-manifest-v3-for-extensions-that-require-constant-persistent-listeners/125942).
53 | - Your Fal key is exposed in the browser environment, which is okay for personal use, but bad practice for production. You should use a server proxy for sending Fal requests in production.
54 | - This example uses vanilla SD 1.5 without any fine-tuning or style Loras, so results aren't as good as more specialized models.
55 |
56 | ## Common Issues
57 |
58 | **I made changes to the code, but they're not reflecting.**
59 |
60 | If you've made changes to code and rebuilt with `pnpm run build` but the changes aren't reflecting, try clicking the refresh button in the extension card in 'Manage Extensions', and refreshing the page that you're testing the extension on.
61 |
62 | **It's not altering the images on the site**
63 |
64 | It can't convert on all sites. See [Current Limitations](#current-limitations)
65 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Vite + React + TS
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vite-starter",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "tsc && vite build",
9 | "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
10 | "preview": "vite preview"
11 | },
12 | "dependencies": {
13 | "@fal-ai/serverless-client": "^0.8.5",
14 | "react": "^18.2.0",
15 | "react-dom": "^18.2.0",
16 | "tslib": "^2.6.2"
17 | },
18 | "devDependencies": {
19 | "@types/react": "^18.2.56",
20 | "@types/react-dom": "^18.2.19",
21 | "@typescript-eslint/eslint-plugin": "^7.0.2",
22 | "@typescript-eslint/parser": "^7.0.2",
23 | "@vitejs/plugin-react-swc": "^3.5.0",
24 | "autoprefixer": "^10.4.17",
25 | "chrome-types": "^0.1.268",
26 | "eslint": "^8.56.0",
27 | "eslint-plugin-react-hooks": "^4.6.0",
28 | "eslint-plugin-react-refresh": "^0.4.5",
29 | "postcss": "^8.4.35",
30 | "tailwindcss": "^3.4.1",
31 | "typescript": "^5.2.2",
32 | "vite": "^5.1.4"
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '6.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | dependencies:
8 | '@fal-ai/serverless-client':
9 | specifier: ^0.8.5
10 | version: 0.8.5
11 | react:
12 | specifier: ^18.2.0
13 | version: 18.2.0
14 | react-dom:
15 | specifier: ^18.2.0
16 | version: 18.2.0(react@18.2.0)
17 | tslib:
18 | specifier: ^2.6.2
19 | version: 2.6.2
20 |
21 | devDependencies:
22 | '@types/react':
23 | specifier: ^18.2.56
24 | version: 18.2.57
25 | '@types/react-dom':
26 | specifier: ^18.2.19
27 | version: 18.2.19
28 | '@typescript-eslint/eslint-plugin':
29 | specifier: ^7.0.2
30 | version: 7.0.2(@typescript-eslint/parser@7.0.2)(eslint@8.56.0)(typescript@5.3.3)
31 | '@typescript-eslint/parser':
32 | specifier: ^7.0.2
33 | version: 7.0.2(eslint@8.56.0)(typescript@5.3.3)
34 | '@vitejs/plugin-react-swc':
35 | specifier: ^3.5.0
36 | version: 3.6.0(vite@5.1.4)
37 | autoprefixer:
38 | specifier: ^10.4.17
39 | version: 10.4.17(postcss@8.4.35)
40 | chrome-types:
41 | specifier: ^0.1.268
42 | version: 0.1.268
43 | eslint:
44 | specifier: ^8.56.0
45 | version: 8.56.0
46 | eslint-plugin-react-hooks:
47 | specifier: ^4.6.0
48 | version: 4.6.0(eslint@8.56.0)
49 | eslint-plugin-react-refresh:
50 | specifier: ^0.4.5
51 | version: 0.4.5(eslint@8.56.0)
52 | postcss:
53 | specifier: ^8.4.35
54 | version: 8.4.35
55 | tailwindcss:
56 | specifier: ^3.4.1
57 | version: 3.4.1
58 | typescript:
59 | specifier: ^5.2.2
60 | version: 5.3.3
61 | vite:
62 | specifier: ^5.1.4
63 | version: 5.1.4
64 |
65 | packages:
66 |
67 | /@aashutoshrathi/word-wrap@1.2.6:
68 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==}
69 | engines: {node: '>=0.10.0'}
70 | dev: true
71 |
72 | /@alloc/quick-lru@5.2.0:
73 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
74 | engines: {node: '>=10'}
75 | dev: true
76 |
77 | /@esbuild/aix-ppc64@0.19.12:
78 | resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
79 | engines: {node: '>=12'}
80 | cpu: [ppc64]
81 | os: [aix]
82 | requiresBuild: true
83 | dev: true
84 | optional: true
85 |
86 | /@esbuild/android-arm64@0.19.12:
87 | resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==}
88 | engines: {node: '>=12'}
89 | cpu: [arm64]
90 | os: [android]
91 | requiresBuild: true
92 | dev: true
93 | optional: true
94 |
95 | /@esbuild/android-arm@0.19.12:
96 | resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==}
97 | engines: {node: '>=12'}
98 | cpu: [arm]
99 | os: [android]
100 | requiresBuild: true
101 | dev: true
102 | optional: true
103 |
104 | /@esbuild/android-x64@0.19.12:
105 | resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==}
106 | engines: {node: '>=12'}
107 | cpu: [x64]
108 | os: [android]
109 | requiresBuild: true
110 | dev: true
111 | optional: true
112 |
113 | /@esbuild/darwin-arm64@0.19.12:
114 | resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==}
115 | engines: {node: '>=12'}
116 | cpu: [arm64]
117 | os: [darwin]
118 | requiresBuild: true
119 | dev: true
120 | optional: true
121 |
122 | /@esbuild/darwin-x64@0.19.12:
123 | resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==}
124 | engines: {node: '>=12'}
125 | cpu: [x64]
126 | os: [darwin]
127 | requiresBuild: true
128 | dev: true
129 | optional: true
130 |
131 | /@esbuild/freebsd-arm64@0.19.12:
132 | resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==}
133 | engines: {node: '>=12'}
134 | cpu: [arm64]
135 | os: [freebsd]
136 | requiresBuild: true
137 | dev: true
138 | optional: true
139 |
140 | /@esbuild/freebsd-x64@0.19.12:
141 | resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==}
142 | engines: {node: '>=12'}
143 | cpu: [x64]
144 | os: [freebsd]
145 | requiresBuild: true
146 | dev: true
147 | optional: true
148 |
149 | /@esbuild/linux-arm64@0.19.12:
150 | resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==}
151 | engines: {node: '>=12'}
152 | cpu: [arm64]
153 | os: [linux]
154 | requiresBuild: true
155 | dev: true
156 | optional: true
157 |
158 | /@esbuild/linux-arm@0.19.12:
159 | resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==}
160 | engines: {node: '>=12'}
161 | cpu: [arm]
162 | os: [linux]
163 | requiresBuild: true
164 | dev: true
165 | optional: true
166 |
167 | /@esbuild/linux-ia32@0.19.12:
168 | resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==}
169 | engines: {node: '>=12'}
170 | cpu: [ia32]
171 | os: [linux]
172 | requiresBuild: true
173 | dev: true
174 | optional: true
175 |
176 | /@esbuild/linux-loong64@0.19.12:
177 | resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==}
178 | engines: {node: '>=12'}
179 | cpu: [loong64]
180 | os: [linux]
181 | requiresBuild: true
182 | dev: true
183 | optional: true
184 |
185 | /@esbuild/linux-mips64el@0.19.12:
186 | resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==}
187 | engines: {node: '>=12'}
188 | cpu: [mips64el]
189 | os: [linux]
190 | requiresBuild: true
191 | dev: true
192 | optional: true
193 |
194 | /@esbuild/linux-ppc64@0.19.12:
195 | resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==}
196 | engines: {node: '>=12'}
197 | cpu: [ppc64]
198 | os: [linux]
199 | requiresBuild: true
200 | dev: true
201 | optional: true
202 |
203 | /@esbuild/linux-riscv64@0.19.12:
204 | resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==}
205 | engines: {node: '>=12'}
206 | cpu: [riscv64]
207 | os: [linux]
208 | requiresBuild: true
209 | dev: true
210 | optional: true
211 |
212 | /@esbuild/linux-s390x@0.19.12:
213 | resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==}
214 | engines: {node: '>=12'}
215 | cpu: [s390x]
216 | os: [linux]
217 | requiresBuild: true
218 | dev: true
219 | optional: true
220 |
221 | /@esbuild/linux-x64@0.19.12:
222 | resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==}
223 | engines: {node: '>=12'}
224 | cpu: [x64]
225 | os: [linux]
226 | requiresBuild: true
227 | dev: true
228 | optional: true
229 |
230 | /@esbuild/netbsd-x64@0.19.12:
231 | resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==}
232 | engines: {node: '>=12'}
233 | cpu: [x64]
234 | os: [netbsd]
235 | requiresBuild: true
236 | dev: true
237 | optional: true
238 |
239 | /@esbuild/openbsd-x64@0.19.12:
240 | resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==}
241 | engines: {node: '>=12'}
242 | cpu: [x64]
243 | os: [openbsd]
244 | requiresBuild: true
245 | dev: true
246 | optional: true
247 |
248 | /@esbuild/sunos-x64@0.19.12:
249 | resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==}
250 | engines: {node: '>=12'}
251 | cpu: [x64]
252 | os: [sunos]
253 | requiresBuild: true
254 | dev: true
255 | optional: true
256 |
257 | /@esbuild/win32-arm64@0.19.12:
258 | resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==}
259 | engines: {node: '>=12'}
260 | cpu: [arm64]
261 | os: [win32]
262 | requiresBuild: true
263 | dev: true
264 | optional: true
265 |
266 | /@esbuild/win32-ia32@0.19.12:
267 | resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==}
268 | engines: {node: '>=12'}
269 | cpu: [ia32]
270 | os: [win32]
271 | requiresBuild: true
272 | dev: true
273 | optional: true
274 |
275 | /@esbuild/win32-x64@0.19.12:
276 | resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==}
277 | engines: {node: '>=12'}
278 | cpu: [x64]
279 | os: [win32]
280 | requiresBuild: true
281 | dev: true
282 | optional: true
283 |
284 | /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0):
285 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
286 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
287 | peerDependencies:
288 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
289 | dependencies:
290 | eslint: 8.56.0
291 | eslint-visitor-keys: 3.4.3
292 | dev: true
293 |
294 | /@eslint-community/regexpp@4.10.0:
295 | resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==}
296 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
297 | dev: true
298 |
299 | /@eslint/eslintrc@2.1.4:
300 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
301 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
302 | dependencies:
303 | ajv: 6.12.6
304 | debug: 4.3.4
305 | espree: 9.6.1
306 | globals: 13.24.0
307 | ignore: 5.3.1
308 | import-fresh: 3.3.0
309 | js-yaml: 4.1.0
310 | minimatch: 3.1.2
311 | strip-json-comments: 3.1.1
312 | transitivePeerDependencies:
313 | - supports-color
314 | dev: true
315 |
316 | /@eslint/js@8.56.0:
317 | resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==}
318 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
319 | dev: true
320 |
321 | /@fal-ai/serverless-client@0.8.5:
322 | resolution: {integrity: sha512-XnDqBTW1Vl8aFbpbL9K4J0Ezr7GIOGEz3UCU5D+faVk11tVQW1mLqZimiM4uriMqrka49he1ByJ7c7jVrqhdeQ==}
323 | engines: {node: '>=18.0.0'}
324 | dependencies:
325 | '@msgpack/msgpack': 3.0.0-beta2
326 | robot3: 0.4.1
327 | uuid-random: 1.3.2
328 | dev: false
329 |
330 | /@humanwhocodes/config-array@0.11.14:
331 | resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
332 | engines: {node: '>=10.10.0'}
333 | dependencies:
334 | '@humanwhocodes/object-schema': 2.0.2
335 | debug: 4.3.4
336 | minimatch: 3.1.2
337 | transitivePeerDependencies:
338 | - supports-color
339 | dev: true
340 |
341 | /@humanwhocodes/module-importer@1.0.1:
342 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
343 | engines: {node: '>=12.22'}
344 | dev: true
345 |
346 | /@humanwhocodes/object-schema@2.0.2:
347 | resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==}
348 | dev: true
349 |
350 | /@isaacs/cliui@8.0.2:
351 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
352 | engines: {node: '>=12'}
353 | dependencies:
354 | string-width: 5.1.2
355 | string-width-cjs: /string-width@4.2.3
356 | strip-ansi: 7.1.0
357 | strip-ansi-cjs: /strip-ansi@6.0.1
358 | wrap-ansi: 8.1.0
359 | wrap-ansi-cjs: /wrap-ansi@7.0.0
360 | dev: true
361 |
362 | /@jridgewell/gen-mapping@0.3.3:
363 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
364 | engines: {node: '>=6.0.0'}
365 | dependencies:
366 | '@jridgewell/set-array': 1.1.2
367 | '@jridgewell/sourcemap-codec': 1.4.15
368 | '@jridgewell/trace-mapping': 0.3.22
369 | dev: true
370 |
371 | /@jridgewell/resolve-uri@3.1.2:
372 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
373 | engines: {node: '>=6.0.0'}
374 | dev: true
375 |
376 | /@jridgewell/set-array@1.1.2:
377 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
378 | engines: {node: '>=6.0.0'}
379 | dev: true
380 |
381 | /@jridgewell/sourcemap-codec@1.4.15:
382 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
383 | dev: true
384 |
385 | /@jridgewell/trace-mapping@0.3.22:
386 | resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==}
387 | dependencies:
388 | '@jridgewell/resolve-uri': 3.1.2
389 | '@jridgewell/sourcemap-codec': 1.4.15
390 | dev: true
391 |
392 | /@msgpack/msgpack@3.0.0-beta2:
393 | resolution: {integrity: sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw==}
394 | engines: {node: '>= 14'}
395 | dev: false
396 |
397 | /@nodelib/fs.scandir@2.1.5:
398 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
399 | engines: {node: '>= 8'}
400 | dependencies:
401 | '@nodelib/fs.stat': 2.0.5
402 | run-parallel: 1.2.0
403 | dev: true
404 |
405 | /@nodelib/fs.stat@2.0.5:
406 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
407 | engines: {node: '>= 8'}
408 | dev: true
409 |
410 | /@nodelib/fs.walk@1.2.8:
411 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
412 | engines: {node: '>= 8'}
413 | dependencies:
414 | '@nodelib/fs.scandir': 2.1.5
415 | fastq: 1.17.1
416 | dev: true
417 |
418 | /@pkgjs/parseargs@0.11.0:
419 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
420 | engines: {node: '>=14'}
421 | requiresBuild: true
422 | dev: true
423 | optional: true
424 |
425 | /@rollup/rollup-android-arm-eabi@4.12.0:
426 | resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==}
427 | cpu: [arm]
428 | os: [android]
429 | requiresBuild: true
430 | dev: true
431 | optional: true
432 |
433 | /@rollup/rollup-android-arm64@4.12.0:
434 | resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==}
435 | cpu: [arm64]
436 | os: [android]
437 | requiresBuild: true
438 | dev: true
439 | optional: true
440 |
441 | /@rollup/rollup-darwin-arm64@4.12.0:
442 | resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==}
443 | cpu: [arm64]
444 | os: [darwin]
445 | requiresBuild: true
446 | dev: true
447 | optional: true
448 |
449 | /@rollup/rollup-darwin-x64@4.12.0:
450 | resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==}
451 | cpu: [x64]
452 | os: [darwin]
453 | requiresBuild: true
454 | dev: true
455 | optional: true
456 |
457 | /@rollup/rollup-linux-arm-gnueabihf@4.12.0:
458 | resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==}
459 | cpu: [arm]
460 | os: [linux]
461 | requiresBuild: true
462 | dev: true
463 | optional: true
464 |
465 | /@rollup/rollup-linux-arm64-gnu@4.12.0:
466 | resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==}
467 | cpu: [arm64]
468 | os: [linux]
469 | requiresBuild: true
470 | dev: true
471 | optional: true
472 |
473 | /@rollup/rollup-linux-arm64-musl@4.12.0:
474 | resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==}
475 | cpu: [arm64]
476 | os: [linux]
477 | requiresBuild: true
478 | dev: true
479 | optional: true
480 |
481 | /@rollup/rollup-linux-riscv64-gnu@4.12.0:
482 | resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==}
483 | cpu: [riscv64]
484 | os: [linux]
485 | requiresBuild: true
486 | dev: true
487 | optional: true
488 |
489 | /@rollup/rollup-linux-x64-gnu@4.12.0:
490 | resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==}
491 | cpu: [x64]
492 | os: [linux]
493 | requiresBuild: true
494 | dev: true
495 | optional: true
496 |
497 | /@rollup/rollup-linux-x64-musl@4.12.0:
498 | resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==}
499 | cpu: [x64]
500 | os: [linux]
501 | requiresBuild: true
502 | dev: true
503 | optional: true
504 |
505 | /@rollup/rollup-win32-arm64-msvc@4.12.0:
506 | resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==}
507 | cpu: [arm64]
508 | os: [win32]
509 | requiresBuild: true
510 | dev: true
511 | optional: true
512 |
513 | /@rollup/rollup-win32-ia32-msvc@4.12.0:
514 | resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==}
515 | cpu: [ia32]
516 | os: [win32]
517 | requiresBuild: true
518 | dev: true
519 | optional: true
520 |
521 | /@rollup/rollup-win32-x64-msvc@4.12.0:
522 | resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==}
523 | cpu: [x64]
524 | os: [win32]
525 | requiresBuild: true
526 | dev: true
527 | optional: true
528 |
529 | /@swc/core-darwin-arm64@1.4.2:
530 | resolution: {integrity: sha512-1uSdAn1MRK5C1m/TvLZ2RDvr0zLvochgrZ2xL+lRzugLlCTlSA+Q4TWtrZaOz+vnnFVliCpw7c7qu0JouhgQIw==}
531 | engines: {node: '>=10'}
532 | cpu: [arm64]
533 | os: [darwin]
534 | requiresBuild: true
535 | dev: true
536 | optional: true
537 |
538 | /@swc/core-darwin-x64@1.4.2:
539 | resolution: {integrity: sha512-TYD28+dCQKeuxxcy7gLJUCFLqrwDZnHtC2z7cdeGfZpbI2mbfppfTf2wUPzqZk3gEC96zHd4Yr37V3Tvzar+lQ==}
540 | engines: {node: '>=10'}
541 | cpu: [x64]
542 | os: [darwin]
543 | requiresBuild: true
544 | dev: true
545 | optional: true
546 |
547 | /@swc/core-linux-arm-gnueabihf@1.4.2:
548 | resolution: {integrity: sha512-Eyqipf7ZPGj0vplKHo8JUOoU1un2sg5PjJMpEesX0k+6HKE2T8pdyeyXODN0YTFqzndSa/J43EEPXm+rHAsLFQ==}
549 | engines: {node: '>=10'}
550 | cpu: [arm]
551 | os: [linux]
552 | requiresBuild: true
553 | dev: true
554 | optional: true
555 |
556 | /@swc/core-linux-arm64-gnu@1.4.2:
557 | resolution: {integrity: sha512-wZn02DH8VYPv3FC0ub4my52Rttsus/rFw+UUfzdb3tHMHXB66LqN+rR0ssIOZrH6K+VLN6qpTw9VizjyoH0BxA==}
558 | engines: {node: '>=10'}
559 | cpu: [arm64]
560 | os: [linux]
561 | requiresBuild: true
562 | dev: true
563 | optional: true
564 |
565 | /@swc/core-linux-arm64-musl@1.4.2:
566 | resolution: {integrity: sha512-3G0D5z9hUj9bXNcwmA1eGiFTwe5rWkuL3DsoviTj73TKLpk7u64ND0XjEfO0huVv4vVu9H1jodrKb7nvln/dlw==}
567 | engines: {node: '>=10'}
568 | cpu: [arm64]
569 | os: [linux]
570 | requiresBuild: true
571 | dev: true
572 | optional: true
573 |
574 | /@swc/core-linux-x64-gnu@1.4.2:
575 | resolution: {integrity: sha512-LFxn9U8cjmYHw3jrdPNqPAkBGglKE3tCZ8rA7hYyp0BFxuo7L2ZcEnPm4RFpmSCCsExFH+LEJWuMGgWERoktvg==}
576 | engines: {node: '>=10'}
577 | cpu: [x64]
578 | os: [linux]
579 | requiresBuild: true
580 | dev: true
581 | optional: true
582 |
583 | /@swc/core-linux-x64-musl@1.4.2:
584 | resolution: {integrity: sha512-dp0fAmreeVVYTUcb4u9njTPrYzKnbIH0EhH2qvC9GOYNNREUu2GezSIDgonjOXkHiTCvopG4xU7y56XtXj4VrQ==}
585 | engines: {node: '>=10'}
586 | cpu: [x64]
587 | os: [linux]
588 | requiresBuild: true
589 | dev: true
590 | optional: true
591 |
592 | /@swc/core-win32-arm64-msvc@1.4.2:
593 | resolution: {integrity: sha512-HlVIiLMQkzthAdqMslQhDkoXJ5+AOLUSTV6fm6shFKZKqc/9cJvr4S8UveNERL9zUficA36yM3bbfo36McwnvQ==}
594 | engines: {node: '>=10'}
595 | cpu: [arm64]
596 | os: [win32]
597 | requiresBuild: true
598 | dev: true
599 | optional: true
600 |
601 | /@swc/core-win32-ia32-msvc@1.4.2:
602 | resolution: {integrity: sha512-WCF8faPGjCl4oIgugkp+kL9nl3nUATlzKXCEGFowMEmVVCFM0GsqlmGdPp1pjZoWc9tpYanoXQDnp5IvlDSLhA==}
603 | engines: {node: '>=10'}
604 | cpu: [ia32]
605 | os: [win32]
606 | requiresBuild: true
607 | dev: true
608 | optional: true
609 |
610 | /@swc/core-win32-x64-msvc@1.4.2:
611 | resolution: {integrity: sha512-oV71rwiSpA5xre2C5570BhCsg1HF97SNLsZ/12xv7zayGzqr3yvFALFJN8tHKpqUdCB4FGPjoP3JFdV3i+1wUw==}
612 | engines: {node: '>=10'}
613 | cpu: [x64]
614 | os: [win32]
615 | requiresBuild: true
616 | dev: true
617 | optional: true
618 |
619 | /@swc/core@1.4.2:
620 | resolution: {integrity: sha512-vWgY07R/eqj1/a0vsRKLI9o9klGZfpLNOVEnrv4nrccxBgYPjcf22IWwAoaBJ+wpA7Q4fVjCUM8lP0m01dpxcg==}
621 | engines: {node: '>=10'}
622 | requiresBuild: true
623 | peerDependencies:
624 | '@swc/helpers': ^0.5.0
625 | peerDependenciesMeta:
626 | '@swc/helpers':
627 | optional: true
628 | dependencies:
629 | '@swc/counter': 0.1.3
630 | '@swc/types': 0.1.5
631 | optionalDependencies:
632 | '@swc/core-darwin-arm64': 1.4.2
633 | '@swc/core-darwin-x64': 1.4.2
634 | '@swc/core-linux-arm-gnueabihf': 1.4.2
635 | '@swc/core-linux-arm64-gnu': 1.4.2
636 | '@swc/core-linux-arm64-musl': 1.4.2
637 | '@swc/core-linux-x64-gnu': 1.4.2
638 | '@swc/core-linux-x64-musl': 1.4.2
639 | '@swc/core-win32-arm64-msvc': 1.4.2
640 | '@swc/core-win32-ia32-msvc': 1.4.2
641 | '@swc/core-win32-x64-msvc': 1.4.2
642 | dev: true
643 |
644 | /@swc/counter@0.1.3:
645 | resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
646 | dev: true
647 |
648 | /@swc/types@0.1.5:
649 | resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==}
650 | dev: true
651 |
652 | /@types/estree@1.0.5:
653 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
654 | dev: true
655 |
656 | /@types/json-schema@7.0.15:
657 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
658 | dev: true
659 |
660 | /@types/prop-types@15.7.11:
661 | resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==}
662 | dev: true
663 |
664 | /@types/react-dom@18.2.19:
665 | resolution: {integrity: sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==}
666 | dependencies:
667 | '@types/react': 18.2.57
668 | dev: true
669 |
670 | /@types/react@18.2.57:
671 | resolution: {integrity: sha512-ZvQsktJgSYrQiMirAN60y4O/LRevIV8hUzSOSNB6gfR3/o3wCBFQx3sPwIYtuDMeiVgsSS3UzCV26tEzgnfvQw==}
672 | dependencies:
673 | '@types/prop-types': 15.7.11
674 | '@types/scheduler': 0.16.8
675 | csstype: 3.1.3
676 | dev: true
677 |
678 | /@types/scheduler@0.16.8:
679 | resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==}
680 | dev: true
681 |
682 | /@types/semver@7.5.7:
683 | resolution: {integrity: sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==}
684 | dev: true
685 |
686 | /@typescript-eslint/eslint-plugin@7.0.2(@typescript-eslint/parser@7.0.2)(eslint@8.56.0)(typescript@5.3.3):
687 | resolution: {integrity: sha512-/XtVZJtbaphtdrWjr+CJclaCVGPtOdBpFEnvtNf/jRV0IiEemRrL0qABex/nEt8isYcnFacm3nPHYQwL+Wb7qg==}
688 | engines: {node: ^16.0.0 || >=18.0.0}
689 | peerDependencies:
690 | '@typescript-eslint/parser': ^7.0.0
691 | eslint: ^8.56.0
692 | typescript: '*'
693 | peerDependenciesMeta:
694 | typescript:
695 | optional: true
696 | dependencies:
697 | '@eslint-community/regexpp': 4.10.0
698 | '@typescript-eslint/parser': 7.0.2(eslint@8.56.0)(typescript@5.3.3)
699 | '@typescript-eslint/scope-manager': 7.0.2
700 | '@typescript-eslint/type-utils': 7.0.2(eslint@8.56.0)(typescript@5.3.3)
701 | '@typescript-eslint/utils': 7.0.2(eslint@8.56.0)(typescript@5.3.3)
702 | '@typescript-eslint/visitor-keys': 7.0.2
703 | debug: 4.3.4
704 | eslint: 8.56.0
705 | graphemer: 1.4.0
706 | ignore: 5.3.1
707 | natural-compare: 1.4.0
708 | semver: 7.6.0
709 | ts-api-utils: 1.2.1(typescript@5.3.3)
710 | typescript: 5.3.3
711 | transitivePeerDependencies:
712 | - supports-color
713 | dev: true
714 |
715 | /@typescript-eslint/parser@7.0.2(eslint@8.56.0)(typescript@5.3.3):
716 | resolution: {integrity: sha512-GdwfDglCxSmU+QTS9vhz2Sop46ebNCXpPPvsByK7hu0rFGRHL+AusKQJ7SoN+LbLh6APFpQwHKmDSwN35Z700Q==}
717 | engines: {node: ^16.0.0 || >=18.0.0}
718 | peerDependencies:
719 | eslint: ^8.56.0
720 | typescript: '*'
721 | peerDependenciesMeta:
722 | typescript:
723 | optional: true
724 | dependencies:
725 | '@typescript-eslint/scope-manager': 7.0.2
726 | '@typescript-eslint/types': 7.0.2
727 | '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.3.3)
728 | '@typescript-eslint/visitor-keys': 7.0.2
729 | debug: 4.3.4
730 | eslint: 8.56.0
731 | typescript: 5.3.3
732 | transitivePeerDependencies:
733 | - supports-color
734 | dev: true
735 |
736 | /@typescript-eslint/scope-manager@7.0.2:
737 | resolution: {integrity: sha512-l6sa2jF3h+qgN2qUMjVR3uCNGjWw4ahGfzIYsCtFrQJCjhbrDPdiihYT8FnnqFwsWX+20hK592yX9I2rxKTP4g==}
738 | engines: {node: ^16.0.0 || >=18.0.0}
739 | dependencies:
740 | '@typescript-eslint/types': 7.0.2
741 | '@typescript-eslint/visitor-keys': 7.0.2
742 | dev: true
743 |
744 | /@typescript-eslint/type-utils@7.0.2(eslint@8.56.0)(typescript@5.3.3):
745 | resolution: {integrity: sha512-IKKDcFsKAYlk8Rs4wiFfEwJTQlHcdn8CLwLaxwd6zb8HNiMcQIFX9sWax2k4Cjj7l7mGS5N1zl7RCHOVwHq2VQ==}
746 | engines: {node: ^16.0.0 || >=18.0.0}
747 | peerDependencies:
748 | eslint: ^8.56.0
749 | typescript: '*'
750 | peerDependenciesMeta:
751 | typescript:
752 | optional: true
753 | dependencies:
754 | '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.3.3)
755 | '@typescript-eslint/utils': 7.0.2(eslint@8.56.0)(typescript@5.3.3)
756 | debug: 4.3.4
757 | eslint: 8.56.0
758 | ts-api-utils: 1.2.1(typescript@5.3.3)
759 | typescript: 5.3.3
760 | transitivePeerDependencies:
761 | - supports-color
762 | dev: true
763 |
764 | /@typescript-eslint/types@7.0.2:
765 | resolution: {integrity: sha512-ZzcCQHj4JaXFjdOql6adYV4B/oFOFjPOC9XYwCaZFRvqN8Llfvv4gSxrkQkd2u4Ci62i2c6W6gkDwQJDaRc4nA==}
766 | engines: {node: ^16.0.0 || >=18.0.0}
767 | dev: true
768 |
769 | /@typescript-eslint/typescript-estree@7.0.2(typescript@5.3.3):
770 | resolution: {integrity: sha512-3AMc8khTcELFWcKcPc0xiLviEvvfzATpdPj/DXuOGIdQIIFybf4DMT1vKRbuAEOFMwhWt7NFLXRkbjsvKZQyvw==}
771 | engines: {node: ^16.0.0 || >=18.0.0}
772 | peerDependencies:
773 | typescript: '*'
774 | peerDependenciesMeta:
775 | typescript:
776 | optional: true
777 | dependencies:
778 | '@typescript-eslint/types': 7.0.2
779 | '@typescript-eslint/visitor-keys': 7.0.2
780 | debug: 4.3.4
781 | globby: 11.1.0
782 | is-glob: 4.0.3
783 | minimatch: 9.0.3
784 | semver: 7.6.0
785 | ts-api-utils: 1.2.1(typescript@5.3.3)
786 | typescript: 5.3.3
787 | transitivePeerDependencies:
788 | - supports-color
789 | dev: true
790 |
791 | /@typescript-eslint/utils@7.0.2(eslint@8.56.0)(typescript@5.3.3):
792 | resolution: {integrity: sha512-PZPIONBIB/X684bhT1XlrkjNZJIEevwkKDsdwfiu1WeqBxYEEdIgVDgm8/bbKHVu+6YOpeRqcfImTdImx/4Bsw==}
793 | engines: {node: ^16.0.0 || >=18.0.0}
794 | peerDependencies:
795 | eslint: ^8.56.0
796 | dependencies:
797 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
798 | '@types/json-schema': 7.0.15
799 | '@types/semver': 7.5.7
800 | '@typescript-eslint/scope-manager': 7.0.2
801 | '@typescript-eslint/types': 7.0.2
802 | '@typescript-eslint/typescript-estree': 7.0.2(typescript@5.3.3)
803 | eslint: 8.56.0
804 | semver: 7.6.0
805 | transitivePeerDependencies:
806 | - supports-color
807 | - typescript
808 | dev: true
809 |
810 | /@typescript-eslint/visitor-keys@7.0.2:
811 | resolution: {integrity: sha512-8Y+YiBmqPighbm5xA2k4wKTxRzx9EkBu7Rlw+WHqMvRJ3RPz/BMBO9b2ru0LUNmXg120PHUXD5+SWFy2R8DqlQ==}
812 | engines: {node: ^16.0.0 || >=18.0.0}
813 | dependencies:
814 | '@typescript-eslint/types': 7.0.2
815 | eslint-visitor-keys: 3.4.3
816 | dev: true
817 |
818 | /@ungap/structured-clone@1.2.0:
819 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
820 | dev: true
821 |
822 | /@vitejs/plugin-react-swc@3.6.0(vite@5.1.4):
823 | resolution: {integrity: sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==}
824 | peerDependencies:
825 | vite: ^4 || ^5
826 | dependencies:
827 | '@swc/core': 1.4.2
828 | vite: 5.1.4
829 | transitivePeerDependencies:
830 | - '@swc/helpers'
831 | dev: true
832 |
833 | /acorn-jsx@5.3.2(acorn@8.11.3):
834 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
835 | peerDependencies:
836 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
837 | dependencies:
838 | acorn: 8.11.3
839 | dev: true
840 |
841 | /acorn@8.11.3:
842 | resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==}
843 | engines: {node: '>=0.4.0'}
844 | hasBin: true
845 | dev: true
846 |
847 | /ajv@6.12.6:
848 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
849 | dependencies:
850 | fast-deep-equal: 3.1.3
851 | fast-json-stable-stringify: 2.1.0
852 | json-schema-traverse: 0.4.1
853 | uri-js: 4.4.1
854 | dev: true
855 |
856 | /ansi-regex@5.0.1:
857 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
858 | engines: {node: '>=8'}
859 | dev: true
860 |
861 | /ansi-regex@6.0.1:
862 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
863 | engines: {node: '>=12'}
864 | dev: true
865 |
866 | /ansi-styles@4.3.0:
867 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
868 | engines: {node: '>=8'}
869 | dependencies:
870 | color-convert: 2.0.1
871 | dev: true
872 |
873 | /ansi-styles@6.2.1:
874 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
875 | engines: {node: '>=12'}
876 | dev: true
877 |
878 | /any-promise@1.3.0:
879 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
880 | dev: true
881 |
882 | /anymatch@3.1.3:
883 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
884 | engines: {node: '>= 8'}
885 | dependencies:
886 | normalize-path: 3.0.0
887 | picomatch: 2.3.1
888 | dev: true
889 |
890 | /arg@5.0.2:
891 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
892 | dev: true
893 |
894 | /argparse@2.0.1:
895 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
896 | dev: true
897 |
898 | /array-union@2.1.0:
899 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
900 | engines: {node: '>=8'}
901 | dev: true
902 |
903 | /autoprefixer@10.4.17(postcss@8.4.35):
904 | resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==}
905 | engines: {node: ^10 || ^12 || >=14}
906 | hasBin: true
907 | peerDependencies:
908 | postcss: ^8.1.0
909 | dependencies:
910 | browserslist: 4.23.0
911 | caniuse-lite: 1.0.30001589
912 | fraction.js: 4.3.7
913 | normalize-range: 0.1.2
914 | picocolors: 1.0.0
915 | postcss: 8.4.35
916 | postcss-value-parser: 4.2.0
917 | dev: true
918 |
919 | /balanced-match@1.0.2:
920 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
921 | dev: true
922 |
923 | /binary-extensions@2.2.0:
924 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
925 | engines: {node: '>=8'}
926 | dev: true
927 |
928 | /brace-expansion@1.1.11:
929 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
930 | dependencies:
931 | balanced-match: 1.0.2
932 | concat-map: 0.0.1
933 | dev: true
934 |
935 | /brace-expansion@2.0.1:
936 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
937 | dependencies:
938 | balanced-match: 1.0.2
939 | dev: true
940 |
941 | /braces@3.0.2:
942 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
943 | engines: {node: '>=8'}
944 | dependencies:
945 | fill-range: 7.0.1
946 | dev: true
947 |
948 | /browserslist@4.23.0:
949 | resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==}
950 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
951 | hasBin: true
952 | dependencies:
953 | caniuse-lite: 1.0.30001589
954 | electron-to-chromium: 1.4.679
955 | node-releases: 2.0.14
956 | update-browserslist-db: 1.0.13(browserslist@4.23.0)
957 | dev: true
958 |
959 | /callsites@3.1.0:
960 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
961 | engines: {node: '>=6'}
962 | dev: true
963 |
964 | /camelcase-css@2.0.1:
965 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
966 | engines: {node: '>= 6'}
967 | dev: true
968 |
969 | /caniuse-lite@1.0.30001589:
970 | resolution: {integrity: sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==}
971 | dev: true
972 |
973 | /chalk@4.1.2:
974 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
975 | engines: {node: '>=10'}
976 | dependencies:
977 | ansi-styles: 4.3.0
978 | supports-color: 7.2.0
979 | dev: true
980 |
981 | /chokidar@3.6.0:
982 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
983 | engines: {node: '>= 8.10.0'}
984 | dependencies:
985 | anymatch: 3.1.3
986 | braces: 3.0.2
987 | glob-parent: 5.1.2
988 | is-binary-path: 2.1.0
989 | is-glob: 4.0.3
990 | normalize-path: 3.0.0
991 | readdirp: 3.6.0
992 | optionalDependencies:
993 | fsevents: 2.3.3
994 | dev: true
995 |
996 | /chrome-types@0.1.268:
997 | resolution: {integrity: sha512-F7qS80/sKB4D4U4WNuVrXxytRHjl7VU2ZHksMYx2WJ+LJl8XjbmucTlOSSiOw4cKzH+9sSQAIENbv84hH94LhA==}
998 | dev: true
999 |
1000 | /color-convert@2.0.1:
1001 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
1002 | engines: {node: '>=7.0.0'}
1003 | dependencies:
1004 | color-name: 1.1.4
1005 | dev: true
1006 |
1007 | /color-name@1.1.4:
1008 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
1009 | dev: true
1010 |
1011 | /commander@4.1.1:
1012 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
1013 | engines: {node: '>= 6'}
1014 | dev: true
1015 |
1016 | /concat-map@0.0.1:
1017 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
1018 | dev: true
1019 |
1020 | /cross-spawn@7.0.3:
1021 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
1022 | engines: {node: '>= 8'}
1023 | dependencies:
1024 | path-key: 3.1.1
1025 | shebang-command: 2.0.0
1026 | which: 2.0.2
1027 | dev: true
1028 |
1029 | /cssesc@3.0.0:
1030 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
1031 | engines: {node: '>=4'}
1032 | hasBin: true
1033 | dev: true
1034 |
1035 | /csstype@3.1.3:
1036 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
1037 | dev: true
1038 |
1039 | /debug@4.3.4:
1040 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
1041 | engines: {node: '>=6.0'}
1042 | peerDependencies:
1043 | supports-color: '*'
1044 | peerDependenciesMeta:
1045 | supports-color:
1046 | optional: true
1047 | dependencies:
1048 | ms: 2.1.2
1049 | dev: true
1050 |
1051 | /deep-is@0.1.4:
1052 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
1053 | dev: true
1054 |
1055 | /didyoumean@1.2.2:
1056 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
1057 | dev: true
1058 |
1059 | /dir-glob@3.0.1:
1060 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
1061 | engines: {node: '>=8'}
1062 | dependencies:
1063 | path-type: 4.0.0
1064 | dev: true
1065 |
1066 | /dlv@1.1.3:
1067 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
1068 | dev: true
1069 |
1070 | /doctrine@3.0.0:
1071 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
1072 | engines: {node: '>=6.0.0'}
1073 | dependencies:
1074 | esutils: 2.0.3
1075 | dev: true
1076 |
1077 | /eastasianwidth@0.2.0:
1078 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
1079 | dev: true
1080 |
1081 | /electron-to-chromium@1.4.679:
1082 | resolution: {integrity: sha512-NhQMsz5k0d6m9z3qAxnsOR/ebal4NAGsrNVRwcDo4Kc/zQ7KdsTKZUxZoygHcVRb0QDW3waEDIcE3isZ79RP6g==}
1083 | dev: true
1084 |
1085 | /emoji-regex@8.0.0:
1086 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
1087 | dev: true
1088 |
1089 | /emoji-regex@9.2.2:
1090 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
1091 | dev: true
1092 |
1093 | /esbuild@0.19.12:
1094 | resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==}
1095 | engines: {node: '>=12'}
1096 | hasBin: true
1097 | requiresBuild: true
1098 | optionalDependencies:
1099 | '@esbuild/aix-ppc64': 0.19.12
1100 | '@esbuild/android-arm': 0.19.12
1101 | '@esbuild/android-arm64': 0.19.12
1102 | '@esbuild/android-x64': 0.19.12
1103 | '@esbuild/darwin-arm64': 0.19.12
1104 | '@esbuild/darwin-x64': 0.19.12
1105 | '@esbuild/freebsd-arm64': 0.19.12
1106 | '@esbuild/freebsd-x64': 0.19.12
1107 | '@esbuild/linux-arm': 0.19.12
1108 | '@esbuild/linux-arm64': 0.19.12
1109 | '@esbuild/linux-ia32': 0.19.12
1110 | '@esbuild/linux-loong64': 0.19.12
1111 | '@esbuild/linux-mips64el': 0.19.12
1112 | '@esbuild/linux-ppc64': 0.19.12
1113 | '@esbuild/linux-riscv64': 0.19.12
1114 | '@esbuild/linux-s390x': 0.19.12
1115 | '@esbuild/linux-x64': 0.19.12
1116 | '@esbuild/netbsd-x64': 0.19.12
1117 | '@esbuild/openbsd-x64': 0.19.12
1118 | '@esbuild/sunos-x64': 0.19.12
1119 | '@esbuild/win32-arm64': 0.19.12
1120 | '@esbuild/win32-ia32': 0.19.12
1121 | '@esbuild/win32-x64': 0.19.12
1122 | dev: true
1123 |
1124 | /escalade@3.1.2:
1125 | resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
1126 | engines: {node: '>=6'}
1127 | dev: true
1128 |
1129 | /escape-string-regexp@4.0.0:
1130 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
1131 | engines: {node: '>=10'}
1132 | dev: true
1133 |
1134 | /eslint-plugin-react-hooks@4.6.0(eslint@8.56.0):
1135 | resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
1136 | engines: {node: '>=10'}
1137 | peerDependencies:
1138 | eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
1139 | dependencies:
1140 | eslint: 8.56.0
1141 | dev: true
1142 |
1143 | /eslint-plugin-react-refresh@0.4.5(eslint@8.56.0):
1144 | resolution: {integrity: sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==}
1145 | peerDependencies:
1146 | eslint: '>=7'
1147 | dependencies:
1148 | eslint: 8.56.0
1149 | dev: true
1150 |
1151 | /eslint-scope@7.2.2:
1152 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
1153 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1154 | dependencies:
1155 | esrecurse: 4.3.0
1156 | estraverse: 5.3.0
1157 | dev: true
1158 |
1159 | /eslint-visitor-keys@3.4.3:
1160 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
1161 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1162 | dev: true
1163 |
1164 | /eslint@8.56.0:
1165 | resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==}
1166 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1167 | hasBin: true
1168 | dependencies:
1169 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
1170 | '@eslint-community/regexpp': 4.10.0
1171 | '@eslint/eslintrc': 2.1.4
1172 | '@eslint/js': 8.56.0
1173 | '@humanwhocodes/config-array': 0.11.14
1174 | '@humanwhocodes/module-importer': 1.0.1
1175 | '@nodelib/fs.walk': 1.2.8
1176 | '@ungap/structured-clone': 1.2.0
1177 | ajv: 6.12.6
1178 | chalk: 4.1.2
1179 | cross-spawn: 7.0.3
1180 | debug: 4.3.4
1181 | doctrine: 3.0.0
1182 | escape-string-regexp: 4.0.0
1183 | eslint-scope: 7.2.2
1184 | eslint-visitor-keys: 3.4.3
1185 | espree: 9.6.1
1186 | esquery: 1.5.0
1187 | esutils: 2.0.3
1188 | fast-deep-equal: 3.1.3
1189 | file-entry-cache: 6.0.1
1190 | find-up: 5.0.0
1191 | glob-parent: 6.0.2
1192 | globals: 13.24.0
1193 | graphemer: 1.4.0
1194 | ignore: 5.3.1
1195 | imurmurhash: 0.1.4
1196 | is-glob: 4.0.3
1197 | is-path-inside: 3.0.3
1198 | js-yaml: 4.1.0
1199 | json-stable-stringify-without-jsonify: 1.0.1
1200 | levn: 0.4.1
1201 | lodash.merge: 4.6.2
1202 | minimatch: 3.1.2
1203 | natural-compare: 1.4.0
1204 | optionator: 0.9.3
1205 | strip-ansi: 6.0.1
1206 | text-table: 0.2.0
1207 | transitivePeerDependencies:
1208 | - supports-color
1209 | dev: true
1210 |
1211 | /espree@9.6.1:
1212 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
1213 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1214 | dependencies:
1215 | acorn: 8.11.3
1216 | acorn-jsx: 5.3.2(acorn@8.11.3)
1217 | eslint-visitor-keys: 3.4.3
1218 | dev: true
1219 |
1220 | /esquery@1.5.0:
1221 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
1222 | engines: {node: '>=0.10'}
1223 | dependencies:
1224 | estraverse: 5.3.0
1225 | dev: true
1226 |
1227 | /esrecurse@4.3.0:
1228 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
1229 | engines: {node: '>=4.0'}
1230 | dependencies:
1231 | estraverse: 5.3.0
1232 | dev: true
1233 |
1234 | /estraverse@5.3.0:
1235 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
1236 | engines: {node: '>=4.0'}
1237 | dev: true
1238 |
1239 | /esutils@2.0.3:
1240 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
1241 | engines: {node: '>=0.10.0'}
1242 | dev: true
1243 |
1244 | /fast-deep-equal@3.1.3:
1245 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
1246 | dev: true
1247 |
1248 | /fast-glob@3.3.2:
1249 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
1250 | engines: {node: '>=8.6.0'}
1251 | dependencies:
1252 | '@nodelib/fs.stat': 2.0.5
1253 | '@nodelib/fs.walk': 1.2.8
1254 | glob-parent: 5.1.2
1255 | merge2: 1.4.1
1256 | micromatch: 4.0.5
1257 | dev: true
1258 |
1259 | /fast-json-stable-stringify@2.1.0:
1260 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
1261 | dev: true
1262 |
1263 | /fast-levenshtein@2.0.6:
1264 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
1265 | dev: true
1266 |
1267 | /fastq@1.17.1:
1268 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
1269 | dependencies:
1270 | reusify: 1.0.4
1271 | dev: true
1272 |
1273 | /file-entry-cache@6.0.1:
1274 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
1275 | engines: {node: ^10.12.0 || >=12.0.0}
1276 | dependencies:
1277 | flat-cache: 3.2.0
1278 | dev: true
1279 |
1280 | /fill-range@7.0.1:
1281 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
1282 | engines: {node: '>=8'}
1283 | dependencies:
1284 | to-regex-range: 5.0.1
1285 | dev: true
1286 |
1287 | /find-up@5.0.0:
1288 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
1289 | engines: {node: '>=10'}
1290 | dependencies:
1291 | locate-path: 6.0.0
1292 | path-exists: 4.0.0
1293 | dev: true
1294 |
1295 | /flat-cache@3.2.0:
1296 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
1297 | engines: {node: ^10.12.0 || >=12.0.0}
1298 | dependencies:
1299 | flatted: 3.3.1
1300 | keyv: 4.5.4
1301 | rimraf: 3.0.2
1302 | dev: true
1303 |
1304 | /flatted@3.3.1:
1305 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
1306 | dev: true
1307 |
1308 | /foreground-child@3.1.1:
1309 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==}
1310 | engines: {node: '>=14'}
1311 | dependencies:
1312 | cross-spawn: 7.0.3
1313 | signal-exit: 4.1.0
1314 | dev: true
1315 |
1316 | /fraction.js@4.3.7:
1317 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
1318 | dev: true
1319 |
1320 | /fs.realpath@1.0.0:
1321 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
1322 | dev: true
1323 |
1324 | /fsevents@2.3.3:
1325 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
1326 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
1327 | os: [darwin]
1328 | requiresBuild: true
1329 | dev: true
1330 | optional: true
1331 |
1332 | /function-bind@1.1.2:
1333 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
1334 | dev: true
1335 |
1336 | /glob-parent@5.1.2:
1337 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
1338 | engines: {node: '>= 6'}
1339 | dependencies:
1340 | is-glob: 4.0.3
1341 | dev: true
1342 |
1343 | /glob-parent@6.0.2:
1344 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
1345 | engines: {node: '>=10.13.0'}
1346 | dependencies:
1347 | is-glob: 4.0.3
1348 | dev: true
1349 |
1350 | /glob@10.3.10:
1351 | resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==}
1352 | engines: {node: '>=16 || 14 >=14.17'}
1353 | hasBin: true
1354 | dependencies:
1355 | foreground-child: 3.1.1
1356 | jackspeak: 2.3.6
1357 | minimatch: 9.0.3
1358 | minipass: 7.0.4
1359 | path-scurry: 1.10.1
1360 | dev: true
1361 |
1362 | /glob@7.2.3:
1363 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
1364 | dependencies:
1365 | fs.realpath: 1.0.0
1366 | inflight: 1.0.6
1367 | inherits: 2.0.4
1368 | minimatch: 3.1.2
1369 | once: 1.4.0
1370 | path-is-absolute: 1.0.1
1371 | dev: true
1372 |
1373 | /globals@13.24.0:
1374 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
1375 | engines: {node: '>=8'}
1376 | dependencies:
1377 | type-fest: 0.20.2
1378 | dev: true
1379 |
1380 | /globby@11.1.0:
1381 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
1382 | engines: {node: '>=10'}
1383 | dependencies:
1384 | array-union: 2.1.0
1385 | dir-glob: 3.0.1
1386 | fast-glob: 3.3.2
1387 | ignore: 5.3.1
1388 | merge2: 1.4.1
1389 | slash: 3.0.0
1390 | dev: true
1391 |
1392 | /graphemer@1.4.0:
1393 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
1394 | dev: true
1395 |
1396 | /has-flag@4.0.0:
1397 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
1398 | engines: {node: '>=8'}
1399 | dev: true
1400 |
1401 | /hasown@2.0.1:
1402 | resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==}
1403 | engines: {node: '>= 0.4'}
1404 | dependencies:
1405 | function-bind: 1.1.2
1406 | dev: true
1407 |
1408 | /ignore@5.3.1:
1409 | resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
1410 | engines: {node: '>= 4'}
1411 | dev: true
1412 |
1413 | /import-fresh@3.3.0:
1414 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
1415 | engines: {node: '>=6'}
1416 | dependencies:
1417 | parent-module: 1.0.1
1418 | resolve-from: 4.0.0
1419 | dev: true
1420 |
1421 | /imurmurhash@0.1.4:
1422 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
1423 | engines: {node: '>=0.8.19'}
1424 | dev: true
1425 |
1426 | /inflight@1.0.6:
1427 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
1428 | dependencies:
1429 | once: 1.4.0
1430 | wrappy: 1.0.2
1431 | dev: true
1432 |
1433 | /inherits@2.0.4:
1434 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
1435 | dev: true
1436 |
1437 | /is-binary-path@2.1.0:
1438 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
1439 | engines: {node: '>=8'}
1440 | dependencies:
1441 | binary-extensions: 2.2.0
1442 | dev: true
1443 |
1444 | /is-core-module@2.13.1:
1445 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
1446 | dependencies:
1447 | hasown: 2.0.1
1448 | dev: true
1449 |
1450 | /is-extglob@2.1.1:
1451 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
1452 | engines: {node: '>=0.10.0'}
1453 | dev: true
1454 |
1455 | /is-fullwidth-code-point@3.0.0:
1456 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
1457 | engines: {node: '>=8'}
1458 | dev: true
1459 |
1460 | /is-glob@4.0.3:
1461 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
1462 | engines: {node: '>=0.10.0'}
1463 | dependencies:
1464 | is-extglob: 2.1.1
1465 | dev: true
1466 |
1467 | /is-number@7.0.0:
1468 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
1469 | engines: {node: '>=0.12.0'}
1470 | dev: true
1471 |
1472 | /is-path-inside@3.0.3:
1473 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
1474 | engines: {node: '>=8'}
1475 | dev: true
1476 |
1477 | /isexe@2.0.0:
1478 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
1479 | dev: true
1480 |
1481 | /jackspeak@2.3.6:
1482 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
1483 | engines: {node: '>=14'}
1484 | dependencies:
1485 | '@isaacs/cliui': 8.0.2
1486 | optionalDependencies:
1487 | '@pkgjs/parseargs': 0.11.0
1488 | dev: true
1489 |
1490 | /jiti@1.21.0:
1491 | resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==}
1492 | hasBin: true
1493 | dev: true
1494 |
1495 | /js-tokens@4.0.0:
1496 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
1497 | dev: false
1498 |
1499 | /js-yaml@4.1.0:
1500 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
1501 | hasBin: true
1502 | dependencies:
1503 | argparse: 2.0.1
1504 | dev: true
1505 |
1506 | /json-buffer@3.0.1:
1507 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
1508 | dev: true
1509 |
1510 | /json-schema-traverse@0.4.1:
1511 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
1512 | dev: true
1513 |
1514 | /json-stable-stringify-without-jsonify@1.0.1:
1515 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
1516 | dev: true
1517 |
1518 | /keyv@4.5.4:
1519 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
1520 | dependencies:
1521 | json-buffer: 3.0.1
1522 | dev: true
1523 |
1524 | /levn@0.4.1:
1525 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
1526 | engines: {node: '>= 0.8.0'}
1527 | dependencies:
1528 | prelude-ls: 1.2.1
1529 | type-check: 0.4.0
1530 | dev: true
1531 |
1532 | /lilconfig@2.1.0:
1533 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
1534 | engines: {node: '>=10'}
1535 | dev: true
1536 |
1537 | /lilconfig@3.1.1:
1538 | resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==}
1539 | engines: {node: '>=14'}
1540 | dev: true
1541 |
1542 | /lines-and-columns@1.2.4:
1543 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
1544 | dev: true
1545 |
1546 | /locate-path@6.0.0:
1547 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
1548 | engines: {node: '>=10'}
1549 | dependencies:
1550 | p-locate: 5.0.0
1551 | dev: true
1552 |
1553 | /lodash.merge@4.6.2:
1554 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
1555 | dev: true
1556 |
1557 | /loose-envify@1.4.0:
1558 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
1559 | hasBin: true
1560 | dependencies:
1561 | js-tokens: 4.0.0
1562 | dev: false
1563 |
1564 | /lru-cache@10.2.0:
1565 | resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==}
1566 | engines: {node: 14 || >=16.14}
1567 | dev: true
1568 |
1569 | /lru-cache@6.0.0:
1570 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
1571 | engines: {node: '>=10'}
1572 | dependencies:
1573 | yallist: 4.0.0
1574 | dev: true
1575 |
1576 | /merge2@1.4.1:
1577 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
1578 | engines: {node: '>= 8'}
1579 | dev: true
1580 |
1581 | /micromatch@4.0.5:
1582 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
1583 | engines: {node: '>=8.6'}
1584 | dependencies:
1585 | braces: 3.0.2
1586 | picomatch: 2.3.1
1587 | dev: true
1588 |
1589 | /minimatch@3.1.2:
1590 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
1591 | dependencies:
1592 | brace-expansion: 1.1.11
1593 | dev: true
1594 |
1595 | /minimatch@9.0.3:
1596 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
1597 | engines: {node: '>=16 || 14 >=14.17'}
1598 | dependencies:
1599 | brace-expansion: 2.0.1
1600 | dev: true
1601 |
1602 | /minipass@7.0.4:
1603 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==}
1604 | engines: {node: '>=16 || 14 >=14.17'}
1605 | dev: true
1606 |
1607 | /ms@2.1.2:
1608 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
1609 | dev: true
1610 |
1611 | /mz@2.7.0:
1612 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
1613 | dependencies:
1614 | any-promise: 1.3.0
1615 | object-assign: 4.1.1
1616 | thenify-all: 1.6.0
1617 | dev: true
1618 |
1619 | /nanoid@3.3.7:
1620 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
1621 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
1622 | hasBin: true
1623 | dev: true
1624 |
1625 | /natural-compare@1.4.0:
1626 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
1627 | dev: true
1628 |
1629 | /node-releases@2.0.14:
1630 | resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
1631 | dev: true
1632 |
1633 | /normalize-path@3.0.0:
1634 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
1635 | engines: {node: '>=0.10.0'}
1636 | dev: true
1637 |
1638 | /normalize-range@0.1.2:
1639 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
1640 | engines: {node: '>=0.10.0'}
1641 | dev: true
1642 |
1643 | /object-assign@4.1.1:
1644 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
1645 | engines: {node: '>=0.10.0'}
1646 | dev: true
1647 |
1648 | /object-hash@3.0.0:
1649 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
1650 | engines: {node: '>= 6'}
1651 | dev: true
1652 |
1653 | /once@1.4.0:
1654 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
1655 | dependencies:
1656 | wrappy: 1.0.2
1657 | dev: true
1658 |
1659 | /optionator@0.9.3:
1660 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
1661 | engines: {node: '>= 0.8.0'}
1662 | dependencies:
1663 | '@aashutoshrathi/word-wrap': 1.2.6
1664 | deep-is: 0.1.4
1665 | fast-levenshtein: 2.0.6
1666 | levn: 0.4.1
1667 | prelude-ls: 1.2.1
1668 | type-check: 0.4.0
1669 | dev: true
1670 |
1671 | /p-limit@3.1.0:
1672 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
1673 | engines: {node: '>=10'}
1674 | dependencies:
1675 | yocto-queue: 0.1.0
1676 | dev: true
1677 |
1678 | /p-locate@5.0.0:
1679 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
1680 | engines: {node: '>=10'}
1681 | dependencies:
1682 | p-limit: 3.1.0
1683 | dev: true
1684 |
1685 | /parent-module@1.0.1:
1686 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
1687 | engines: {node: '>=6'}
1688 | dependencies:
1689 | callsites: 3.1.0
1690 | dev: true
1691 |
1692 | /path-exists@4.0.0:
1693 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
1694 | engines: {node: '>=8'}
1695 | dev: true
1696 |
1697 | /path-is-absolute@1.0.1:
1698 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
1699 | engines: {node: '>=0.10.0'}
1700 | dev: true
1701 |
1702 | /path-key@3.1.1:
1703 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
1704 | engines: {node: '>=8'}
1705 | dev: true
1706 |
1707 | /path-parse@1.0.7:
1708 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
1709 | dev: true
1710 |
1711 | /path-scurry@1.10.1:
1712 | resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==}
1713 | engines: {node: '>=16 || 14 >=14.17'}
1714 | dependencies:
1715 | lru-cache: 10.2.0
1716 | minipass: 7.0.4
1717 | dev: true
1718 |
1719 | /path-type@4.0.0:
1720 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
1721 | engines: {node: '>=8'}
1722 | dev: true
1723 |
1724 | /picocolors@1.0.0:
1725 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
1726 | dev: true
1727 |
1728 | /picomatch@2.3.1:
1729 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
1730 | engines: {node: '>=8.6'}
1731 | dev: true
1732 |
1733 | /pify@2.3.0:
1734 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
1735 | engines: {node: '>=0.10.0'}
1736 | dev: true
1737 |
1738 | /pirates@4.0.6:
1739 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
1740 | engines: {node: '>= 6'}
1741 | dev: true
1742 |
1743 | /postcss-import@15.1.0(postcss@8.4.35):
1744 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
1745 | engines: {node: '>=14.0.0'}
1746 | peerDependencies:
1747 | postcss: ^8.0.0
1748 | dependencies:
1749 | postcss: 8.4.35
1750 | postcss-value-parser: 4.2.0
1751 | read-cache: 1.0.0
1752 | resolve: 1.22.8
1753 | dev: true
1754 |
1755 | /postcss-js@4.0.1(postcss@8.4.35):
1756 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
1757 | engines: {node: ^12 || ^14 || >= 16}
1758 | peerDependencies:
1759 | postcss: ^8.4.21
1760 | dependencies:
1761 | camelcase-css: 2.0.1
1762 | postcss: 8.4.35
1763 | dev: true
1764 |
1765 | /postcss-load-config@4.0.2(postcss@8.4.35):
1766 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
1767 | engines: {node: '>= 14'}
1768 | peerDependencies:
1769 | postcss: '>=8.0.9'
1770 | ts-node: '>=9.0.0'
1771 | peerDependenciesMeta:
1772 | postcss:
1773 | optional: true
1774 | ts-node:
1775 | optional: true
1776 | dependencies:
1777 | lilconfig: 3.1.1
1778 | postcss: 8.4.35
1779 | yaml: 2.3.4
1780 | dev: true
1781 |
1782 | /postcss-nested@6.0.1(postcss@8.4.35):
1783 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
1784 | engines: {node: '>=12.0'}
1785 | peerDependencies:
1786 | postcss: ^8.2.14
1787 | dependencies:
1788 | postcss: 8.4.35
1789 | postcss-selector-parser: 6.0.15
1790 | dev: true
1791 |
1792 | /postcss-selector-parser@6.0.15:
1793 | resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==}
1794 | engines: {node: '>=4'}
1795 | dependencies:
1796 | cssesc: 3.0.0
1797 | util-deprecate: 1.0.2
1798 | dev: true
1799 |
1800 | /postcss-value-parser@4.2.0:
1801 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
1802 | dev: true
1803 |
1804 | /postcss@8.4.35:
1805 | resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==}
1806 | engines: {node: ^10 || ^12 || >=14}
1807 | dependencies:
1808 | nanoid: 3.3.7
1809 | picocolors: 1.0.0
1810 | source-map-js: 1.0.2
1811 | dev: true
1812 |
1813 | /prelude-ls@1.2.1:
1814 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
1815 | engines: {node: '>= 0.8.0'}
1816 | dev: true
1817 |
1818 | /punycode@2.3.1:
1819 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
1820 | engines: {node: '>=6'}
1821 | dev: true
1822 |
1823 | /queue-microtask@1.2.3:
1824 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
1825 | dev: true
1826 |
1827 | /react-dom@18.2.0(react@18.2.0):
1828 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
1829 | peerDependencies:
1830 | react: ^18.2.0
1831 | dependencies:
1832 | loose-envify: 1.4.0
1833 | react: 18.2.0
1834 | scheduler: 0.23.0
1835 | dev: false
1836 |
1837 | /react@18.2.0:
1838 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
1839 | engines: {node: '>=0.10.0'}
1840 | dependencies:
1841 | loose-envify: 1.4.0
1842 | dev: false
1843 |
1844 | /read-cache@1.0.0:
1845 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
1846 | dependencies:
1847 | pify: 2.3.0
1848 | dev: true
1849 |
1850 | /readdirp@3.6.0:
1851 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
1852 | engines: {node: '>=8.10.0'}
1853 | dependencies:
1854 | picomatch: 2.3.1
1855 | dev: true
1856 |
1857 | /resolve-from@4.0.0:
1858 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
1859 | engines: {node: '>=4'}
1860 | dev: true
1861 |
1862 | /resolve@1.22.8:
1863 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
1864 | hasBin: true
1865 | dependencies:
1866 | is-core-module: 2.13.1
1867 | path-parse: 1.0.7
1868 | supports-preserve-symlinks-flag: 1.0.0
1869 | dev: true
1870 |
1871 | /reusify@1.0.4:
1872 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
1873 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
1874 | dev: true
1875 |
1876 | /rimraf@3.0.2:
1877 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
1878 | hasBin: true
1879 | dependencies:
1880 | glob: 7.2.3
1881 | dev: true
1882 |
1883 | /robot3@0.4.1:
1884 | resolution: {integrity: sha512-hzjy826lrxzx8eRgv80idkf8ua1JAepRc9Efdtj03N3KNJuznQCPlyCJ7gnUmDFwZCLQjxy567mQVKmdv2BsXQ==}
1885 | dev: false
1886 |
1887 | /rollup@4.12.0:
1888 | resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==}
1889 | engines: {node: '>=18.0.0', npm: '>=8.0.0'}
1890 | hasBin: true
1891 | dependencies:
1892 | '@types/estree': 1.0.5
1893 | optionalDependencies:
1894 | '@rollup/rollup-android-arm-eabi': 4.12.0
1895 | '@rollup/rollup-android-arm64': 4.12.0
1896 | '@rollup/rollup-darwin-arm64': 4.12.0
1897 | '@rollup/rollup-darwin-x64': 4.12.0
1898 | '@rollup/rollup-linux-arm-gnueabihf': 4.12.0
1899 | '@rollup/rollup-linux-arm64-gnu': 4.12.0
1900 | '@rollup/rollup-linux-arm64-musl': 4.12.0
1901 | '@rollup/rollup-linux-riscv64-gnu': 4.12.0
1902 | '@rollup/rollup-linux-x64-gnu': 4.12.0
1903 | '@rollup/rollup-linux-x64-musl': 4.12.0
1904 | '@rollup/rollup-win32-arm64-msvc': 4.12.0
1905 | '@rollup/rollup-win32-ia32-msvc': 4.12.0
1906 | '@rollup/rollup-win32-x64-msvc': 4.12.0
1907 | fsevents: 2.3.3
1908 | dev: true
1909 |
1910 | /run-parallel@1.2.0:
1911 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
1912 | dependencies:
1913 | queue-microtask: 1.2.3
1914 | dev: true
1915 |
1916 | /scheduler@0.23.0:
1917 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
1918 | dependencies:
1919 | loose-envify: 1.4.0
1920 | dev: false
1921 |
1922 | /semver@7.6.0:
1923 | resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==}
1924 | engines: {node: '>=10'}
1925 | hasBin: true
1926 | dependencies:
1927 | lru-cache: 6.0.0
1928 | dev: true
1929 |
1930 | /shebang-command@2.0.0:
1931 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
1932 | engines: {node: '>=8'}
1933 | dependencies:
1934 | shebang-regex: 3.0.0
1935 | dev: true
1936 |
1937 | /shebang-regex@3.0.0:
1938 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
1939 | engines: {node: '>=8'}
1940 | dev: true
1941 |
1942 | /signal-exit@4.1.0:
1943 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
1944 | engines: {node: '>=14'}
1945 | dev: true
1946 |
1947 | /slash@3.0.0:
1948 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
1949 | engines: {node: '>=8'}
1950 | dev: true
1951 |
1952 | /source-map-js@1.0.2:
1953 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
1954 | engines: {node: '>=0.10.0'}
1955 | dev: true
1956 |
1957 | /string-width@4.2.3:
1958 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
1959 | engines: {node: '>=8'}
1960 | dependencies:
1961 | emoji-regex: 8.0.0
1962 | is-fullwidth-code-point: 3.0.0
1963 | strip-ansi: 6.0.1
1964 | dev: true
1965 |
1966 | /string-width@5.1.2:
1967 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
1968 | engines: {node: '>=12'}
1969 | dependencies:
1970 | eastasianwidth: 0.2.0
1971 | emoji-regex: 9.2.2
1972 | strip-ansi: 7.1.0
1973 | dev: true
1974 |
1975 | /strip-ansi@6.0.1:
1976 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
1977 | engines: {node: '>=8'}
1978 | dependencies:
1979 | ansi-regex: 5.0.1
1980 | dev: true
1981 |
1982 | /strip-ansi@7.1.0:
1983 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
1984 | engines: {node: '>=12'}
1985 | dependencies:
1986 | ansi-regex: 6.0.1
1987 | dev: true
1988 |
1989 | /strip-json-comments@3.1.1:
1990 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
1991 | engines: {node: '>=8'}
1992 | dev: true
1993 |
1994 | /sucrase@3.35.0:
1995 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
1996 | engines: {node: '>=16 || 14 >=14.17'}
1997 | hasBin: true
1998 | dependencies:
1999 | '@jridgewell/gen-mapping': 0.3.3
2000 | commander: 4.1.1
2001 | glob: 10.3.10
2002 | lines-and-columns: 1.2.4
2003 | mz: 2.7.0
2004 | pirates: 4.0.6
2005 | ts-interface-checker: 0.1.13
2006 | dev: true
2007 |
2008 | /supports-color@7.2.0:
2009 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
2010 | engines: {node: '>=8'}
2011 | dependencies:
2012 | has-flag: 4.0.0
2013 | dev: true
2014 |
2015 | /supports-preserve-symlinks-flag@1.0.0:
2016 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
2017 | engines: {node: '>= 0.4'}
2018 | dev: true
2019 |
2020 | /tailwindcss@3.4.1:
2021 | resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==}
2022 | engines: {node: '>=14.0.0'}
2023 | hasBin: true
2024 | dependencies:
2025 | '@alloc/quick-lru': 5.2.0
2026 | arg: 5.0.2
2027 | chokidar: 3.6.0
2028 | didyoumean: 1.2.2
2029 | dlv: 1.1.3
2030 | fast-glob: 3.3.2
2031 | glob-parent: 6.0.2
2032 | is-glob: 4.0.3
2033 | jiti: 1.21.0
2034 | lilconfig: 2.1.0
2035 | micromatch: 4.0.5
2036 | normalize-path: 3.0.0
2037 | object-hash: 3.0.0
2038 | picocolors: 1.0.0
2039 | postcss: 8.4.35
2040 | postcss-import: 15.1.0(postcss@8.4.35)
2041 | postcss-js: 4.0.1(postcss@8.4.35)
2042 | postcss-load-config: 4.0.2(postcss@8.4.35)
2043 | postcss-nested: 6.0.1(postcss@8.4.35)
2044 | postcss-selector-parser: 6.0.15
2045 | resolve: 1.22.8
2046 | sucrase: 3.35.0
2047 | transitivePeerDependencies:
2048 | - ts-node
2049 | dev: true
2050 |
2051 | /text-table@0.2.0:
2052 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
2053 | dev: true
2054 |
2055 | /thenify-all@1.6.0:
2056 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
2057 | engines: {node: '>=0.8'}
2058 | dependencies:
2059 | thenify: 3.3.1
2060 | dev: true
2061 |
2062 | /thenify@3.3.1:
2063 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
2064 | dependencies:
2065 | any-promise: 1.3.0
2066 | dev: true
2067 |
2068 | /to-regex-range@5.0.1:
2069 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
2070 | engines: {node: '>=8.0'}
2071 | dependencies:
2072 | is-number: 7.0.0
2073 | dev: true
2074 |
2075 | /ts-api-utils@1.2.1(typescript@5.3.3):
2076 | resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==}
2077 | engines: {node: '>=16'}
2078 | peerDependencies:
2079 | typescript: '>=4.2.0'
2080 | dependencies:
2081 | typescript: 5.3.3
2082 | dev: true
2083 |
2084 | /ts-interface-checker@0.1.13:
2085 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
2086 | dev: true
2087 |
2088 | /tslib@2.6.2:
2089 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
2090 | dev: false
2091 |
2092 | /type-check@0.4.0:
2093 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
2094 | engines: {node: '>= 0.8.0'}
2095 | dependencies:
2096 | prelude-ls: 1.2.1
2097 | dev: true
2098 |
2099 | /type-fest@0.20.2:
2100 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
2101 | engines: {node: '>=10'}
2102 | dev: true
2103 |
2104 | /typescript@5.3.3:
2105 | resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
2106 | engines: {node: '>=14.17'}
2107 | hasBin: true
2108 | dev: true
2109 |
2110 | /update-browserslist-db@1.0.13(browserslist@4.23.0):
2111 | resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
2112 | hasBin: true
2113 | peerDependencies:
2114 | browserslist: '>= 4.21.0'
2115 | dependencies:
2116 | browserslist: 4.23.0
2117 | escalade: 3.1.2
2118 | picocolors: 1.0.0
2119 | dev: true
2120 |
2121 | /uri-js@4.4.1:
2122 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
2123 | dependencies:
2124 | punycode: 2.3.1
2125 | dev: true
2126 |
2127 | /util-deprecate@1.0.2:
2128 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
2129 | dev: true
2130 |
2131 | /uuid-random@1.3.2:
2132 | resolution: {integrity: sha512-UOzej0Le/UgkbWEO8flm+0y+G+ljUon1QWTEZOq1rnMAsxo2+SckbiZdKzAHHlVh6gJqI1TjC/xwgR50MuCrBQ==}
2133 | dev: false
2134 |
2135 | /vite@5.1.4:
2136 | resolution: {integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==}
2137 | engines: {node: ^18.0.0 || >=20.0.0}
2138 | hasBin: true
2139 | peerDependencies:
2140 | '@types/node': ^18.0.0 || >=20.0.0
2141 | less: '*'
2142 | lightningcss: ^1.21.0
2143 | sass: '*'
2144 | stylus: '*'
2145 | sugarss: '*'
2146 | terser: ^5.4.0
2147 | peerDependenciesMeta:
2148 | '@types/node':
2149 | optional: true
2150 | less:
2151 | optional: true
2152 | lightningcss:
2153 | optional: true
2154 | sass:
2155 | optional: true
2156 | stylus:
2157 | optional: true
2158 | sugarss:
2159 | optional: true
2160 | terser:
2161 | optional: true
2162 | dependencies:
2163 | esbuild: 0.19.12
2164 | postcss: 8.4.35
2165 | rollup: 4.12.0
2166 | optionalDependencies:
2167 | fsevents: 2.3.3
2168 | dev: true
2169 |
2170 | /which@2.0.2:
2171 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
2172 | engines: {node: '>= 8'}
2173 | hasBin: true
2174 | dependencies:
2175 | isexe: 2.0.0
2176 | dev: true
2177 |
2178 | /wrap-ansi@7.0.0:
2179 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
2180 | engines: {node: '>=10'}
2181 | dependencies:
2182 | ansi-styles: 4.3.0
2183 | string-width: 4.2.3
2184 | strip-ansi: 6.0.1
2185 | dev: true
2186 |
2187 | /wrap-ansi@8.1.0:
2188 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
2189 | engines: {node: '>=12'}
2190 | dependencies:
2191 | ansi-styles: 6.2.1
2192 | string-width: 5.1.2
2193 | strip-ansi: 7.1.0
2194 | dev: true
2195 |
2196 | /wrappy@1.0.2:
2197 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
2198 | dev: true
2199 |
2200 | /yallist@4.0.0:
2201 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
2202 | dev: true
2203 |
2204 | /yaml@2.3.4:
2205 | resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==}
2206 | engines: {node: '>= 14'}
2207 | dev: true
2208 |
2209 | /yocto-queue@0.1.0:
2210 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
2211 | engines: {node: '>=10'}
2212 | dev: true
2213 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/public/icons/icon128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaelbzhu/browserdiffusion/5dd439a16d6c0608e79a8adeddbd3792e41cdb66/public/icons/icon128.png
--------------------------------------------------------------------------------
/public/icons/icon16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaelbzhu/browserdiffusion/5dd439a16d6c0608e79a8adeddbd3792e41cdb66/public/icons/icon16.png
--------------------------------------------------------------------------------
/public/icons/icon32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaelbzhu/browserdiffusion/5dd439a16d6c0608e79a8adeddbd3792e41cdb66/public/icons/icon32.png
--------------------------------------------------------------------------------
/public/icons/icon48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaelbzhu/browserdiffusion/5dd439a16d6c0608e79a8adeddbd3792e41cdb66/public/icons/icon48.png
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "manifest_version": 3,
3 | "name": "Browser Diffusion",
4 |
5 | "version": "1.0.0",
6 | "description": "Browser Diffusion",
7 | "action": {
8 | "default_popup": "index.html",
9 | "default_title": "open"
10 | },
11 | "icons": {
12 | "16": "icons/icon16.png",
13 | "32": "icons/icon32.png",
14 | "48": "icons/icon48.png",
15 | "128": "icons/icon128.png"
16 | },
17 | "permissions": ["storage", "scripting", "tabs", "activeTab"],
18 | "content_scripts": [
19 | {
20 | "matches": [""],
21 | "js": ["contentScript.bundle.js"]
22 | }
23 | ]
24 | }
25 |
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
--------------------------------------------------------------------------------
/src/App.tsx:
--------------------------------------------------------------------------------
1 | import "./App.css";
2 | import * as fal from "@fal-ai/serverless-client";
3 | import View from "./View";
4 | import { withTabId } from "./utils";
5 |
6 | function App() {
7 | // setup fal
8 | fal.config({
9 | credentials: import.meta.env.VITE_FAL_CREDENTIALS,
10 | });
11 |
12 | const connection = fal.realtime.connect("fal-ai/lcm", {
13 | onResult: (result) => {
14 | let newImageUrl = result.images[0].url;
15 | withTabId((tabId) => {
16 | // After receiving the new image URL, send a message to the content script to update the specific image
17 | chrome.tabs.sendMessage(tabId, {
18 | action: "updateSingleImage",
19 | originalUrl: result.request_id,
20 | newImageUrl: newImageUrl,
21 | });
22 | });
23 | },
24 | onError: (error) => {
25 | console.error("uh oh fal individual image gen attempt failed for img ");
26 | console.error(error);
27 | },
28 | });
29 |
30 | const sendToFal = (img: any, user_prompt: string) => {
31 | const prompt =
32 | user_prompt.length > 0
33 | ? user_prompt
34 | : "((anime, masterpiece)), vibrant, high-contrast, high-quality, manga";
35 | connection.send({
36 | prompt,
37 | sync_mode: true,
38 | image_url: img.croppedb64Image,
39 | guidance_scale: 1.2,
40 | negative_prompt:
41 | "watercolor, dull, nsfw, (worst quality, low quality:1.3), (depth of field, blurry:1.2), (greyscale, monochrome:1.1), 3D face, nose, cropped, lowres, text, jpeg artifacts, signature, watermark, username, blurry, artist name, trademark, watermark, title, (tan, muscular, loli, petite, child, infant, toddlers, chibi, sd character:1.1), multiple view, Reference sheet,",
42 | num_inference_steps: 5,
43 | enable_safety_checks: false,
44 | num_images: 1,
45 | strength: 0.6, //the lower the value, the more true to the original image
46 | request_id: img.imageUrl,
47 | });
48 | };
49 |
50 | return ;
51 | }
52 |
53 | export default App;
54 |
--------------------------------------------------------------------------------
/src/View.tsx:
--------------------------------------------------------------------------------
1 | import { FC, useEffect, useState } from "react";
2 | import animeSkylinePhoto from "./assets/animeskyline.jpeg";
3 | import realSkylinePhoto from "./assets/realskyline.jpeg";
4 | import { withTabId } from "./utils";
5 |
6 | type ViewProps = {
7 | sendToFal: (img: any, user_prompt: string) => void;
8 | };
9 |
10 | const delay = (ms: number) => {
11 | return new Promise((resolve) => setTimeout(resolve, ms));
12 | };
13 |
14 | let didInit = false;
15 |
16 | const View: FC = ({ sendToFal }) => {
17 | const [isReplacing, setIsReplacing] = useState(false);
18 | const [prompt, setPrompt] = useState("");
19 |
20 | useEffect(() => {
21 | if (didInit) return;
22 | didInit = true;
23 |
24 | withTabId(async (tabId) => {
25 | // get badge text
26 | const badgeText = await chrome.action.getBadgeText({ tabId });
27 | if (badgeText === "ON") {
28 | setIsReplacing(true);
29 | }
30 | });
31 |
32 | // setup listener for messages from contentscript
33 | chrome.runtime.onMessage.addListener((message: any) => {
34 | if (message.action === "processImages") {
35 | processImagesWithFAL(message.images);
36 | }
37 | return false; // return false since not responding to sender here
38 | });
39 | }, []);
40 |
41 | const processImagesWithFAL = async (images: any[]) => {
42 | const user_prompt = window.sessionStorage.getItem("user_prompt") ?? "";
43 | for (const imageObj of images) {
44 | // Delay in milliseconds. otherwise on load might send too many requests at once
45 | await delay(300);
46 | sendToFal(imageObj, user_prompt);
47 | }
48 | };
49 |
50 | const toggleReplaceImages = () => {
51 | const newState = !isReplacing;
52 | setIsReplacing(newState);
53 |
54 | window.sessionStorage.setItem("user_prompt", prompt);
55 | withTabId((tabId) => {
56 | // update badge text
57 | chrome.action.setBadgeText({
58 | text: newState ? "ON" : "OFF",
59 | tabId,
60 | });
61 |
62 | chrome.action.setBadgeBackgroundColor({
63 | color: newState ? "#90EE90" : "#D3D3D3", // Light green for "ON", light gray for "OFF"
64 | tabId: tabId,
65 | });
66 | // send message to contentScript
67 | chrome.tabs.sendMessage(tabId, { replaceImages: newState });
68 | });
69 | };
70 |
71 | return (
72 |
82 |
86 | setPrompt(e.target.value)}
90 | className="bg-transparent h-10 px-4 w-[200px] text-sm focus:outline-none placeholder:text-slate-600"
91 | placeholder="Custom prompt"
92 | />
93 |
94 |
99 |
105 |
110 |
115 |
116 |
117 | {isReplacing ? "AI" : "Reality"}
118 |
119 | {/*
*/}
123 |
124 | );
125 | };
126 |
127 | export default View;
128 |
--------------------------------------------------------------------------------
/src/assets/animeskyline.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaelbzhu/browserdiffusion/5dd439a16d6c0608e79a8adeddbd3792e41cdb66/src/assets/animeskyline.jpeg
--------------------------------------------------------------------------------
/src/assets/realskyline.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/michaelbzhu/browserdiffusion/5dd439a16d6c0608e79a8adeddbd3792e41cdb66/src/assets/realskyline.jpeg
--------------------------------------------------------------------------------
/src/contentScript.ts:
--------------------------------------------------------------------------------
1 | // ---------- GLOBALS ----------
2 | let isReplacingImages = false;
3 | var imagesStore = {} as any;
4 | var imageStartTimes = {} as any;
5 | const timeBeforeRetry = 3000; //min time in ms to wait before retrying generation for a given image
6 |
7 | // ---------- UTILS ----------
8 |
9 | function findKeyByValue(obj: any, value: any) {
10 | return Object.keys(obj).find((key) => obj[key] === value);
11 | }
12 |
13 | /**
14 | * Extracts URLs from the given text.
15 | * @param {string} text - The text to search for URLs.
16 | * @returns {string[]|null} - An array of URLs found in the text, or null if no URLs are found.
17 | */
18 | function extractUrls(text: string) {
19 | const urlPattern = /https?:\/\/[^\s]+/g;
20 | const urls = text.match(urlPattern);
21 | return urls ? urls : null;
22 | }
23 |
24 | /**
25 | * Sends image URLs to the background script
26 | * @param {Array} filteredImages - List of image URLs to be sent
27 | */
28 | async function sendImageUrlsToApp(filteredImages: string[]) {
29 | try {
30 | // Convert image URLs to base64 and create image objects
31 | const imageObjects = await Promise.all(
32 | filteredImages.map(async (imageUrl) => {
33 | return { imageUrl, croppedb64Image: imageUrl };
34 | })
35 | );
36 | // Send image objects to the background script
37 | chrome.runtime.sendMessage({
38 | action: "processImages",
39 | images: imageObjects,
40 | });
41 | } catch (error) {
42 | console.error("Error processing images:", error);
43 | }
44 | }
45 |
46 | /**
47 | * Check if the image should be processed based on various conditions.
48 | *
49 | * @param {HTMLImageElement} img - the image to be processed
50 | * @return {boolean} whether the image should be processed or not
51 | */
52 | function shouldProcess(img: HTMLImageElement) {
53 | if (
54 | (!imageStartTimes.hasOwnProperty(img.src) ||
55 | imageStartTimes[img.src] + timeBeforeRetry < Date.now()) &&
56 | !img.src.startsWith("data:image") &&
57 | !img.alt.toLowerCase().includes("profile") &&
58 | !img.src.toLowerCase().includes("video_thumb") &&
59 | !img.src.toLowerCase().includes("icon") &&
60 | !img.src.toLowerCase().includes("static-asset") &&
61 | !(img.offsetWidth < 125 && img.offsetHeight < 125)
62 | ) {
63 | return true;
64 | }
65 | return false;
66 | }
67 |
68 | // ---------- LIFECYCLE ----------
69 |
70 | /**
71 | * Scans the document for images and sends the URLs of new images to the background process for processing.
72 | */
73 | const scanImages = () => {
74 | if (!isReplacingImages) {
75 | return;
76 | }
77 |
78 | const images = [...document.getElementsByTagName("img")];
79 | let filteredImages = [];
80 |
81 | for (let img of images) {
82 | // Check if the image URL is not already stored and should be processed
83 | if (!imagesStore.hasOwnProperty(img.src) && shouldProcess(img)) {
84 | filteredImages.push(img.src);
85 | imageStartTimes[img.src] = Date.now();
86 | }
87 | }
88 |
89 | if (filteredImages.length > 0) {
90 | sendImageUrlsToApp(filteredImages);
91 | }
92 | };
93 |
94 | /**
95 | * Updates the images on the page based on the current state of the imagesStore.
96 | */
97 | function updatePageImages() {
98 | // Update general images
99 | const images = [...document.getElementsByTagName("img")];
100 | for (let img of images) {
101 | let currentUrl = img.src;
102 | if (!isReplacingImages) {
103 | // If replacing is toggled off, switch altered images back, while keeping generations in imagesStore
104 | let originalImage = findKeyByValue(imagesStore, currentUrl);
105 | img.src = originalImage === undefined ? currentUrl : originalImage;
106 | } else if (
107 | imagesStore.hasOwnProperty(currentUrl) &&
108 | img.src !== imagesStore[currentUrl]
109 | ) {
110 | img.src = imagesStore[currentUrl];
111 | }
112 | }
113 |
114 | // In some sites like the nytimes, the source of truth is in the source tag, not the img tag
115 | const sources = [...document.getElementsByTagName("source")];
116 | for (let source of sources) {
117 | if (!isReplacingImages) {
118 | let originalImage = findKeyByValue(imagesStore, source.srcset);
119 | source.srcset =
120 | originalImage === undefined ? source.srcset : originalImage;
121 | } else {
122 | let currentUrls = extractUrls(source.srcset) || source.srcset;
123 | if (currentUrls === null) continue;
124 | for (let currentUrl of currentUrls) {
125 | if (
126 | imagesStore.hasOwnProperty(currentUrl) &&
127 | source.srcset !== imagesStore[currentUrl]
128 | ) {
129 | source.srcset = imagesStore[currentUrl];
130 | }
131 | }
132 | }
133 | }
134 | }
135 |
136 | /**
137 | * Function to observe DOM changes and replace images if new ones are added
138 | */
139 | const observeDOM = () => {
140 | const observer = new MutationObserver((mutations) => {
141 | const hasAdditions = mutations.some(
142 | (mutation) => mutation.addedNodes.length > 0
143 | );
144 |
145 | // If new nodes are added and the flag for replacing images is true, then scan for and update images
146 | if (hasAdditions && isReplacingImages) {
147 | scanImages();
148 | updatePageImages();
149 | }
150 | });
151 |
152 | // Start observing changes to the entire body and its subtree
153 | observer.observe(document.body, {
154 | childList: true,
155 | subtree: true,
156 | });
157 | };
158 |
159 | // ---------- MAIN ----------
160 |
161 | /**
162 | * Listens for messages from App.js and background.js and performs actions based on the message content.
163 | * - If the message action is "updateSingleImage", it updates a single image's URL in the imagesStore and triggers an update of page images.
164 | * - If the message contains "replaceImages", it toggles the state of image replacement, connects to the runtime for further instructions, scans for new images, updates page images, and sends a success response.
165 | */
166 | chrome.runtime.onMessage.addListener((request: any) => {
167 | if (
168 | request.hasOwnProperty("action") &&
169 | request.action === "updateSingleImage"
170 | ) {
171 | imagesStore[request.originalUrl] = request.newImageUrl;
172 | updatePageImages();
173 | } else if (request.hasOwnProperty("replaceImages")) {
174 | isReplacingImages = request.replaceImages;
175 | scanImages();
176 | updatePageImages();
177 | }
178 | return false; // return false since not responding to sender here
179 | });
180 |
181 | observeDOM();
182 |
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | display: flex;
4 | place-items: center;
5 | min-width: 250px;
6 | min-height: 250px;
7 | }
8 |
9 | #root {
10 | width: 100%;
11 | height: 100%;
12 | }
13 |
--------------------------------------------------------------------------------
/src/main.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import ReactDOM from "react-dom/client";
3 | import App from "./App.tsx";
4 | import "./index.css";
5 |
6 | ReactDOM.createRoot(document.getElementById("root")!).render(
7 |
8 |
9 |
10 | );
11 |
--------------------------------------------------------------------------------
/src/utils.ts:
--------------------------------------------------------------------------------
1 | export const withTabId = (callback: (tabId: number) => void) => {
2 | chrome.tabs.query({ active: true, currentWindow: true }, async (tabs) => {
3 | const tabId = tabs[0].id;
4 | if (tabId) {
5 | callback(tabId);
6 | } else {
7 | console.error("No tabId found");
8 | }
9 | });
10 | };
11 |
--------------------------------------------------------------------------------
/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | export default {
3 | content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"],
4 | theme: {
5 | extend: {},
6 | },
7 | plugins: [],
8 | };
9 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "useDefineForClassFields": true,
5 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
6 | "module": "ESNext",
7 | "skipLibCheck": true,
8 |
9 | /* Bundler mode */
10 | "moduleResolution": "bundler",
11 | "allowImportingTsExtensions": true,
12 | "resolveJsonModule": true,
13 | "isolatedModules": true,
14 | "noEmit": true,
15 | "jsx": "react-jsx",
16 |
17 | /* Linting */
18 | "strict": true,
19 | "noUnusedLocals": true,
20 | "noUnusedParameters": true,
21 | "noFallthroughCasesInSwitch": true,
22 | "types": ["chrome-types"]
23 | },
24 | "include": ["src"],
25 | "references": [{ "path": "./tsconfig.node.json" }]
26 | }
27 |
--------------------------------------------------------------------------------
/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "composite": true,
4 | "skipLibCheck": true,
5 | "module": "ESNext",
6 | "moduleResolution": "bundler",
7 | "allowSyntheticDefaultImports": true,
8 | "strict": true
9 | },
10 | "include": ["vite.config.ts"]
11 | }
12 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "vite";
2 | import react from "@vitejs/plugin-react-swc";
3 |
4 | // https://vitejs.dev/config/
5 | export default defineConfig({
6 | plugins: [react()],
7 | build: {
8 | rollupOptions: {
9 | input: {
10 | contentScript: "src/contentScript.ts",
11 | main: "index.html",
12 | },
13 | output: {
14 | entryFileNames: (chunkInfo) => {
15 | // Use a custom name for the contentScript script bundle
16 | if (chunkInfo.name === "contentScript") {
17 | return "contentScript.bundle.js";
18 | }
19 | // Default naming scheme for other assets
20 | return "assets/[name].[hash].js";
21 | },
22 | dir: "dist", // Output directory
23 | },
24 | },
25 | },
26 | });
27 |
--------------------------------------------------------------------------------