├── .editorconfig
├── .gitignore
├── .npmignore
├── .prettierignore
├── .prettierrc
├── LICENSE
├── README.md
├── jsconfig.json
├── landing-page
├── .gitignore
├── chrome-installer.zip
├── chrome.svg
├── chromium.svg
├── edge.svg
├── favicon.ico
├── firefox-installer.zip
├── firefox.svg
├── icon.png
├── index.html
├── installer.html
├── opera.svg
└── sitemap.xml
├── package-lock.json
├── package.json
├── popup.html
├── public
└── img
│ ├── android-chrome-192x192.png
│ ├── android-chrome-384x384.png
│ ├── apple-touch-icon.png
│ ├── browserconfig.xml
│ ├── favicon-16x16.png
│ ├── favicon-32x32.png
│ ├── favicon.ico
│ ├── mstile-150x150.png
│ ├── safari-pinned-tab.svg
│ └── site.webmanifest
├── src
├── assets
│ ├── demo.gif
│ ├── how-to-install.gif
│ ├── icon.png
│ └── small-demo.gif
├── background
│ └── index.js
├── contentScript
│ └── index.js
├── manifest.js
└── popup
│ ├── index.css
│ └── index.js
└── vite.config.js
/.editorconfig:
--------------------------------------------------------------------------------
1 | # EditorConfig is awesome: https://EditorConfig.org
2 |
3 | # top-most EditorConfig file
4 | root = true
5 |
6 | # Unix-style newlines with a newline ending every file
7 | [*]
8 | end_of_line = lf
9 | insert_final_newline = true
10 |
11 | # Matches multiple files with brace expansion notation
12 | # Set default charset
13 | [*.{js,jsx,ts,tsx,md}]
14 | charset = utf-8
15 | indent_style = space
16 | indent_size = 2
17 | tab_width = 2
18 | end_of_line = lf
19 | insert_final_newline = true
20 | trim_trailing_whitespace = true
21 |
22 |
23 | # Matches the exact files either package.json or .travis.yml
24 | [{package.json,.travis.yml}]
25 | indent_style = space
26 | indent_size = 2
27 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/ignore-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 |
6 | # testing
7 | /coverage
8 |
9 | # production
10 | /build
11 | /package
12 |
13 | # misc
14 | .DS_Store
15 | .env.local
16 | .env.development.local
17 | .env.test.local
18 | .env.production.local
19 | .history
20 | *.log
21 |
22 | # secrets
23 | secrets.*.js
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | # OS
2 | .DS_Store
3 |
4 | # ignore node dependency directories & lock
5 | node_modules
6 | yarn.lock
7 | pnpm-lock.yaml
8 | package-lock.json
9 |
10 | # ignore log files and local
11 | *.log
12 | *.local
13 | .env.local
14 | .env.development.local
15 | .env.test.local
16 | .env.production.local
17 | .history
18 |
19 | # ignore compiled files
20 | build
21 | types
22 | coverage
23 |
24 | # ignore ide settings
25 | .idea
26 | .vscode
27 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | # Ignore artifacts:
2 | build
3 | coverage
4 | node_modules
5 | pnpm-lock.yaml
6 | pnpm-workspace.yaml
7 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "jsxSingleQuote": false,
3 | "singleQuote": true,
4 | "trailingComma": "all",
5 | "endOfLine": "lf",
6 | "printWidth": 100,
7 | "semi": false,
8 | "tabWidth": 2,
9 | "useTabs": false
10 | }
11 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2024-present, no one
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # AdBlitz (Not an Ad Blocker)
2 |
3 | ## Description
4 | AdBlitz is your ultimate tool for turbocharging your YouTube viewing experience. Designed to effortlessly enhance your browsing sessions, it automatically skips skippable ads and accelerates non-skippable ones, ensuring you enjoy uninterrupted content seamlessly. Remember, it's not an *ad blocker*;
5 |
6 | ## Features
7 | - **Automatic Skips:** Say goodbye to interruptions as AdBlitz automatically skips skippable ads on YouTube videos.
8 | - **Ad Skimming:** For non skippable ads, AdBlitz automatically speeds up ads to maximum speed and mute them.
9 | - **Multi-Ad Skipping:** Handles multiple ads with ease, keeping your viewing flow uninterrupted.
10 | - **Background Magic:** Works seamlessly in the background, providing a smooth and hassle-free viewing experience.
11 | - **Lightweight & User-Friendly:** Easy to install and use, without any unnecessary bloat.
12 |
13 |
14 | ## Installation (on Chromium-based browsers)
15 | 1. [Download](https://ad-blitz.vercel.app/) the extension by clicking on your browser icon.
16 | 2. Open Chrome and navigate to `chrome://extensions/`.
17 | 3. Enable Developer Mode by toggling the switch in the upper-right corner.
18 | 4. Click on the "Load unpacked" button located at the top-left corner of the extensions page.
19 | 5. Select the directory where you cloned or downloaded the extension repository.
20 | 6. Confirm the installation when prompted.
21 |
22 | ## Installation (on Firefox)
23 | 1. [Download](https://addons.mozilla.org/en-US/firefox/addon/adblitz/) the extension.
24 | 6. Confirm the installation when prompted.
25 | 6. Give permissions by right clicking on extension.
26 |
27 | ## How to Run Locally
28 | 1. **Clone the Repository**:
29 | ```sh
30 | git clone https://github.com/dikshantrajput/adBlitz
31 | ```
32 | 2. **Run the server**:
33 | ```sh
34 | npm run dev
35 | ```
36 | 3. **Make any change and just save. Your extension should refresh**.
37 | 4. **Build the project**:
38 | ```sh
39 | npm run build
40 | ```
41 |
42 | ## Usage
43 | 1. Once installed, the extension will automatically start working whenever you watch a YouTube video with a skippable ad.
44 | 2. Sit back and enjoy your uninterrupted YouTube experience as the extension takes care of skipping the ads for you.
45 |
46 | ## Compatibility
47 | This extension is compatible with Google Chrome (Chromium-based browsers) and Firefox.
48 |
49 | ## Contributing
50 | Contributions from the community are welcome. If you'd like to contribute to the development of this extension, please fork the repository, make your changes, and submit a pull request. If you encounter any issues, please raise them in the repository's issue tracker.
51 |
52 | ## Disclaimer
53 | This extension is not endorsed by or affiliated with YouTube. It is an independent project developed solely for the purpose of improving user experience on the platform.
54 |
55 | Enjoy ad-free YouTube viewing with AdBlitz!
56 |
--------------------------------------------------------------------------------
/jsconfig.json:
--------------------------------------------------------------------------------
1 | { "typeAcquisition": { "include": ["chrome"] } }
2 |
--------------------------------------------------------------------------------
/landing-page/.gitignore:
--------------------------------------------------------------------------------
1 | .vercel
2 |
--------------------------------------------------------------------------------
/landing-page/chrome-installer.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/landing-page/chrome-installer.zip
--------------------------------------------------------------------------------
/landing-page/chrome.svg:
--------------------------------------------------------------------------------
1 |
2 |
32 |
--------------------------------------------------------------------------------
/landing-page/chromium.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/landing-page/edge.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/landing-page/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/landing-page/favicon.ico
--------------------------------------------------------------------------------
/landing-page/firefox-installer.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/landing-page/firefox-installer.zip
--------------------------------------------------------------------------------
/landing-page/firefox.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/landing-page/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/landing-page/icon.png
--------------------------------------------------------------------------------
/landing-page/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | AdBlitz - Turbocharge Your YouTube Experience
8 |
11 |
12 |
13 |
14 |
17 |
18 |
19 |
20 |
344 |
345 |
346 |
347 |
348 |
349 |
364 |
365 |
366 |
367 |
AdBlitz - Your Shortcut to Ad-Free Streaming
368 |

369 |
370 |
Not an ad blocker
371 |
408 |
download for Chromium if your browser is Chromium based but not
409 | one of above
410 |
411 |
412 |
413 |
414 |
Features
415 |
416 |
417 |
418 |
419 | Automatic Skips
420 |
421 |
Say goodbye to interruptions as AdBlitz automatically skips skippable ads on YouTube videos.
422 |
423 |
424 |
425 |
426 |
427 |
428 |
429 |
430 |
431 | Ad Skimming
432 |
433 |
For non-skippable ads, AdBlitz skims through them at an accelerated speed (e.g., 16x), saving
434 | you valuable time.
435 |
436 |
437 |
438 |
439 |
440 |
441 |
442 |
443 | Multi-Ad Skipping
444 |
445 |
Handles multiple ads with ease, keeping your viewing flow uninterrupted.
446 |
447 |
448 |
449 |
450 |
451 |
452 |
453 |
454 | Background Magic
455 |
456 |
Works seamlessly in the background, providing a smooth and hassle-free viewing experience.
457 |
458 |
459 |
460 |
461 |
462 |
463 |
464 |
465 |
466 | Lightweight
467 |
468 |
Easy to install and use, without any unnecessary bloat.
469 |
470 |
471 |
472 |
473 |
474 |
475 |
476 |
477 |
478 |
479 |
See AdBlitz in Action
480 |
481 |
482 |
483 |
484 |
Experience the smooth, ad-free streaming with AdBlitz
485 |
486 |
487 |
488 |
489 |
495 |
496 |
497 |
498 |
499 |
517 |
518 |
521 |
522 |
523 |
--------------------------------------------------------------------------------
/landing-page/installer.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Download adBlitz
7 |
8 |
9 | Downloading...
10 |
11 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/landing-page/opera.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/landing-page/sitemap.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | https://ad-blitz.vercel.app/
5 | 2024-04-24
6 | daily
7 | 1.0
8 |
9 |
10 | https://ad-blitz.vercel.app/installer.html
11 | 2024-04-24
12 | weekly
13 | 0.8
14 |
15 |
16 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "my-crx",
3 | "version": "0.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "my-crx",
9 | "version": "0.0.0",
10 | "license": "MIT",
11 | "devDependencies": {
12 | "@crxjs/vite-plugin": "^2.0.0-beta.19",
13 | "prettier": "^3.0.3",
14 | "vite": "^4.4.11"
15 | },
16 | "engines": {
17 | "node": ">=14.18.0"
18 | }
19 | },
20 | "node_modules/@crxjs/vite-plugin": {
21 | "version": "2.0.0-beta.23",
22 | "resolved": "https://registry.npmjs.org/@crxjs/vite-plugin/-/vite-plugin-2.0.0-beta.23.tgz",
23 | "integrity": "sha512-AO+VYhtNZ1fITq/sc54FZpTtFvHR+gJwFGiWTGKs07bwYzzZFdF0sYeiFgZiEjaNkddkAzuM4F4lgOmCm69YUw==",
24 | "dev": true,
25 | "dependencies": {
26 | "@rollup/pluginutils": "^4.1.2",
27 | "@webcomponents/custom-elements": "^1.5.0",
28 | "acorn-walk": "^8.2.0",
29 | "cheerio": "^1.0.0-rc.10",
30 | "connect-injector": "^0.4.4",
31 | "convert-source-map": "^1.7.0",
32 | "debug": "^4.3.3",
33 | "es-module-lexer": "^0.10.0",
34 | "fast-glob": "^3.2.11",
35 | "fs-extra": "^10.0.1",
36 | "jsesc": "^3.0.2",
37 | "magic-string": "^0.26.0",
38 | "picocolors": "^1.0.0",
39 | "react-refresh": "^0.13.0",
40 | "rollup": "2.78.1",
41 | "rxjs": "7.5.7"
42 | }
43 | },
44 | "node_modules/@esbuild/android-arm": {
45 | "version": "0.18.20",
46 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
47 | "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
48 | "cpu": [
49 | "arm"
50 | ],
51 | "dev": true,
52 | "optional": true,
53 | "os": [
54 | "android"
55 | ],
56 | "engines": {
57 | "node": ">=12"
58 | }
59 | },
60 | "node_modules/@esbuild/android-arm64": {
61 | "version": "0.18.20",
62 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
63 | "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
64 | "cpu": [
65 | "arm64"
66 | ],
67 | "dev": true,
68 | "optional": true,
69 | "os": [
70 | "android"
71 | ],
72 | "engines": {
73 | "node": ">=12"
74 | }
75 | },
76 | "node_modules/@esbuild/android-x64": {
77 | "version": "0.18.20",
78 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
79 | "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
80 | "cpu": [
81 | "x64"
82 | ],
83 | "dev": true,
84 | "optional": true,
85 | "os": [
86 | "android"
87 | ],
88 | "engines": {
89 | "node": ">=12"
90 | }
91 | },
92 | "node_modules/@esbuild/darwin-arm64": {
93 | "version": "0.18.20",
94 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
95 | "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
96 | "cpu": [
97 | "arm64"
98 | ],
99 | "dev": true,
100 | "optional": true,
101 | "os": [
102 | "darwin"
103 | ],
104 | "engines": {
105 | "node": ">=12"
106 | }
107 | },
108 | "node_modules/@esbuild/darwin-x64": {
109 | "version": "0.18.20",
110 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
111 | "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
112 | "cpu": [
113 | "x64"
114 | ],
115 | "dev": true,
116 | "optional": true,
117 | "os": [
118 | "darwin"
119 | ],
120 | "engines": {
121 | "node": ">=12"
122 | }
123 | },
124 | "node_modules/@esbuild/freebsd-arm64": {
125 | "version": "0.18.20",
126 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
127 | "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
128 | "cpu": [
129 | "arm64"
130 | ],
131 | "dev": true,
132 | "optional": true,
133 | "os": [
134 | "freebsd"
135 | ],
136 | "engines": {
137 | "node": ">=12"
138 | }
139 | },
140 | "node_modules/@esbuild/freebsd-x64": {
141 | "version": "0.18.20",
142 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
143 | "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
144 | "cpu": [
145 | "x64"
146 | ],
147 | "dev": true,
148 | "optional": true,
149 | "os": [
150 | "freebsd"
151 | ],
152 | "engines": {
153 | "node": ">=12"
154 | }
155 | },
156 | "node_modules/@esbuild/linux-arm": {
157 | "version": "0.18.20",
158 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
159 | "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
160 | "cpu": [
161 | "arm"
162 | ],
163 | "dev": true,
164 | "optional": true,
165 | "os": [
166 | "linux"
167 | ],
168 | "engines": {
169 | "node": ">=12"
170 | }
171 | },
172 | "node_modules/@esbuild/linux-arm64": {
173 | "version": "0.18.20",
174 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
175 | "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
176 | "cpu": [
177 | "arm64"
178 | ],
179 | "dev": true,
180 | "optional": true,
181 | "os": [
182 | "linux"
183 | ],
184 | "engines": {
185 | "node": ">=12"
186 | }
187 | },
188 | "node_modules/@esbuild/linux-ia32": {
189 | "version": "0.18.20",
190 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
191 | "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
192 | "cpu": [
193 | "ia32"
194 | ],
195 | "dev": true,
196 | "optional": true,
197 | "os": [
198 | "linux"
199 | ],
200 | "engines": {
201 | "node": ">=12"
202 | }
203 | },
204 | "node_modules/@esbuild/linux-loong64": {
205 | "version": "0.18.20",
206 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
207 | "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
208 | "cpu": [
209 | "loong64"
210 | ],
211 | "dev": true,
212 | "optional": true,
213 | "os": [
214 | "linux"
215 | ],
216 | "engines": {
217 | "node": ">=12"
218 | }
219 | },
220 | "node_modules/@esbuild/linux-mips64el": {
221 | "version": "0.18.20",
222 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
223 | "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
224 | "cpu": [
225 | "mips64el"
226 | ],
227 | "dev": true,
228 | "optional": true,
229 | "os": [
230 | "linux"
231 | ],
232 | "engines": {
233 | "node": ">=12"
234 | }
235 | },
236 | "node_modules/@esbuild/linux-ppc64": {
237 | "version": "0.18.20",
238 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
239 | "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
240 | "cpu": [
241 | "ppc64"
242 | ],
243 | "dev": true,
244 | "optional": true,
245 | "os": [
246 | "linux"
247 | ],
248 | "engines": {
249 | "node": ">=12"
250 | }
251 | },
252 | "node_modules/@esbuild/linux-riscv64": {
253 | "version": "0.18.20",
254 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
255 | "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
256 | "cpu": [
257 | "riscv64"
258 | ],
259 | "dev": true,
260 | "optional": true,
261 | "os": [
262 | "linux"
263 | ],
264 | "engines": {
265 | "node": ">=12"
266 | }
267 | },
268 | "node_modules/@esbuild/linux-s390x": {
269 | "version": "0.18.20",
270 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
271 | "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
272 | "cpu": [
273 | "s390x"
274 | ],
275 | "dev": true,
276 | "optional": true,
277 | "os": [
278 | "linux"
279 | ],
280 | "engines": {
281 | "node": ">=12"
282 | }
283 | },
284 | "node_modules/@esbuild/linux-x64": {
285 | "version": "0.18.20",
286 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
287 | "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
288 | "cpu": [
289 | "x64"
290 | ],
291 | "dev": true,
292 | "optional": true,
293 | "os": [
294 | "linux"
295 | ],
296 | "engines": {
297 | "node": ">=12"
298 | }
299 | },
300 | "node_modules/@esbuild/netbsd-x64": {
301 | "version": "0.18.20",
302 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
303 | "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
304 | "cpu": [
305 | "x64"
306 | ],
307 | "dev": true,
308 | "optional": true,
309 | "os": [
310 | "netbsd"
311 | ],
312 | "engines": {
313 | "node": ">=12"
314 | }
315 | },
316 | "node_modules/@esbuild/openbsd-x64": {
317 | "version": "0.18.20",
318 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
319 | "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
320 | "cpu": [
321 | "x64"
322 | ],
323 | "dev": true,
324 | "optional": true,
325 | "os": [
326 | "openbsd"
327 | ],
328 | "engines": {
329 | "node": ">=12"
330 | }
331 | },
332 | "node_modules/@esbuild/sunos-x64": {
333 | "version": "0.18.20",
334 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
335 | "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
336 | "cpu": [
337 | "x64"
338 | ],
339 | "dev": true,
340 | "optional": true,
341 | "os": [
342 | "sunos"
343 | ],
344 | "engines": {
345 | "node": ">=12"
346 | }
347 | },
348 | "node_modules/@esbuild/win32-arm64": {
349 | "version": "0.18.20",
350 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
351 | "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
352 | "cpu": [
353 | "arm64"
354 | ],
355 | "dev": true,
356 | "optional": true,
357 | "os": [
358 | "win32"
359 | ],
360 | "engines": {
361 | "node": ">=12"
362 | }
363 | },
364 | "node_modules/@esbuild/win32-ia32": {
365 | "version": "0.18.20",
366 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
367 | "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
368 | "cpu": [
369 | "ia32"
370 | ],
371 | "dev": true,
372 | "optional": true,
373 | "os": [
374 | "win32"
375 | ],
376 | "engines": {
377 | "node": ">=12"
378 | }
379 | },
380 | "node_modules/@esbuild/win32-x64": {
381 | "version": "0.18.20",
382 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
383 | "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
384 | "cpu": [
385 | "x64"
386 | ],
387 | "dev": true,
388 | "optional": true,
389 | "os": [
390 | "win32"
391 | ],
392 | "engines": {
393 | "node": ">=12"
394 | }
395 | },
396 | "node_modules/@nodelib/fs.scandir": {
397 | "version": "2.1.5",
398 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
399 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
400 | "dev": true,
401 | "dependencies": {
402 | "@nodelib/fs.stat": "2.0.5",
403 | "run-parallel": "^1.1.9"
404 | },
405 | "engines": {
406 | "node": ">= 8"
407 | }
408 | },
409 | "node_modules/@nodelib/fs.stat": {
410 | "version": "2.0.5",
411 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
412 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
413 | "dev": true,
414 | "engines": {
415 | "node": ">= 8"
416 | }
417 | },
418 | "node_modules/@nodelib/fs.walk": {
419 | "version": "1.2.8",
420 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
421 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
422 | "dev": true,
423 | "dependencies": {
424 | "@nodelib/fs.scandir": "2.1.5",
425 | "fastq": "^1.6.0"
426 | },
427 | "engines": {
428 | "node": ">= 8"
429 | }
430 | },
431 | "node_modules/@rollup/pluginutils": {
432 | "version": "4.2.1",
433 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz",
434 | "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==",
435 | "dev": true,
436 | "dependencies": {
437 | "estree-walker": "^2.0.1",
438 | "picomatch": "^2.2.2"
439 | },
440 | "engines": {
441 | "node": ">= 8.0.0"
442 | }
443 | },
444 | "node_modules/@webcomponents/custom-elements": {
445 | "version": "1.6.0",
446 | "resolved": "https://registry.npmjs.org/@webcomponents/custom-elements/-/custom-elements-1.6.0.tgz",
447 | "integrity": "sha512-CqTpxOlUCPWRNUPZDxT5v2NnHXA4oox612iUGnmTUGQFhZ1Gkj8kirtl/2wcF6MqX7+PqqicZzOCBKKfIn0dww==",
448 | "dev": true
449 | },
450 | "node_modules/acorn-walk": {
451 | "version": "8.3.2",
452 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz",
453 | "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==",
454 | "dev": true,
455 | "engines": {
456 | "node": ">=0.4.0"
457 | }
458 | },
459 | "node_modules/boolbase": {
460 | "version": "1.0.0",
461 | "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
462 | "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
463 | "dev": true
464 | },
465 | "node_modules/braces": {
466 | "version": "3.0.2",
467 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
468 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
469 | "dev": true,
470 | "dependencies": {
471 | "fill-range": "^7.0.1"
472 | },
473 | "engines": {
474 | "node": ">=8"
475 | }
476 | },
477 | "node_modules/cheerio": {
478 | "version": "1.0.0-rc.12",
479 | "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
480 | "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
481 | "dev": true,
482 | "dependencies": {
483 | "cheerio-select": "^2.1.0",
484 | "dom-serializer": "^2.0.0",
485 | "domhandler": "^5.0.3",
486 | "domutils": "^3.0.1",
487 | "htmlparser2": "^8.0.1",
488 | "parse5": "^7.0.0",
489 | "parse5-htmlparser2-tree-adapter": "^7.0.0"
490 | },
491 | "engines": {
492 | "node": ">= 6"
493 | },
494 | "funding": {
495 | "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
496 | }
497 | },
498 | "node_modules/cheerio-select": {
499 | "version": "2.1.0",
500 | "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
501 | "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
502 | "dev": true,
503 | "dependencies": {
504 | "boolbase": "^1.0.0",
505 | "css-select": "^5.1.0",
506 | "css-what": "^6.1.0",
507 | "domelementtype": "^2.3.0",
508 | "domhandler": "^5.0.3",
509 | "domutils": "^3.0.1"
510 | },
511 | "funding": {
512 | "url": "https://github.com/sponsors/fb55"
513 | }
514 | },
515 | "node_modules/connect-injector": {
516 | "version": "0.4.4",
517 | "resolved": "https://registry.npmjs.org/connect-injector/-/connect-injector-0.4.4.tgz",
518 | "integrity": "sha512-hdBG8nXop42y2gWCqOV8y1O3uVk4cIU+SoxLCPyCUKRImyPiScoNiSulpHjoktRU1BdI0UzoUdxUa87thrcmHw==",
519 | "dev": true,
520 | "dependencies": {
521 | "debug": "^2.0.0",
522 | "q": "^1.0.1",
523 | "stream-buffers": "^0.2.3",
524 | "uberproto": "^1.1.0"
525 | },
526 | "engines": {
527 | "node": ">= 0.8.0"
528 | }
529 | },
530 | "node_modules/connect-injector/node_modules/debug": {
531 | "version": "2.6.9",
532 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
533 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
534 | "dev": true,
535 | "dependencies": {
536 | "ms": "2.0.0"
537 | }
538 | },
539 | "node_modules/connect-injector/node_modules/ms": {
540 | "version": "2.0.0",
541 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
542 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
543 | "dev": true
544 | },
545 | "node_modules/convert-source-map": {
546 | "version": "1.9.0",
547 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
548 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
549 | "dev": true
550 | },
551 | "node_modules/css-select": {
552 | "version": "5.1.0",
553 | "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
554 | "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
555 | "dev": true,
556 | "dependencies": {
557 | "boolbase": "^1.0.0",
558 | "css-what": "^6.1.0",
559 | "domhandler": "^5.0.2",
560 | "domutils": "^3.0.1",
561 | "nth-check": "^2.0.1"
562 | },
563 | "funding": {
564 | "url": "https://github.com/sponsors/fb55"
565 | }
566 | },
567 | "node_modules/css-what": {
568 | "version": "6.1.0",
569 | "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
570 | "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
571 | "dev": true,
572 | "engines": {
573 | "node": ">= 6"
574 | },
575 | "funding": {
576 | "url": "https://github.com/sponsors/fb55"
577 | }
578 | },
579 | "node_modules/debug": {
580 | "version": "4.3.4",
581 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
582 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
583 | "dev": true,
584 | "dependencies": {
585 | "ms": "2.1.2"
586 | },
587 | "engines": {
588 | "node": ">=6.0"
589 | },
590 | "peerDependenciesMeta": {
591 | "supports-color": {
592 | "optional": true
593 | }
594 | }
595 | },
596 | "node_modules/dom-serializer": {
597 | "version": "2.0.0",
598 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
599 | "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
600 | "dev": true,
601 | "dependencies": {
602 | "domelementtype": "^2.3.0",
603 | "domhandler": "^5.0.2",
604 | "entities": "^4.2.0"
605 | },
606 | "funding": {
607 | "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
608 | }
609 | },
610 | "node_modules/domelementtype": {
611 | "version": "2.3.0",
612 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
613 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
614 | "dev": true,
615 | "funding": [
616 | {
617 | "type": "github",
618 | "url": "https://github.com/sponsors/fb55"
619 | }
620 | ]
621 | },
622 | "node_modules/domhandler": {
623 | "version": "5.0.3",
624 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
625 | "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
626 | "dev": true,
627 | "dependencies": {
628 | "domelementtype": "^2.3.0"
629 | },
630 | "engines": {
631 | "node": ">= 4"
632 | },
633 | "funding": {
634 | "url": "https://github.com/fb55/domhandler?sponsor=1"
635 | }
636 | },
637 | "node_modules/domutils": {
638 | "version": "3.1.0",
639 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
640 | "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
641 | "dev": true,
642 | "dependencies": {
643 | "dom-serializer": "^2.0.0",
644 | "domelementtype": "^2.3.0",
645 | "domhandler": "^5.0.3"
646 | },
647 | "funding": {
648 | "url": "https://github.com/fb55/domutils?sponsor=1"
649 | }
650 | },
651 | "node_modules/entities": {
652 | "version": "4.5.0",
653 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
654 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
655 | "dev": true,
656 | "engines": {
657 | "node": ">=0.12"
658 | },
659 | "funding": {
660 | "url": "https://github.com/fb55/entities?sponsor=1"
661 | }
662 | },
663 | "node_modules/es-module-lexer": {
664 | "version": "0.10.5",
665 | "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.10.5.tgz",
666 | "integrity": "sha512-+7IwY/kiGAacQfY+YBhKMvEmyAJnw5grTUgjG85Pe7vcUI/6b7pZjZG8nQ7+48YhzEAEqrEgD2dCz/JIK+AYvw==",
667 | "dev": true
668 | },
669 | "node_modules/esbuild": {
670 | "version": "0.18.20",
671 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
672 | "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
673 | "dev": true,
674 | "hasInstallScript": true,
675 | "bin": {
676 | "esbuild": "bin/esbuild"
677 | },
678 | "engines": {
679 | "node": ">=12"
680 | },
681 | "optionalDependencies": {
682 | "@esbuild/android-arm": "0.18.20",
683 | "@esbuild/android-arm64": "0.18.20",
684 | "@esbuild/android-x64": "0.18.20",
685 | "@esbuild/darwin-arm64": "0.18.20",
686 | "@esbuild/darwin-x64": "0.18.20",
687 | "@esbuild/freebsd-arm64": "0.18.20",
688 | "@esbuild/freebsd-x64": "0.18.20",
689 | "@esbuild/linux-arm": "0.18.20",
690 | "@esbuild/linux-arm64": "0.18.20",
691 | "@esbuild/linux-ia32": "0.18.20",
692 | "@esbuild/linux-loong64": "0.18.20",
693 | "@esbuild/linux-mips64el": "0.18.20",
694 | "@esbuild/linux-ppc64": "0.18.20",
695 | "@esbuild/linux-riscv64": "0.18.20",
696 | "@esbuild/linux-s390x": "0.18.20",
697 | "@esbuild/linux-x64": "0.18.20",
698 | "@esbuild/netbsd-x64": "0.18.20",
699 | "@esbuild/openbsd-x64": "0.18.20",
700 | "@esbuild/sunos-x64": "0.18.20",
701 | "@esbuild/win32-arm64": "0.18.20",
702 | "@esbuild/win32-ia32": "0.18.20",
703 | "@esbuild/win32-x64": "0.18.20"
704 | }
705 | },
706 | "node_modules/estree-walker": {
707 | "version": "2.0.2",
708 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
709 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
710 | "dev": true
711 | },
712 | "node_modules/fast-glob": {
713 | "version": "3.3.2",
714 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
715 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
716 | "dev": true,
717 | "dependencies": {
718 | "@nodelib/fs.stat": "^2.0.2",
719 | "@nodelib/fs.walk": "^1.2.3",
720 | "glob-parent": "^5.1.2",
721 | "merge2": "^1.3.0",
722 | "micromatch": "^4.0.4"
723 | },
724 | "engines": {
725 | "node": ">=8.6.0"
726 | }
727 | },
728 | "node_modules/fastq": {
729 | "version": "1.16.0",
730 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz",
731 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==",
732 | "dev": true,
733 | "dependencies": {
734 | "reusify": "^1.0.4"
735 | }
736 | },
737 | "node_modules/fill-range": {
738 | "version": "7.0.1",
739 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
740 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
741 | "dev": true,
742 | "dependencies": {
743 | "to-regex-range": "^5.0.1"
744 | },
745 | "engines": {
746 | "node": ">=8"
747 | }
748 | },
749 | "node_modules/fs-extra": {
750 | "version": "10.1.0",
751 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
752 | "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
753 | "dev": true,
754 | "dependencies": {
755 | "graceful-fs": "^4.2.0",
756 | "jsonfile": "^6.0.1",
757 | "universalify": "^2.0.0"
758 | },
759 | "engines": {
760 | "node": ">=12"
761 | }
762 | },
763 | "node_modules/fsevents": {
764 | "version": "2.3.3",
765 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
766 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
767 | "dev": true,
768 | "hasInstallScript": true,
769 | "optional": true,
770 | "os": [
771 | "darwin"
772 | ],
773 | "engines": {
774 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
775 | }
776 | },
777 | "node_modules/glob-parent": {
778 | "version": "5.1.2",
779 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
780 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
781 | "dev": true,
782 | "dependencies": {
783 | "is-glob": "^4.0.1"
784 | },
785 | "engines": {
786 | "node": ">= 6"
787 | }
788 | },
789 | "node_modules/graceful-fs": {
790 | "version": "4.2.11",
791 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
792 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
793 | "dev": true
794 | },
795 | "node_modules/htmlparser2": {
796 | "version": "8.0.2",
797 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
798 | "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
799 | "dev": true,
800 | "funding": [
801 | "https://github.com/fb55/htmlparser2?sponsor=1",
802 | {
803 | "type": "github",
804 | "url": "https://github.com/sponsors/fb55"
805 | }
806 | ],
807 | "dependencies": {
808 | "domelementtype": "^2.3.0",
809 | "domhandler": "^5.0.3",
810 | "domutils": "^3.0.1",
811 | "entities": "^4.4.0"
812 | }
813 | },
814 | "node_modules/is-extglob": {
815 | "version": "2.1.1",
816 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
817 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
818 | "dev": true,
819 | "engines": {
820 | "node": ">=0.10.0"
821 | }
822 | },
823 | "node_modules/is-glob": {
824 | "version": "4.0.3",
825 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
826 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
827 | "dev": true,
828 | "dependencies": {
829 | "is-extglob": "^2.1.1"
830 | },
831 | "engines": {
832 | "node": ">=0.10.0"
833 | }
834 | },
835 | "node_modules/is-number": {
836 | "version": "7.0.0",
837 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
838 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
839 | "dev": true,
840 | "engines": {
841 | "node": ">=0.12.0"
842 | }
843 | },
844 | "node_modules/jsesc": {
845 | "version": "3.0.2",
846 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
847 | "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
848 | "dev": true,
849 | "bin": {
850 | "jsesc": "bin/jsesc"
851 | },
852 | "engines": {
853 | "node": ">=6"
854 | }
855 | },
856 | "node_modules/jsonfile": {
857 | "version": "6.1.0",
858 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
859 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
860 | "dev": true,
861 | "dependencies": {
862 | "universalify": "^2.0.0"
863 | },
864 | "optionalDependencies": {
865 | "graceful-fs": "^4.1.6"
866 | }
867 | },
868 | "node_modules/magic-string": {
869 | "version": "0.26.7",
870 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz",
871 | "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==",
872 | "dev": true,
873 | "dependencies": {
874 | "sourcemap-codec": "^1.4.8"
875 | },
876 | "engines": {
877 | "node": ">=12"
878 | }
879 | },
880 | "node_modules/merge2": {
881 | "version": "1.4.1",
882 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
883 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
884 | "dev": true,
885 | "engines": {
886 | "node": ">= 8"
887 | }
888 | },
889 | "node_modules/micromatch": {
890 | "version": "4.0.5",
891 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
892 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
893 | "dev": true,
894 | "dependencies": {
895 | "braces": "^3.0.2",
896 | "picomatch": "^2.3.1"
897 | },
898 | "engines": {
899 | "node": ">=8.6"
900 | }
901 | },
902 | "node_modules/ms": {
903 | "version": "2.1.2",
904 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
905 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
906 | "dev": true
907 | },
908 | "node_modules/nanoid": {
909 | "version": "3.3.7",
910 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
911 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
912 | "dev": true,
913 | "funding": [
914 | {
915 | "type": "github",
916 | "url": "https://github.com/sponsors/ai"
917 | }
918 | ],
919 | "bin": {
920 | "nanoid": "bin/nanoid.cjs"
921 | },
922 | "engines": {
923 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
924 | }
925 | },
926 | "node_modules/nth-check": {
927 | "version": "2.1.1",
928 | "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
929 | "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
930 | "dev": true,
931 | "dependencies": {
932 | "boolbase": "^1.0.0"
933 | },
934 | "funding": {
935 | "url": "https://github.com/fb55/nth-check?sponsor=1"
936 | }
937 | },
938 | "node_modules/parse5": {
939 | "version": "7.1.2",
940 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
941 | "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
942 | "dev": true,
943 | "dependencies": {
944 | "entities": "^4.4.0"
945 | },
946 | "funding": {
947 | "url": "https://github.com/inikulin/parse5?sponsor=1"
948 | }
949 | },
950 | "node_modules/parse5-htmlparser2-tree-adapter": {
951 | "version": "7.0.0",
952 | "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz",
953 | "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==",
954 | "dev": true,
955 | "dependencies": {
956 | "domhandler": "^5.0.2",
957 | "parse5": "^7.0.0"
958 | },
959 | "funding": {
960 | "url": "https://github.com/inikulin/parse5?sponsor=1"
961 | }
962 | },
963 | "node_modules/picocolors": {
964 | "version": "1.0.0",
965 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
966 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
967 | "dev": true
968 | },
969 | "node_modules/picomatch": {
970 | "version": "2.3.1",
971 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
972 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
973 | "dev": true,
974 | "engines": {
975 | "node": ">=8.6"
976 | },
977 | "funding": {
978 | "url": "https://github.com/sponsors/jonschlinkert"
979 | }
980 | },
981 | "node_modules/postcss": {
982 | "version": "8.4.33",
983 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz",
984 | "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==",
985 | "dev": true,
986 | "funding": [
987 | {
988 | "type": "opencollective",
989 | "url": "https://opencollective.com/postcss/"
990 | },
991 | {
992 | "type": "tidelift",
993 | "url": "https://tidelift.com/funding/github/npm/postcss"
994 | },
995 | {
996 | "type": "github",
997 | "url": "https://github.com/sponsors/ai"
998 | }
999 | ],
1000 | "dependencies": {
1001 | "nanoid": "^3.3.7",
1002 | "picocolors": "^1.0.0",
1003 | "source-map-js": "^1.0.2"
1004 | },
1005 | "engines": {
1006 | "node": "^10 || ^12 || >=14"
1007 | }
1008 | },
1009 | "node_modules/prettier": {
1010 | "version": "3.2.4",
1011 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.4.tgz",
1012 | "integrity": "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==",
1013 | "dev": true,
1014 | "bin": {
1015 | "prettier": "bin/prettier.cjs"
1016 | },
1017 | "engines": {
1018 | "node": ">=14"
1019 | },
1020 | "funding": {
1021 | "url": "https://github.com/prettier/prettier?sponsor=1"
1022 | }
1023 | },
1024 | "node_modules/q": {
1025 | "version": "1.5.1",
1026 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
1027 | "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
1028 | "dev": true,
1029 | "engines": {
1030 | "node": ">=0.6.0",
1031 | "teleport": ">=0.2.0"
1032 | }
1033 | },
1034 | "node_modules/queue-microtask": {
1035 | "version": "1.2.3",
1036 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
1037 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
1038 | "dev": true,
1039 | "funding": [
1040 | {
1041 | "type": "github",
1042 | "url": "https://github.com/sponsors/feross"
1043 | },
1044 | {
1045 | "type": "patreon",
1046 | "url": "https://www.patreon.com/feross"
1047 | },
1048 | {
1049 | "type": "consulting",
1050 | "url": "https://feross.org/support"
1051 | }
1052 | ]
1053 | },
1054 | "node_modules/react-refresh": {
1055 | "version": "0.13.0",
1056 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.13.0.tgz",
1057 | "integrity": "sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==",
1058 | "dev": true,
1059 | "engines": {
1060 | "node": ">=0.10.0"
1061 | }
1062 | },
1063 | "node_modules/reusify": {
1064 | "version": "1.0.4",
1065 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
1066 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
1067 | "dev": true,
1068 | "engines": {
1069 | "iojs": ">=1.0.0",
1070 | "node": ">=0.10.0"
1071 | }
1072 | },
1073 | "node_modules/rollup": {
1074 | "version": "2.78.1",
1075 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz",
1076 | "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==",
1077 | "dev": true,
1078 | "bin": {
1079 | "rollup": "dist/bin/rollup"
1080 | },
1081 | "engines": {
1082 | "node": ">=10.0.0"
1083 | },
1084 | "optionalDependencies": {
1085 | "fsevents": "~2.3.2"
1086 | }
1087 | },
1088 | "node_modules/run-parallel": {
1089 | "version": "1.2.0",
1090 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
1091 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
1092 | "dev": true,
1093 | "funding": [
1094 | {
1095 | "type": "github",
1096 | "url": "https://github.com/sponsors/feross"
1097 | },
1098 | {
1099 | "type": "patreon",
1100 | "url": "https://www.patreon.com/feross"
1101 | },
1102 | {
1103 | "type": "consulting",
1104 | "url": "https://feross.org/support"
1105 | }
1106 | ],
1107 | "dependencies": {
1108 | "queue-microtask": "^1.2.2"
1109 | }
1110 | },
1111 | "node_modules/rxjs": {
1112 | "version": "7.5.7",
1113 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz",
1114 | "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==",
1115 | "dev": true,
1116 | "dependencies": {
1117 | "tslib": "^2.1.0"
1118 | }
1119 | },
1120 | "node_modules/source-map-js": {
1121 | "version": "1.0.2",
1122 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
1123 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
1124 | "dev": true,
1125 | "engines": {
1126 | "node": ">=0.10.0"
1127 | }
1128 | },
1129 | "node_modules/sourcemap-codec": {
1130 | "version": "1.4.8",
1131 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
1132 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
1133 | "deprecated": "Please use @jridgewell/sourcemap-codec instead",
1134 | "dev": true
1135 | },
1136 | "node_modules/stream-buffers": {
1137 | "version": "0.2.6",
1138 | "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-0.2.6.tgz",
1139 | "integrity": "sha512-ZRpmWyuCdg0TtNKk8bEqvm13oQvXMmzXDsfD4cBgcx5LouborvU5pm3JMkdTP3HcszyUI08AM1dHMXA5r2g6Sg==",
1140 | "dev": true,
1141 | "engines": {
1142 | "node": ">= 0.3.0"
1143 | }
1144 | },
1145 | "node_modules/to-regex-range": {
1146 | "version": "5.0.1",
1147 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1148 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1149 | "dev": true,
1150 | "dependencies": {
1151 | "is-number": "^7.0.0"
1152 | },
1153 | "engines": {
1154 | "node": ">=8.0"
1155 | }
1156 | },
1157 | "node_modules/tslib": {
1158 | "version": "2.6.2",
1159 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
1160 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
1161 | "dev": true
1162 | },
1163 | "node_modules/uberproto": {
1164 | "version": "1.2.0",
1165 | "resolved": "https://registry.npmjs.org/uberproto/-/uberproto-1.2.0.tgz",
1166 | "integrity": "sha512-pGtPAQmLwh+R9w81WVHzui1FfedpQWQpiaIIfPCwhtsBez4q6DYbJFfyXPVHPUTNFnedAvNEnkoFiLuhXIR94w==",
1167 | "dev": true,
1168 | "engines": {
1169 | "node": "*"
1170 | }
1171 | },
1172 | "node_modules/universalify": {
1173 | "version": "2.0.1",
1174 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
1175 | "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
1176 | "dev": true,
1177 | "engines": {
1178 | "node": ">= 10.0.0"
1179 | }
1180 | },
1181 | "node_modules/vite": {
1182 | "version": "4.5.2",
1183 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz",
1184 | "integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==",
1185 | "dev": true,
1186 | "dependencies": {
1187 | "esbuild": "^0.18.10",
1188 | "postcss": "^8.4.27",
1189 | "rollup": "^3.27.1"
1190 | },
1191 | "bin": {
1192 | "vite": "bin/vite.js"
1193 | },
1194 | "engines": {
1195 | "node": "^14.18.0 || >=16.0.0"
1196 | },
1197 | "funding": {
1198 | "url": "https://github.com/vitejs/vite?sponsor=1"
1199 | },
1200 | "optionalDependencies": {
1201 | "fsevents": "~2.3.2"
1202 | },
1203 | "peerDependencies": {
1204 | "@types/node": ">= 14",
1205 | "less": "*",
1206 | "lightningcss": "^1.21.0",
1207 | "sass": "*",
1208 | "stylus": "*",
1209 | "sugarss": "*",
1210 | "terser": "^5.4.0"
1211 | },
1212 | "peerDependenciesMeta": {
1213 | "@types/node": {
1214 | "optional": true
1215 | },
1216 | "less": {
1217 | "optional": true
1218 | },
1219 | "lightningcss": {
1220 | "optional": true
1221 | },
1222 | "sass": {
1223 | "optional": true
1224 | },
1225 | "stylus": {
1226 | "optional": true
1227 | },
1228 | "sugarss": {
1229 | "optional": true
1230 | },
1231 | "terser": {
1232 | "optional": true
1233 | }
1234 | }
1235 | },
1236 | "node_modules/vite/node_modules/rollup": {
1237 | "version": "3.29.4",
1238 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz",
1239 | "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==",
1240 | "dev": true,
1241 | "bin": {
1242 | "rollup": "dist/bin/rollup"
1243 | },
1244 | "engines": {
1245 | "node": ">=14.18.0",
1246 | "npm": ">=8.0.0"
1247 | },
1248 | "optionalDependencies": {
1249 | "fsevents": "~2.3.2"
1250 | }
1251 | }
1252 | }
1253 | }
1254 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "AdBlitz",
3 | "version": "0.1.0",
4 | "author": "Dikshant Rajput",
5 | "description": "AdBlitz: Your Shortcut to Ad-Free Streaming",
6 | "type": "module",
7 | "license": "MIT",
8 | "keywords": [
9 | "chrome-extension",
10 | "vanilla",
11 | "vite",
12 | "create-chrome-ext"
13 | ],
14 | "engines": {
15 | "node": ">=14.18.0"
16 | },
17 | "scripts": {
18 | "dev": "vite",
19 | "build": "vite build",
20 | "preview": "vite preview",
21 | "fmt": "prettier --write '**/*.{js,json,css,scss,md}'"
22 | },
23 | "dependencies": {},
24 | "devDependencies": {
25 | "@crxjs/vite-plugin": "^2.0.0-beta.19",
26 | "prettier": "^3.0.3",
27 | "vite": "^4.4.11"
28 | }
29 | }
--------------------------------------------------------------------------------
/popup.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | AdBlitz
7 |
46 |
47 |
48 |
49 |
AdBlitz
50 |
Total ads skipped: 0
51 |
Total ads speeded: 0
52 |
53 |
54 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/public/img/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/public/img/android-chrome-192x192.png
--------------------------------------------------------------------------------
/public/img/android-chrome-384x384.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/public/img/android-chrome-384x384.png
--------------------------------------------------------------------------------
/public/img/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/public/img/apple-touch-icon.png
--------------------------------------------------------------------------------
/public/img/browserconfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | #da532c
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/public/img/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/public/img/favicon-16x16.png
--------------------------------------------------------------------------------
/public/img/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/public/img/favicon-32x32.png
--------------------------------------------------------------------------------
/public/img/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/public/img/favicon.ico
--------------------------------------------------------------------------------
/public/img/mstile-150x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/public/img/mstile-150x150.png
--------------------------------------------------------------------------------
/public/img/safari-pinned-tab.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
34 |
--------------------------------------------------------------------------------
/public/img/site.webmanifest:
--------------------------------------------------------------------------------
1 | {
2 | "name": "",
3 | "short_name": "",
4 | "icons": [
5 | {
6 | "src": "/android-chrome-192x192.png",
7 | "sizes": "192x192",
8 | "type": "image/png"
9 | },
10 | {
11 | "src": "/android-chrome-384x384.png",
12 | "sizes": "384x384",
13 | "type": "image/png"
14 | }
15 | ],
16 | "theme_color": "#ffffff",
17 | "background_color": "#ffffff",
18 | "display": "standalone"
19 | }
20 |
--------------------------------------------------------------------------------
/src/assets/demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/src/assets/demo.gif
--------------------------------------------------------------------------------
/src/assets/how-to-install.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/src/assets/how-to-install.gif
--------------------------------------------------------------------------------
/src/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/src/assets/icon.png
--------------------------------------------------------------------------------
/src/assets/small-demo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dikshantrajput/adBlitz/007ca130a3ac0b3f962142004f3cc1fbddb83a82/src/assets/small-demo.gif
--------------------------------------------------------------------------------
/src/background/index.js:
--------------------------------------------------------------------------------
1 | chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
2 | switch(message.action){
3 | case "adSkipped":
4 | chrome.storage.local.get('adCount', function(data) {
5 | const adCount = data.adCount || 0;
6 | chrome.storage.local.set({ 'adCount': adCount + 1 });
7 | });
8 | case "adSpeeded":
9 | chrome.storage.local.get('adSpeed', function(data) {
10 | const adSpeed = data.adSpeed || 0;
11 | chrome.storage.local.set({ 'adSpeed': adSpeed + 1 });
12 | });
13 | default:
14 | console.log("Action not defined");
15 | }
16 | });
17 |
--------------------------------------------------------------------------------
/src/contentScript/index.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Initializes the ad skipping functionality and observes changes in the target node.
3 | * @param {Node} targetNode - The node to observe for changes.
4 | */
5 | // variable to store the MutationObserver instance
6 | let observer;
7 |
8 | // Function to handle ad skipping logic
9 | const execute = (targetNode) => {
10 | const increaseAdPlaybackSpeed = () => {
11 | const videoElement = document.querySelector("video")
12 | if (videoElement) {
13 | videoElement.playbackRate = 16
14 | videoElement.volume = 0
15 | chrome.runtime.sendMessage({ action: 'adSpeeded' });
16 | }
17 | }
18 |
19 | const skipAdFallback = () => {
20 | let isSkipped = false;
21 | const skipAddButtons = document.getElementsByClassName("ytp-ad-skip-button-text");
22 | if (skipAddButtons.length === 1) {
23 | const button = skipAddButtons[0];
24 | const skipButtonCta = button.parentElement.classList.contains("ytp-ad-skip-button-modern");
25 | if (skipButtonCta) {
26 | button.parentElement.click();
27 | chrome.runtime.sendMessage({ action: 'adSkipped' });
28 | isSkipped = true
29 | }
30 | }
31 |
32 | return isSkipped
33 | }
34 |
35 | // Function to skip the ad
36 | const skipAd = () => {
37 | const skipAddButtons = document.getElementsByClassName("ytp-skip-ad-button");
38 | if (skipAddButtons.length) {
39 | const skipButtonCta = skipAddButtons[0];
40 | if (skipButtonCta) {
41 | skipButtonCta.click();
42 | chrome.runtime.sendMessage({ action: 'adSkipped' });
43 | }
44 | } else if(! skipAdFallback()){
45 | increaseAdPlaybackSpeed()
46 | }
47 | };
48 |
49 | // Function to check if a node has child elements
50 | const checkChildElements = (node) => {
51 | return node?.children?.length > 0
52 | }
53 |
54 | // Function to check for child elements and skip ad
55 | const checkForChildElementAndSkipAd = (node) => {
56 | checkChildElements(node) && skipAd()
57 | }
58 |
59 | // Callback function for MutationObserver
60 | const observerCallback = (mutationsList, observer) => {
61 | for (let mutation of mutationsList) {
62 | if (mutation.type === 'childList') {
63 | checkForChildElementAndSkipAd(targetNode)
64 | }
65 | }
66 | }
67 |
68 | // Disconnect existing observer if any
69 | if (observer && observer.disconnect) {
70 | observer.disconnect()
71 | }
72 |
73 | // Create a new MutationObserver to observe targetNode
74 | observer = new MutationObserver(observerCallback);
75 | observer.observe(targetNode, { childList: true });
76 | // Check for child elements and skip ad initially
77 | checkForChildElementAndSkipAd(targetNode)
78 | }
79 |
80 | /**
81 | * Handles changes in the URL and triggers ad skipping logic accordingly.
82 | */
83 |
84 | // Variable to store the previous URL
85 | let previousTitle = ''
86 |
87 | // Function to handle URL changes
88 | const handleUrlChange = () => {
89 | // Check if URL has changed
90 | if (document.title !== previousTitle) {
91 | // Update previousUrl with current URL
92 | previousTitle = document.title;
93 |
94 | // Find the targetNode containing video ads
95 | const targetNode = document.querySelector(".video-ads.ytp-ad-module");
96 | // Execute ad skipping logic if targetNode exists
97 | targetNode && execute(targetNode)
98 |
99 | }
100 | }
101 | /**
102 | * Observes changes in the element to detect URL changes.
103 | */
104 | // MutationObserver to observe changes to the element for URL changes
105 | const observerForUrlChange = new MutationObserver(handleUrlChange);
106 | observerForUrlChange.observe(document.querySelector('title'), { childList: true });
--------------------------------------------------------------------------------
/src/manifest.js:
--------------------------------------------------------------------------------
1 | import { defineManifest } from '@crxjs/vite-plugin'
2 | import packageData from '../package.json'
3 |
4 | export default defineManifest({
5 | name: packageData.name,
6 | description: packageData.description,
7 | version: packageData.version,
8 | manifest_version: 3,
9 | icons: {
10 | 16: 'img/favicon-16x16.png',
11 | 32: 'img/favicon-32x32.png',
12 | 192: 'img/android-chrome-192x192.png',
13 | },
14 | action: {
15 | default_popup: 'popup.html',
16 | default_icon: 'img/apple-touch-icon.png',
17 | },
18 | background: {
19 | service_worker: 'src/background/index.js',
20 | type: 'module',
21 | },
22 | content_scripts: [
23 | {
24 | "matches": ["*://*.youtube.com/*"],
25 | "js": ["src/contentScript/index.js"]
26 | }
27 | ],
28 | web_accessible_resources: [
29 | {
30 | resources: ['img/favicon-16x16.png', 'img/favicon-32x32.png', 'img/android-chrome-192x192.png'],
31 | matches: [],
32 | },
33 | ],
34 | permissions: ['activeTab', 'storage'],
35 | })
36 |
--------------------------------------------------------------------------------
/src/popup/index.css:
--------------------------------------------------------------------------------
1 | :root {
2 | font-family:
3 | system-ui,
4 | -apple-system,
5 | BlinkMacSystemFont,
6 | 'Segoe UI',
7 | Roboto,
8 | Oxygen,
9 | Ubuntu,
10 | Cantarell,
11 | 'Open Sans',
12 | 'Helvetica Neue',
13 | sans-serif;
14 |
15 | color-scheme: light dark;
16 | background-color: #242424;
17 | }
18 |
19 | @media (prefers-color-scheme: light) {
20 | :root {
21 | background-color: #fafafa;
22 | }
23 |
24 | a:hover {
25 | color: #f3e5ab;
26 | }
27 | }
28 |
29 | body {
30 | min-width: 20rem;
31 | margin: 0;
32 | }
33 |
34 | main {
35 | text-align: center;
36 | padding: 1em;
37 | margin: 0 auto;
38 | }
39 |
40 | h3 {
41 | color: #f3e5ab;
42 | text-transform: uppercase;
43 | font-size: 1.5rem;
44 | font-weight: 200;
45 | line-height: 1.2rem;
46 | margin: 2rem auto;
47 | }
48 |
49 | .calc {
50 | display: flex;
51 | justify-content: center;
52 | align-items: center;
53 | margin: 2rem;
54 | }
55 |
56 | button {
57 | font-size: 1rem;
58 | padding: 0.5rem 1rem;
59 | border: 1px solid #f3e5ab;
60 | border-radius: 0.25rem;
61 | background-color: transparent;
62 | color: #f3e5ab;
63 | cursor: pointer;
64 | outline: none;
65 |
66 | width: 3rem;
67 | margin: 0 a;
68 | }
69 |
70 | label {
71 | font-size: 1.5rem;
72 | margin: 0 1rem;
73 | }
74 |
75 | a {
76 | font-size: 0.5rem;
77 | margin: 0.5rem;
78 | color: #cccccc;
79 | text-decoration: none;
80 | }
81 |
--------------------------------------------------------------------------------
/src/popup/index.js:
--------------------------------------------------------------------------------
1 | // Retrieve ad count from local storage and update popup
2 | chrome.storage.local.get('adCount', function(data) {
3 | const adCount = data.adCount || 0;
4 | document.getElementById('adCount').textContent = adCount;
5 | });
6 |
7 | chrome.storage.local.get('adSpeed', function(data) {
8 | const adSpeed = data.adSpeed || 0;
9 | document.getElementById('adSpeed').textContent = adSpeed;
10 | });
--------------------------------------------------------------------------------
/vite.config.js:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import { crx } from '@crxjs/vite-plugin'
3 | import manifest from './src/manifest.js'
4 |
5 | // https://vitejs.dev/config/
6 | export default defineConfig(({ mode }) => {
7 | return {
8 | build: {
9 | emptyOutDir: true,
10 | outDir: 'build',
11 | rollupOptions: {
12 | output: {
13 | chunkFileNames: 'assets/chunk-[hash].js',
14 | },
15 | },
16 | },
17 |
18 | plugins: [crx({ manifest })],
19 | }
20 | })
21 |
--------------------------------------------------------------------------------