diff --git a/package-lock.json b/package-lock.json index 506735a1..e4b4104d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,62 +1,62 @@ { "name": "ttv-lol-pro", - "version": "2.0.0", + "version": "2.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ttv-lol-pro", - "version": "2.0.0", + "version": "2.0.1", "license": "GPL-3.0", "dependencies": { "bowser": "^2.11.0", - "semver-compare": "^1.0.0", - "xhook": "^1.6.0" + "ip": "^1.1.8" }, "devDependencies": { - "@parcel/config-webextension": "^2.9.1", + "@parcel/config-webextension": "^2.9.2", "@types/chrome": "^0.0.237", - "@types/semver-compare": "^1.0.1", + "@types/ip": "^1.1.0", "@types/webextension-polyfill": "^0.10.0", - "@types/xhook": "^1.5.0", - "cpy-cli": "^4.2.0", - "parcel": "^2.9.1", + "buffer": "^6.0.3", + "os-browserify": "^0.3.0", + "parcel": "^2.9.2", "postcss": "^8.4.24", "prettier": "^2.8.8", - "prettier-plugin-css-order": "^1.3.0", + "prettier-plugin-css-order": "^1.3.1", "prettier-plugin-organize-imports": "^3.2.2", + "shx": "^0.3.4", "typescript": "^4.9.5", "webextension-polyfill": "^0.10.0" } }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -105,15 +105,6 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -320,57 +311,22 @@ "win32" ] }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@parcel/bundler-default": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/bundler-default/-/bundler-default-2.9.1.tgz", - "integrity": "sha512-gNTaSQpp7jiFvkQ/P/KfAiVLT3UOEs5bBivQm4OMdgSi2DTIsjGMQVQ7JDzvzEzrHiFlDmdXKxUagex54pOtJg==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/bundler-default/-/bundler-default-2.9.2.tgz", + "integrity": "sha512-tmhyeNQYJla9509Sq/U12j2fZg0hDojyIyM4wuVWKhkAnDnZjbMKj3m11S1COR5i2aqx9lJjTWj0XPJl5lrcvg==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.9.1", - "@parcel/graph": "2.9.1", - "@parcel/hash": "2.9.1", - "@parcel/plugin": "2.9.1", - "@parcel/utils": "2.9.1", + "@parcel/diagnostic": "2.9.2", + "@parcel/graph": "2.9.2", + "@parcel/hash": "2.9.2", + "@parcel/plugin": "2.9.2", + "@parcel/utils": "2.9.2", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -378,14 +334,14 @@ } }, "node_modules/@parcel/cache": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.9.1.tgz", - "integrity": "sha512-2aFWUAi7vkcnIdfOw3oW/vhgvwv9MPb+LjmJSkE59nNUuSJe83jJFAPAhqQTHd9L3kX/Xk+xJBNYNubUq/Cieg==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.9.2.tgz", + "integrity": "sha512-Bde9HmxaO+H5qPbcxBl/JzzZ/7ewoHFDWLOQ4zdfyh+q4IyLS257WAUGm4x6BeNjc1S7YjoelEbBKdgw8mQOig==", "dev": true, "dependencies": { - "@parcel/fs": "2.9.1", - "@parcel/logger": "2.9.1", - "@parcel/utils": "2.9.1", + "@parcel/fs": "2.9.2", + "@parcel/logger": "2.9.2", + "@parcel/utils": "2.9.2", "lmdb": "2.7.11" }, "engines": { @@ -396,13 +352,13 @@ "url": "https://opencollective.com/parcel" }, "peerDependencies": { - "@parcel/core": "^2.9.1" + "@parcel/core": "^2.9.2" } }, "node_modules/@parcel/codeframe": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.9.1.tgz", - "integrity": "sha512-qLVIyEHuZq8wWYaXVAwxMzlK3QqWlaB5fUSe1n+kITEa9EEwb2WPmysYAsWiVaFdD62A0+1klJ8Sq9gapOMIng==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.9.2.tgz", + "integrity": "sha512-+T1POu9uU2tkPi3P25ojtU3CKoGYfirc2bE/1iNyvbuEtpkAzl9UQFXphGqFyuJSI429mP2pWL8SeKG0b5zaUw==", "dev": true, "dependencies": { "chalk": "^4.1.0" @@ -416,16 +372,16 @@ } }, "node_modules/@parcel/compressor-raw": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/compressor-raw/-/compressor-raw-2.9.1.tgz", - "integrity": "sha512-aUkZ0pOzGjQ9kyaUQ/suDVmU5lR4mT9fU5HXlp3hGD7MWh2HFJUOfQ3gp5g3P9x+MeVZKU+ht6UcIMhrzelLGQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/compressor-raw/-/compressor-raw-2.9.2.tgz", + "integrity": "sha512-QRrxyiztMjk8Tt4AmP1ibgH7bRrAcrWCjTY/W1wa0fCkEn2QyCg20BGxONg280qXTQD4x2N98X4B3ctAPAxpDw==", "dev": true, "dependencies": { - "@parcel/plugin": "2.9.1" + "@parcel/plugin": "2.9.2" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -433,91 +389,91 @@ } }, "node_modules/@parcel/config-default": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/config-default/-/config-default-2.9.1.tgz", - "integrity": "sha512-oH6NHKaKp2YBHOcQJxwHGPbgGCZZZH1I4eef+KRBFiabgiDQxHLni+vg+c+mErd8lFrNn2gcGIdKzQwWqavT+w==", - "dev": true, - "dependencies": { - "@parcel/bundler-default": "2.9.1", - "@parcel/compressor-raw": "2.9.1", - "@parcel/namer-default": "2.9.1", - "@parcel/optimizer-css": "2.9.1", - "@parcel/optimizer-htmlnano": "2.9.1", - "@parcel/optimizer-image": "2.9.1", - "@parcel/optimizer-svgo": "2.9.1", - "@parcel/optimizer-swc": "2.9.1", - "@parcel/packager-css": "2.9.1", - "@parcel/packager-html": "2.9.1", - "@parcel/packager-js": "2.9.1", - "@parcel/packager-raw": "2.9.1", - "@parcel/packager-svg": "2.9.1", - "@parcel/reporter-dev-server": "2.9.1", - "@parcel/resolver-default": "2.9.1", - "@parcel/runtime-browser-hmr": "2.9.1", - "@parcel/runtime-js": "2.9.1", - "@parcel/runtime-react-refresh": "2.9.1", - "@parcel/runtime-service-worker": "2.9.1", - "@parcel/transformer-babel": "2.9.1", - "@parcel/transformer-css": "2.9.1", - "@parcel/transformer-html": "2.9.1", - "@parcel/transformer-image": "2.9.1", - "@parcel/transformer-js": "2.9.1", - "@parcel/transformer-json": "2.9.1", - "@parcel/transformer-postcss": "2.9.1", - "@parcel/transformer-posthtml": "2.9.1", - "@parcel/transformer-raw": "2.9.1", - "@parcel/transformer-react-refresh-wrap": "2.9.1", - "@parcel/transformer-svg": "2.9.1" + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/config-default/-/config-default-2.9.2.tgz", + "integrity": "sha512-dRqUKn6YIKTxvKbfO5xfxzMhOMWMCNoZzEWuP/bESW6zXI8krdGmgdu6HxSfCmvPnkz+0SAz8ig2QnjV0KtCcw==", + "dev": true, + "dependencies": { + "@parcel/bundler-default": "2.9.2", + "@parcel/compressor-raw": "2.9.2", + "@parcel/namer-default": "2.9.2", + "@parcel/optimizer-css": "2.9.2", + "@parcel/optimizer-htmlnano": "2.9.2", + "@parcel/optimizer-image": "2.9.2", + "@parcel/optimizer-svgo": "2.9.2", + "@parcel/optimizer-swc": "2.9.2", + "@parcel/packager-css": "2.9.2", + "@parcel/packager-html": "2.9.2", + "@parcel/packager-js": "2.9.2", + "@parcel/packager-raw": "2.9.2", + "@parcel/packager-svg": "2.9.2", + "@parcel/reporter-dev-server": "2.9.2", + "@parcel/resolver-default": "2.9.2", + "@parcel/runtime-browser-hmr": "2.9.2", + "@parcel/runtime-js": "2.9.2", + "@parcel/runtime-react-refresh": "2.9.2", + "@parcel/runtime-service-worker": "2.9.2", + "@parcel/transformer-babel": "2.9.2", + "@parcel/transformer-css": "2.9.2", + "@parcel/transformer-html": "2.9.2", + "@parcel/transformer-image": "2.9.2", + "@parcel/transformer-js": "2.9.2", + "@parcel/transformer-json": "2.9.2", + "@parcel/transformer-postcss": "2.9.2", + "@parcel/transformer-posthtml": "2.9.2", + "@parcel/transformer-raw": "2.9.2", + "@parcel/transformer-react-refresh-wrap": "2.9.2", + "@parcel/transformer-svg": "2.9.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" }, "peerDependencies": { - "@parcel/core": "^2.9.1" + "@parcel/core": "^2.9.2" } }, "node_modules/@parcel/config-webextension": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/config-webextension/-/config-webextension-2.9.1.tgz", - "integrity": "sha512-GL2ZH5Q/fv0odc0APBcHVr90172nAJR9T23i7pwBjL/hp80sKq3m6Ux5U+7msD4iJrKVtM80gbTi50juWorYVA==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/config-webextension/-/config-webextension-2.9.2.tgz", + "integrity": "sha512-+bbwtArcr4BOeIU90YSc924yoaAvAeUPZT8wH6XYGCIWMiPE6KzHthkKzYaCA5uB/Ap4bOL1JQDvCmq+e0zMbg==", "dev": true, "dependencies": { - "@parcel/config-default": "2.9.1", - "@parcel/packager-webextension": "2.9.1", - "@parcel/runtime-webextension": "2.9.1", - "@parcel/transformer-raw": "2.9.1", - "@parcel/transformer-webextension": "2.9.1" + "@parcel/config-default": "2.9.2", + "@parcel/packager-webextension": "2.9.2", + "@parcel/runtime-webextension": "2.9.2", + "@parcel/transformer-raw": "2.9.2", + "@parcel/transformer-webextension": "2.9.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" }, "peerDependencies": { - "@parcel/core": "^2.9.1" + "@parcel/core": "^2.9.2" } }, "node_modules/@parcel/core": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.9.1.tgz", - "integrity": "sha512-D/7iyRV5c8kYMV1JGkokktxh3ON5CMvNAllaBucl4SMatAyLo5aLjGG5ey6FD/4Tv+JJ6NsldLtkvciDVJdgFQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.9.2.tgz", + "integrity": "sha512-Qwn9Fp85gchfDq94chr+of9+xgWQP0G48chP+J/PmZ3TP29sOZ9NsVf+qiGO47UAeNnamBRPeMXyK/Nvv0zQdg==", "dev": true, "dependencies": { "@mischnic/json-sourcemap": "^0.1.0", - "@parcel/cache": "2.9.1", - "@parcel/diagnostic": "2.9.1", - "@parcel/events": "2.9.1", - "@parcel/fs": "2.9.1", - "@parcel/graph": "2.9.1", - "@parcel/hash": "2.9.1", - "@parcel/logger": "2.9.1", - "@parcel/package-manager": "2.9.1", - "@parcel/plugin": "2.9.1", - "@parcel/profiler": "2.9.1", + "@parcel/cache": "2.9.2", + "@parcel/diagnostic": "2.9.2", + "@parcel/events": "2.9.2", + "@parcel/fs": "2.9.2", + "@parcel/graph": "2.9.2", + "@parcel/hash": "2.9.2", + "@parcel/logger": "2.9.2", + "@parcel/package-manager": "2.9.2", + "@parcel/plugin": "2.9.2", + "@parcel/profiler": "2.9.2", "@parcel/source-map": "^2.1.1", - "@parcel/types": "2.9.1", - "@parcel/utils": "2.9.1", - "@parcel/workers": "2.9.1", + "@parcel/types": "2.9.2", + "@parcel/utils": "2.9.2", + "@parcel/workers": "2.9.2", "abortcontroller-polyfill": "^1.1.9", "base-x": "^3.0.8", "browserslist": "^4.6.6", @@ -538,9 +494,9 @@ } }, "node_modules/@parcel/diagnostic": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.9.1.tgz", - "integrity": "sha512-LM+w4maoAsjcL+javaHw9B9oEQoLdg/fMCNbuTmAKpQWi16hfNkr4+xz7AxxwL3dCcL7uuvVgoUOUubwxWNLAA==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.9.2.tgz", + "integrity": "sha512-cHvQ3GtC0dJixtt5Ne1SG0vogt6PE9Fu2KmrFMLcL57rowi3sl+W+Lh02sujd/V0ZQOSRV01WdXJXDsiI/na8g==", "dev": true, "dependencies": { "@mischnic/json-sourcemap": "^0.1.0", @@ -555,9 +511,9 @@ } }, "node_modules/@parcel/events": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.9.1.tgz", - "integrity": "sha512-tga4FiJB1TC4iOKBK66e9zXpcDFXvJhXmsgOMsgSTM6uCZMXeGaYEixHNlPDs3HTfg17qAmHHlhfgPBbku/aOg==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.9.2.tgz", + "integrity": "sha512-aDKq9gl8vK/LTTsAs3k8wBsFYVQ8NOSa0aC0Thq+l5KRN04U/ljNiDVmxDkwJgAvT0Iv62kT9ooBl6aQPUWNyQ==", "dev": true, "engines": { "node": ">= 12.0.0" @@ -568,16 +524,16 @@ } }, "node_modules/@parcel/fs": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.9.1.tgz", - "integrity": "sha512-F/GRHtHN4AuTauadsq/UQ1OSpLBLAS/96Sv1x09/AKZxNlZ2UzWExoYEhSkVM5smKVzSnx8XP9OqABcHcZwOLQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.9.2.tgz", + "integrity": "sha512-URKchUywNyoOIcOsmwcxr8gp+CBVjD502Fb6RhAdFhdZV2o3X2BLTGf03fQzSSJ0IDO3jKUTK0UUg/Mz8Vd3Rw==", "dev": true, "dependencies": { - "@parcel/fs-search": "2.9.1", - "@parcel/types": "2.9.1", - "@parcel/utils": "2.9.1", + "@parcel/fs-search": "2.9.2", + "@parcel/types": "2.9.2", + "@parcel/utils": "2.9.2", "@parcel/watcher": "^2.0.7", - "@parcel/workers": "2.9.1" + "@parcel/workers": "2.9.2" }, "engines": { "node": ">= 12.0.0" @@ -587,13 +543,13 @@ "url": "https://opencollective.com/parcel" }, "peerDependencies": { - "@parcel/core": "^2.9.1" + "@parcel/core": "^2.9.2" } }, "node_modules/@parcel/fs-search": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/fs-search/-/fs-search-2.9.1.tgz", - "integrity": "sha512-F7SkVsMb5XYcWmeptLz5D3g76Raed3dmNulJMrWIECP8lJ1LUcCExQId7NsdeCfRbNRwaf84gdsjc/1GKM/QYg==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/fs-search/-/fs-search-2.9.2.tgz", + "integrity": "sha512-PP1aFLaH5rk8mF8AN62/R68Ne9Xq/VNhj3h1BxdESiHkhRIrM1ZcQ4t4WBaMjPaLXi1jSKLQ8fY50QBVIJKy4Q==", "dev": true, "engines": { "node": ">= 12.0.0" @@ -604,9 +560,9 @@ } }, "node_modules/@parcel/graph": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-2.9.1.tgz", - "integrity": "sha512-fc/Yk1XPzo3ZHhKS7l5aETAEBpnF0nK+0TawkNrQ2rcL21MG1kHNYSR8uBwOqyXmBSMEItals5Ixgd8fWa+9PQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-2.9.2.tgz", + "integrity": "sha512-2lraupLwe6JTzy4KFOsFphV6/Fn3OF6PUOnHY2oQhHdBzWw43a0cbVpyIn8ChvXKlB3YqdId6X7oOutbmh3X8A==", "dev": true, "dependencies": { "nullthrows": "^1.1.1" @@ -620,9 +576,9 @@ } }, "node_modules/@parcel/hash": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/hash/-/hash-2.9.1.tgz", - "integrity": "sha512-fiqAIi/23h5tnH5W7DRTwOhfRPhadHvI7hYoG8YFGvnFxSQ/XCnOID0B0/vNhaluICSPeFcedjAmDVdqY6/X7w==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/hash/-/hash-2.9.2.tgz", + "integrity": "sha512-zXjg3BTxevsTe2Ylqsmm2Cw6gcIObaSz2dBjeRXO3LM8ziXJ4c7tOBKIXHPcnc2JmOyp3pmFB1sQaE+qXKh0DQ==", "dev": true, "dependencies": { "xxhash-wasm": "^0.4.2" @@ -636,13 +592,13 @@ } }, "node_modules/@parcel/logger": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.9.1.tgz", - "integrity": "sha512-wUH9ShrRr3RwNa75ymegDIAdJiY3dGB7HCgIP6VOOc2CGyGA2DJKbbYGfw5mkl3DV8lUV+dYsWYMGXZhInAQCQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.9.2.tgz", + "integrity": "sha512-rhb+CZZ4tKbrH585GTec32qxEpbjqrjaAbBRmyjGknsTleoiazcrLiutE7h+VRItKmv5QG+yPgrZ0PFx83fmhw==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.9.1", - "@parcel/events": "2.9.1" + "@parcel/diagnostic": "2.9.2", + "@parcel/events": "2.9.2" }, "engines": { "node": ">= 12.0.0" @@ -653,9 +609,9 @@ } }, "node_modules/@parcel/markdown-ansi": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.9.1.tgz", - "integrity": "sha512-FpOz2ltnKnm6QaQCdcpuAEwGuScVUq0ixT/QAmU7A3/cwlsoxqMkB2XeWYIVTjs7p7Bsu0Ctdid/6pdtP7ghpg==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.9.2.tgz", + "integrity": "sha512-2iWqdaQhDEPL11V4TAssghJLZUXwB4RXzCgOEniWv7Hj/3ymXA4VzCyOncRoIqpm4MvxBV3tLPGM7qVqbCzN8Q==", "dev": true, "dependencies": { "chalk": "^4.1.0" @@ -669,18 +625,18 @@ } }, "node_modules/@parcel/namer-default": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/namer-default/-/namer-default-2.9.1.tgz", - "integrity": "sha512-XHpAc5JLQchUqRrYqnUvinReR2nCyiD+DhIedMW5hURwlCPBlfcTVf6M5kSSpjzqRDVKezx3TFF6dzZNv0fBJQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/namer-default/-/namer-default-2.9.2.tgz", + "integrity": "sha512-7hHEPhSPGnQadQmqghreRpREM8BheEA2BXhpXcemLYhFcCtQwrQUe14laOFy70+E8lK3SRf4QvQKXroHscL3ZQ==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.9.1", - "@parcel/plugin": "2.9.1", + "@parcel/diagnostic": "2.9.2", + "@parcel/plugin": "2.9.2", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -688,15 +644,15 @@ } }, "node_modules/@parcel/node-resolver-core": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.0.1.tgz", - "integrity": "sha512-4owokOoHCONeazQGndB4PkIaUhZfyWuCT7Sx4UJc2UhR1V82MlahHrT2ItT0pkQyKWwCSNgHdBgdKUgKRdIiAw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.0.2.tgz", + "integrity": "sha512-fDsELMiEZoMOfqVKQY+BpGA92egLy4rTCC0ra1J+rKpevOubh/qNL2px3+FZUlfsxFO59iaR4qBSjBUzfD3zlg==", "dev": true, "dependencies": { "@mischnic/json-sourcemap": "^0.1.0", - "@parcel/diagnostic": "2.9.1", - "@parcel/fs": "2.9.1", - "@parcel/utils": "2.9.1", + "@parcel/diagnostic": "2.9.2", + "@parcel/fs": "2.9.2", + "@parcel/utils": "2.9.2", "nullthrows": "^1.1.1", "semver": "^5.7.1" }, @@ -709,22 +665,22 @@ } }, "node_modules/@parcel/optimizer-css": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-css/-/optimizer-css-2.9.1.tgz", - "integrity": "sha512-IYQpV0kc0KN/aqRAWQsZ8b2pbI4ha4T5HAi27lTGIhQNvEixUtf0gJvCJVSlBxpdMiXVJq9pp97UamoNuB6oig==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-css/-/optimizer-css-2.9.2.tgz", + "integrity": "sha512-tNkoeCqy6yK21D+EMMWmmUHJL+abwNjhUC3LKJbi7YBrj1DswSaARiFMzLNlNQysa39VtWbo42VD+GV/5F6LAQ==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.9.1", - "@parcel/plugin": "2.9.1", + "@parcel/diagnostic": "2.9.2", + "@parcel/plugin": "2.9.2", "@parcel/source-map": "^2.1.1", - "@parcel/utils": "2.9.1", + "@parcel/utils": "2.9.2", "browserslist": "^4.6.6", "lightningcss": "^1.16.1", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -732,12 +688,12 @@ } }, "node_modules/@parcel/optimizer-htmlnano": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.9.1.tgz", - "integrity": "sha512-t/e9XsoXZViqOFWcz3LlEClCOYNCjP6MIo+p+WmAuc5+QFF0/9viNqgRbhVe8V1tbtRofxsm4BossFOjOBSjmg==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.9.2.tgz", + "integrity": "sha512-PfZ5bK9Xh5Yi6B++cilRDslSnkkzoEldGAAQ4qeX1njT6/VmQcOsG+ZV1lA344sXogu9nhmdjl+TVbpxzrs+Og==", "dev": true, "dependencies": { - "@parcel/plugin": "2.9.1", + "@parcel/plugin": "2.9.2", "htmlnano": "^2.0.0", "nullthrows": "^1.1.1", "posthtml": "^0.16.5", @@ -745,7 +701,7 @@ }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -821,39 +777,42 @@ } }, "node_modules/@parcel/optimizer-image": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-image/-/optimizer-image-2.9.1.tgz", - "integrity": "sha512-Ml51RUGbQXyoHZ9yhyal8J/khZeWZX5J8NPOEvkCmmOkxo/qM4CMPIvJStzzn5K7mOPRKUheDkM/QoNGO5gTwA==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-image/-/optimizer-image-2.9.2.tgz", + "integrity": "sha512-FhYo3j/olcojmDGBxwYXrD1+xzLTulsWosqgs0BpU4E2mGwqpK2IqC+VUs66wKLsCWB3EQStHY1ax7o3ODAmjA==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.9.1", - "@parcel/plugin": "2.9.1", - "@parcel/utils": "2.9.1", - "@parcel/workers": "2.9.1" + "@parcel/diagnostic": "2.9.2", + "@parcel/plugin": "2.9.2", + "@parcel/utils": "2.9.2", + "@parcel/workers": "2.9.2" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.9.2" } }, "node_modules/@parcel/optimizer-svgo": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-svgo/-/optimizer-svgo-2.9.1.tgz", - "integrity": "sha512-8XHSEIjJfdTFtUQzRiy0K+fbvdcheYc+azdyuJPnIV5AX04k4heKwp7uH328Ylk2k0JkfDyQmjFEyPj9qWDadQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-svgo/-/optimizer-svgo-2.9.2.tgz", + "integrity": "sha512-k14TS8IM46Lsffr9MdlSO+/2Np4x1en1viKBfqUHjoJSRwpV12o7Jy81XRTaLekBTe+NvUPem4nzvE1/x+4QKA==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.9.1", - "@parcel/plugin": "2.9.1", - "@parcel/utils": "2.9.1", + "@parcel/diagnostic": "2.9.2", + "@parcel/plugin": "2.9.2", + "@parcel/utils": "2.9.2", "svgo": "^2.4.0" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -929,21 +888,21 @@ } }, "node_modules/@parcel/optimizer-swc": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-swc/-/optimizer-swc-2.9.1.tgz", - "integrity": "sha512-bLDkAwkmFE8YZNHcfJNj22haSLXrqjZkGXbPgGDkanCUS52yWv1+OFZ+6frX2q4EdXaTX8nFZSJL4VPHZZiUGQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-swc/-/optimizer-swc-2.9.2.tgz", + "integrity": "sha512-agy/gE70tPoALRapJEbbjP7Q52N3sV0sZDvR83lrmdc+B1KLGPAswGJe/RXyzXfiA76NGlTQTDxrExSbPa9B4Q==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.9.1", - "@parcel/plugin": "2.9.1", + "@parcel/diagnostic": "2.9.2", + "@parcel/plugin": "2.9.2", "@parcel/source-map": "^2.1.1", - "@parcel/utils": "2.9.1", + "@parcel/utils": "2.9.2", "@swc/core": "^1.3.36", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -951,18 +910,18 @@ } }, "node_modules/@parcel/package-manager": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.9.1.tgz", - "integrity": "sha512-cTUBUPRm62770Vw4YG5WGlkFxJII320nSobbP0TMggE/CGXg3ru2pvvX6WqXTFAHeM/z78xTPDq0NP97DBp5Ow==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.9.1", - "@parcel/fs": "2.9.1", - "@parcel/logger": "2.9.1", - "@parcel/node-resolver-core": "3.0.1", - "@parcel/types": "2.9.1", - "@parcel/utils": "2.9.1", - "@parcel/workers": "2.9.1", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.9.2.tgz", + "integrity": "sha512-4/ytXWzm0456gbT93klZNM1CMSqG9SCbJWKk7m5pqy5f8hCYDSrd9Qza+tTynK73cNCHzl4ehS3wsHDhsT+q+Q==", + "dev": true, + "dependencies": { + "@parcel/diagnostic": "2.9.2", + "@parcel/fs": "2.9.2", + "@parcel/logger": "2.9.2", + "@parcel/node-resolver-core": "3.0.2", + "@parcel/types": "2.9.2", + "@parcel/utils": "2.9.2", + "@parcel/workers": "2.9.2", "semver": "^5.7.1" }, "engines": { @@ -973,24 +932,24 @@ "url": "https://opencollective.com/parcel" }, "peerDependencies": { - "@parcel/core": "^2.9.1" + "@parcel/core": "^2.9.2" } }, "node_modules/@parcel/packager-css": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/packager-css/-/packager-css-2.9.1.tgz", - "integrity": "sha512-efMShrIwVBY9twZTGQ5QFwl9H3xJg8nSjl/xgOGq9rrbkmcrVlfSgPL9ExNx75EvmOwOKxZjFiMsNYNICPNfgg==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/packager-css/-/packager-css-2.9.2.tgz", + "integrity": "sha512-/FV8KmAONUbbfd0ybuXfD56EIPmMRQJGtKINFK4gRLLFOotgR9NSNoAUsEUxYblodZsC4RbKqwMhPpWdRMhcZg==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.9.1", - "@parcel/plugin": "2.9.1", + "@parcel/diagnostic": "2.9.2", + "@parcel/plugin": "2.9.2", "@parcel/source-map": "^2.1.1", - "@parcel/utils": "2.9.1", + "@parcel/utils": "2.9.2", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -998,20 +957,20 @@ } }, "node_modules/@parcel/packager-html": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/packager-html/-/packager-html-2.9.1.tgz", - "integrity": "sha512-mP7iIwyFDZ21XwD2SlwZoSrvKpS5Amlpi/ywd0dLdwQb5TL+Q2f05IcRNfFbWdVd1AJycDQ85ERokNKN3QPMkg==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/packager-html/-/packager-html-2.9.2.tgz", + "integrity": "sha512-CdOdKc0O6lxdsbnQs+Cai2sBSePvVZty+hUIHf/TeKKiYz1SDu51BEbsH+cppbMl08vbzQcUVkpgaatzaHzUMQ==", "dev": true, "dependencies": { - "@parcel/plugin": "2.9.1", - "@parcel/types": "2.9.1", - "@parcel/utils": "2.9.1", + "@parcel/plugin": "2.9.2", + "@parcel/types": "2.9.2", + "@parcel/utils": "2.9.2", "nullthrows": "^1.1.1", "posthtml": "^0.16.5" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1019,22 +978,22 @@ } }, "node_modules/@parcel/packager-js": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/packager-js/-/packager-js-2.9.1.tgz", - "integrity": "sha512-MmeKdp/obO36M8Y9yYAFiFkdhRFbQtYGSxbMwm2JVtRKMcFmlR5KzqLUg67OX6qgKw5lZZ1TkYhSI0hQQ6+Vqw==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/packager-js/-/packager-js-2.9.2.tgz", + "integrity": "sha512-BgtouTdfTio4xe+o7pX4ys9+6hpNf70Ae+xEk8elwUhq+u+r1NlM8Iv/irtxIAQNCG0fGMdM4OCZofUQ4DMyvw==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.9.1", - "@parcel/hash": "2.9.1", - "@parcel/plugin": "2.9.1", + "@parcel/diagnostic": "2.9.2", + "@parcel/hash": "2.9.2", + "@parcel/plugin": "2.9.2", "@parcel/source-map": "^2.1.1", - "@parcel/utils": "2.9.1", + "@parcel/utils": "2.9.2", "globals": "^13.2.0", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1042,16 +1001,16 @@ } }, "node_modules/@parcel/packager-raw": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/packager-raw/-/packager-raw-2.9.1.tgz", - "integrity": "sha512-qHJ389R5cLgR2PcJt8sOrNBcAY0qpZRMTOMgkc9zYkKy1tdUMgCUuDfO1kShfv4E7rr084mtlu9tK8MXChyF6w==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/packager-raw/-/packager-raw-2.9.2.tgz", + "integrity": "sha512-p7eHwSSGHk8t1SjL72xKZHe8BsfkuixBhLnWVa+hscB0UGeYqIkQ+OQ34+gg9DkcL98Zc0/ZN1qHzsOdhd/2jg==", "dev": true, "dependencies": { - "@parcel/plugin": "2.9.1" + "@parcel/plugin": "2.9.2" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1059,19 +1018,19 @@ } }, "node_modules/@parcel/packager-svg": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/packager-svg/-/packager-svg-2.9.1.tgz", - "integrity": "sha512-aRzuiwcUlNATfSIbeYpDkJXvwdiAAbiQlxSz6cI53NqWwZn+Dn79WyiKPBST14ij4/P3ZjkcwXevqHpvXP/ArQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/packager-svg/-/packager-svg-2.9.2.tgz", + "integrity": "sha512-ywAk84WtHe+QIPlvKM36oefzfEN1anyj60bldZjzvSFoU2cBkwgtp1F80Do4lXdaaNCSvcLScD37EIVhAD2ASA==", "dev": true, "dependencies": { - "@parcel/plugin": "2.9.1", - "@parcel/types": "2.9.1", - "@parcel/utils": "2.9.1", + "@parcel/plugin": "2.9.2", + "@parcel/types": "2.9.2", + "@parcel/utils": "2.9.2", "posthtml": "^0.16.4" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1079,18 +1038,18 @@ } }, "node_modules/@parcel/packager-webextension": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/packager-webextension/-/packager-webextension-2.9.1.tgz", - "integrity": "sha512-8N6TOh5iMgUDfnWjYYsoKgxhpGsxv36/J8h8PaIC6FXmO4uBiAFGXr7qeAX1ELXp1dhP6gzGRUb06FS1SJINkQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/packager-webextension/-/packager-webextension-2.9.2.tgz", + "integrity": "sha512-OzfAi+mdQZSkS8g3pfwTB925kKKvV9uSQIxS5bvQirRQQ4snNFbiSqi2k+W+RDxs68bQ2yzMCbl2zOAf9yC1YQ==", "dev": true, "dependencies": { - "@parcel/plugin": "2.9.1", - "@parcel/utils": "2.9.1", + "@parcel/plugin": "2.9.2", + "@parcel/utils": "2.9.2", "nullthrows": "^1.1.1" }, "engines": { "node": ">=12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1098,12 +1057,12 @@ } }, "node_modules/@parcel/plugin": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.9.1.tgz", - "integrity": "sha512-kD+BNkPGRcxZZUKhAXqF/bilUMhXUlf/ZixVlBS5rEsUB1yx/Ze8c4ypaKr5WsEwv34C+X4p4WFYdZVJEr3Y+g==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.9.2.tgz", + "integrity": "sha512-5v4sdeD5Cft4Vg2D61HW9TK0oi50X2jrm0hVFbUbCG2/TPWs77BMN6Nq+dMV38wEaGbnPjRolxBtRp+ungF09w==", "dev": true, "dependencies": { - "@parcel/types": "2.9.1" + "@parcel/types": "2.9.2" }, "engines": { "node": ">= 12.0.0" @@ -1114,13 +1073,13 @@ } }, "node_modules/@parcel/profiler": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.9.1.tgz", - "integrity": "sha512-hrptwbh9uUxnWHAAXiZ6BtpM74cU+VfrOWgnmUA8pkYWBmrb2wSLeqRKl8FiSt+nfRTTbNAIlmn9vk2x+wRNOA==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.9.2.tgz", + "integrity": "sha512-C846buL+bmnP/F360rUp4I9dwkdUkVM+gFe/AK3JCjtA0TZQIysLqntIQ7g6JK8VUa3e9Q8GwmTfncPAFoiaNQ==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.9.1", - "@parcel/events": "2.9.1", + "@parcel/diagnostic": "2.9.2", + "@parcel/events": "2.9.2", "chrome-trace-event": "^1.0.2" }, "engines": { @@ -1132,20 +1091,20 @@ } }, "node_modules/@parcel/reporter-cli": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/reporter-cli/-/reporter-cli-2.9.1.tgz", - "integrity": "sha512-xzJaaHQwcsmHijlCl7gOAdqU0n6AnW7c7rN8AXDH8BvnOx2v8NC8nCIEmDTOfpQYepcuER2+ilTQ7jpDx/iDhg==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/reporter-cli/-/reporter-cli-2.9.2.tgz", + "integrity": "sha512-9BSK9FzdrEq0dCfwkuh78ds7hvPn8aY/fLcYwWOaWz2PxjnhmAwpuPMluybQxtfsSGS3gFnSFlnABA+ptEZczQ==", "dev": true, "dependencies": { - "@parcel/plugin": "2.9.1", - "@parcel/types": "2.9.1", - "@parcel/utils": "2.9.1", + "@parcel/plugin": "2.9.2", + "@parcel/types": "2.9.2", + "@parcel/utils": "2.9.2", "chalk": "^4.1.0", "term-size": "^2.2.1" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1153,17 +1112,17 @@ } }, "node_modules/@parcel/reporter-dev-server": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/reporter-dev-server/-/reporter-dev-server-2.9.1.tgz", - "integrity": "sha512-Wa9kmtnuYTqEsKakhrSLvZmWxM4TB+Dg2jl1vC3gYfvlsgt/d/Hp/y2giPH1EeCm4wEEQfdAY3WmSUx9p1x07w==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/reporter-dev-server/-/reporter-dev-server-2.9.2.tgz", + "integrity": "sha512-lnspjm17GqeJB2D6e0qbymSv9ssiOnicxUm+slrOkYr5QjGKMffIuxqi822gpE0y4rZmxLDmYO3bsVBO/gxtkg==", "dev": true, "dependencies": { - "@parcel/plugin": "2.9.1", - "@parcel/utils": "2.9.1" + "@parcel/plugin": "2.9.2", + "@parcel/utils": "2.9.2" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1171,19 +1130,19 @@ } }, "node_modules/@parcel/reporter-tracer": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/reporter-tracer/-/reporter-tracer-2.9.1.tgz", - "integrity": "sha512-LgZKx9qwBAChWHBcpHW8GJXz45IGtiPmzs6HIDavZOiGqjGVzmbHUKxHnFaRZqR6WznJ+0ay/2o+BrJ8cyXUcg==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/reporter-tracer/-/reporter-tracer-2.9.2.tgz", + "integrity": "sha512-wEe5k4uVVEw6SxtEOP34YXPPj/HSFEQfO2tKbLCOQHp8F+/g4LTnV8pFrWWkpFlyhxHwI9qhOHxPAKv1QjRIBw==", "dev": true, "dependencies": { - "@parcel/plugin": "2.9.1", - "@parcel/utils": "2.9.1", + "@parcel/plugin": "2.9.2", + "@parcel/utils": "2.9.2", "chrome-trace-event": "^1.0.3", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1191,17 +1150,17 @@ } }, "node_modules/@parcel/resolver-default": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/resolver-default/-/resolver-default-2.9.1.tgz", - "integrity": "sha512-Q+knNaRDTbGIGqUnddtWEgpYduVBkDyi/CpxKpi7dP7sVYNJsXwEf82hpjX6/XqotA5dehT63yJkvJ/wxJF1Nw==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/resolver-default/-/resolver-default-2.9.2.tgz", + "integrity": "sha512-aGk0yx4g0ps0PWa/f8jEAtdF5b1I3VFQRnNA5hNYdyTrV3l+vTtzxw4ssahIctqFkCz5J26F/iYsauyZ5SpDgg==", "dev": true, "dependencies": { - "@parcel/node-resolver-core": "3.0.1", - "@parcel/plugin": "2.9.1" + "@parcel/node-resolver-core": "3.0.2", + "@parcel/plugin": "2.9.2" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1209,17 +1168,17 @@ } }, "node_modules/@parcel/runtime-browser-hmr": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.9.1.tgz", - "integrity": "sha512-C+023FOsrycpBHUgUf7Nv4uN0NrLN3UkeymsAHQlgZD5QQD7+nhG6p9PQ7+HbbEAaGaeO7c/86s2qRUglufNig==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.9.2.tgz", + "integrity": "sha512-TuICC8LicFobsNBPsBXWl0bg7e20jtcA7Eec6ZWNRNQUoE7MNiYIb4Te1Yo9glSirqcoAGolOqqBCRo05QJyew==", "dev": true, "dependencies": { - "@parcel/plugin": "2.9.1", - "@parcel/utils": "2.9.1" + "@parcel/plugin": "2.9.2", + "@parcel/utils": "2.9.2" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1227,19 +1186,19 @@ } }, "node_modules/@parcel/runtime-js": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/runtime-js/-/runtime-js-2.9.1.tgz", - "integrity": "sha512-caT1s1BqYNFGFAz9ul7uwDf+ZXzipiYYoHphhmT2JFweQmRA1CrMeFCuCQa2exsdu+UQpRbuKd+v5UUS2n0poQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/runtime-js/-/runtime-js-2.9.2.tgz", + "integrity": "sha512-9+a7+pBIKd9ESqykc9HeqaMjfmnnWW9dSxEeo5LAeSfI1rAZeMzkxSsYMtyneFgQGaCyVxjXvEWxJLBUINloQA==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.9.1", - "@parcel/plugin": "2.9.1", - "@parcel/utils": "2.9.1", + "@parcel/diagnostic": "2.9.2", + "@parcel/plugin": "2.9.2", + "@parcel/utils": "2.9.2", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1247,19 +1206,19 @@ } }, "node_modules/@parcel/runtime-react-refresh": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.9.1.tgz", - "integrity": "sha512-opDW9p3f4gVc1aVdFAyLWTL+2S8rhsPdBQRBHEi4WE2DRe/9lpA12NN5KUUHy88dlIr3wyzmaO2Fts0r/x80zg==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.9.2.tgz", + "integrity": "sha512-/JUwVwwJ1GLIssYXZxR/stjPxYFo4hOuxgrCnDiLCUQDDY04ivzZnjZM4jZncE4TsfolP0CTkOoz+A211G8gRA==", "dev": true, "dependencies": { - "@parcel/plugin": "2.9.1", - "@parcel/utils": "2.9.1", + "@parcel/plugin": "2.9.2", + "@parcel/utils": "2.9.2", "react-error-overlay": "6.0.9", "react-refresh": "^0.9.0" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1267,18 +1226,18 @@ } }, "node_modules/@parcel/runtime-service-worker": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/runtime-service-worker/-/runtime-service-worker-2.9.1.tgz", - "integrity": "sha512-TED4MouYjP7xbU9V7/3rjnmuWbCefrP+OC+eQJG6j3HwKiL92QTZ6trWqdLuxFhtZMXKjwbWaBBbIcELB/PbtQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/runtime-service-worker/-/runtime-service-worker-2.9.2.tgz", + "integrity": "sha512-U/Q+7/WVcqtoXwrqN86Rg6ygiultSAPW6t5OEa6DUsER9A0ytNRJ2PPEgrXXEN7gjkswXRCkfZxitRdbzzk63Q==", "dev": true, "dependencies": { - "@parcel/plugin": "2.9.1", - "@parcel/utils": "2.9.1", + "@parcel/plugin": "2.9.2", + "@parcel/utils": "2.9.2", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1286,18 +1245,18 @@ } }, "node_modules/@parcel/runtime-webextension": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/runtime-webextension/-/runtime-webextension-2.9.1.tgz", - "integrity": "sha512-jwZpl6pHdAbwTnOBsF19XQzYbQZQsFackAEjXqNK1+qEQrIbRRhQNJ+tMcFLaR+qkhB3PqH5jZhpICHGQkcZHA==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/runtime-webextension/-/runtime-webextension-2.9.2.tgz", + "integrity": "sha512-rR5toUBK09CvpVatufB37BiqTYSOprbi+sYA+hBX/pM2acD2waaP3mzCPn245TOU6PTupbRSLn7UbSmQI/s3qg==", "dev": true, "dependencies": { - "@parcel/plugin": "2.9.1", - "@parcel/utils": "2.9.1", + "@parcel/plugin": "2.9.2", + "@parcel/utils": "2.9.2", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1317,15 +1276,15 @@ } }, "node_modules/@parcel/transformer-babel": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/transformer-babel/-/transformer-babel-2.9.1.tgz", - "integrity": "sha512-HEU3bavD9Cu0RP5T1ioGLbsOQDqND/SQWal8L2f9HsgwTs2kzmTxYylNccqNjAMj3NnoyXzKMKbZyG8qEuLlpw==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-babel/-/transformer-babel-2.9.2.tgz", + "integrity": "sha512-7Xpp5mizzRuRlrIPtlBSLzWHqniXOajrsANlNXHuMDTRmHL5KF9ZdmJdMFspO2lkFN/PiNC7abHJ4IigtKYPfQ==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.9.1", - "@parcel/plugin": "2.9.1", + "@parcel/diagnostic": "2.9.2", + "@parcel/plugin": "2.9.2", "@parcel/source-map": "^2.1.1", - "@parcel/utils": "2.9.1", + "@parcel/utils": "2.9.2", "browserslist": "^4.6.6", "json5": "^2.2.0", "nullthrows": "^1.1.1", @@ -1333,7 +1292,7 @@ }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1341,22 +1300,22 @@ } }, "node_modules/@parcel/transformer-css": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/transformer-css/-/transformer-css-2.9.1.tgz", - "integrity": "sha512-nT+xOfyveX6qSb088dOh59HWJ1gm7DAIQZPbjTa1wLzRQul8ysdQRf/loulBmtUheol7YwQtVvUHN2XgoMDCAw==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-css/-/transformer-css-2.9.2.tgz", + "integrity": "sha512-jX/A8BmTyJFtNtaIlj/6jXX8/TiVGAFwcFRbQOpwlio2HL/NgdDgeVCEyWMSMumQm5FlnfONl29jBmHS7Q2xVw==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.9.1", - "@parcel/plugin": "2.9.1", + "@parcel/diagnostic": "2.9.2", + "@parcel/plugin": "2.9.2", "@parcel/source-map": "^2.1.1", - "@parcel/utils": "2.9.1", + "@parcel/utils": "2.9.2", "browserslist": "^4.6.6", "lightningcss": "^1.16.1", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1364,14 +1323,14 @@ } }, "node_modules/@parcel/transformer-html": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/transformer-html/-/transformer-html-2.9.1.tgz", - "integrity": "sha512-pIkJbcB91Dl2RyZmVd9neGkf7XJeYXwgx0et5hktw+3m0S2QB399OjVWwi5Q6ZdtTrWkQnHLmbeHT3NOmNWlaw==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-html/-/transformer-html-2.9.2.tgz", + "integrity": "sha512-w883gggwb2AL8PnH7/87pwGMmR3dO/kctwxm/DO83yEXjfkUBB0u1ruYNSuhBFuNAQsrYobC54QrJ/ERcTB96w==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.9.1", - "@parcel/hash": "2.9.1", - "@parcel/plugin": "2.9.1", + "@parcel/diagnostic": "2.9.2", + "@parcel/hash": "2.9.2", + "@parcel/plugin": "2.9.2", "nullthrows": "^1.1.1", "posthtml": "^0.16.5", "posthtml-parser": "^0.10.1", @@ -1381,7 +1340,7 @@ }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1389,35 +1348,35 @@ } }, "node_modules/@parcel/transformer-image": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/transformer-image/-/transformer-image-2.9.1.tgz", - "integrity": "sha512-3D4zEavCM1i354ZgJWg7RBNgASA7Q2iHN374lH5hT6I7VAJzNT+PTNrPNQ4vKhi69r+i1sQQzsPdgEUXOExmbQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-image/-/transformer-image-2.9.2.tgz", + "integrity": "sha512-0ZH1Lyob6P28DE6gVizPDbWWCORF/5exQJzjmeFrpUTJep/Aep0bwboYlNUTGrO5phjMp1/aIyzGDqbVhTHhBw==", "dev": true, "dependencies": { - "@parcel/plugin": "2.9.1", - "@parcel/utils": "2.9.1", - "@parcel/workers": "2.9.1", + "@parcel/plugin": "2.9.2", + "@parcel/utils": "2.9.2", + "@parcel/workers": "2.9.2", "nullthrows": "^1.1.1" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "peerDependencies": { - "@parcel/core": "^2.9.1" + "@parcel/core": "^2.9.2" } }, "node_modules/@parcel/transformer-js": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/transformer-js/-/transformer-js-2.9.1.tgz", - "integrity": "sha512-7hlbAIufIvx6iPspfZ3v1g2cmtpaNEaC04RzRv8HVVru8TE868yplFI840ZBnF5ylOfmxwFTUjlphVtVcPs13A==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-js/-/transformer-js-2.9.2.tgz", + "integrity": "sha512-d4JkEEPh99ON345dhkBc9pAqlM/jXgtQ1K7IW/P8Shd6Z+1vdVkGiTMWH9KNXob/fBm511UvbIhJtmj68MUfug==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.9.1", - "@parcel/plugin": "2.9.1", + "@parcel/diagnostic": "2.9.2", + "@parcel/plugin": "2.9.2", "@parcel/source-map": "^2.1.1", - "@parcel/utils": "2.9.1", - "@parcel/workers": "2.9.1", + "@parcel/utils": "2.9.2", + "@parcel/workers": "2.9.2", "@swc/helpers": "^0.5.0", "browserslist": "^4.6.6", "nullthrows": "^1.1.1", @@ -1426,28 +1385,28 @@ }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" }, "peerDependencies": { - "@parcel/core": "^2.9.1" + "@parcel/core": "^2.9.2" } }, "node_modules/@parcel/transformer-json": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/transformer-json/-/transformer-json-2.9.1.tgz", - "integrity": "sha512-yFRSz1qVbdCssC65D37Ru3diQk7GQl5ZOOyQ7MeMYlhvl8mcFKGRC3wUAyqBZrh70VOWuWR7WS2XLdqTdE9WqQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-json/-/transformer-json-2.9.2.tgz", + "integrity": "sha512-V4SfaBBYHKhFXvORAeUEn3SHyIXevlN4VKKU2838SokHoJ7FbJUXv5QjSS9Fgc8JBeAyIilFoHKQ3CdKI+29qA==", "dev": true, "dependencies": { - "@parcel/plugin": "2.9.1", + "@parcel/plugin": "2.9.2", "json5": "^2.2.0" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1455,15 +1414,15 @@ } }, "node_modules/@parcel/transformer-postcss": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/transformer-postcss/-/transformer-postcss-2.9.1.tgz", - "integrity": "sha512-sNSJbdT4Z8H+/cZ/vCmos44SfbB9O5gNgMEgGa6WqU7MV7cVlnE8zuNJkxR97ZZTpIXNrfVerOY3lOrUrFCxdA==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-postcss/-/transformer-postcss-2.9.2.tgz", + "integrity": "sha512-zkP7Th+MyGJnUXS0aPJCMCMI6wUL6kV4zPuNu59hDLIcm4+H8qeq0s6UyCOIdxjdhHxWKQxKFmlRiPJ9bs0hxg==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.9.1", - "@parcel/hash": "2.9.1", - "@parcel/plugin": "2.9.1", - "@parcel/utils": "2.9.1", + "@parcel/diagnostic": "2.9.2", + "@parcel/hash": "2.9.2", + "@parcel/plugin": "2.9.2", + "@parcel/utils": "2.9.2", "clone": "^2.1.1", "nullthrows": "^1.1.1", "postcss-value-parser": "^4.2.0", @@ -1471,7 +1430,7 @@ }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1479,13 +1438,13 @@ } }, "node_modules/@parcel/transformer-posthtml": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/transformer-posthtml/-/transformer-posthtml-2.9.1.tgz", - "integrity": "sha512-I6fr6lVAqjDxdkOwxelx7FibMWP55JPf3ZTXKCWpoIGkOuT2i2tYZMdXEHVshZWJmByelbYSC96w8P8rSY+6XQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-posthtml/-/transformer-posthtml-2.9.2.tgz", + "integrity": "sha512-z4I+FDL13XFHCH32BqryXN9HcocG9a0KyfTPIphJrtBRGW8lR9rX4rukp8X3gGZIdYMuRMvU4jj6BpPRYJzzXA==", "dev": true, "dependencies": { - "@parcel/plugin": "2.9.1", - "@parcel/utils": "2.9.1", + "@parcel/plugin": "2.9.2", + "@parcel/utils": "2.9.2", "nullthrows": "^1.1.1", "posthtml": "^0.16.5", "posthtml-parser": "^0.10.1", @@ -1494,7 +1453,7 @@ }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1502,16 +1461,16 @@ } }, "node_modules/@parcel/transformer-raw": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/transformer-raw/-/transformer-raw-2.9.1.tgz", - "integrity": "sha512-Wr0Y9fETiyF5ntL3yhn/ZXjcnswcn1T9YLXa+yAxpAxKW+/D7A1jKVS0tyDOZsdakWA9gzlLP6w1O4Nl8pVmEg==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-raw/-/transformer-raw-2.9.2.tgz", + "integrity": "sha512-0Lo44e4KX7lKGLnnOe52JvtptGTLl1kV3UACbOATApR1Rklte0RfNFxL/TRymic7wxRwt/aAXKhZCzFHmJp5Hg==", "dev": true, "dependencies": { - "@parcel/plugin": "2.9.1" + "@parcel/plugin": "2.9.2" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1519,18 +1478,18 @@ } }, "node_modules/@parcel/transformer-react-refresh-wrap": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.9.1.tgz", - "integrity": "sha512-ML+KDvLoZ6O+9r3/yf8DeVtobhYc9DPXYHZ75aXoFyou97I9WDf4EqlY4/MSkbZV79FUXxC68dyLJj3Q9ILqeA==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.9.2.tgz", + "integrity": "sha512-y2GPoIG7fjizqXq3xl6vvDeGSsOJGcPqm/WvbaxekR1+Yl/U5T4vAD0CaC8EJcVyostCT3G835DdNX7O7rkW/w==", "dev": true, "dependencies": { - "@parcel/plugin": "2.9.1", - "@parcel/utils": "2.9.1", + "@parcel/plugin": "2.9.2", + "@parcel/utils": "2.9.2", "react-refresh": "^0.9.0" }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1538,14 +1497,14 @@ } }, "node_modules/@parcel/transformer-svg": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/transformer-svg/-/transformer-svg-2.9.1.tgz", - "integrity": "sha512-DYcUfutjtghPXMVybFygncIKJl/4rrpQMxv8yTVeDtplUTvFzbI+3hIoYfYm8z9CXaSBzsCw2Kud6PD8Ob2AzQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-svg/-/transformer-svg-2.9.2.tgz", + "integrity": "sha512-R9YTE9T7UcwtrZY7LNO4qAhgByqn7mSyt5/cEFN925XtlLSt0TsX2A4cv4s28hGsaABWGB0WL4IAbgATwbOq7w==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.9.1", - "@parcel/hash": "2.9.1", - "@parcel/plugin": "2.9.1", + "@parcel/diagnostic": "2.9.2", + "@parcel/hash": "2.9.2", + "@parcel/plugin": "2.9.2", "nullthrows": "^1.1.1", "posthtml": "^0.16.5", "posthtml-parser": "^0.10.1", @@ -1554,7 +1513,7 @@ }, "engines": { "node": ">= 12.0.0", - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1562,19 +1521,19 @@ } }, "node_modules/@parcel/transformer-webextension": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/transformer-webextension/-/transformer-webextension-2.9.1.tgz", - "integrity": "sha512-cLqP2XgpWDmavzya9wIKFf1GQjaL/OChLovp5X6toh5nLfkoNNGVzE33KUGT7AT9BUceqXLZS5llIIyojsGQMQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-webextension/-/transformer-webextension-2.9.2.tgz", + "integrity": "sha512-gAn/9uVSh+9UXhsUJJ9b4Z5GbgcPi7Pe7smF0zaosWIpmcZkJobt3DIuFvFZXjDAQDebe/Wifo8owQo5lWIc1g==", "dev": true, "dependencies": { "@mischnic/json-sourcemap": "^0.1.0", - "@parcel/diagnostic": "2.9.1", - "@parcel/plugin": "2.9.1", - "@parcel/utils": "2.9.1", + "@parcel/diagnostic": "2.9.2", + "@parcel/plugin": "2.9.2", + "@parcel/utils": "2.9.2", "content-security-policy-parser": "^0.3.0" }, "engines": { - "parcel": "^2.9.1" + "parcel": "^2.9.2" }, "funding": { "type": "opencollective", @@ -1582,31 +1541,31 @@ } }, "node_modules/@parcel/types": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.9.1.tgz", - "integrity": "sha512-LBx4Tvr1sK9t+FmPjS4jPvcmUcJo6co22sn0pBuz2oXISs/YK2N+3ZHXL+KsozKvLn2wXysgaWFIARN9xFoORw==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.9.2.tgz", + "integrity": "sha512-i8WOfWuvBQ88Q0frgJOmIPOZDUZ6BaGtyq+seo0B1Y0Bt04/KF4qPFo9E1umpL8ZgtA1kMtyZd1gsSmXLP5COw==", "dev": true, "dependencies": { - "@parcel/cache": "2.9.1", - "@parcel/diagnostic": "2.9.1", - "@parcel/fs": "2.9.1", - "@parcel/package-manager": "2.9.1", + "@parcel/cache": "2.9.2", + "@parcel/diagnostic": "2.9.2", + "@parcel/fs": "2.9.2", + "@parcel/package-manager": "2.9.2", "@parcel/source-map": "^2.1.1", - "@parcel/workers": "2.9.1", + "@parcel/workers": "2.9.2", "utility-types": "^3.10.0" } }, "node_modules/@parcel/utils": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.9.1.tgz", - "integrity": "sha512-0P/zIvtvLyuzQA4VFMzA8F22lrUyGR+phve/NlBUH+4Tn+Rt/evh9fP9vG1YTVMXWd90tesLdrtqatm1hqrJSA==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.9.2.tgz", + "integrity": "sha512-Gvl23c54ZYmBmXqpk7Kbw1S6+taWncgdqTo+XaokOzh3jjih1bmMVSMS+CwtBrYhPZ32x84JNeOxsxz01zsrAA==", "dev": true, "dependencies": { - "@parcel/codeframe": "2.9.1", - "@parcel/diagnostic": "2.9.1", - "@parcel/hash": "2.9.1", - "@parcel/logger": "2.9.1", - "@parcel/markdown-ansi": "2.9.1", + "@parcel/codeframe": "2.9.2", + "@parcel/diagnostic": "2.9.2", + "@parcel/hash": "2.9.2", + "@parcel/logger": "2.9.2", + "@parcel/markdown-ansi": "2.9.2", "@parcel/source-map": "^2.1.1", "chalk": "^4.1.0", "nullthrows": "^1.1.1" @@ -1640,16 +1599,16 @@ } }, "node_modules/@parcel/workers": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.9.1.tgz", - "integrity": "sha512-24R4IRMX8TBghak6pDCzM5B8NB4LTt0pI4dwNqSENyZA/Q5s/xMbG5gdn4aTwkAyIQ5lHrgDsHzoHbjOT0HLYQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.9.2.tgz", + "integrity": "sha512-38jd6jWMPNx41gWSJVtdRiTfE+6TvLfM35mkGg3ykpESk8QwwumaV2CLgvdfnFjxeUlRtOGi8m+bWiWqKJetww==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.9.1", - "@parcel/logger": "2.9.1", - "@parcel/profiler": "2.9.1", - "@parcel/types": "2.9.1", - "@parcel/utils": "2.9.1", + "@parcel/diagnostic": "2.9.2", + "@parcel/logger": "2.9.2", + "@parcel/profiler": "2.9.2", + "@parcel/types": "2.9.2", + "@parcel/utils": "2.9.2", "nullthrows": "^1.1.1" }, "engines": { @@ -1660,13 +1619,13 @@ "url": "https://opencollective.com/parcel" }, "peerDependencies": { - "@parcel/core": "^2.9.1" + "@parcel/core": "^2.9.2" } }, "node_modules/@swc/core": { - "version": "1.3.61", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.61.tgz", - "integrity": "sha512-p58Ltdjo7Yy8CU3zK0cp4/eAgy5qkHs35znGedqVGPiA67cuYZM63DuTfmyrOntMRwQnaFkMLklDAPCizDdDng==", + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.62.tgz", + "integrity": "sha512-J58hWY+/G8vOr4J6ZH9hLg0lMSijZtqIIf4HofZezGog/pVX6sJyBJ40dZ1ploFkDIlWTWvJyqtpesBKS73gkQ==", "dev": true, "hasInstallScript": true, "engines": { @@ -1677,16 +1636,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.3.61", - "@swc/core-darwin-x64": "1.3.61", - "@swc/core-linux-arm-gnueabihf": "1.3.61", - "@swc/core-linux-arm64-gnu": "1.3.61", - "@swc/core-linux-arm64-musl": "1.3.61", - "@swc/core-linux-x64-gnu": "1.3.61", - "@swc/core-linux-x64-musl": "1.3.61", - "@swc/core-win32-arm64-msvc": "1.3.61", - "@swc/core-win32-ia32-msvc": "1.3.61", - "@swc/core-win32-x64-msvc": "1.3.61" + "@swc/core-darwin-arm64": "1.3.62", + "@swc/core-darwin-x64": "1.3.62", + "@swc/core-linux-arm-gnueabihf": "1.3.62", + "@swc/core-linux-arm64-gnu": "1.3.62", + "@swc/core-linux-arm64-musl": "1.3.62", + "@swc/core-linux-x64-gnu": "1.3.62", + "@swc/core-linux-x64-musl": "1.3.62", + "@swc/core-win32-arm64-msvc": "1.3.62", + "@swc/core-win32-ia32-msvc": "1.3.62", + "@swc/core-win32-x64-msvc": "1.3.62" }, "peerDependencies": { "@swc/helpers": "^0.5.0" @@ -1698,9 +1657,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.3.61", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.61.tgz", - "integrity": "sha512-Ra1CZIYYyIp/Y64VcKyaLjIPUwT83JmGduvHu8vhUZOvWV4dWL4s5DrcxQVaQJjjb7Z2N/IUYYS55US1TGnxZw==", + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.62.tgz", + "integrity": "sha512-MmGilibITz68LEje6vJlKzc2gUUSgzvB3wGLSjEORikTNeM7P8jXVxE4A8fgZqDeudJUm9HVWrxCV+pHDSwXhA==", "cpu": [ "arm64" ], @@ -1714,9 +1673,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.3.61", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.61.tgz", - "integrity": "sha512-LUia75UByUFkYH1Ddw7IE0X9usNVGJ7aL6+cgOTju7P0dsU0f8h/OGc/GDfp1E4qnKxDCJE+GwDRLoi4SjIxpg==", + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.62.tgz", + "integrity": "sha512-Xl93MMB3sCWVlYWuQIB+v6EQgzoiuQYK5tNt9lsHoIEVu2zLdkQjae+5FUHZb1VYqCXIiWcULFfVz0R4Sjb7JQ==", "cpu": [ "x64" ], @@ -1730,9 +1689,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.3.61", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.61.tgz", - "integrity": "sha512-aalPlicYxHAn2PxNlo3JFEZkMXzCtUwjP27AgMqnfV4cSz7Omo56OtC+413e/kGyCH86Er9gJRQQsxNKP8Qbsg==", + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.62.tgz", + "integrity": "sha512-nJsp6O7kCtAjTTMcIjVB0g5y1JNiYAa5q630eiwrnaHUusEFoANDdORI3Z9vXeikMkng+6yIv9/V8Rb093xLjQ==", "cpu": [ "arm" ], @@ -1746,9 +1705,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.3.61", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.61.tgz", - "integrity": "sha512-9hGdsbQrYNPo1c7YzWF57yl17bsIuuEQi3I1fOFSv3puL3l5M/C/oCD0Bz6IdKh6mEDC5UNJE4LWtV1gFA995A==", + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.62.tgz", + "integrity": "sha512-XGsV93vpUAopDt5y6vPwbK1Nc/MlL55L77bAZUPIiosWD1cWWPHNtNSpriE6+I+JiMHe0pqtfS/SSTk6ZkFQVw==", "cpu": [ "arm64" ], @@ -1762,9 +1721,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.3.61", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.61.tgz", - "integrity": "sha512-mVmcNfFQRP4SYbGC08IPB3B9Xox+VpGIQqA3Qg7LMCcejLAQLi4Lfe8CDvvBPlQzXHso0Cv+BicJnQVKs8JLOA==", + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.62.tgz", + "integrity": "sha512-ESUmJjSlTTkoBy9dMG49opcNn8BmviqStMhwyeD1G8XRnmRVCZZgoBOKdvCXmJhw8bQXDhZumeaTUB+OFUKVXg==", "cpu": [ "arm64" ], @@ -1778,9 +1737,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.3.61", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.61.tgz", - "integrity": "sha512-ZkRHs7GEikN6JiVL1/stvq9BVHKrSKoRn9ulVK2hMr+mAGNOKm3Y06NSzOO+BWwMaFOgnO2dWlszCUICsQ0kpg==", + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.62.tgz", + "integrity": "sha512-wnHJkt3ZBrax3SFnUHDcncG6mrSg9ZZjMhQV9Mc3JL1x1s1Gy9rGZCoBNnV/BUZWTemxIBcQbANRSDut/WO+9A==", "cpu": [ "x64" ], @@ -1794,9 +1753,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.3.61", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.61.tgz", - "integrity": "sha512-zK7VqQ5JlK20+7fxI4AgvIUckeZyX0XIbliGXNMR3i+39SJq1vs9scYEmq8VnAfvNdMU5BG+DewbFJlMfCtkxQ==", + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.62.tgz", + "integrity": "sha512-9oRbuTC/VshB66Rgwi3pTq3sPxSTIb8k9L1vJjES+dDMKa29DAjPtWCXG/pyZ00ufpFZgkGEuAHH5uqUcr1JQg==", "cpu": [ "x64" ], @@ -1810,9 +1769,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.3.61", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.61.tgz", - "integrity": "sha512-e9kVVPk5iVNhO41TvLvcExDHn5iATQ5/M4U7/CdcC7s0fK19TKSEUqkdoTLIJvHBFhgR7w3JJSErfnauO0xXoA==", + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.62.tgz", + "integrity": "sha512-zv14vlF2VRrxS061XkfzGjCYnOrEo5glKJjLK5PwUKysIoVrx/L8nAbFxjkX5cObdlyoqo+ekelyBPAO+4bS0w==", "cpu": [ "arm64" ], @@ -1826,9 +1785,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.3.61", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.61.tgz", - "integrity": "sha512-7cJULfa6HvKqvFh6M/f7mKiNRhE2AjgFUCZfdOuy5r8vbtpk+qBK94TXwaDjJYDUGKzDVZw/tJ1eN4Y9n9Ls/Q==", + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.62.tgz", + "integrity": "sha512-8MC/PZQSsOP2iA/81tAfNRqMWyEqTS/8zKUI67vPuLvpx6NAjRn3E9qBv7iFqH79iqZNzqSMo3awnLrKZyFbcw==", "cpu": [ "ia32" ], @@ -1842,9 +1801,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.3.61", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.61.tgz", - "integrity": "sha512-Jx8S+21WcKF/wlhW+sYpystWUyymDTEsbBpOgBRpXZelakVcNBCIIYSZOKW/A9PwWTpu6S8yvbs9nUOzKiVPqA==", + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.62.tgz", + "integrity": "sha512-GJSmUJ95HKHZXAxiuPUmrcm/S3ivQvEzXhOZaIqYBIwUsm02vFZkClsV7eIKzWjso1t0+I/8MjrnUNaSWqh1rQ==", "cpu": [ "x64" ], @@ -1901,27 +1860,24 @@ "dev": true }, "node_modules/@types/har-format": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.10.tgz", - "integrity": "sha512-o0J30wqycjF5miWDKYKKzzOU1ZTLuA42HZ4HE7/zqTOc/jTLdQ5NhYWvsRQo45Nfi1KHoRdNhteSI4BAxTF1Pg==", - "dev": true - }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.11.tgz", + "integrity": "sha512-T232/TneofqK30AD1LRrrf8KnjLvzrjWDp7eWST5KoiSzrBfRsLrWDPk4STQPW4NZG6v2MltnduBVmakbZOBIQ==", "dev": true }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true + "node_modules/@types/ip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@types/ip/-/ip-1.1.0.tgz", + "integrity": "sha512-dwNe8gOoF70VdL6WJBwVHtQmAX4RMd62M+mAB9HQFjG1/qiCLM/meRy95Pd14FYBbEDwCq7jgJs89cHpLBu4HQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } }, - "node_modules/@types/semver-compare": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/semver-compare/-/semver-compare-1.0.1.tgz", - "integrity": "sha512-wx2LQVvKlEkhXp/HoKIZ/aSL+TvfJdKco8i0xJS3aR877mg4qBHzNT6+B5a61vewZHo79EdZavskGnRXEC2H6A==", + "node_modules/@types/node": { + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.0.tgz", + "integrity": "sha512-cumHmIAf6On83X7yP+LrsEyUOf/YlociZelmpRYaGFydoaPdxdt80MAbu6vWerQT2COCp2nPvHdsbD7tHn/YlQ==", "dev": true }, "node_modules/@types/webextension-polyfill": { @@ -1930,34 +1886,12 @@ "integrity": "sha512-If4EcaHzYTqcbNMp/FdReVdRmLL/Te42ivnJII551bYjhX19bWem5m14FERCqdJA732OloGuxCRvLBvcMGsn4A==", "dev": true }, - "node_modules/@types/xhook": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@types/xhook/-/xhook-1.5.0.tgz", - "integrity": "sha512-4gjZvetNo+5Gv2bEYHs6GDl15QXAX+kWXCUKNMeOM+Rrh5dh4X28DrSag9Qwzc0fkR11SJO3h0iUaze6MO/KzA==", - "dev": true - }, "node_modules/abortcontroller-polyfill": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", "dev": true }, - "node_modules/aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -1979,17 +1913,11 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/arrify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", - "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "node_modules/base-x": { "version": "3.0.9", @@ -2000,6 +1928,26 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -2011,6 +1959,16 @@ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -2055,6 +2013,30 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2064,52 +2046,10 @@ "node": ">=6" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", - "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", - "dev": true, - "dependencies": { - "camelcase": "^6.3.0", - "map-obj": "^4.1.0", - "quick-lru": "^5.1.1", - "type-fest": "^1.2.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/caniuse-lite": { - "version": "1.0.30001492", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz", - "integrity": "sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw==", + "version": "1.0.30001499", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001499.tgz", + "integrity": "sha512-IhoQqRrW6WiecFcfZgoJS1YLEN1/HR1vHP5WNgjCARRW7KUNToHHTX3FrwCM+y4zkRa48D9rE90WFYc2IWhDWQ==", "dev": true, "funding": [ { @@ -2151,21 +2091,6 @@ "node": ">=6.0" } }, - "node_modules/clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", @@ -2202,6 +2127,12 @@ "node": ">= 10" } }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, "node_modules/content-security-policy-parser": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/content-security-policy-parser/-/content-security-policy-parser-0.3.0.tgz", @@ -2212,9 +2143,9 @@ } }, "node_modules/cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", "dev": true, "dependencies": { "import-fresh": "^3.2.1", @@ -2229,72 +2160,13 @@ "url": "https://github.com/sponsors/d-fischer" } }, - "node_modules/cp-file": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-9.1.0.tgz", - "integrity": "sha512-3scnzFj/94eb7y4wyXRWwvzLFaQp87yyfTnChIjlfYrVqp5lVO3E2hIJMeQIltUT0K2ZAB3An1qXcBmwGyvuwA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "nested-error-stacks": "^2.0.0", - "p-event": "^4.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cpy": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cpy/-/cpy-9.0.1.tgz", - "integrity": "sha512-D9U0DR5FjTCN3oMTcFGktanHnAG5l020yvOCR1zKILmAyPP7I/9pl6NFgRbDcmSENtbK1sQLBz1p9HIOlroiNg==", - "dev": true, - "dependencies": { - "arrify": "^3.0.0", - "cp-file": "^9.1.0", - "globby": "^13.1.1", - "junk": "^4.0.0", - "micromatch": "^4.0.4", - "nested-error-stacks": "^2.1.0", - "p-filter": "^3.0.0", - "p-map": "^5.3.0" - }, - "engines": { - "node": "^12.20.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cpy-cli": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/cpy-cli/-/cpy-cli-4.2.0.tgz", - "integrity": "sha512-b04b+cbdr29CdpREPKw/itrfjO43Ty0Aj7wRM6M6LoE4GJxZJCk9Xp+Eu1IqztkKh3LxIBt1tDplENsa6KYprg==", - "dev": true, - "dependencies": { - "cpy": "^9.0.0", - "meow": "^10.1.2" - }, - "bin": { - "cpy": "cli.js" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/css-declaration-sorter": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz", - "integrity": "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.0.0.tgz", + "integrity": "sha512-jV48Uxg3jWGLthtZhYAH3JFWMjdurJrSQAgWCc/t2ZE0UUFAIWlgcXcLJNutZT8GXrLAr36Kp+O1w3yBdxCr/A==", "dev": true, "engines": { - "node": "^10 || ^12 || >=14" + "node": "^14 || ^16 || >=18" }, "peerDependencies": { "postcss": "^8.0.9" @@ -2447,52 +2319,6 @@ "optional": true, "peer": true }, - "node_modules/decamelize": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", - "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", @@ -2505,18 +2331,6 @@ "node": ">=0.10" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", @@ -2597,9 +2411,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.416", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.416.tgz", - "integrity": "sha512-AUYh0XDTb2vrj0rj82jb3P9hHSyzQNdTPYWZIhPdCOui7/vpme7+HTE07BE5jwuqg/34TZ8ktlRz6GImJ4IXjA==", + "version": "1.4.427", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.427.tgz", + "integrity": "sha512-HK3r9l+Jm8dYAm1ctXEWIC+hV60zfcjS9UA5BDlYvnI5S7PU/yytjpvSrTNrSSRRkuu3tDyZhdkwIczh+0DWaw==", "dev": true }, "node_modules/entities": { @@ -2633,40 +2447,12 @@ } }, "node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" + "node": ">=0.8.0" } }, "node_modules/fill-range": { @@ -2681,21 +2467,11 @@ "node": ">=8" } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true }, "node_modules/function-bind": { "version": "1.1.1", @@ -2712,16 +2488,24 @@ "node": ">=6" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">= 6" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/globals": { @@ -2739,50 +2523,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", - "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "function-bind": "^1.1.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" + "node": ">= 0.4.0" } }, "node_modules/has-flag": { @@ -2794,18 +2544,6 @@ "node": ">=8" } }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/htmlnano": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/htmlnano/-/htmlnano-2.0.4.tgz", @@ -2872,14 +2610,25 @@ "entities": "^3.0.1" } }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true, - "engines": { - "node": ">= 4" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/import-fresh": { "version": "3.3.0", @@ -2897,18 +2646,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.10" } }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -2963,15 +2730,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3008,31 +2766,10 @@ "node": ">=6" } }, - "node_modules/junk": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/junk/-/junk-4.0.1.tgz", - "integrity": "sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lightningcss": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.20.0.tgz", - "integrity": "sha512-4bj8aP+Vi+or8Gwq/hknmicr4PmA8D9uL/3qY0N0daX5vYBMYERGI6Y93nzoeRgQMULq+gtrN/FvJYtH0xNN8g==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.21.0.tgz", + "integrity": "sha512-HDznZexdDMvC98c79vRE+oW5vFncTlLjJopzK4azReOilq6n4XIscCMhvgiXkstYMM/dCe6FJw0oed06ck8AtA==", "dev": true, "dependencies": { "detect-libc": "^1.0.3" @@ -3045,20 +2782,20 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.20.0", - "lightningcss-darwin-x64": "1.20.0", - "lightningcss-linux-arm-gnueabihf": "1.20.0", - "lightningcss-linux-arm64-gnu": "1.20.0", - "lightningcss-linux-arm64-musl": "1.20.0", - "lightningcss-linux-x64-gnu": "1.20.0", - "lightningcss-linux-x64-musl": "1.20.0", - "lightningcss-win32-x64-msvc": "1.20.0" + "lightningcss-darwin-arm64": "1.21.0", + "lightningcss-darwin-x64": "1.21.0", + "lightningcss-linux-arm-gnueabihf": "1.21.0", + "lightningcss-linux-arm64-gnu": "1.21.0", + "lightningcss-linux-arm64-musl": "1.21.0", + "lightningcss-linux-x64-gnu": "1.21.0", + "lightningcss-linux-x64-musl": "1.21.0", + "lightningcss-win32-x64-msvc": "1.21.0" } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.20.0.tgz", - "integrity": "sha512-aYEohJTlzwB8URJaNiS57tMbjyLub0mYvxlxKQk8SZv+irXx6MoBWpDNQKKTS9gg1pGf/eAwjpa3BLAoCBsh1A==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.21.0.tgz", + "integrity": "sha512-WcJmVmbNUnCbUqqXV46ZsriFtWJujcPkn+w2cu4R+EgpXuibyTP/gzahmX0gc4RYQxTz2zXIeGx4cF2gr8fLwA==", "cpu": [ "arm64" ], @@ -3076,9 +2813,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.20.0.tgz", - "integrity": "sha512-cmMgY8FFWVaGgtift7eKKkHMqlz9O09/yTdlCXEDOeDP9yeo6vHOBTRP7ojb368kjw8Ew3l0L2uT1Gtx56eNkg==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.21.0.tgz", + "integrity": "sha512-xHwMHfcTIHX6fY4YQimI1V/KcbozoNVeKMncZzrp/3NAj0sp3ktxobCj1e0sGqVJMUMaHu/SWvt0mS8jAIhkYw==", "cpu": [ "x64" ], @@ -3096,9 +2833,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.20.0.tgz", - "integrity": "sha512-/m+NDO1O6JCv7R9F0XWlXcintQHx4MPNU+kt8jZJO07LLdGwCfvjN31GVcwVPlStnnx/cU8uTTmax6g/Qu/whg==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.21.0.tgz", + "integrity": "sha512-rk1cr+C2IA1QHvh0QJAPXsQ2vrwCksms7fgfaw43RIERBWa6EEM5p0/1CWhdZ5zrl9veUdY6NRaNGRJjJL0iLw==", "cpu": [ "arm" ], @@ -3116,9 +2853,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.20.0.tgz", - "integrity": "sha512-gtXoa6v0HvMRLbev6Hsef0+Q5He7NslB+Rs7G49Y5LUSdJeGIATEN+j8JzHC0DnxCsOGbEgGRmvtJzzYDkkluw==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.21.0.tgz", + "integrity": "sha512-JkOG8K2Y4m5MeP3DlaHOgGDDtHbhbJcN8JcizFN0snUIIru1qxYNWPhAQsEwysuTRY9aANP0nScZJkALpcYmgA==", "cpu": [ "arm64" ], @@ -3136,9 +2873,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.20.0.tgz", - "integrity": "sha512-Po7XpucM1kZnkiyd2BNwTExSDcZ8jm8uB9u+Sq44qjpkf5f75jreQwn3DQm9I1t5C6tB9HGt30HExMju9umJBQ==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.21.0.tgz", + "integrity": "sha512-4Zx51DbR41neTFMs28CI9cZpX/mF5Urc6pChTio5nZhrz6FC1pRGiwxNJ+G15a/YPvRmPmvQd3Mz1N4WEgbj2A==", "cpu": [ "arm64" ], @@ -3156,9 +2893,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.20.0.tgz", - "integrity": "sha512-8yR/fGNn/P0I+Lc3PK+VWPET/zdSpBfHFIG0DJ38TywMbItVKvnFvoTBwnIm4LqBz7g2G2dDexnNP95za2Ll8g==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.21.0.tgz", + "integrity": "sha512-PN33pPK/O3b4qMfWcJ2eis7NLqEkyW2NEh9X4rWfJrBtOnSbgafuYUuEtO5Ylu+dL3oUKc5usB07FGeil3RzeA==", "cpu": [ "x64" ], @@ -3176,9 +2913,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.20.0.tgz", - "integrity": "sha512-EmpJ+VkPZ8RACiB4m+l8TmapmE1W2UvJKDHE+ML/3Ihr9tRKUs3CibfnQTFZC8aSsrxgXagDAN+PgCDDhIyriA==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.21.0.tgz", + "integrity": "sha512-S51OT7TRfS5x8aN/8frv/JSXCGm+11VuhM4WCiTqDPjhHUDWd8nwiN/7s5juiwrlrpOxb5UKq21EKDrISoGQpw==", "cpu": [ "x64" ], @@ -3196,9 +2933,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.20.0.tgz", - "integrity": "sha512-BRdPvbq7Cc1qxAzp2emqWJHrqsEkf4ggxS29VOnxT7jhkdHKU+a26OVMjvm/OL0NH0ToNOZNAPvHMSexiEgBeA==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.21.0.tgz", + "integrity": "sha512-yW6/ZDJAHrSWtRltH1tr2I+2sn374gK2yclc44HMfpxfjIYgXMUkzqstalloMUQpZFR6M0ltXo5/tuLWoBydGQ==", "cpu": [ "x64" ], @@ -3261,69 +2998,6 @@ "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", "dev": true }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", @@ -3332,53 +3006,6 @@ "optional": true, "peer": true }, - "node_modules/meow": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", - "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.2", - "camelcase-keys": "^7.0.0", - "decamelize": "^5.0.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.2", - "read-pkg-up": "^8.0.0", - "redent": "^4.0.0", - "trim-newlines": "^4.0.2", - "type-fest": "^1.2.2", - "yargs-parser": "^20.2.9" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -3392,42 +3019,31 @@ "node": ">=8.6" } }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 6" + "node": "*" } }, - "node_modules/minimist-options/node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/msgpackr": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.9.2.tgz", - "integrity": "sha512-xtDgI3Xv0AAiZWLRGDchyzBwU6aq0rwJ+W+5Y4CZhEWtkl/hJtFFLc+3JtGTw7nz1yquxs7nL8q/yA2aqpflIQ==", + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.9.5.tgz", + "integrity": "sha512-/IJ3cFSN6Ci3eG2wLhbFEL6GT63yEaoN/R5My2QkV6zro+OJaVRLPlwvxY7EtHYSmDlQpk8stvOQTL2qJFkDRg==", "dev": true, "optionalDependencies": { "msgpackr-extract": "^3.0.2" @@ -3485,12 +3101,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/nested-error-stacks": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", - "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", - "dev": true - }, "node_modules/node-addon-api": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", @@ -3525,36 +3135,6 @@ "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", "dev": true }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -3573,125 +3153,44 @@ "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", "dev": true }, - "node_modules/ordered-binary": { + "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.4.0.tgz", - "integrity": "sha512-EHQ/jk4/a9hLupIKxTfUsQRej1Yd/0QLQs3vGvIqg5ZtCYSzNhkzHoZc7Zf4e4kUlDaC3Uw8Q/1opOLNN2OKRQ==", - "dev": true - }, - "node_modules/p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", - "dev": true, - "dependencies": { - "p-timeout": "^3.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-3.0.0.tgz", - "integrity": "sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==", - "dev": true, - "dependencies": { - "p-map": "^5.1.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "wrappy": "1" } }, - "node_modules/p-map": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", - "dev": true, - "dependencies": { - "aggregate-error": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/ordered-binary": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.4.0.tgz", + "integrity": "sha512-EHQ/jk4/a9hLupIKxTfUsQRej1Yd/0QLQs3vGvIqg5ZtCYSzNhkzHoZc7Zf4e4kUlDaC3Uw8Q/1opOLNN2OKRQ==", + "dev": true }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true }, "node_modules/parcel": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/parcel/-/parcel-2.9.1.tgz", - "integrity": "sha512-LBD+jeCpvnDJ8MeE0ciEns4EZw+WH01qLEKT2O1tW2uHM1njhcWvuc9bx19f8iyE2+8Xwwr2GsGTQgPXKiA/yQ==", - "dev": true, - "dependencies": { - "@parcel/config-default": "2.9.1", - "@parcel/core": "2.9.1", - "@parcel/diagnostic": "2.9.1", - "@parcel/events": "2.9.1", - "@parcel/fs": "2.9.1", - "@parcel/logger": "2.9.1", - "@parcel/package-manager": "2.9.1", - "@parcel/reporter-cli": "2.9.1", - "@parcel/reporter-dev-server": "2.9.1", - "@parcel/reporter-tracer": "2.9.1", - "@parcel/utils": "2.9.1", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/parcel/-/parcel-2.9.2.tgz", + "integrity": "sha512-nTpT/0JIhGW5rKXVnVGHyLBFK/KxteqzsSjQNzeGybiBttnIYRXnM03e2QJX0GWqiS9OtM4rJro04DNHoqx3Ug==", + "dev": true, + "dependencies": { + "@parcel/config-default": "2.9.2", + "@parcel/core": "2.9.2", + "@parcel/diagnostic": "2.9.2", + "@parcel/events": "2.9.2", + "@parcel/fs": "2.9.2", + "@parcel/logger": "2.9.2", + "@parcel/package-manager": "2.9.2", + "@parcel/reporter-cli": "2.9.2", + "@parcel/reporter-dev-server": "2.9.2", + "@parcel/reporter-tracer": "2.9.2", + "@parcel/utils": "2.9.2", "chalk": "^4.1.0", "commander": "^7.0.0", "get-port": "^4.2.0" @@ -3737,15 +3236,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -3906,12 +3411,12 @@ } }, "node_modules/prettier-plugin-css-order": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-css-order/-/prettier-plugin-css-order-1.3.0.tgz", - "integrity": "sha512-wOS4qlbUARCoiiuOG0TiB/j751soC3+gUnMMva5HVWKvHJdLNYqh+jXK3MvvixR6xkJVPxHSF7rIIhkHIuHTFg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/prettier-plugin-css-order/-/prettier-plugin-css-order-1.3.1.tgz", + "integrity": "sha512-c8rtt5MLDDoMvutJHXT5t/bKO/bbHHnRI/UKzGGqKyskoHXpDn58SiNNW7ot2eCBFh5iLSy+0nUYArfvFWs57A==", "dev": true, "dependencies": { - "css-declaration-sorter": "^6.2.2", + "css-declaration-sorter": "^7.0.0", "postcss-less": "^6.0.0", "postcss-scss": "^4.0.3", "sync-threads": "^1.0.1" @@ -3943,38 +3448,6 @@ } } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/react-error-overlay": { "version": "6.0.9", "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", @@ -3990,87 +3463,41 @@ "node": ">=0.10.0" } }, - "node_modules/read-pkg": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", - "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" + "resolve": "^1.1.6" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", - "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0", - "read-pkg": "^6.0.0", - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.10" } }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true }, - "node_modules/redent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", - "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "dependencies": { - "indent-string": "^5.0.0", - "strip-indent": "^4.0.0" + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">=12" + "bin": { + "resolve": "bin/resolve" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -4080,39 +3507,6 @@ "node": ">=4" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -4142,21 +3536,37 @@ "semver": "bin/semver" } }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" - }, - "node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, "engines": { - "node": ">=12" + "node": ">=4" + } + }, + "node_modules/shx": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", + "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", + "dev": true, + "dependencies": { + "minimist": "^1.2.3", + "shelljs": "^0.8.5" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "shx": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, "node_modules/source-map": { @@ -4177,38 +3587,6 @@ "node": ">=0.10.0" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, "node_modules/srcset": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", @@ -4228,21 +3606,6 @@ "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", "dev": true }, - "node_modules/strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4255,6 +3618,18 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/svgo": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz", @@ -4317,22 +3692,10 @@ "node": ">=8.0" } }, - "node_modules/trim-newlines": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", - "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/tslib": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", - "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", "dev": true }, "node_modules/type-fest": { @@ -4399,16 +3762,6 @@ "node": ">= 4" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/weak-lru-cache": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", @@ -4421,43 +3774,17 @@ "integrity": "sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==", "dev": true }, - "node_modules/xhook": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/xhook/-/xhook-1.6.0.tgz", - "integrity": "sha512-r/urufZx/xMRmC6G5a2o0TceIHvkw0sJb4IQcNbrH1YvwoJSb2N9fg10FkbqsbI5+lyNW9TpB5LxegKMjX40OQ==" + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, "node_modules/xxhash-wasm": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz", "integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==", "dev": true - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } } } } diff --git a/package.json b/package.json index da5bb07d..6c8208fb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ttv-lol-pro", - "version": "2.0.0", + "version": "2.0.1", "description": "TTV LOL PRO removes most livestream ads from Twitch.", "@parcel/bundler-default": { "minBundles": 10000000, @@ -18,12 +18,17 @@ }, "browserslist": "> 0.5%, last 2 versions, not dead", "scripts": { - "dev:firefox": "cpy src/manifest.firefox.json . --rename=manifest.json && parcel src/manifest.json --host localhost --target webext-dev --no-hmr", - "dev:chromium": "cpy src/manifest.chromium.json . --rename=manifest.json && parcel src/manifest.json --host localhost --target webext-dev --no-hmr", + "predev:firefox": "npm run clean && shx cp src/manifest.firefox.json src/manifest.json", + "predev:chromium": "npm run clean && shx cp src/manifest.chromium.json src/manifest.json", + "dev:firefox": "parcel src/manifest.json --host localhost --target webext-dev --no-hmr", + "dev:chromium": "parcel src/manifest.json --host localhost --target webext-dev --no-hmr", "lint": "prettier --check ./src", "lint:fix": "prettier --write ./src", - "build:firefox": "cpy src/manifest.firefox.json . --rename=manifest.json && parcel build src/manifest.json --target webext-prod --no-source-maps", - "build:chromium": "cpy src/manifest.chromium.json . --rename=manifest.json && parcel build src/manifest.json --target webext-prod --no-source-maps" + "prebuild:firefox": "npm run clean && shx cp src/manifest.firefox.json src/manifest.json", + "prebuild:chromium": "npm run clean && shx cp src/manifest.chromium.json src/manifest.json", + "build:firefox": "parcel build src/manifest.json --target webext-prod --no-source-maps", + "build:chromium": "parcel build src/manifest.json --target webext-prod --no-source-maps", + "clean": "shx rm -rf .parcel-cache ; shx rm -rf dist ; shx --silent rm src/manifest.json ; exit 0" }, "keywords": [ "twitch", @@ -37,21 +42,21 @@ "license": "GPL-3.0", "dependencies": { "bowser": "^2.11.0", - "semver-compare": "^1.0.0", - "xhook": "^1.6.0" + "ip": "^1.1.8" }, "devDependencies": { - "@parcel/config-webextension": "^2.9.1", + "@parcel/config-webextension": "^2.9.2", "@types/chrome": "^0.0.237", - "@types/semver-compare": "^1.0.1", + "@types/ip": "^1.1.0", "@types/webextension-polyfill": "^0.10.0", - "@types/xhook": "^1.5.0", - "cpy-cli": "^4.2.0", - "parcel": "^2.9.1", + "buffer": "^6.0.3", + "os-browserify": "^0.3.0", + "parcel": "^2.9.2", "postcss": "^8.4.24", "prettier": "^2.8.8", - "prettier-plugin-css-order": "^1.3.0", + "prettier-plugin-css-order": "^1.3.1", "prettier-plugin-organize-imports": "^3.2.2", + "shx": "^0.3.4", "typescript": "^4.9.5", "webextension-polyfill": "^0.10.0" }, diff --git a/src/background/background.ts b/src/background/background.ts index 3c4aebda..21ae58d4 100644 --- a/src/background/background.ts +++ b/src/background/background.ts @@ -33,10 +33,11 @@ if (isChromium) { // Block tracking pixels. browser.webRequest.onBeforeRequest.addListener( () => ({ cancel: true }), - { urls: ["https://*.twitch.tv/r/*"] }, + { urls: ["https://*.twitch.tv/r/s/*", "https://*.twitch.tv/r/c/*"] }, ["blocking"] ); - // Map channel names to video-weaver URLs. + + // Map channel names to Video Weaver URLs. browser.webRequest.onBeforeRequest.addListener( onBeforeUsherRequest, { @@ -44,6 +45,7 @@ if (isChromium) { }, ["blocking"] ); + // Proxy requests. browser.proxy.onRequest.addListener( onProxyRequest, @@ -52,7 +54,8 @@ if (isChromium) { }, ["requestHeaders"] ); - // Remove the Accept flag from requests. + + // Remove the Accept flag from flagged requests. browser.webRequest.onBeforeSendHeaders.addListener( onBeforeSendHeaders, { @@ -60,7 +63,8 @@ if (isChromium) { }, ["blocking", "requestHeaders"] ); - // Check for ads in video-weaver responses. + + // Check for ads in Video Weaver responses. browser.webRequest.onBeforeRequest.addListener( onBeforeVideoWeaverRequest, { @@ -68,6 +72,7 @@ if (isChromium) { }, ["blocking"] ); + // Monitor responses of proxied requests. browser.webRequest.onHeadersReceived.addListener(onHeadersReceived, { urls: ["https://*.ttvnw.net/*", "https://*.twitch.tv/*"], diff --git a/src/background/handlers/onAuthRequired.ts b/src/background/handlers/onAuthRequired.ts index e4d19814..191465e3 100644 --- a/src/background/handlers/onAuthRequired.ts +++ b/src/background/handlers/onAuthRequired.ts @@ -1,29 +1,50 @@ import { WebRequest } from "webextension-polyfill"; +import getProxyInfoFromUrl from "../../common/ts/getProxyInfoFromUrl"; import store from "../../store"; const pendingRequests = []; export default function onAuthRequired( details: WebRequest.OnAuthRequiredDetailsType -) { +): void | WebRequest.BlockingResponseOrPromise { + if (!details.isProxy) return; + if (pendingRequests.includes(details.requestId)) { console.error( - `🔐 Incorrect credentials provided for proxy ${details.challenger.host}:${details.challenger.port}.` + `🔐 Provided invalid credentials for proxy ${details.challenger.host}:${details.challenger.port}.` ); + // TODO: Remove the proxy from the list of online proxies. return; } pendingRequests.push(details.requestId); + let predicate = (proxy: string) => + proxy.endsWith(`@${details.challenger.host}:${details.challenger.port}`); + if (details.challenger.port === 3128) { + // Default port + predicate = (proxy: string) => + proxy.endsWith( + `@${details.challenger.host}:${details.challenger.port}` + ) || proxy.endsWith(`@${details.challenger.host}`); + } + const proxies = store.state.optimizedProxiesEnabled ? store.state.optimizedProxies : store.state.normalProxies; - const proxy = proxies.find(proxy => - proxy.includes(`@${details.challenger.host}`) - ); - if (!proxy) return; - const [username, password] = proxy - .substring(0, proxy.lastIndexOf("@")) - .split(":"); - console.log("Provided credentials for proxy", details.challenger.host); - return { authCredentials: { username, password } }; + const proxy = proxies.find(predicate); + if (!proxy) { + console.error( + `🔐 No credentials found for proxy ${details.challenger.host}:${details.challenger.port}.` + ); + return; + } + + console.log(`🔑 Providing credentials for proxy ${proxy}.`); + const proxyInfo = getProxyInfoFromUrl(proxy); + return { + authCredentials: { + username: proxyInfo.username, + password: proxyInfo.password, + }, + }; } diff --git a/src/background/handlers/onHeadersReceived.ts b/src/background/handlers/onHeadersReceived.ts index 1958e1b5..5b3a6fb8 100644 --- a/src/background/handlers/onHeadersReceived.ts +++ b/src/background/handlers/onHeadersReceived.ts @@ -4,6 +4,7 @@ import getHostFromUrl from "../../common/ts/getHostFromUrl"; import { passportHostRegex, twitchGqlHostRegex, + twitchTvHostRegex, usherHostRegex, videoWeaverHostRegex, } from "../../common/ts/regexes"; @@ -21,7 +22,7 @@ export default function onHeadersReceived( const proxy = getProxyFromDetails(details); // Twitch webpage requests. - if (store.state.proxyTwitchWebpage && host === "www.twitch.tv") { + if (store.state.proxyTwitchWebpage && twitchTvHostRegex.test(host)) { if (!proxy) return console.log(`❌ Did not proxy ${details.url}`); console.log(`✅ Proxied ${details.url} through ${proxy}`); } diff --git a/src/background/handlers/onProxyRequest.ts b/src/background/handlers/onProxyRequest.ts index a80dd5b5..812caecb 100644 --- a/src/background/handlers/onProxyRequest.ts +++ b/src/background/handlers/onProxyRequest.ts @@ -2,11 +2,13 @@ import { Proxy } from "webextension-polyfill"; import findChannelFromUsherUrl from "../../common/ts/findChannelFromUsherUrl"; import findChannelFromVideoWeaverUrl from "../../common/ts/findChannelFromVideoWeaverUrl"; import getHostFromUrl from "../../common/ts/getHostFromUrl"; +import getProxyInfoFromUrl from "../../common/ts/getProxyInfoFromUrl"; import isChannelWhitelisted from "../../common/ts/isChannelWhitelisted"; import isFlaggedRequest from "../../common/ts/isFlaggedRequest"; import { passportHostRegex, twitchGqlHostRegex, + twitchTvHostRegex, usherHostRegex, videoWeaverHostRegex, } from "../../common/ts/regexes"; @@ -34,19 +36,13 @@ export default async function onProxyRequest( (store.state.optimizedProxiesEnabled && isFlaggedRequest(details.requestHeaders)) || !store.state.optimizedProxiesEnabled; - const proxies = ( - store.state.optimizedProxiesEnabled - ? store.state.optimizedProxies - : store.state.normalProxies - ).map(host => - host.includes("@") - ? host.slice(host.lastIndexOf("@") + 1, host.length) - : host - ); - const proxyInfoArray = getProxyInfoArrayFromHosts(proxies); + const proxies = store.state.optimizedProxiesEnabled + ? store.state.optimizedProxies + : store.state.normalProxies; + const proxyInfoArray = getProxyInfoArrayFromUrls(proxies); // Twitch webpage requests. - if (store.state.proxyTwitchWebpage && host === "www.twitch.tv") { + if (store.state.proxyTwitchWebpage && twitchTvHostRegex.test(host)) { console.log(`⌛ Proxying ${details.url} through one of: `); return proxyInfoArray; } @@ -91,7 +87,7 @@ export default async function onProxyRequest( return proxyInfoArray; } - // Video-weaver requests. + // Video Weaver requests. if (videoWeaverHostRegex.test(host) && isFlagged) { // Don't proxy whitelisted channels. const channelName = findChannelFromVideoWeaverUrl(details.url); @@ -110,16 +106,9 @@ export default async function onProxyRequest( return { type: "direct" }; } -function getProxyInfoArrayFromHosts(hosts: string[]): ProxyInfo[] { +function getProxyInfoArrayFromUrls(urls: string[]): ProxyInfo[] { return [ - ...hosts.map(host => { - const [hostname, port] = host.split(":"); - return { - type: "http", - host: hostname, - port: Number(port) ?? 3128, - } as ProxyInfo; - }), + ...urls.map(url => getProxyInfoFromUrl(url)), { type: "direct" } as ProxyInfo, // Fallback to direct connection if all proxies fail. ]; } diff --git a/src/common/ts/anonymizeIpAddress.ts b/src/common/ts/anonymizeIpAddress.ts new file mode 100644 index 00000000..ee7dde74 --- /dev/null +++ b/src/common/ts/anonymizeIpAddress.ts @@ -0,0 +1,42 @@ +import ip from "ip"; +import getProxyInfoFromUrl from "./getProxyInfoFromUrl"; + +/** + * Anonymize an IP address by masking the last 2 octets of an IPv4 address + * or the last 8 octets of an IPv6 address. + * @param url + * @returns + */ +export function anonymizeIpAddress(url: string): string { + const proxyInfo = getProxyInfoFromUrl(url); + + let proxyHost = proxyInfo.host; + const withinBrackets = /^\[.*\]$/.test(proxyHost); + if (withinBrackets) proxyHost = proxyHost.slice(1, -1); + + const isIPv4 = ip.isV4Format(proxyHost); + const isIPv6 = ip.isV6Format(proxyHost); + const isIP = isIPv4 || isIPv6; + const isPublicIP = isIP && !ip.isPrivate(proxyHost); + + if (isPublicIP) { + if (isIPv4) { + proxyHost = ip.mask(proxyHost, "255.255.0.0").replace(/\.0\.0$/, ".*.*"); + } else if (isIPv6) { + proxyHost = ip.mask(proxyHost, "ffff:ffff:ffff:ffff:0000:0000:0000:0000"); + } + } + + if (withinBrackets) proxyHost = `[${proxyHost}]`; + + return `${proxyHost}:${proxyInfo.port}`; +} + +/** + * Anonymize an array of IP addresses. See {@link anonymizeIpAddress}. + * @param urls + * @returns + */ +export function anonymizeIpAddresses(urls: string[]): string[] { + return urls.map(url => anonymizeIpAddress(url)); +} diff --git a/src/common/ts/getHostFromUrl.ts b/src/common/ts/getHostFromUrl.ts index a0e993bd..3421e124 100644 --- a/src/common/ts/getHostFromUrl.ts +++ b/src/common/ts/getHostFromUrl.ts @@ -2,8 +2,7 @@ export default function getHostFromUrl(url: string) { try { const Url = new URL(url); return Url.host; - } catch (error) { - console.error(error); + } catch { return null; } } diff --git a/src/common/ts/getProxyInfoFromUrl.ts b/src/common/ts/getProxyInfoFromUrl.ts new file mode 100644 index 00000000..b296f97c --- /dev/null +++ b/src/common/ts/getProxyInfoFromUrl.ts @@ -0,0 +1,57 @@ +import type { ProxyInfo } from "../../types"; + +export default function getProxyInfoFromUrl(url: string): ProxyInfo { + const lastIndexOfAt = url.lastIndexOf("@"); + const hostname = url.substring(lastIndexOfAt + 1, url.length); + const lastIndexOfColon = getLastIndexOfColon(hostname); + + let host: string | undefined = undefined; + let port: number | undefined = undefined; + if (lastIndexOfColon === -1) { + host = hostname; + port = 3128; // Default port + } else { + host = hostname.substring(0, lastIndexOfColon); + port = Number(hostname.substring(lastIndexOfColon + 1, hostname.length)); + } + + let username: string | undefined = undefined; + let password: string | undefined = undefined; + if (lastIndexOfAt !== -1) { + const credentials = url.substring(0, lastIndexOfAt); + const indexOfColon = credentials.indexOf(":"); + username = credentials.substring(0, indexOfColon); + password = credentials.substring(indexOfColon + 1, credentials.length); + } + + return { + type: "http", + host, + port, + username, + password, + }; +} + +/** + * Returns the last index of a colon in a hostname, ignoring colons inside brackets. + * Supports IPv6 addresses. + * @param hostname + * @returns Returns -1 if no colon is found. + */ +function getLastIndexOfColon(hostname: string): number { + let lastIndexOfColon = -1; + let bracketDepth = 0; + for (let i = hostname.length - 1; i >= 0; i--) { + const char = hostname[i]; + if (char === "]") { + bracketDepth++; + } else if (char === "[") { + bracketDepth--; + } else if (char === ":" && bracketDepth === 0) { + lastIndexOfColon = i; + break; + } + } + return lastIndexOfColon; +} diff --git a/src/common/ts/regexes.ts b/src/common/ts/regexes.ts index 54300ed6..5bf2cf3a 100644 --- a/src/common/ts/regexes.ts +++ b/src/common/ts/regexes.ts @@ -1,8 +1,9 @@ export const passportHostRegex = /^passport\.twitch\.tv$/i; export const twitchApiChannelNameRegex = /\/hls\/(.+)\.m3u8/i; export const twitchChannelNameRegex = - /^https?:\/\/(?:(?:www|m)\.)?twitch\.tv\/(?:videos\/)?(\w+)/i; + /^https?:\/\/(?:www|m)\.twitch\.tv\/(?:videos\/)?(\w+)/i; export const twitchGqlHostRegex = /^gql\.twitch\.tv$/i; +export const twitchTvHostRegex = /^(?:www|m)\.twitch\.tv$/i; export const usherHostRegex = /^usher\.ttvnw\.net$/i; export const videoWeaverHostRegex = /^video-weaver\.\w+\.hls\.ttvnw\.net$/i; export const videoWeaverUrlRegex = diff --git a/src/common/ts/updateProxySettings.ts b/src/common/ts/updateProxySettings.ts index 463ca0e7..b8cde82e 100644 --- a/src/common/ts/updateProxySettings.ts +++ b/src/common/ts/updateProxySettings.ts @@ -1,45 +1,41 @@ import store from "../../store"; +import getProxyInfoFromUrl from "./getProxyInfoFromUrl"; import { passportHostRegex, twitchGqlHostRegex, + twitchTvHostRegex, usherHostRegex, videoWeaverHostRegex, } from "./regexes"; export default function updateProxySettings() { - const proxies = store.state.normalProxies.map(host => - host.includes("@") - ? host.slice(host.lastIndexOf("@") + 1, host.length) - : host - ); - const proxyInfo = getProxyInfoFromHosts(proxies); - const proxyInfoStringified = JSON.stringify(proxyInfo); + const { proxyTwitchWebpage, proxyUsherRequests } = store.state; + + const proxies = store.state.optimizedProxiesEnabled + ? store.state.optimizedProxies + : store.state.normalProxies; + const proxyInfoString = getProxyInfoStringFromUrls(proxies); const config = { mode: "pac_script", pacScript: { data: ` - function FindProxyForURL(url, host) { - // Settings - const proxyTwitchWebpage = ${store.state.proxyTwitchWebpage}; - const proxyUsherRequests = ${store.state.proxyUsherRequests}; - // Regexes - const twitchGqlHostRegex = ${twitchGqlHostRegex.toString()}; - const passportHostRegex = ${passportHostRegex.toString()}; - const usherHostRegex = ${usherHostRegex.toString()}; - const videoWeaverHostRegex = ${videoWeaverHostRegex.toString()}; - - if (proxyTwitchWebpage && (host === "www.twitch.tv" || twitchGqlHostRegex.test(host))) { - return ${proxyInfoStringified}; - } - if (proxyUsherRequests && (passportHostRegex.test(host) || usherHostRegex.test(host))) { - return ${proxyInfoStringified}; - } - if (videoWeaverHostRegex.test(host)) { - return ${proxyInfoStringified}; - } - return "DIRECT"; - }`, + function FindProxyForURL(url, host) { + // Twitch webpage & GraphQL requests. + if (${proxyTwitchWebpage} && (${twitchTvHostRegex}.test(host) || ${twitchGqlHostRegex}.test(host))) { + return "${proxyInfoString}"; + } + // Passport & Usher requests. + if (${proxyUsherRequests} && (${passportHostRegex}.test(host) || ${usherHostRegex}.test(host))) { + return "${proxyInfoString}"; + } + // Video Weaver requests. + if (${videoWeaverHostRegex}.test(host)) { + return "${proxyInfoString}"; + } + return "DIRECT"; + } + `, }, }; @@ -50,6 +46,12 @@ export default function updateProxySettings() { }); } -function getProxyInfoFromHosts(hosts: string[]): string { - return [...hosts.map(host => `PROXY ${host}`), "DIRECT"].join("; "); +function getProxyInfoStringFromUrls(urls: string[]): string { + return [ + ...urls.map(url => { + const proxyInfo = getProxyInfoFromUrl(url); + return `PROXY ${proxyInfo.host}:${proxyInfo.port}`; + }), + "DIRECT", + ].join("; "); } diff --git a/src/content/content.ts b/src/content/content.ts index 389c3a35..1aaf13ed 100644 --- a/src/content/content.ts +++ b/src/content/content.ts @@ -15,8 +15,13 @@ function injectScript(src: string) { workerScriptURL: workerScript, }); script.onload = () => script.remove(); - // Note: Despite what the TS types say, `document.head` can be `null`. - (document.head || document.documentElement).append(script); + // ------------------------------------------ + // 🦊🦊🦊 DEAR FIREFOX ADDON REVIEWER 🦊🦊🦊 + // ------------------------------------------ + // This is NOT remote code execution. The script being injected is + // bundled with the extension (look at the `url:` imports above provided by + // the Parcel bundler). By the way, no custom CSP is used. + (document.head || document.documentElement).append(script); // Note: Despite what the TS types say, `document.head` can be `null`. } if (store.readyState === "complete") onStoreReady(); diff --git a/src/manifest.chromium.json b/src/manifest.chromium.json index 186f1f37..1e310792 100644 --- a/src/manifest.chromium.json +++ b/src/manifest.chromium.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "TTV LOL PRO", "description": "TTV LOL PRO removes most livestream ads from Twitch.", - "version": "2.0.0", + "version": "2.0.1", "background": { "service_worker": "background/background.ts", "type": "module" diff --git a/src/manifest.firefox.json b/src/manifest.firefox.json index fb36ba5e..12e86dbd 100644 --- a/src/manifest.firefox.json +++ b/src/manifest.firefox.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "TTV LOL PRO", "description": "TTV LOL PRO removes most livestream ads from Twitch.", - "version": "2.0.0", + "version": "2.0.1", "background": { "scripts": ["background/background.ts"], "persistent": false diff --git a/src/options/options.ts b/src/options/options.ts index 7e41466c..bab11b94 100644 --- a/src/options/options.ts +++ b/src/options/options.ts @@ -32,9 +32,6 @@ type ListOptions = { const proxyUsherRequestsCheckboxElement = $( "#proxy-usher-requests-checkbox" ) as HTMLInputElement; -const proxyTwitchWebpageLiElement = $( - "#proxy-twitch-webpage-li" -) as HTMLElement; const proxyTwitchWebpageCheckboxElement = $( "#proxy-twitch-webpage-checkbox" ) as HTMLInputElement; @@ -72,7 +69,7 @@ const importButtonElement = $("#import-button") as HTMLButtonElement; const resetButtonElement = $("#reset-button") as HTMLButtonElement; //#endregion -const DEFAULT_STATE_KEYS = Object.freeze(Object.keys(getDefaultState())); +const DEFAULT_STATE = Object.freeze(getDefaultState()); const DEFAULT_LIST_OPTIONS = Object.freeze({ getAlreadyExistsAlertMessage: text => `'${text}' is already in the list`, getItemPlaceholder: text => `Leave empty to remove '${text}' from the list`, @@ -101,9 +98,6 @@ function main() { store.state.proxyTwitchWebpage = proxyTwitchWebpageCheckboxElement.checked; if (isChromium) updateProxySettings(); }); - if (proxyTwitchWebpageCheckboxElement.checked) { - proxyTwitchWebpageLiElement.style.display = "block"; - } // Whitelisted channels if (isChromium) { whitelistedChannelsSectionElement.style.display = "none"; @@ -134,8 +128,8 @@ function main() { if (insertMode == "prepend") return "Enter a proxy URL… (Primary)"; return "Enter a proxy URL… (Fallback)"; }, - isAddAllowed: isOptimizedProxyUrlValid, - isEditAllowed: isOptimizedProxyUrlValid, + isAddAllowed: isOptimizedProxyUrlAllowed, + isEditAllowed: isOptimizedProxyUrlAllowed, hidePromptMarker: true, insertMode: "both", }); @@ -144,8 +138,8 @@ function main() { if (insertMode == "prepend") return "Enter a proxy URL… (Primary)"; return "Enter a proxy URL… (Fallback)"; }, - isAddAllowed: isNormalProxyUrlValid, - isEditAllowed: isNormalProxyUrlValid, + isAddAllowed: isNormalProxyUrlAllowed, + isEditAllowed: isNormalProxyUrlAllowed, onEdit() { if (isChromium) updateProxySettings(); }, @@ -163,47 +157,77 @@ function main() { } } -function isOptimizedProxyUrlValid(host: string): AllowedResult { - if ( - host.toLowerCase().startsWith("http://") || - host.toLowerCase().startsWith("https://") - ) { - return [ - false, - "Proxy URLs cannot contain a protocol (e.g. 'http://'). Reminder: TTV LOL PRO v1 proxies are not compatible", - ]; +function isOptimizedProxyUrlAllowed(url: string): AllowedResult { + const urlLower = url.toLowerCase(); + + // Allow default proxies. + if (DEFAULT_STATE.optimizedProxies.includes(urlLower)) { + return [true]; + } + + // Forbid v1 proxies. + const proxiesV1 = [ + // *.luminous.dev + "eu.luminous.dev", + "eu2.luminous.dev", + "as.luminous.dev", + "bg.luminous.dev", + // *.perfprod.com + "lb-eu.perfprod.com", + "lb-eu2.perfprod.com", + "lb-na.perfprod.com", + "lb-as.perfprod.com", + // *.cdn-perfprod.com + "lb-eu.cdn-perfprod.com", + "lb-eu2.cdn-perfprod.com", + "lb-na.cdn-perfprod.com", + "lb-as.cdn-perfprod.com", + ]; + if (proxiesV1.some(proxy => urlLower.includes(proxy))) { + return [false, "TTV LOL PRO v1 proxies are not compatible"]; + } + + if (/^https?:\/\//i.test(url)) { + return [false, "Proxy URLs must not contain a protocol (e.g. 'http://')"]; + } + + if (url.includes("/")) { + return [false, "Proxy URLs must not contain a path (e.g. '/path')"]; } try { - new URL(`http://${host.slice(host.lastIndexOf("@") + 1, host.length)}`); - if (host.includes("/")) { - return [false, "Proxy URLs cannot contain a path (e.g. '/path')"]; - } - if ( - [ - "eu.luminous.dev", - "as.luminous.dev", - "lb-eu.perfprod.com", - "lb-eu2.perfprod.com", - "lb-na.perfprod.com", - "lb-as.perfprod.com", - ].includes(host.toLowerCase()) - ) { - return [false, "TTV LOL PRO v1 proxies are not compatible"]; - } + const host = url.substring(url.lastIndexOf("@") + 1, url.length); + new URL(`http://${host}`); // Throws if the host is invalid. return [true]; } catch { - return [false, `'${host}' is not a valid proxy URL`]; + return [false, `'${url}' is not a valid proxy URL`]; } } -function isNormalProxyUrlValid(host: string): AllowedResult { - const [allowed, error] = isOptimizedProxyUrlValid(host); +function isNormalProxyUrlAllowed(url: string): AllowedResult { + const [allowed, error] = isOptimizedProxyUrlAllowed(url); if (!allowed) return [false, error]; - if (host.toLowerCase().includes("perfprod.com")) { - if (isChromium) return [false, "This proxy can only be used on Firefox"]; - return [false, "This proxy cannot be used for all requests"]; + + const urlLower = url.toLowerCase(); + + // Allow default proxies. + if (DEFAULT_STATE.normalProxies.includes(urlLower)) { + return [true]; + } + + // Allow donator proxy (password protected). + if (urlLower === "restricted.api.cdn-perfprod.com:6691") { + return [true]; + } + + // Forbid other perfprod.com proxies. + if ( + urlLower.includes(".perfprod.com") || + urlLower.includes(".cdn-perfprod.com") + ) { + return [false, "This proxy is not compatible with 'Proxy all requests'"]; } + return [true]; } @@ -414,24 +438,32 @@ exportButtonElement.addEventListener("click", () => { }); importButtonElement.addEventListener("click", async () => { + const DEFAULT_STATE_KEYS = Object.keys(DEFAULT_STATE); + try { const data = await readFile("application/json;charset=utf-8"); const state = JSON.parse(data); - for (const [key, value] of Object.entries(state)) { + + for (const entry of Object.entries(state)) { + const key = entry[0] as keyof State; + const value = entry[1]; + if (!DEFAULT_STATE_KEYS.includes(key)) { console.warn(`Unknown key '${key}' in imported settings`); continue; } let filteredValue = value; - if (key !== "optimizedProxies" && Array.isArray(value)) { + if (key === "optimizedProxies" && Array.isArray(value)) { filteredValue = value.filter(item => - typeof item === "string" - ? !item.toLowerCase().includes("perfprod.com") - : true + item != null ? isOptimizedProxyUrlAllowed(item.toString())[0] : false ); } - if (key === "optimizedProxiesEnabled" && isChromium) - filteredValue = false; + if (key === "normalProxies" && Array.isArray(value)) { + filteredValue = value.filter(item => + item != null ? isNormalProxyUrlAllowed(item.toString())[0] : false + ); + } + // @ts-ignore store.state[key] = filteredValue; } window.location.reload(); // Reload page to update UI. @@ -448,40 +480,3 @@ resetButtonElement.addEventListener("click", () => { store.clear(); window.location.reload(); // Reload page to update UI. }); - -// From https://stackoverflow.com/a/31627191 - -const konamiCode = [ - "ArrowUp", - "ArrowUp", - "ArrowDown", - "ArrowDown", - "ArrowLeft", - "ArrowRight", - "ArrowLeft", - "ArrowRight", - "b", - "a", -]; -let konamiCodePosition = 0; - -document.addEventListener("keydown", function (e) { - const key = e.key; - const expectedKey = konamiCode[konamiCodePosition]; - - if (key == expectedKey) { - konamiCodePosition += 1; - - // Complete code entered correctly. - if (konamiCodePosition == konamiCode.length) { - konamiCodeActivate(); - konamiCodePosition = 0; - } - } else { - konamiCodePosition = 0; - } -}); - -function konamiCodeActivate() { - proxyTwitchWebpageLiElement.style.display = "block"; -} diff --git a/src/options/page.html b/src/options/page.html index 178c0690..9e1831ec 100644 --- a/src/options/page.html +++ b/src/options/page.html @@ -33,32 +33,42 @@

Passport


- Browse Twitch as a TTV LOL PRO citizen. This option enables - advanced proxying to prevent ads. + Browse Twitch as a TTV LOL PRO citizen! This option enables + proxying of passport.twitch.tv and + usher.ttvnw.net requests.
This option is not an on/off switch. TTV LOL PRO will still - proxy some requests even if this option is disabled. + proxy video-weaver.*.hls.ttvnw.net requests even if + this option is disabled. -
  • +
  • -
    - - Learn more about laissez-passers + Make the passport a here. + >laissez-passer + +
    + + This option enables proxying of www.twitch.tv and + gql.twitch.tv requests. + +
    + + + Only enable this option if you are experiencing issues with + TTV LOL PRO's passport! +
  • Expiration date: 2038-01-19T03:14:07.000Z @@ -75,16 +85,18 @@

    Whitelisted channels

    - +

    Proxies

    Proxies listed below must be HTTP proxies in the format - hostname:port. + hostname:port. To provide authentication credentials, use + the format username:password@hostname:port.
    - - Proxies for TTV LOL PRO v1 are not compatible. + + IPv6 addresses must be enclosed in square brackets, for example + [::1]:8080.
    diff --git a/src/options/style.css b/src/options/style.css index 88460c7b..5e24eaf7 100644 --- a/src/options/style.css +++ b/src/options/style.css @@ -60,6 +60,7 @@ fieldset { a, a:visited { color: var(--link); + text-decoration: none; transition: color 100ms ease-in-out; } @@ -195,11 +196,3 @@ li.hide-marker::marker { height: 80px; margin-top: 1rem; } - -#proxy-twitch-webpage-li { - display: none; -} - -#proxy-twitch-webpage-li > label { - text-shadow: 0 0 10px; -} diff --git a/src/page/fetch.ts b/src/page/fetch.ts deleted file mode 100644 index 55c5a560..00000000 --- a/src/page/fetch.ts +++ /dev/null @@ -1,211 +0,0 @@ -import acceptFlag from "../common/ts/acceptFlag"; -import getHostFromUrl from "../common/ts/getHostFromUrl"; -import { - twitchGqlHostRegex, - usherHostRegex, - videoWeaverHostRegex, -} from "../common/ts/regexes"; - -const NATIVE_FETCH = self.fetch; - -const ignoredVideoWeaverUrls = new Set(); -const knownVideoWeaverUrls = new Set(); -const videoWeaverUrlsToFlag = new Map(); // URL -> No. of times flagged. - -/** - * Converts a HeadersInit to a map. - * @param headers - * @returns - */ -function getHeadersMap( - headers: Headers | HeadersInit | undefined -): Map { - if (!headers) return new Map(); - if (headers instanceof Headers) { - return new Map(headers.entries()); - } - if (Array.isArray(headers)) { - return new Map(headers); - } - return new Map(Object.entries(headers)); -} - -/** - * Converts a BodyInit to a string. - * @param body - * @returns - */ -async function getRequestBodyText( - body: BodyInit | null | undefined -): Promise { - if (!body) return null; - if (body instanceof Blob) { - return body.text(); - } - if (body instanceof ArrayBuffer) { - return new TextDecoder().decode(body); - } - if (body instanceof FormData) { - const entries = [...body.entries()]; - return entries.map(e => `${e[0]}=${e[1]}`).join("&"); - } - return body.toString(); -} - -function findHeaderFromMap( - headersMap: Map, - name: string -): string | undefined { - return [...headersMap.keys()].find( - header => header.toLowerCase() === name.toLowerCase() - ); -} - -function getHeaderFromMap( - headersMap: Map, - name: string -): string | null { - const header = findHeaderFromMap(headersMap, name); - return header != null ? headersMap.get(header)! : null; -} - -function setHeaderToMap( - headersMap: Map, - name: string, - value: string -) { - const header = findHeaderFromMap(headersMap, name); - headersMap.set(header ?? name, value); -} - -function removeHeaderFromMap(headersMap: Map, name: string) { - const header = findHeaderFromMap(headersMap, name); - if (header != null) { - headersMap.delete(header); - } -} - -function flagRequest(headersMap: Map) { - const accept = getHeaderFromMap(headersMap, "Accept"); - setHeaderToMap(headersMap, "Accept", `${accept || ""}${acceptFlag}`); -} - -function cancelRequest(): never { - throw new Error(); -} - -export interface FetchOptions { - proxyTwitchWebpage: boolean; -} - -export async function fetch( - input: RequestInfo | URL, - init?: RequestInit -): Promise { - const url = input instanceof Request ? input.url : input.toString(); - const host = getHostFromUrl(url); - const headersMap = getHeadersMap(init?.headers); - const requestBody = await getRequestBodyText(init?.body); - - // Twitch GraphQL requests. - if (host != null && twitchGqlHostRegex.test(host)) { - if (url === "https://gql.twitch.tv/integrity") { - console.log("[TTV LOL PRO] 🥅 Caught integrity request. Flagging…"); - flagRequest(headersMap); - } - const clientIntegrityHeader = getHeaderFromMap( - headersMap, - "Client-Integrity" - ); - if (clientIntegrityHeader != null) { - console.log( - "[TTV LOL PRO] 🥅 Caught request with Client-Integrity header. Flagging…" - ); - flagRequest(headersMap); - } - if (requestBody != null && requestBody.includes("PlaybackAccessToken")) { - console.log( - "[TTV LOL PRO] 🥅 Caught PlaybackAccessToken request. Flagging…" - ); - flagRequest(headersMap); - } - } - - // Usher requests. - if (host != null && usherHostRegex.test(host)) { - console.log("[TTV LOL PRO] 🥅 Caught Usher request."); - } - - // Video Weaver requests. - if (host != null && videoWeaverHostRegex.test(host)) { - const isIgnoredUrl = ignoredVideoWeaverUrls.has(url); - const isNewUrl = !knownVideoWeaverUrls.has(url); - const isFlaggedUrl = videoWeaverUrlsToFlag.has(url); - if (!isIgnoredUrl && (isNewUrl || isFlaggedUrl)) { - console.log( - "[TTV LOL PRO] 🥅 Caught new or ad-containing Video Weaver request. Flagging…" - ); - flagRequest(headersMap); - if (isNewUrl) knownVideoWeaverUrls.add(url); - videoWeaverUrlsToFlag.set(url, (videoWeaverUrlsToFlag.get(url) ?? 0) + 1); - } - } - - const response = await NATIVE_FETCH(input, { - ...init, - headers: Object.fromEntries(headersMap), - }); - const clonedResponse = response.clone(); - - // Usher responses. - if (host != null && usherHostRegex.test(host)) { - console.log("[TTV LOL PRO] 🥅 Caught Usher response."); - const responseBody = await clonedResponse.text(); - responseBody.split("\n").forEach(line => { - if (line.includes("video-weaver.")) { - knownVideoWeaverUrls.delete(line.trim()); - } - }); - } - - // Video Weaver responses. - if (host != null && videoWeaverHostRegex.test(host)) { - const responseBody = await clonedResponse.text(); - - if ( - responseBody.includes("stitched-ad") || - responseBody.includes("twitch-client-ad") || - responseBody.includes("twitch-maf-ad") - ) { - console.log( - "[TTV LOL PRO] 🥅 Caught Video Weaver response containing ad." - ); - if (ignoredVideoWeaverUrls.has(url)) return response; - if (!videoWeaverUrlsToFlag.has(url)) { - // Let's proxy the next request for this URL, 2 attempts left. - videoWeaverUrlsToFlag.set(url, 0); - cancelRequest(); - } - // 0: First attempt, not proxied, cancelled. - // 1: Second attempt, proxied, cancelled? - // 2: Third attempt, proxied, last attempt by Twitch. - // If the third attempt contains an ad, we have to let it through. - const isCancellable = videoWeaverUrlsToFlag.get(url) < 2; - if (isCancellable) { - cancelRequest(); - } else { - console.error( - "[TTV LOL PRO] ❌ Could not cancel Video Weaver response containing ad. All attempts used." - ); - videoWeaverUrlsToFlag.delete(url); // Clear attempts. - ignoredVideoWeaverUrls.add(url); // Ignore this URL, there's nothing we can do. - } - } else { - // No ad, remove from flagged list. - videoWeaverUrlsToFlag.delete(url); - ignoredVideoWeaverUrls.delete(url); - } - } - - return response; -} diff --git a/src/page/getFetch.ts b/src/page/getFetch.ts new file mode 100644 index 00000000..0203da62 --- /dev/null +++ b/src/page/getFetch.ts @@ -0,0 +1,256 @@ +import acceptFlag from "../common/ts/acceptFlag"; +import getHostFromUrl from "../common/ts/getHostFromUrl"; +import { + twitchGqlHostRegex, + usherHostRegex, + videoWeaverHostRegex, +} from "../common/ts/regexes"; + +const NATIVE_FETCH = self.fetch; + +export interface FetchOptions {} + +export function getFetch(options: FetchOptions = {}): typeof fetch { + const knownVideoWeaverUrls = new Set(); + const videoWeaverUrlsToFlag = new Map(); // Video Weaver URLs to flag -> number of times flagged. + const videoWeaverUrlsToIgnore = new Set(); // No response check. + + return async function fetch( + input: RequestInfo | URL, + init?: RequestInit + ): Promise { + const url = input instanceof Request ? input.url : input.toString(); + // Firefox doesn't support relative URLs in content scripts (workers too!). + // See https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Chrome_incompatibilities#content_script_https_requests + if (url.startsWith("/")) { + const newUrl = `${location.origin}${url}`; + if (input instanceof Request) input = new Request(newUrl, input); + else input = newUrl; + } + const host = getHostFromUrl(url); + const headersMap = getHeadersMap(input, init); + + // Reading the request body can be expensive, so we only do it if we need to. + let requestBody: string | undefined = undefined; + const readRequestBody = async () => { + if (requestBody != null) return; + requestBody = await getRequestBodyText(input, init); + }; + + //#region Requests + + // Twitch GraphQL requests. + if (host != null && twitchGqlHostRegex.test(host)) { + await readRequestBody(); + // Integrity requests. + if (url === "https://gql.twitch.tv/integrity") { + console.debug( + "[TTV LOL PRO] 🥅 Caught GraphQL integrity request. Flagging…" + ); + flagRequest(headersMap); + } + // Requests with Client-Integrity header. + const integrityHeader = getHeaderFromMap(headersMap, "Client-Integrity"); + if (integrityHeader != null) { + console.debug( + "[TTV LOL PRO] 🥅 Caught GraphQL request with Client-Integrity header. Flagging…" + ); + flagRequest(headersMap); + } + // PlaybackAccessToken requests. + if (requestBody != null && requestBody.includes("PlaybackAccessToken")) { + console.debug( + "[TTV LOL PRO] 🥅 Caught GraphQL PlaybackAccessToken request. Flagging…" + ); + flagRequest(headersMap); + } + } + + // Usher requests. + if (host != null && usherHostRegex.test(host)) { + console.debug("[TTV LOL PRO] 🥅 Caught Usher request."); + } + + // Video Weaver requests. + if (host != null && videoWeaverHostRegex.test(host)) { + const isIgnoredUrl = videoWeaverUrlsToIgnore.has(url); + const isNewUrl = !knownVideoWeaverUrls.has(url); + const isFlaggedUrl = videoWeaverUrlsToFlag.has(url); + + if (!isIgnoredUrl && (isNewUrl || isFlaggedUrl)) { + console.log( + `[TTV LOL PRO] 🥅 Caught ${ + isNewUrl + ? "first request to Video Weaver URL" + : "Video Weaver request to flag" + }. Flagging…` + ); + flagRequest(headersMap); + videoWeaverUrlsToFlag.set( + url, + (videoWeaverUrlsToFlag.get(url) ?? 0) + 1 + ); + if (isNewUrl) knownVideoWeaverUrls.add(url); + } + } + + //#endregion + + const response = await NATIVE_FETCH(input, { + ...init, + headers: Object.fromEntries(headersMap), + }); + + // Reading the response body can be expensive, so we only do it if we need to. + let responseBody: string | undefined = undefined; + const readResponseBody = async () => { + if (responseBody != null) return; + const clonedResponse = response.clone(); + responseBody = await clonedResponse.text(); + }; + + //#region Responses + + // Usher responses. + if (host != null && usherHostRegex.test(host)) { + await readResponseBody(); + console.debug("[TTV LOL PRO] 🥅 Caught Usher response."); + // Remove all Video Weaver URLs from known URLs. + responseBody.split("\n").forEach(line => { + if (line.includes("video-weaver.")) { + knownVideoWeaverUrls.delete(line.trim()); + } + }); + } + + // Video Weaver responses. + if (host != null && videoWeaverHostRegex.test(host)) { + await readResponseBody(); + // Check if response contains ad. + if (responseBody.includes("stitched-ad")) { + console.log( + "[TTV LOL PRO] 🥅 Caught Video Weaver response containing ad." + ); + if (videoWeaverUrlsToIgnore.has(url)) return response; + if (!videoWeaverUrlsToFlag.has(url)) { + // Let's proxy the next request for this URL, 2 attempts left. + videoWeaverUrlsToFlag.set(url, 0); + cancelRequest(); + } + // FIXME: This workaround doesn't work. Let's find another way. + // 0: First attempt, not proxied, cancelled. + // 1: Second attempt, proxied, cancelled. + // 2: Third attempt, proxied, last attempt by Twitch client. + // If the third attempt contains an ad, we have to let it through. + const isCancellable = videoWeaverUrlsToFlag.get(url) < 2; + if (isCancellable) { + cancelRequest(); + } else { + console.error( + "[TTV LOL PRO] ❌ Could not cancel Video Weaver response containing ad. All attempts used." + ); + videoWeaverUrlsToFlag.delete(url); // Clear attempts. + videoWeaverUrlsToIgnore.add(url); // Ignore this URL, there's nothing we can do. + } + } else { + // No ad, remove from flagged list. + videoWeaverUrlsToFlag.delete(url); + videoWeaverUrlsToIgnore.delete(url); + } + } + + //#endregion + + return response; + }; +} + +/** + * Converts a HeadersInit to a map. + * @param headers + * @returns + */ +function getHeadersMap( + input: RequestInfo | URL, + init?: RequestInit +): Map { + const headers = input instanceof Request ? input.headers : init?.headers; + if (!headers) return new Map(); + if (headers instanceof Headers) { + return new Map(headers.entries()); + } + if (Array.isArray(headers)) { + return new Map(headers); + } + return new Map(Object.entries(headers)); +} + +/** + * Converts a BodyInit to a string. + * @param body + * @returns + */ +async function getRequestBodyText( + input: RequestInfo | URL, + init?: RequestInit +): Promise { + if (input instanceof Request) { + const clonedRequest = input.clone(); + return clonedRequest.text(); + } + const body = init?.body; + if (body == null) return null; + if (body instanceof Blob) { + return body.text(); + } + if (body instanceof ArrayBuffer) { + return new TextDecoder().decode(body); + } + if (body instanceof FormData) { + const entries = [...body.entries()]; + return entries.map(e => `${e[0]}=${e[1]}`).join("&"); + } + return body.toString(); +} + +function findHeaderFromMap( + headersMap: Map, + name: string +): string | undefined { + return [...headersMap.keys()].find( + header => header.toLowerCase() === name.toLowerCase() + ); +} + +function getHeaderFromMap( + headersMap: Map, + name: string +): string | null { + const header = findHeaderFromMap(headersMap, name); + return header != null ? headersMap.get(header)! : null; +} + +function setHeaderToMap( + headersMap: Map, + name: string, + value: string +) { + const header = findHeaderFromMap(headersMap, name); + headersMap.set(header ?? name, value); +} + +function removeHeaderFromMap(headersMap: Map, name: string) { + const header = findHeaderFromMap(headersMap, name); + if (header != null) { + headersMap.delete(header); + } +} + +function flagRequest(headersMap: Map) { + const accept = getHeaderFromMap(headersMap, "Accept"); + setHeaderToMap(headersMap, "Accept", `${accept || ""}${acceptFlag}`); +} + +function cancelRequest(): never { + throw new Error(); +} diff --git a/src/page/page.ts b/src/page/page.ts index 9c181f16..4d886386 100644 --- a/src/page/page.ts +++ b/src/page/page.ts @@ -1,34 +1,35 @@ -import { fetch } from "./fetch"; +import { getFetch } from "./getFetch"; console.info("[TTV LOL PRO] 🚀 Page script running."); const params = JSON.parse(document.currentScript.dataset.params); -window.fetch = fetch; +window.fetch = getFetch(); +// Inject custom worker script to intercept fetch requests made from workers and +// decide whether to proxy them or not. window.Worker = class Worker extends window.Worker { constructor(scriptURL: string | URL, options?: WorkerOptions) { - console.log("SCRIPT URL", scriptURL); const url = scriptURL.toString(); let script = ""; - // Firefox Nightly errors out when trying to import a blob URL directly. - if (url.startsWith("blob:")) { - const xhr = new XMLHttpRequest(); - xhr.open("GET", url, false); - xhr.send(); - if (!(200 <= xhr.status && xhr.status < 300)) { - throw new Error(`Failed to fetch script: ${xhr.statusText}`); - } + // Fetch Twitch's script, since Firefox Nightly errors out when trying to + // import a blob URL directly. + const xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(); + if (200 <= xhr.status && xhr.status < 300) { script = xhr.responseText; - } - if (!script) { - script = `importScripts("${scriptURL}");`; + } else { + console.warn( + `[TTV LOL PRO] ❌ Failed to fetch script: ${xhr.statusText}` + ); + script = `importScripts("${url}");`; // Will fail on Firefox Nightly. } const newScript = ` try { importScripts("${params.workerScriptURL}"); } catch { - console.error(\`[TTV LOL PRO] ❌ Failed to load worker script: ${params.workerScriptURL}\`); + console.error("[TTV LOL PRO] ❌ Failed to load worker script: ${params.workerScriptURL}"); } ${script} `; @@ -38,3 +39,5 @@ window.Worker = class Worker extends window.Worker { super(newScriptURL, options); } }; + +document.currentScript.remove(); diff --git a/src/page/worker.ts b/src/page/worker.ts index 55cc0a52..82d3a4da 100644 --- a/src/page/worker.ts +++ b/src/page/worker.ts @@ -1,5 +1,5 @@ -import { fetch } from "./fetch"; +import { getFetch } from "./getFetch"; console.info("[TTV LOL PRO] 🚀 Worker script running."); -self.fetch = fetch; +self.fetch = getFetch(); diff --git a/src/popup/menu.html b/src/popup/menu.html index 05f5acdc..50c98bf4 100644 --- a/src/popup/menu.html +++ b/src/popup/menu.html @@ -11,8 +11,11 @@
    - No proxies have been added to the extension. Add proxies in the options - page. +

    Twitch ads are not being blocked!

    + No proxies have been added to the extension. Add proxies in the + options page.
    diff --git a/src/popup/popup.ts b/src/popup/popup.ts index 723471a3..55f7db21 100644 --- a/src/popup/popup.ts +++ b/src/popup/popup.ts @@ -1,6 +1,10 @@ import Bowser from "bowser"; import browser from "webextension-polyfill"; import $ from "../common/ts/$"; +import { + anonymizeIpAddress, + anonymizeIpAddresses, +} from "../common/ts/anonymizeIpAddress"; import isChromium from "../common/ts/isChromium"; import { twitchChannelNameRegex } from "../common/ts/regexes"; import store from "../store"; @@ -99,7 +103,7 @@ function setProxyStatus(channelNameLower: string, status: StreamStatus) { // Info let messages = []; if (status.proxyHost) { - messages.push(`Proxy: ${status.proxyHost}`); + messages.push(`Proxy: ${anonymizeIpAddress(status.proxyHost)}`); } if (status.proxyCountry) { messages.push(`Country: ${status.proxyCountry}`); @@ -137,7 +141,7 @@ function setWhitelistStatus(channelNameLower: string) { }); } -copyDebugInfoButtonElement.addEventListener("click", async () => { +copyDebugInfoButtonElement.addEventListener("click", async e => { const extensionInfo = await browser.management.getSelf(); const userAgentParser = Bowser.getParser(window.navigator.userAgent); @@ -149,8 +153,16 @@ copyDebugInfoButtonElement.addEventListener("click", async () => { `- Passport enabled: ${store.state.proxyUsherRequests}`, `- Is laissez-passer: ${store.state.proxyTwitchWebpage}`, `- Optimized proxies enabled: ${store.state.optimizedProxiesEnabled}`, - `- Optimized proxies: ${JSON.stringify(store.state.optimizedProxies)}`, - `- Normal proxies: ${JSON.stringify(store.state.normalProxies)}`, + `- Optimized proxies: ${JSON.stringify( + e.shiftKey + ? store.state.optimizedProxies + : anonymizeIpAddresses(store.state.optimizedProxies) + )}`, + `- Normal proxies: ${JSON.stringify( + e.shiftKey + ? store.state.normalProxies + : anonymizeIpAddresses(store.state.normalProxies) + )}`, `- Last ad log entry: ${ store.state.adLog.length ? JSON.stringify({ diff --git a/src/popup/style.css b/src/popup/style.css index c7dd27c2..a1db56f0 100644 --- a/src/popup/style.css +++ b/src/popup/style.css @@ -59,6 +59,12 @@ main > * { font-size: 9pt; } +#warning-banner .warning-banner-title { + margin: 0 0 2px 0; + font-weight: bold; + font-size: 11pt; +} + #warning-banner .warning-banner-link, #warning-banner .warning-banner-link:visited { color: currentColor; diff --git a/src/rules/rules.json b/src/rules/rules.json index 95ca1f7e..0863dceb 100644 --- a/src/rules/rules.json +++ b/src/rules/rules.json @@ -6,15 +6,19 @@ "type": "block" }, "condition": { - "urlFilter": "*.twitch.tv/r/*", - "resourceTypes": [ - "main_frame", - "sub_frame", - "script", - "image", - "xmlhttprequest", - "other" - ] + "urlFilter": "*.twitch.tv/r/s/*", + "resourceTypes": ["script"] + } + }, + { + "id": 2, + "priority": 1, + "action": { + "type": "block" + }, + "condition": { + "urlFilter": "*.twitch.tv/r/c/*", + "resourceTypes": ["image"] } } ] diff --git a/src/store/getDefaultState.ts b/src/store/getDefaultState.ts index 42870ff9..cc571f83 100644 --- a/src/store/getDefaultState.ts +++ b/src/store/getDefaultState.ts @@ -6,8 +6,8 @@ export default function getDefaultState() { adLog: [], adLogEnabled: true, adLogLastSent: 0, - normalProxies: [], - optimizedProxies: isChromium ? [] : ["dev.ttvlolpro.perfprod.com:2023"], + normalProxies: isChromium ? ["chrome.api.cdn-perfprod.com:4023"] : [], + optimizedProxies: isChromium ? [] : ["firefox.api.cdn-perfprod.com:2023"], optimizedProxiesEnabled: !isChromium, proxyTwitchWebpage: false, proxyUsherRequests: true,