diff --git a/.env b/.env index f0d8e65..6ba25e7 100644 --- a/.env +++ b/.env @@ -1,2 +1,6 @@ REACT_APP_GA_TRACKING_ID=G-XXXXXXXXXX -REACT_APP_ENV=development \ No newline at end of file +REACT_APP_ENV=development +DISABLE_ESLINT_PLUGIN=true +TSC_COMPILE_ON_ERROR=true +DANGEROUSLY_DISABLE_HOST_CHECK=true +FAST_REFRESH=false \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 116697b..155e444 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,34 +8,27 @@ "name": "match-five", "version": "0.1.0", "dependencies": { - "@reduxjs/toolkit": "^2.3.0", - "@testing-library/jest-dom": "^6.0.0", - "@testing-library/react": "^14.3.1", - "@types/jest": "^29.5.14", - "@types/node": "^16.18.0", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "@types/react-transition-group": "^4.4.11", - "bootstrap": "^5.3.3", + "@reduxjs/toolkit": "^1.9.7", + "@types/node": "^16.18.68", + "@types/react": "^18.2.45", + "@types/react-dom": "^18.2.18", + "@types/react-redux": "^7.1.33", + "@types/react-router-dom": "^5.3.3", + "ajv": "^8.12.0", + "ajv-keywords": "^5.1.0", + "bootstrap": "^5.3.2", + "framer-motion": "^11.15.0", "react": "^18.2.0", - "react-bootstrap": "^2.10.5", + "react-bootstrap": "^2.9.1", "react-dom": "^18.2.0", - "react-ga4": "^2.1.0", - "react-redux": "^9.1.2", + "react-icons": "^4.12.0", + "react-redux": "^8.1.3", + "react-router-dom": "^6.21.0", "react-scripts": "5.0.1", - "react-transition-group": "^4.4.5", "typescript": "^4.9.5", - "web-vitals": "^3.5.2" - }, - "devDependencies": { - "gh-pages": "^6.2.0" + "web-vitals": "^2.1.4" } }, - "node_modules/@adobe/css-tools": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.1.tgz", - "integrity": "sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==" - }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -59,6 +52,22 @@ "node": ">=6.0.0" } }, + "node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", @@ -73,9 +82,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", - "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", + "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", "engines": { "node": ">=6.9.0" } @@ -151,12 +160,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", - "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", "dependencies": { - "@babel/parser": "^7.26.2", - "@babel/types": "^7.26.0", + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -176,18 +185,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz", - "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", @@ -240,12 +237,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", - "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", + "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", - "regexpu-core": "^6.1.1", + "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "engines": { @@ -369,18 +366,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", - "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", @@ -443,11 +428,11 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", - "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", "dependencies": { - "@babel/types": "^7.26.0" + "@babel/types": "^7.26.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -1111,11 +1096,10 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz", - "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { @@ -1257,13 +1241,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", - "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-simple-access": "^7.25.9" + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1698,9 +1681,9 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz", - "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz", + "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-create-class-features-plugin": "^7.25.9", @@ -1878,9 +1861,9 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.9.tgz", - "integrity": "sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz", + "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/helper-validator-option": "^7.25.9", @@ -1939,15 +1922,15 @@ } }, "node_modules/@babel/traverse": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", - "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", + "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/parser": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", "@babel/template": "^7.25.9", - "@babel/types": "^7.25.9", + "@babel/types": "^7.26.3", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1956,9 +1939,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", - "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" @@ -2289,6 +2272,21 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/@eslint/eslintrc/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2319,6 +2317,11 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -2561,25 +2564,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jest/fake-timers": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", @@ -2774,9 +2758,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -2970,18 +2954,18 @@ } }, "node_modules/@reduxjs/toolkit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.3.0.tgz", - "integrity": "sha512-WC7Yd6cNGfHx8zf+iu+Q1UPTfEcXhQ+ATi7CV1hlrSAaQBdlPzg7Ww/wJHNQem7qG9rxmWoFCDCPubSvFObGzA==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", + "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", "dependencies": { - "immer": "^10.0.3", - "redux": "^5.0.1", - "redux-thunk": "^3.1.0", - "reselect": "^5.1.0" + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" }, "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18", - "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + "react-redux": "^7.2.1 || ^8.0.2" }, "peerDependenciesMeta": { "react": { @@ -2992,13 +2976,12 @@ } } }, - "node_modules/@reduxjs/toolkit/node_modules/immer": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", - "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" + "node_modules/@remix-run/router": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.21.0.tgz", + "integrity": "sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==", + "engines": { + "node": ">=14.0.0" } }, "node_modules/@restart/hooks": { @@ -3371,85 +3354,6 @@ "tslib": "^2.8.0" } }, - "node_modules/@testing-library/dom": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", - "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/@testing-library/dom/node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" - }, - "node_modules/@testing-library/jest-dom": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz", - "integrity": "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==", - "dependencies": { - "@adobe/css-tools": "^4.4.0", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "lodash": "^4.17.21", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/react": { - "version": "14.3.1", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.3.1.tgz", - "integrity": "sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^9.0.0", - "@types/react-dom": "^18.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -3466,11 +3370,6 @@ "node": ">=10.13.0" } }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==" - }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -3577,9 +3476,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz", - "integrity": "sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz", + "integrity": "sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -3606,6 +3505,20 @@ "@types/node": "*" } }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz", + "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -3645,178 +3558,6 @@ "@types/istanbul-lib-report": "*" } }, - "node_modules/@types/jest": { - "version": "29.5.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", - "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/jest/node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" - }, - "node_modules/@types/jest/node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/jest/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@types/jest/node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -3856,9 +3597,9 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" }, "node_modules/@types/prop-types": { - "version": "15.7.13", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", - "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==" + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==" }, "node_modules/@types/q": { "version": "1.5.8", @@ -3892,11 +3633,41 @@ "@types/react": "*" } }, - "node_modules/@types/react-transition-group": { - "version": "4.4.11", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", - "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", + "node_modules/@types/react-redux": { + "version": "7.1.34", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.34.tgz", + "integrity": "sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "peerDependencies": { "@types/react": "*" } }, @@ -4213,9 +3984,9 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==" }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", @@ -4463,14 +4234,14 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -4493,32 +4264,15 @@ } } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "fast-deep-equal": "^3.1.3" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "peerDependencies": { - "ajv": "^6.9.1" + "ajv": "^8.8.2" } }, "node_modules/ansi-escapes": { @@ -4618,12 +4372,12 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" @@ -4703,14 +4457,14 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4720,14 +4474,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4772,18 +4526,17 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -4925,6 +4678,34 @@ "webpack": ">=2" } }, + "node_modules/babel-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/babel-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/babel-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, "node_modules/babel-loader/node_modules/schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", @@ -5202,9 +4983,9 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/bonjour-service": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", - "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", "dependencies": { "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" @@ -5259,9 +5040,9 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "funding": [ { "type": "opencollective", @@ -5277,9 +5058,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { @@ -5322,15 +5103,41 @@ } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -5387,9 +5194,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001680", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", - "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==", + "version": "1.0.30001690", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", + "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", "funding": [ { "type": "opencollective", @@ -5834,9 +5641,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", - "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6043,11 +5850,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" - }, "node_modules/cssdb": { "version": "7.11.2", "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", @@ -6228,13 +6030,13 @@ } }, "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6244,27 +6046,27 @@ } }, "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/inspect-js" } }, "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, @@ -6276,9 +6078,9 @@ } }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dependencies": { "ms": "^2.1.3" }, @@ -6301,37 +6103,6 @@ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -6522,11 +6293,6 @@ "node": ">=6.0.0" } }, - "node_modules/dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==" - }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -6637,6 +6403,19 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -6667,15 +6446,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.59", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.59.tgz", - "integrity": "sha512-faAXB6+gEbC8FsiRdpOXgOe4snP49YwjiXynEB8Mp7sUx80W5eN+BnnBHJ/F7eIeLzs+QBfDD40bJMm97oEFcw==" - }, - "node_modules/email-addresses": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-5.0.0.tgz", - "integrity": "sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==", - "dev": true + "version": "1.5.75", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.75.tgz", + "integrity": "sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q==" }, "node_modules/emittery": { "version": "0.8.1", @@ -6710,9 +6483,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", + "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -6746,56 +6519,57 @@ } }, "node_modules/es-abstract": { - "version": "1.23.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", - "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", + "version": "1.23.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.7.tgz", + "integrity": "sha512-OygGC8kIcDhXX+6yAZRGLqwi2CmEXCbLQixeGUgYeR+Qwlppqmo7DIDr8XibtEBZp+fJcoYpoatp5qwLMEdcqQ==", "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.6", + "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", + "object.assign": "^4.1.7", "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", + "safe-array-concat": "^1.1.3", + "safe-regex-test": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" }, "engines": { "node": ">= 0.4" @@ -6810,12 +6584,9 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "engines": { "node": ">= 0.4" } @@ -6828,45 +6599,27 @@ "node": ">= 0.4" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-iterator-helpers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz", - "integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", + "get-intrinsic": "^1.2.6", "globalthis": "^1.0.4", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.3", - "safe-array-concat": "^1.1.2" + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" }, "engines": { "node": ">= 0.4" @@ -6910,13 +6663,13 @@ } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -7397,6 +7150,21 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/eslint/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -7442,6 +7210,11 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -7632,9 +7405,9 @@ } }, "node_modules/express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -7655,7 +7428,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -7670,6 +7443,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/debug": { @@ -7788,6 +7565,34 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, "node_modules/file-loader/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -7832,32 +7637,6 @@ "node": ">=10" } }, - "node_modules/filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/filenamify": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", - "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", - "dev": true, - "dependencies": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.1", - "trim-repeated": "^1.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/filesize": { "version": "8.0.7", "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", @@ -7949,9 +7728,9 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==" }, "node_modules/follow-redirects": { "version": "1.15.9", @@ -8044,6 +7823,29 @@ } } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", @@ -8073,6 +7875,11 @@ "node": ">=10" } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", @@ -8131,11 +7938,37 @@ "url": "https://github.com/sponsors/rawify" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { + "node_modules/framer-motion": { + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.15.0.tgz", + "integrity": "sha512-MLk8IvZntxOMg7lDBLw2qgTHHv664bYoYmnFTmE0Gm/FW67aOJk0WM3ctMcG+Xhcv+vh5uyyXwxvxhSeJzSe+w==", + "dependencies": { + "motion-dom": "^11.14.3", + "motion-utils": "^11.14.3", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { "node": ">= 0.6" } }, @@ -8184,14 +8017,16 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -8225,15 +8060,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", + "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -8267,13 +8107,13 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dependencies": { - "call-bind": "^1.0.5", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -8282,51 +8122,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gh-pages": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-6.2.0.tgz", - "integrity": "sha512-HMXJ8th9u5wRXaZCnLcs/d3oVvCHiZkaP5KQExQljYGwJjQbSPyTdHe/Gc1IvYUR/rWiZLxNobIqfoMHKTKjHQ==", - "dev": true, - "dependencies": { - "async": "^3.2.4", - "commander": "^11.0.0", - "email-addresses": "^5.0.0", - "filenamify": "^4.3.0", - "find-cache-dir": "^3.3.1", - "fs-extra": "^11.1.1", - "globby": "^11.1.0" - }, - "bin": { - "gh-pages": "bin/gh-pages.js", - "gh-pages-clean": "bin/gh-pages-clean.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gh-pages/node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/gh-pages/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -8441,11 +8236,11 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8513,9 +8308,12 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -8524,9 +8322,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -8567,6 +8365,19 @@ "he": "bin/he" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -8916,14 +8727,6 @@ "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -8945,13 +8748,13 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -8973,28 +8776,14 @@ "node": ">= 10" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -9023,11 +8812,14 @@ } }, "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9045,12 +8837,12 @@ } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", + "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9071,9 +8863,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dependencies": { "hasown": "^2.0.2" }, @@ -9085,10 +8877,12 @@ } }, "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { @@ -9099,11 +8893,12 @@ } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9135,11 +8930,14 @@ } }, "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9202,17 +9000,6 @@ "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -9222,11 +9009,12 @@ } }, "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9268,12 +9056,14 @@ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -9310,11 +9100,11 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -9335,11 +9125,12 @@ } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9349,11 +9140,13 @@ } }, "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dependencies": { - "has-symbols": "^1.0.2" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -9363,11 +9156,11 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -9393,11 +9186,14 @@ } }, "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", + "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9531,15 +9327,16 @@ } }, "node_modules/iterator.prototype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", - "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.4.tgz", + "integrity": "sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==", "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "reflect.getprototypeof": "^1.0.8", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -10345,9 +10142,9 @@ } }, "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", - "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz", + "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==", "engines": { "node": ">=12.20" } @@ -10422,9 +10219,9 @@ } }, "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "bin": { "jiti": "bin/jiti.js" } @@ -10492,9 +10289,9 @@ } }, "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "bin": { "jsesc": "bin/jsesc" }, @@ -10518,9 +10315,9 @@ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -10772,14 +10569,6 @@ "yallist": "^3.0.2" } }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "bin": { - "lz-string": "bin/bin.js" - } - }, "node_modules/magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", @@ -10818,6 +10607,14 @@ "tmpl": "1.0.5" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdn-data": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", @@ -10921,14 +10718,6 @@ "node": ">=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==", - "engines": { - "node": ">=4" - } - }, "node_modules/mini-css-extract-plugin": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", @@ -10991,6 +10780,16 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/motion-dom": { + "version": "11.14.3", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.14.3.tgz", + "integrity": "sha512-lW+D2wBy5vxLJi6aCP0xyxTxlTfiu+b+zcpVbGVFUxotwThqhdpPRSmX8xztAgtZMPMeU0WGVn/k1w4I+TbPqA==" + }, + "node_modules/motion-utils": { + "version": "11.14.3", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.14.3.tgz", + "integrity": "sha512-Xg+8xnqIJTpr0L/cidfTTBFkvRw26ZtGGuIhA94J9PQ2p4mEa06Xx7QVYZH0BP+EpMSaDlu+q0I0mmvwADPsaQ==" + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -11019,9 +10818,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "funding": [ { "type": "github", @@ -11081,9 +10880,9 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -11135,9 +10934,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.13", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz", - "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==" + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", + "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==" }, "node_modules/object-assign": { "version": "4.1.1", @@ -11166,21 +10965,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -11190,13 +10974,15 @@ } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -11270,11 +11056,12 @@ } }, "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, @@ -11522,9 +11309,9 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, "node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" }, "node_modules/path-type": { "version": "4.0.0", @@ -12134,9 +11921,9 @@ } }, "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", - "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "engines": { "node": ">=14" }, @@ -12145,9 +11932,9 @@ } }, "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", - "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", "bin": { "yaml": "bin.mjs" }, @@ -12302,9 +12089,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz", - "integrity": "sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^7.0.0", @@ -13002,11 +12789,14 @@ } }, "node_modules/psl": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.10.0.tgz", - "integrity": "sha512-KSKHEbjAnpUuAUserOq0FxGXCUrzC3WniuSJhvdbs102rL55266ZcHBqLWOsG30spQMlPdpy7icATiAQehg/iA==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", "dependencies": { "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" } }, "node_modules/punycode": { @@ -13291,10 +13081,13 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" }, - "node_modules/react-ga4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/react-ga4/-/react-ga4-2.1.0.tgz", - "integrity": "sha512-ZKS7PGNFqqMd3PJ6+C2Jtz/o1iU9ggiy8Y8nUeksgVuvNISbmrQtJiZNvC/TjDsqD0QlU5Wkgs7i+w9+OjHhhQ==" + "node_modules/react-icons": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz", + "integrity": "sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==", + "peerDependencies": { + "react": "*" + } }, "node_modules/react-is": { "version": "17.0.2", @@ -13307,27 +13100,48 @@ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "node_modules/react-redux": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", - "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz", + "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==", "dependencies": { + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", "use-sync-external-store": "^1.0.0" }, "peerDependencies": { - "@types/react": "^18.2.25", - "react": "^18.0", - "redux": "^5.0.0" + "@types/react": "^16.8 || ^17.0 || ^18.0", + "@types/react-dom": "^16.8 || ^17.0 || ^18.0", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0", + "react-native": ">=0.59", + "redux": "^4 || ^5.0.0-beta.0" }, "peerDependenciesMeta": { "@types/react": { "optional": true }, + "@types/react-dom": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, "redux": { "optional": true } } }, + "node_modules/react-redux/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, "node_modules/react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", @@ -13336,6 +13150,36 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.28.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.28.1.tgz", + "integrity": "sha512-2omQTA3rkMljmrvvo6WtewGdVh45SpL9hGiCI9uUrwGGfNFDIvGK4gYJsKlJoNVi6AQZcopSCballL+QGOm7fA==", + "dependencies": { + "@remix-run/router": "1.21.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.28.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.28.1.tgz", + "integrity": "sha512-YraE27C/RdjcZwl5UCqF/ffXnZDxpJdk9Q6jw38SZHjXs7NNdpViq2l2c7fO7+4uWaEfcwfGCv3RSg4e1By/fQ==", + "dependencies": { + "@remix-run/router": "1.21.0", + "react-router": "6.28.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", @@ -13466,43 +13310,35 @@ "node": ">=6.0.0" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" + "@babel/runtime": "^7.9.2" } }, - "node_modules/redux": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", - "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" - }, "node_modules/redux-thunk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", - "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", "peerDependencies": { - "redux": "^5.0.0" + "redux": "^4" } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz", + "integrity": "sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", + "dunder-proto": "^1.0.1", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "which-builtin-type": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -13563,14 +13399,14 @@ } }, "node_modules/regexpu-core": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", - "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.0", "regjsgen": "^0.8.0", - "regjsparser": "^0.11.0", + "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -13584,9 +13420,9 @@ "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==" }, "node_modules/regjsparser": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz", - "integrity": "sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "dependencies": { "jsesc": "~3.0.2" }, @@ -13594,6 +13430,17 @@ "regjsparser": "bin/parser" } }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -13636,22 +13483,25 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/reselect": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", - "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==" + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13849,13 +13699,14 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -13885,13 +13736,13 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -13972,9 +13823,9 @@ } }, "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -13982,44 +13833,13 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -14239,22 +14059,76 @@ } }, "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -14519,17 +14393,6 @@ "node": ">= 0.8" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -14606,22 +14469,23 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -14640,14 +14504,17 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -14657,14 +14524,18 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -14745,17 +14616,6 @@ "node": ">=6" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -14767,27 +14627,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-outer/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/style-loader": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", @@ -15077,9 +14916,9 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "node_modules/tailwindcss": { - "version": "3.4.15", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.15.tgz", - "integrity": "sha512-r4MeXnfBmSOuKUWmXe6h2CcyfzJCEk4F0pptO5jlnYSIViUkVmsawj80N5h2lO3gwcmSb4n3PuN+e+GC1Guylw==", + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -15090,7 +14929,7 @@ "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.6", - "lilconfig": "^2.1.0", + "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", @@ -15112,6 +14951,17 @@ "node": ">=14.0.0" } }, + "node_modules/tailwindcss/node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -15172,9 +15022,9 @@ } }, "node_modules/terser": { - "version": "5.36.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", - "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -15189,15 +15039,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", + "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -15221,23 +15071,6 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -15347,27 +15180,6 @@ "node": ">=8" } }, - "node_modules/trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/trim-repeated/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/tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", @@ -15475,28 +15287,28 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -15506,16 +15318,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -15525,16 +15338,16 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -15564,14 +15377,17 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -15720,11 +15536,11 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", + "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/util-deprecate": { @@ -15850,9 +15666,9 @@ } }, "node_modules/web-vitals": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-3.5.2.tgz", - "integrity": "sha512-c0rhqNcHXRkY/ogGDJQxZ9Im9D19hDihbzSQJrsioex+KnFgmMzBiy57Z1EjkhX/+OjyBpclDCzz2ITtjokFmg==" + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", + "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==" }, "node_modules/webidl-conversions": { "version": "6.1.0", @@ -15863,15 +15679,15 @@ } }, "node_modules/webpack": { - "version": "5.96.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", - "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.14.0", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", @@ -16050,6 +15866,29 @@ "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -16070,6 +15909,11 @@ "node": ">=4.0" } }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, "node_modules/webpack/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -16165,37 +16009,41 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-builtin-type": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dependencies": { + "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", + "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", + "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -16222,14 +16070,15 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "for-each": "^0.3.3", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { @@ -16311,37 +16160,6 @@ "node": ">=10.0.0" } }, - "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", - "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", - "dependencies": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "ajv": ">=8" - } - }, - "node_modules/workbox-build/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/workbox-build/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -16356,11 +16174,6 @@ "node": ">=10" } }, - "node_modules/workbox-build/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/workbox-build/node_modules/source-map": { "version": "0.8.0-beta.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", diff --git a/package.json b/package.json index 9b5d5cb..bfd0677 100644 --- a/package.json +++ b/package.json @@ -1,35 +1,37 @@ { "name": "match-five", "version": "0.1.0", - "homepage": "https://hamburgj.github.io/match-five", "private": true, "dependencies": { - "@reduxjs/toolkit": "^2.3.0", - "@testing-library/jest-dom": "^6.0.0", - "@testing-library/react": "^14.3.1", - "@types/jest": "^29.5.14", - "@types/node": "^16.18.0", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "@types/react-transition-group": "^4.4.11", - "bootstrap": "^5.3.3", + "@reduxjs/toolkit": "^1.9.7", + "@types/node": "^16.18.68", + "@types/react": "^18.2.45", + "@types/react-dom": "^18.2.18", + "@types/react-redux": "^7.1.33", + "@types/react-router-dom": "^5.3.3", + "ajv": "^8.12.0", + "ajv-keywords": "^5.1.0", + "bootstrap": "^5.3.2", + "framer-motion": "^11.15.0", "react": "^18.2.0", - "react-bootstrap": "^2.10.5", + "react-bootstrap": "^2.9.1", "react-dom": "^18.2.0", - "react-ga4": "^2.1.0", - "react-redux": "^9.1.2", + "react-icons": "^4.12.0", + "react-redux": "^8.1.3", + "react-router-dom": "^6.21.0", "react-scripts": "5.0.1", - "react-transition-group": "^4.4.5", "typescript": "^4.9.5", - "web-vitals": "^3.5.2" + "web-vitals": "^2.1.4" }, "scripts": { - "start": "react-scripts start", + "start": "set PORT=3010 && react-scripts start", "build": "react-scripts build", - "test": "react-scripts test", - "eject": "react-scripts eject", - "predeploy": "npm run build", - "deploy": "gh-pages -d build" + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": [ + "react-app" + ] }, "browserslist": { "production": [ diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..6e6480d --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,8 @@ + + + + 5 + + \ No newline at end of file diff --git a/public/index.html b/public/index.html index 50da021..6b42f49 100644 --- a/public/index.html +++ b/public/index.html @@ -2,43 +2,22 @@ - + - + - - + - - React App - + + + + Match Five
- diff --git a/public/manifest.json b/public/manifest.json index 080d6c7..9847bc0 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -1,25 +1,15 @@ { - "short_name": "React App", - "name": "Create React App Sample", + "short_name": "Match Five", + "name": "Match Five - Word Matching Game", "icons": [ { - "src": "favicon.ico", + "src": "favicon.svg", "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "logo192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" + "type": "image/svg+xml" } ], "start_url": ".", "display": "standalone", - "theme_color": "#000000", + "theme_color": "#1a237e", "background_color": "#ffffff" } diff --git a/src/App.css b/src/App.css index e625378..fdbe9a9 100644 --- a/src/App.css +++ b/src/App.css @@ -1,528 +1,602 @@ :root { - --primary: #666666; - --secondary: #888888; - --accent: #666666; - --success: #4CAF50; - --danger: #F44336; - --light: #FFFFFF; - --dark: #333333; - --text: #333333; - --text-muted: rgba(51, 51, 51, 0.5); - --background: #FFFFFF; - --border: #666666; -} - -.App { - min-height: 100vh; + --primary: #4A4A4A; + --primary-variant: #2D2D2D; + --secondary: #8C8C8C; + --secondary-variant: #6B6B6B; + --background: #F5F5F5; + --surface: #FFFFFF; + --error: #D32F2F; + --success: #43A047; + --on-primary: #FFFFFF; + --on-secondary: #FFFFFF; + --on-background: #1A1A1A; + --on-surface: #1A1A1A; + --on-error: #FFFFFF; + --elevation-1: 0 2px 4px rgba(0,0,0,0.06); + --elevation-2: 0 4px 8px rgba(0,0,0,0.08); + --elevation-3: 0 8px 16px rgba(0,0,0,0.10); + --navbar-height: 56px; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, + Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; background: var(--background); - color: var(--text); - padding: 10px; - font-family: 'Poppins', sans-serif; + min-height: 100vh; + padding-top: var(--navbar-height); } -.App-logo { - height: 40vmin; - pointer-events: none; +/* Navbar */ +.custom-navbar { + height: var(--navbar-height); + width: 100%; + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 9999; + background: var(--surface); + box-shadow: var(--elevation-1); +} + +/* Game board layout */ +.game-board { + padding: 0.5rem; + max-width: 1200px; + margin: 0 auto; + width: 100%; } -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } +.level-title { + font-size: 1.25rem; + margin-bottom: 1rem; + color: var(--on-background); } -.App-header { - background-color: #282c34; - min-height: 100vh; +.available-words-section { + background: var(--surface); + border-radius: 0.5rem; + padding: 1rem; + margin-bottom: 1rem; + box-shadow: var(--elevation-2); +} + +.available-words-header { display: flex; - flex-direction: column; + justify-content: space-between; align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; - padding: 20px; + margin-bottom: 0.5rem; } -.App-link { - color: #61dafb; +.available-words-title { + font-size: 1rem; + color: var(--on-background); + margin-bottom: 0; + font-weight: 500; } -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } +.available-words-container { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + padding: 0.5rem; + min-height: 50px; + border-radius: 0.5rem; + background: rgba(255, 255, 255, 0.05); } -/* Mobile-first responsive design */ -@media (max-width: 768px) { - .App-header { - font-size: calc(8px + 2vmin); - padding: 10px; - } +.slots-grid { + display: grid; + grid-template-columns: repeat(5, 1fr); + gap: 0.5rem; + width: 100%; } -.game-universe { - width: 100%; - height: 100vh; +.slot-card { + background: var(--surface); + border-radius: 0.5rem; + padding: 0.75rem; + height: 90px; display: flex; - justify-content: center; - align-items: center; - perspective: 1000px; + flex-direction: column; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + box-shadow: var(--elevation-1); } -.word-tile { - background: white; - padding: 4px 8px; - border-radius: 2px; - cursor: grab; - user-select: none; - color: var(--text); - border: 1px solid var(--border); - font-size: 0.9rem; +.slot-card.correct { + background: linear-gradient(135deg, rgba(76, 175, 80, 0.1) 0%, rgba(76, 175, 80, 0.2) 100%); + border: 2px solid var(--success); + animation: pulse 1s cubic-bezier(0.4, 0, 0.6, 1); } -.word-tile:hover { - transform: translateY(-2px); - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); +.slot-card.incorrect { + background: linear-gradient(135deg, rgba(176, 0, 32, 0.1) 0%, rgba(176, 0, 32, 0.2) 100%); + border: 2px solid var(--error); + animation: shake 0.5s cubic-bezier(0.36, 0, 0.66, 1); } -.empty-slot { - border: 2px dashed rgba(255, 255, 255, 0.3); - padding: 20px; - border-radius: 8px; - background: rgba(255, 255, 255, 0.1); +.hint-word { + font-size: 1rem; + color: var(--on-surface); + opacity: 0.7; + margin-bottom: 0.25rem; + text-align: center; } -.card { - background: rgba(255, 255, 255, 0.1); - border: none; - transition: all 0.3s ease; +.word-tile { + background: var(--primary); + color: var(--on-primary); + padding: 0.15rem 0.75rem; + border-radius: 0.25rem; + cursor: grab; + user-select: none; + font-size: 0.8rem; + transition: all 0.2s ease; + box-shadow: var(--elevation-1); + display: inline-flex; + align-items: center; + gap: 0.5rem; + width: fit-content; } -.card:hover { - transform: translateY(-5px); - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); +.word-emoji { + font-size: 1em; + line-height: 1; + display: inline-block; } -.inventory-floating { - position: sticky; - top: 10px; - background: white; - border-radius: 4px; - padding: 8px; - border: 1px solid black; +.word-container { + flex: 1; + display: flex; + justify-content: center; + align-items: center; } -.world-card { - background: white; - border: 1px solid black; - margin-bottom: 6px; +/* Drag and drop animations */ +.available-words-section.drag-over { + transform: scale(1.01); + box-shadow: var(--elevation-3); transition: all 0.2s ease; - border-radius: 4px; - cursor: pointer; - padding: 6px; } -.world-card:hover { - background: #f5f5f5; +.slot-card.drag-over { + transform: scale(1.02); + box-shadow: var(--elevation-3); + transition: all 0.2s ease; + background: rgba(74, 74, 74, 0.05); } -.level-card { - background: white; - margin: 4px 0; - padding: 6px; - border-radius: 4px; - transition: all 0.2s ease; - cursor: pointer; - margin-left: 12px; - border: 1px solid black; +/* Make sure the word tile maintains its size in slots */ +.slot-card .word-tile { + width: fit-content; + min-width: 0; + max-width: 90%; +} + +.word-tile:active { + cursor: grabbing; } -.level-card.completed { - border-left: 3px solid black; +/* Ensure the word container doesn't force the word to stretch */ +.word-container .word-tile { + flex: 0 0 auto; } -.level-card.locked { +.empty-slot-text { + color: var(--on-surface); opacity: 0.5; - cursor: not-allowed; + font-size: 0.8rem; + text-align: center; } -.level-section.expanded { - max-height: 1000px; +/* Animations */ +@keyframes pulse { + 0%, 100% { transform: scale(1); } + 50% { transform: scale(1.05); } } -.word-tile { - cursor: grab; - user-select: none; +@keyframes shake { + 0%, 100% { transform: translateX(0); } + 25% { transform: translateX(-4px); } + 75% { transform: translateX(4px); } } -.slot-card { - background: white; - border-radius: 4px; - padding: 6px; - width: 120px; - height: 100px; - display: flex; - flex-direction: column; - transition: all 0.2s ease; - border: 1px solid var(--border); - margin: 0 4px; +/* Responsive adjustments */ +@media (max-width: 768px) { + .game-board { + padding: 0.5rem 0.25rem; + } + + .level-title { + font-size: 1.125rem; + margin: 0.25rem 0; + } + + .available-words-section { + padding: 0.75rem; + margin-bottom: 0.75rem; + } + + .available-words-header { + margin-bottom: 0.5rem; + } + + .slots-grid { + gap: 0.35rem; + } + + .slot-card { + padding: 0.5rem; + height: 80px; + } + + .word-tile { + padding: 0.15rem 0.5rem; + font-size: 0.6rem; + } } -.slot-card.correct { - background: rgba(76, 175, 80, 0.1); - border: 2px solid var(--success); +/* Remove unused styles */ +.inventory-floating, +.inventory-container, +.inventory-col, +.inventory-title, +.inventory-words { + display: none; } -.slot-card.incorrect { - background: rgba(244, 67, 54, 0.1); - border: 2px solid var(--danger); - color: white; +/* Level Select Styles */ +.level-select-container { + padding: 2rem 1rem; + padding-top: calc(var(--navbar-height) + 2rem); + max-width: 1200px; + margin: 0 auto; } -.slot-card.drag-over { - border: 2px dashed #666; - background: rgba(0, 0, 0, 0.05); +.level-select-title { + font-size: 2rem; + color: var(--on-background); + margin-bottom: 2rem; + text-align: center; + font-weight: 500; } -.word-tile.accepted { - background: rgba(76, 175, 80, 0.1); - border: 1px solid var(--success); - color: var(--text); +.levels-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + gap: 1.5rem; + padding: 0.5rem; } -.word-tile.incorrect { - background: rgba(244, 67, 54, 0.1); - border: 1px solid var(--danger); - color: var(--text); +.level-select-card { + background: var(--surface); + border: none; + border-radius: 1rem; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + box-shadow: var(--elevation-1); + cursor: pointer; + overflow: hidden; } -.hint-word { - font-size: 0.9rem; - color: rgba(255, 255, 255, 0.7); - margin-bottom: 12px; - text-align: center; +.level-select-card:not(.locked):hover { + transform: translateY(-4px); + box-shadow: var(--elevation-3); } -.word-container { - flex: 1; - display: flex; - justify-content: center; - align-items: center; - min-height: 50px; +.level-select-card.completed { + background: linear-gradient(135deg, rgba(67, 160, 71, 0.1) 0%, rgba(67, 160, 71, 0.2) 100%); + border: 2px solid var(--success); } -.empty-slot-text { - color: rgba(255, 255, 255, 0.4); - font-size: 0.9rem; +.level-select-card.locked { + background: var(--surface); + border: 2px dashed rgba(0, 0, 0, 0.1); + cursor: not-allowed; + opacity: 0.7; } -.drop-zone { - flex: 1; +.level-select-card.coming-soon { + background: linear-gradient(135deg, rgba(33, 150, 243, 0.1) 0%, rgba(33, 150, 243, 0.2) 100%); + border: 2px dashed var(--primary); + cursor: default; + opacity: 0.9; +} + +.level-header { display: flex; - justify-content: center; + justify-content: space-between; align-items: center; - border: 2px dashed rgba(255, 255, 255, 0.2); - border-radius: 6px; - margin-top: 20px; - min-height: 80px; - transition: all 0.2s ease; + margin-bottom: 1rem; } -.drop-zone.drag-over { - background: rgba(255, 255, 255, 0.1); - border-color: rgba(255, 255, 255, 0.4); +.level-info { + flex: 1; } -.drop-text { - color: rgba(255, 255, 255, 0.5); - font-size: 0.9rem; +.level-name { + font-size: 1.25rem; + color: var(--on-surface); + margin: 0; + font-weight: 500; } -.available-words { - display: flex; - flex-wrap: wrap; - gap: 8px; - padding: 12px; - background: white; - border: 1px solid var(--border); - border-radius: 4px; - min-height: 60px; +.level-progress { + font-size: 0.875rem; + color: var(--on-surface); + opacity: 0.7; + margin-top: 0.25rem; } -.inventory-words { +.level-status { + width: 2rem; + height: 2rem; display: flex; - flex-wrap: wrap; - gap: 10px; - padding: 15px; - background: rgba(255, 255, 255, 0.05); - border-radius: 8px; - min-height: 60px; -} - -.word-tile { - background: #2a2a4a; - padding: 8px 16px; - border-radius: 6px; - cursor: grab; - transition: all 0.2s ease; - user-select: none; - color: white; + align-items: center; + justify-content: center; + border-radius: 50%; + background: var(--primary); + color: var(--on-primary); + margin-left: 1rem; } -.word-tile:hover { - transform: translateY(-2px); - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); +.level-status.complete { + background: var(--success); } -.inventory-floating.drag-over { - background: rgba(255, 255, 255, 0.15); - box-shadow: 0 0 15px rgba(255, 255, 255, 0.1); +.level-status.locked { + background: var(--error); } -.word-tile.accepted { - background: #2a4a2a; - border: 1px solid #4caf50; - box-shadow: 0 0 8px rgba(76, 175, 80, 0.3); +.solutions-row { + margin-top: 0.5rem; + padding-top: 0.5rem; + border-top: 1px solid rgba(0, 0, 0, 0.1); } -.word-tile.incorrect { - background: #4a2a2a; - border: 1px solid #f44336; - box-shadow: 0 0 8px rgba(244, 67, 54, 0.3); +.solutions-stars { + font-size: 1rem; + line-height: 1; + min-height: 1.5rem; + text-align: center; } -.worlds-container { - padding: 15px; - background: rgba(255, 255, 255, 0.05); - border-radius: 12px; - min-height: 100px; - overflow: visible; +.locked-message { + font-size: 0.875rem; + color: var(--error); + margin-top: 0.5rem; + text-align: center; + font-weight: 500; } -.world-card { - background: var(--primary); - border: none; - margin-bottom: 10px; - transition: all 0.3s ease; - border-radius: 8px; - cursor: pointer; +/* Modal styles */ +.modal { + z-index: 10000; } -.world-card:hover { - transform: translateX(5px); - background: var(--secondary); +.modal-backdrop { + z-index: 9999; } -.world-card.completed { - background: var(--success); - opacity: 0.8; +.modal-content { + background: var(--surface); + border: none; + border-radius: 1rem; + box-shadow: var(--elevation-3); } -.level-card { - background: var(--secondary); - margin: 5px 0; - padding: 10px; - border-radius: 6px; - transition: all 0.3s ease; - cursor: pointer; - margin-left: 20px; - border-left: 3px solid var(--accent); +.modal-header { + border-bottom: none; + padding: 1.5rem 1.5rem 0.5rem; } -.level-card.completed { - border-left-color: var(--success); - background: rgba(46, 204, 113, 0.2); +.modal-header .modal-title { + font-size: 1.5rem; + font-weight: 600; + color: var(--on-surface); } -.level-card.locked { - opacity: 0.5; - cursor: not-allowed; +.modal-body { + padding: 1rem 1.5rem; + color: var(--on-surface); } -.slot-container { - display: flex; - flex-direction: row; - justify-content: center; - flex-wrap: nowrap; - gap: 8px; - margin: 1rem 0; - width: 100%; +.modal-footer { + border-top: none; + padding: 0.5rem 1.5rem 1.5rem; + gap: 0.75rem; } -.slot-card { - flex: 1; - min-width: 120px; - max-width: 300px; - height: 100px; - background: white; - border-radius: 4px; - padding: 6px; - display: flex; - flex-direction: column; +.modal-footer .btn { + border-radius: 0.5rem; + padding: 0.5rem 1rem; + font-weight: 500; transition: all 0.2s ease; - border: 1px solid var(--border); - margin: 0; } -.slot-card.correct { - background: rgba(76, 175, 80, 0.1); - border: 2px solid var(--success); +.modal-footer .btn:hover { + transform: translateY(-1px); } -.slot-card.incorrect { - background: rgba(244, 67, 54, 0.1); - border: 2px solid var(--danger); - color: white; +.modal-footer .btn-secondary { + background: var(--surface); + border: 2px solid var(--primary); + color: var(--primary); } -.hint-word { - font-size: 0.8rem; - color: var(--text-muted); - margin-bottom: 3px; +.modal-footer .btn-secondary:hover { + background: var(--primary); + color: var(--on-primary); } -.word-container { - flex: 1; - display: flex; - justify-content: center; - align-items: center; +.modal-footer .btn-info { + background: var(--primary-variant); + border: none; + color: var(--on-primary); } -.word-tile { - background: var(--accent); - padding: 5px 10px; - border-radius: 4px; - cursor: grab; - transition: all 0.2s ease; - user-select: none; - font-size: 0.9rem; +.modal-footer .btn-info:hover { + background: var(--primary); } -.word-tile:hover { - transform: translateY(-2px); - box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); +.modal-footer .btn-primary { + background: linear-gradient(135deg, #2196f3 0%, #1976d2 100%); + border: none; + box-shadow: 0 2px 4px rgba(33, 150, 243, 0.3); } -.word-tile.accepted { - background: var(--success); +.modal-footer .btn-primary:hover { + background: linear-gradient(135deg, #1976d2 0%, #1565c0 100%); + box-shadow: 0 4px 8px rgba(33, 150, 243, 0.4); } -.word-tile.incorrect { - background: var(--danger); +.level-complete-stars { + font-size: 1.5rem; + text-align: center; + margin: 1rem 0; + line-height: 1; } -.inventory-floating { - position: sticky; - top: 20px; - background: var(--primary); - border-radius: 8px; - padding: 15px; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); - transition: all 0.3s ease; +.level-complete-message { + text-align: center; + margin-bottom: 0.5rem; } -/* Custom scrollbar */ -::-webkit-scrollbar { - width: 8px; - height: 8px; +.level-complete-submessage { + text-align: center; + color: var(--secondary); + font-size: 0.9rem; } -::-webkit-scrollbar-track { - background: var(--dark); -} +@media (max-width: 768px) { + .levels-grid { + grid-template-columns: 1fr; + gap: 1rem; + } -::-webkit-scrollbar-thumb { - background: var(--accent); - border-radius: 4px; + .level-select-title { + font-size: 1.5rem; + margin-bottom: 1.5rem; + } } -::-webkit-scrollbar-thumb:hover { - background: var(--secondary); +/* Home page styles */ +.temp-page { + display: flex; + justify-content: center; + align-items: center; + height: calc(100vh - var(--navbar-height)); + font-size: 1.5rem; + color: #666; + background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); + margin-top: calc(-1 * var(--navbar-height)); /* Offset the body padding */ } -.world-section { - margin-bottom: 1rem; - overflow: visible; +/* Tutorial overlay styles */ +.tutorial-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: none; + z-index: 10000; } -.world-card { - cursor: pointer; +.tutorial-spotlight { + position: fixed; + border-radius: 8px; + box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.5); + z-index: 10000; + pointer-events: none; transition: all 0.3s ease; } -.world-card:hover { - transform: translateY(-2px); - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); +.tutorial-spotlight::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + border-radius: 8px; + box-shadow: 0 0 0 4px rgba(255, 255, 255, 0.2); } -.level-section { - padding: 1rem; - margin-top: 0.5rem; - background: rgba(255, 255, 255, 0.05); +.tutorial-message { + color: var(--on-surface); + font-size: 0.95rem; + line-height: 1.5; + background: var(--surface); + padding: 16px 24px; border-radius: 8px; - overflow: visible; - height: auto; - max-height: none; - transition: opacity 0.3s ease-out; - opacity: 1; - margin-top: 1rem; + box-shadow: var(--elevation-3); } -/* Bootstrap Collapse override */ -.collapse { - display: none; - overflow: visible !important; +.tutorial-message button { + background: var(--primary) !important; + border: none !important; + transition: all 0.2s ease !important; } -.collapse.show { - display: block; - overflow: visible !important; +.tutorial-message button:hover { + background: var(--primary-variant) !important; + transform: translateY(-1px); } -.collapsing { - position: relative; - height: 0; - overflow: hidden; - transition: height 0.35s ease; -} +/* Short screen adjustments */ +@media screen and (max-height: 750px) { + .game-board { + padding: 0.25rem; + } -/* Level cards within collapsed section */ -.level-card { - margin-bottom: 0.5rem; -} + .level-title { + font-size: 1rem; + margin-bottom: 0.5rem; + } -.empty-slot-text { - color: #666; - font-size: 0.9rem; -} + .available-words-section { + padding: 0.5rem; + margin-bottom: 0.5rem; + } -.hint-word { - font-size: 0.9rem; - color: #666; - margin-bottom: 8px; - text-align: center; -} + .available-words-header { + margin-bottom: 0.25rem; + } -.inventory-container { - min-height: 100px; - border: 2px solid var(--border); - border-radius: 8px; - padding: 15px; -} + .available-words-title { + font-size: 0.9rem; + } -.inventory-container.drag-over { - border: 2px dashed var(--accent); - background: rgba(0, 0, 0, 0.05); -} + .available-words-container { + min-height: 40px; + padding: 0.25rem; + gap: 0.25rem; + } -.inventory-words { - display: flex; - flex-wrap: wrap; - gap: 8px; - padding: 8px; - min-height: 50px; + .word-tile { + padding: 0.15rem 0.5rem; + font-size: 0.6rem; + } + + .slot-card { + height: 70px; + padding: 0.5rem; + } + + .hint-word { + font-size: 0.8rem; + margin-bottom: 0.15rem; + } + + .empty-slot-text { + font-size: 0.75rem; + } } diff --git a/src/App.test.tsx b/src/App.test.tsx deleted file mode 100644 index 81bd52f..0000000 --- a/src/App.test.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react'; -import { render, screen } from '@testing-library/react'; -import App from './App'; - -describe('App Component', () => { - it('renders without crashing', () => { - render(); - }); -}); diff --git a/src/App.tsx b/src/App.tsx index 86f8b17..7e554c3 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,42 +1,29 @@ -import React, { useEffect } from 'react'; -import { Provider, useDispatch } from 'react-redux'; -import { Container, Row, Col } from 'react-bootstrap'; +import React from 'react'; +import { HashRouter, Routes, Route } from 'react-router-dom'; +import { Provider } from 'react-redux'; import { store } from './store/store'; -import WorldSelector from './components/WorldSelector'; -import Inventory from './components/Inventory'; -import { loadSavedProgress } from './store/gameSlice'; +import Navbar from './components/Navbar'; +import Home from './components/Home'; +import LevelSelector from './components/LevelSelector'; +import GameBoard from './components/GameBoard'; import 'bootstrap/dist/css/bootstrap.min.css'; import './App.css'; -const GameContent: React.FC = () => { - const dispatch = useDispatch(); - - useEffect(() => { - dispatch(loadSavedProgress()); - }, [dispatch]); - +function App() { return ( -
- - - - - - -
- -
- -
-
-
+ + +
+ + + } /> + } /> + } /> + +
+
+
); -}; - -const App: React.FC = () => ( - - - -); +} export default App; diff --git a/src/components/FallingWords.tsx b/src/components/FallingWords.tsx new file mode 100644 index 0000000..e01dfec --- /dev/null +++ b/src/components/FallingWords.tsx @@ -0,0 +1,157 @@ +import React, { useEffect, useState, useRef } from 'react'; +import gameData from '../data/gameData.json'; + +// Animation configuration constants +const ANIMATION_CONFIG = { + NUM_WORDS: 20, // Number of words on screen + WORD_SCALE: 1, // Size scale of the words (1 = normal size) + WORD_OPACITY: 0.5, // Opacity of the words (0-1) + MIN_SPEED: 50, // Minimum fall speed (pixels per second) + MAX_SPEED: 150, // Maximum fall speed (pixels per second) + MIN_DELAY: 0, // Minimum delay before word starts falling (ms) + MAX_DELAY: 5000, // Maximum delay before word starts falling (ms) + VERTICAL_OFFSET: -50, // Starting position above viewport +}; + +interface FallingWord { + id: number; + text: string; + emoji: string; + x: number; + y: number; + speed: number; + delay: number; +} + +const FallingWords: React.FC = () => { + const [words, setWords] = useState([]); + const [dimensions, setDimensions] = useState({ width: window.innerWidth, height: window.innerHeight }); + const lastTimeRef = useRef(0); + const animationFrameRef = useRef(); + + // Get a random word and its emoji from the game data + const getRandomWord = () => { + const wordList = Object.entries(gameData.wordEmojis); + const [text, emoji] = wordList[Math.floor(Math.random() * wordList.length)]; + return { text, emoji }; + }; + + // Create a new falling word with random position and speed + const createFallingWord = (id: number, isInitial: boolean = false): FallingWord => { + const { text, emoji } = getRandomWord(); + return { + id, + text, + emoji, + x: Math.random() * dimensions.width, + // If initial placement, distribute across screen height, otherwise start from top + y: isInitial ? Math.random() * dimensions.height : ANIMATION_CONFIG.VERTICAL_OFFSET, + speed: ANIMATION_CONFIG.MIN_SPEED + Math.random() * (ANIMATION_CONFIG.MAX_SPEED - ANIMATION_CONFIG.MIN_SPEED), + // No delay for initial words, normal delay for new words + delay: isInitial ? 0 : ANIMATION_CONFIG.MIN_DELAY + Math.random() * (ANIMATION_CONFIG.MAX_DELAY - ANIMATION_CONFIG.MIN_DELAY), + }; + }; + + // Update window dimensions on resize + useEffect(() => { + const handleResize = () => { + const newWidth = window.innerWidth; + const newHeight = window.innerHeight; + setDimensions({ width: newWidth, height: newHeight }); + + // Redistribute words across new dimensions + setWords(currentWords => + currentWords.map(word => ({ + ...word, + x: (word.x / dimensions.width) * newWidth, + y: word.y < 0 ? word.y : (word.y / dimensions.height) * newHeight + })) + ); + }; + + window.addEventListener('resize', handleResize); + return () => window.removeEventListener('resize', handleResize); + }, [dimensions.width, dimensions.height]); + + // Initialize words + useEffect(() => { + const initialWords = Array.from( + { length: ANIMATION_CONFIG.NUM_WORDS }, + (_, i) => createFallingWord(i, true) + ); + setWords(initialWords); + lastTimeRef.current = performance.now(); + }, []); + + // Animate words using delta time + useEffect(() => { + const animate = (currentTime: number) => { + const deltaTime = currentTime - lastTimeRef.current; + lastTimeRef.current = currentTime; + + setWords(currentWords => { + return currentWords.map(word => { + // Don't start moving until delay is over + if (word.delay > 0) { + return { ...word, delay: word.delay - deltaTime }; + } + + // Calculate new position based on speed and delta time + const pixelsPerFrame = (word.speed * deltaTime) / 1000; + const newY = word.y + pixelsPerFrame; + + // Reset word if it goes off screen + if (newY > dimensions.height) { + return createFallingWord(word.id); + } + return { ...word, y: newY }; + }); + }); + + animationFrameRef.current = requestAnimationFrame(animate); + }; + + animationFrameRef.current = requestAnimationFrame(animate); + return () => { + if (animationFrameRef.current) { + cancelAnimationFrame(animationFrameRef.current); + } + }; + }, [dimensions.height]); + + return ( +
+ {words.map(word => ( +
+ {word.text} + + {word.emoji} + +
+ ))} +
+ ); +}; + +export default FallingWords; \ No newline at end of file diff --git a/src/components/GameBoard.tsx b/src/components/GameBoard.tsx index 05975d2..9127f3b 100644 --- a/src/components/GameBoard.tsx +++ b/src/components/GameBoard.tsx @@ -1,146 +1,681 @@ -import React, { useEffect } from 'react'; +import React, { useEffect, useState } from 'react'; import { useSelector, useDispatch } from 'react-redux'; -import { Container, Row, Col, Card } from 'react-bootstrap'; +import { useNavigate, useParams } from 'react-router-dom'; +import { Row, Col, Modal, Button } from 'react-bootstrap'; import { RootState } from '../store/store'; -import { placeWord, addToInventory, checkSolution } from '../store/gameSlice'; -import { Word, Slot } from '../store/types'; +import { placeWord, addToInventory, checkSolution, markSectionComplete, setCurrentSection } from '../store/gameSlice'; +import { Word, Slot, Section, Hint, HintDictionary } from '../store/types'; +import TutorialOverlay from './TutorialOverlay'; +import gameData from '../data/gameData.json'; +import '../styles/GameBoard.css'; +import WordTile from './WordTile'; -interface GameBoardProps { - worldId: string; - levelId: string; +interface SectionWithId extends Section { + id: string; } -const GameBoard: React.FC = ({ worldId, levelId }) => { +interface SectionCompletion { + isComplete: boolean; +} + +interface LevelCompletion { + isComplete: boolean; + uniqueSolutions: Set; +} + +interface TutorialStep { + targetSelector: string; + message: string; + position: 'bottom' | 'top' | 'left'; +} + +const GameBoard: React.FC = () => { + const { levelId = '' } = useParams(); + const navigate = useNavigate(); const dispatch = useDispatch(); + const [showLevelCompleteModal, setShowLevelCompleteModal] = useState(false); + const [showTutorial, setShowTutorial] = useState(false); + const [showHintTutorial, setShowHintTutorial] = useState(false); + const [tutorialStep, setTutorialStep] = useState(0); + + // Get the current level and hints from Redux store const level = useSelector((state: RootState) => { - const world = state.game.worlds.find(w => w.id === worldId); - return world?.levels.find(l => l.id === levelId); + const levelIndex = parseInt(levelId.split('_')[1]) - 1; + return state.game.levels[levelIndex]; + }); + + const hints = useSelector((state: RootState) => state.game.hints); + + // Check if a level is complete + const isLevelComplete = (levelId: string): boolean => { + const saved = localStorage.getItem(`level_completion_${levelId}`); + if (!saved) return false; + const completion = JSON.parse(saved); + return completion.isComplete; + }; + + // Check if the level is accessible + const isLevelAccessible = (levelId: string): boolean => { + if (levelId === 'level_1') return true; + const levelNum = parseInt(levelId.split('_')[1]); + const previousLevelId = `level_${levelNum - 1}`; + return isLevelComplete(previousLevelId); + }; + + // Redirect to home if level is not accessible + useEffect(() => { + if (!isLevelAccessible(levelId)) { + navigate('/'); + } + }, [levelId, navigate]); + + // Helper function to check if a section is complete + const checkSectionComplete = (levelId: string, sectionId: string): boolean => { + if (!level) return false; + + const [_, levelNum, sectionNum] = sectionId.split('_').map(Number); + const targetSectionIndex = sectionNum - 1; + if (targetSectionIndex === -1) return false; + + // Check all sections up to and including the target section + for (let i = 0; i <= targetSectionIndex; i++) { + const section = level.sections[i]; + const sectionId = `section_${levelNum}_${i + 1}`; + const saved = localStorage.getItem(`completion_${levelId}_${sectionId}`); + if (!saved) return false; + const completion: SectionCompletion = JSON.parse(saved); + if (!completion.isComplete) return false; + } + + return true; + }; + + // Get all unlocked sections up to the current section + const sections = useSelector((state: RootState) => { + if (!level) return [] as SectionWithId[]; + + const levelNum = parseInt(levelId.split('_')[1]); + + // Find the first incomplete section based on stored completion state + const currentSectionIndex = level.sections.findIndex(section => { + const sectionId = `section_${levelNum}_${level.sections.indexOf(section) + 1}`; + return !checkSectionComplete(levelId, sectionId); + }); + + // If all sections are complete, show all sections + const lastIndex = currentSectionIndex === -1 ? level.sections.length : currentSectionIndex + 1; + return level.sections.slice(0, lastIndex) as SectionWithId[]; }); + // Get all slots from unlocked sections in order + const allSlots = sections.flatMap(section => section.slots); + + // Get only the current section's available words + const currentSection = sections[sections.length - 1] as SectionWithId | undefined; + + // Tutorial steps for the first level + const tutorialSteps: TutorialStep[] = [ + { + targetSelector: '.available-words-section', + message: 'Welcome to Match Five! These are your available words and inventory. Click or drag them to fill the slots below.', + position: 'bottom' + }, + { + targetSelector: '.slots-grid', + message: 'Drop words into these slots. Each slot accepts specific words based on its hint.', + position: 'bottom' + } + ]; + + // Tutorial steps for when second section unlocks + const sectionTutorialSteps: TutorialStep[] = [ + { + targetSelector: '.available-words-section', + message: 'New words are now available! You can use these new words along with your existing words.', + position: 'bottom' + }, + { + targetSelector: '.slots-grid', + message: 'With more slots unlocked, you have more possible combinations! Try moving words between different slots to find new solutions. Be careful, some words have multiple possible matches!', + position: 'top' + } + ]; + + // Tutorial steps for incorrect word hint + const hintTutorialSteps: TutorialStep[] = [ + { + targetSelector: '.slots-grid', + message: 'Remember that each slot can accept multiple different words! Think creatively about different ways words could fit the hint. Sometimes the first word that comes to mind isn\'t the right one.', + position: 'top' + } + ]; + + // Load and check tutorial state useEffect(() => { - if (level && level.slots.every(slot => - slot.currentWord && slot.acceptedWords.includes(slot.currentWord.text) - )) { - dispatch(checkSolution()); + console.log('Tutorial check - Level ID:', levelId); + console.log('Tutorial check - Sections length:', sections.length); + console.log('Tutorial check - Level ID type:', typeof levelId); + console.log('Tutorial check - Level ID strict equality:', levelId === '1'); + console.log('Tutorial check - Level ID includes:', levelId.includes('1')); + + if (levelId.includes('level_1')) { + const hasSeenTutorial = localStorage.getItem('tutorial_completed') === 'true'; + const hasSeenSectionTutorial = localStorage.getItem('section_tutorial_completed') === 'true'; + + console.log('Tutorial state:', { + hasSeenTutorial, + hasSeenSectionTutorial, + showTutorial, + tutorialStep + }); + + if (!hasSeenTutorial) { + console.log('Setting showTutorial to true - new user'); + setShowTutorial(true); + } else if (sections.length === 2 && !hasSeenSectionTutorial) { + console.log('Setting showTutorial to true - second section unlocked'); + setTutorialStep(0); + setShowTutorial(true); + } } - }, [level?.slots, dispatch, worldId, levelId]); + }, [levelId, sections.length]); - if (!level) return null; + // Load saved game state + useEffect(() => { + if (!levelId || !level) return; + + // Load section completion states + sections.forEach((section, index) => { + const levelNum = parseInt(levelId.split('_')[1]); + const sectionId = `section_${levelNum}_${index + 1}`; + const saved = localStorage.getItem(`completion_${levelId}_${sectionId}`); + if (saved) { + const completion = JSON.parse(saved); + if (completion.isComplete) { + dispatch(markSectionComplete({ levelId, sectionId })); + } + } + }); + + // Load level completion state + const levelCompletion = localStorage.getItem(`level_completion_${levelId}`); + if (levelCompletion) { + const completion = JSON.parse(levelCompletion); + if (completion.isComplete && completion.uniqueSolutions) { + completion.uniqueSolutions.forEach((solution: string) => { + saveLevelSolution(solution); + }); + } + } + }, [levelId, level, sections, dispatch]); + + // Save section completion state + useEffect(() => { + if (!currentSection || !levelId || !level) return; + + // Check if ALL slots in ALL unlocked sections are correctly filled + const areAllSectionsComplete = sections.every(section => + section.slots.every(slot => { + const hint = hints[slot.hintId]; + return slot.currentWord && hint && hint.accepts.includes(slot.currentWord.text); + }) + ); + + if (areAllSectionsComplete) { + // Save section completion + localStorage.setItem( + `completion_${levelId}_${currentSection.id}`, + JSON.stringify({ isComplete: true }) + ); + dispatch(markSectionComplete({ levelId, sectionId: currentSection.id })); + + // If this was the last section, handle level completion + if (sections.length === level.sections.length) { + const solution = level.sections + .flatMap(section => section.slots) + .map(slot => slot.currentWord?.text) + .join(','); + const isNewSolution = saveLevelSolution(solution); + if (isNewSolution) { + setShowLevelCompleteModal(true); + } + } + } + }, [sections, levelId, currentSection, level, dispatch]); + + // Check for all slots filled but with incorrect words + useEffect(() => { + if (!level || !levelId) return; + + const hasSeenHintTutorial = localStorage.getItem('hint_tutorial_completed') === 'true'; + if (hasSeenHintTutorial) return; + + const allSlotsFilled = allSlots.every(slot => slot.currentWord); + const hasIncorrectWord = allSlots.some(slot => { + const hint = hints[slot.hintId]; + return slot.currentWord && hint && !hint.accepts.includes(slot.currentWord.text); + }); + + if (allSlotsFilled && hasIncorrectWord) { + setShowHintTutorial(true); + } + }, [allSlots, level, levelId]); + + const handleTutorialComplete = () => { + console.log('Tutorial completed'); + setShowTutorial(false); + if (sections.length === 1) { + console.log('Saving initial tutorial completion'); + localStorage.setItem('tutorial_completed', 'true'); + } else { + console.log('Saving section tutorial completion'); + localStorage.setItem('section_tutorial_completed', 'true'); + } + }; + + const handleTutorialNext = () => { + console.log('Moving to next tutorial step:', tutorialStep + 1); + setTutorialStep(prev => prev + 1); + }; + + const handleHintTutorialComplete = () => { + setShowHintTutorial(false); + localStorage.setItem('hint_tutorial_completed', 'true'); + }; + + const getLevelSolutions = (): Set => { + const saved = localStorage.getItem(`level_completion_${levelId}`); + if (!saved) return new Set(); + const completion: LevelCompletion = JSON.parse(saved, (key, value) => + key === 'uniqueSolutions' ? new Set(value) : value + ); + return completion.uniqueSolutions; + }; + + const saveLevelSolution = (solution: string): boolean => { + const solutions = getLevelSolutions(); + const isNewSolution = !solutions.has(solution); + solutions.add(solution); + localStorage.setItem(`level_completion_${levelId}`, JSON.stringify({ + isComplete: true, + uniqueSolutions: Array.from(solutions) + })); + return isNewSolution; + }; + + const nextLevel = useSelector((state: RootState) => { + const levels = state.game.levels; + const currentLevelNum = parseInt(levelId.split('_')[1]); + return currentLevelNum < levels.length ? levels[currentLevelNum] : undefined; + }); const handleDrop = (e: React.DragEvent, slotId: string) => { + if (!currentSection || !levelId) return; + e.preventDefault(); e.currentTarget.classList.remove('drag-over'); const word = JSON.parse(e.dataTransfer.getData('word')) as Word; - const sourceWorldId = e.dataTransfer.getData('sourceWorldId'); const sourceLevelId = e.dataTransfer.getData('sourceLevelId'); + const sourceSectionId = e.dataTransfer.getData('sourceSectionId'); + const sourceSlotId = e.dataTransfer.getData('sourceSlotId'); + // Find the section that owns this slot + const targetSection = sections.find(section => + section.slots.some(slot => slot.id === slotId) + ); + if (!targetSection) return; + + const levelNum = parseInt(levelId.split('_')[1]); + const sectionIndex = sections.indexOf(targetSection); + const targetSectionId = `section_${levelNum}_${sectionIndex + 1}`; + + // If the slot already has a word and the source was another slot, switch the words + const existingWord = targetSection.slots.find(slot => slot.id === slotId)?.currentWord; + if (existingWord && sourceSlotId) { + // Move the existing word to the source slot + dispatch(placeWord({ + levelId, + sectionId: sourceSectionId, + slotId: sourceSlotId, + word: existingWord, + sourceLevelId: levelId, + sourceSectionId: targetSectionId + })); + } else if (existingWord) { + // If source wasn't a slot (was inventory/available words), move to inventory + dispatch(placeWord({ + levelId, + sectionId: targetSectionId, + slotId: 'inventory', + word: existingWord, + sourceLevelId: levelId, + sourceSectionId: targetSectionId + })); + } + + // Place the new word in the target slot dispatch(placeWord({ - worldId, levelId, + sectionId: targetSectionId, slotId, word, - sourceWorldId, - sourceLevelId + sourceLevelId, + sourceSectionId })); }; + // Add cleanup function for drag states + const cleanupDragStates = () => { + document.querySelectorAll('.drag-over').forEach(element => { + element.classList.remove('drag-over'); + }); + }; + const handleDragStart = (e: React.DragEvent, word: Word) => { + if (!currentSection || !levelId) return; + e.dataTransfer.setData('word', JSON.stringify(word)); - e.dataTransfer.setData('sourceWorldId', worldId); e.dataTransfer.setData('sourceLevelId', levelId); + + // Find the section and slot that contains this word + let sourceSection; + let sourceSlot; + for (const section of sections) { + sourceSlot = section.slots.find(slot => slot.currentWord?.id === word.id); + if (sourceSlot) { + sourceSection = section; + break; + } + } + + const sectionId = sourceSection?.id || currentSection.id; + e.dataTransfer.setData('sourceSectionId', sectionId); + if (sourceSlot) { + e.dataTransfer.setData('sourceSlotId', sourceSlot.id); + } + }; + + const handleDragEnd = () => { + cleanupDragStates(); + }; + + const handleInventoryDrop = (e: React.DragEvent) => { + if (!currentSection || !levelId) return; + + e.preventDefault(); + e.currentTarget.classList.remove('drag-over'); + const word = JSON.parse(e.dataTransfer.getData('word')) as Word; + const sourceLevelId = e.dataTransfer.getData('sourceLevelId'); + const sourceSectionId = e.dataTransfer.getData('sourceSectionId'); + + dispatch(placeWord({ + levelId, + sectionId: currentSection.id, + slotId: 'inventory', + word, + sourceLevelId, + sourceSectionId + })); }; const handleWordClick = (word: Word, fromSlot: boolean = false) => { + if (!currentSection || !levelId) return; + if (fromSlot) { + const sourceSection = sections.find(section => + section.slots.some(slot => slot.currentWord?.id === word.id) + ); + if (!sourceSection) return; + dispatch(placeWord({ - worldId, levelId, + sectionId: sourceSection.id, slotId: 'inventory', word, - sourceWorldId: worldId, - sourceLevelId: levelId + sourceLevelId: levelId, + sourceSectionId: sourceSection.id })); } else { - dispatch(addToInventory({ - worldId, + // For words from the available words section + dispatch(placeWord({ levelId, + sectionId: currentSection.id, + slotId: 'inventory', word, - sourceWorldId: worldId, - sourceLevelId: levelId + sourceLevelId: levelId, + sourceSectionId: currentSection.id })); } }; const isWordAccepted = (word: Word, slot: Slot) => { - return slot.acceptedWords.includes(word.text); + const hint = hints[slot.hintId]; + return hint ? hint.accepts.includes(word.text) : false; }; - const isLevelComplete = () => { - return level.slots.every(slot => - slot.currentWord && slot.acceptedWords.includes(slot.currentWord.text) - ); + const getHintText = (hintId: string): string => { + // The hintId is the same as the display text in our case + return hintId; + }; + + const handleReturnAllToInventory = () => { + if (!levelId) return; + + // Move all words from slots to inventory + sections.forEach(section => { + section.slots.forEach(slot => { + if (slot.currentWord) { + dispatch(placeWord({ + levelId, + sectionId: section.id, + slotId: 'inventory', + word: slot.currentWord, + sourceLevelId: levelId, + sourceSectionId: section.id + })); + } + }); + }); }; + const getWordEmoji = (word: Word): string | null => { + return gameData.wordEmojis[word.text] || null; + }; + + if (!level || sections.length === 0 || !currentSection) return null; + + const availableWords = currentSection.availableWords || []; + return ( - - {level.availableWords.length > 0 && ( - - -
- {level.availableWords.map((word: Word) => ( -
handleDragStart(e, word)} - onClick={() => handleWordClick(word)} - > - {word.text} -
- ))} -
- -
- )} - - - -
- {level.slots.map((slot) => ( -
+ {showTutorial && ( + + )} + + {showHintTutorial && ( + + )} +
+ + +
+

Level {levelId.split('_')[1]}

+ + {/* Combined available words and inventory section */} +
{ e.preventDefault(); - e.currentTarget.classList.add('drag-over'); + const section = e.currentTarget; + if (!section.classList.contains('drag-over') && e.target === section) { + section.classList.add('drag-over'); + } }} onDragLeave={(e) => { - e.currentTarget.classList.remove('drag-over'); + const section = e.currentTarget; + const rect = section.getBoundingClientRect(); + if ( + e.clientX <= rect.left || + e.clientX >= rect.right || + e.clientY <= rect.top || + e.clientY >= rect.bottom + ) { + section.classList.remove('drag-over'); + } + }} + onDrop={(e) => { + e.preventDefault(); + cleanupDragStates(); + handleInventoryDrop(e); }} - onDrop={(e) => handleDrop(e, slot.id)} > -
{slot.hintWord}
-
- {slot.currentWord ? ( -
handleDragStart(e, slot.currentWord!)} - onClick={() => handleWordClick(slot.currentWord!, true)} +
+
Available Words
+ {allSlots.some(slot => slot.currentWord) && ( +
- ) : ( -
Drop word here
+ Return all words + )}
+
+ {availableWords.map((word: Word) => ( + handleDragStart(e, word)} + onClick={() => handleWordClick(word)} + /> + ))} + {level.inventory.map((word) => ( + handleDragStart(e, word)} + onClick={() => handleWordClick(word, true)} + /> + ))} +
+
+ + {/* Slots grid */} +
+ {allSlots.map((slot) => ( +
{ + e.preventDefault(); + const card = e.currentTarget; + if (!card.classList.contains('drag-over')) { + card.classList.add('drag-over'); + } + }} + onDragLeave={(e) => { + const card = e.currentTarget; + const rect = card.getBoundingClientRect(); + if ( + e.clientX <= rect.left || + e.clientX >= rect.right || + e.clientY <= rect.top || + e.clientY >= rect.bottom + ) { + card.classList.remove('drag-over'); + } + }} + onDrop={(e) => { + e.preventDefault(); + cleanupDragStates(); + handleDrop(e, slot.id); + }} + > +
{getHintText(slot.hintId)}
+
+ {slot.currentWord ? ( + handleDragStart(e, slot.currentWord!)} + onClick={() => handleWordClick(slot.currentWord!, true)} + /> + ) : ( +
Drop word here
+ )} +
+
+ ))}
- ))} -
- - - +
+ +
+ + setShowLevelCompleteModal(false)} centered> + + + {nextLevel ? 'Level Complete!' : 'Congratulations! 🎉'} + + + +
+ {nextLevel ? ( + 'You\'ve completed this level!' + ) : ( + 'You\'ve completed all available levels!' + )} +
+
+ {Array(getLevelSolutions().size).fill('⭐').join(' ')} +
+
+ {nextLevel ? ( + 'Can you find more solutions?' + ) : ( + 'More levels coming soon! Stay tuned for new challenges.' + )} +
+
+ + + {nextLevel ? ( + <> + + + + ) : ( + + )} + +
+
+
); }; diff --git a/src/components/Home.tsx b/src/components/Home.tsx new file mode 100644 index 0000000..b0f85d4 --- /dev/null +++ b/src/components/Home.tsx @@ -0,0 +1,66 @@ +import React from 'react'; +import { useNavigate } from 'react-router-dom'; +import { useSelector } from 'react-redux'; +import { RootState } from '../store/store'; +import FallingWords from './FallingWords'; +import WordTile from './WordTile'; +import '../styles/Home.css'; + +interface LevelCompletion { + isComplete: boolean; +} + +const Home: React.FC = () => { + const navigate = useNavigate(); + const levels = useSelector((state: RootState) => state.game.levels); + + const findLastUnlockedLevel = () => { + // Go through levels in reverse to find the last unlocked one + for (let i = levels.length - 1; i >= 0; i--) { + const levelId = `level_${i + 1}`; + // A level is accessible if it's the first level or if the previous level is complete + if (i === 0 || isLevelComplete(`level_${i}`)) { + return levelId; + } + } + // If no level is found (shouldn't happen), return the first level + return 'level_1'; + }; + + const isLevelComplete = (levelId: string): boolean => { + const saved = localStorage.getItem(`level_completion_${levelId}`); + if (!saved) return false; + const completion = JSON.parse(saved); + return completion.isComplete; + }; + + const handlePlayClick = () => { + const lastUnlockedLevelId = findLastUnlockedLevel(); + navigate(`/play/${lastUnlockedLevelId}`); + }; + + return ( +
+ +
+

Match Five

+
+

+ A where you match words to their hints. When all your are , more words are revealed. Is your feeling today? +

+
+ +
+ +
+
+
+ ); +}; + +export default Home; \ No newline at end of file diff --git a/src/components/Inventory.tsx b/src/components/Inventory.tsx deleted file mode 100644 index 3a90ddf..0000000 --- a/src/components/Inventory.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import React from 'react'; -import { useSelector, useDispatch } from 'react-redux'; -import { Container, Row, Col } from 'react-bootstrap'; -import { RootState } from '../store/store'; -import { Word } from '../store/types'; -import { placeWord } from '../store/gameSlice'; - -const Inventory: React.FC = () => { - const dispatch = useDispatch(); - const inventory = useSelector((state: RootState) => state.game.inventory); - const currentWorld = useSelector((state: RootState) => state.game.currentWorld); - const currentLevel = useSelector((state: RootState) => state.game.currentLevel); - - const handleDragStart = (e: React.DragEvent, word: Word) => { - e.dataTransfer.setData('word', JSON.stringify(word)); - }; - - const handleDrop = (e: React.DragEvent) => { - console.log('drop in inventory', currentWorld, currentLevel); - e.preventDefault(); - const container = e.currentTarget; - container.classList.remove('drag-over'); - - try { - if (currentWorld && currentLevel) { - const word = JSON.parse(e.dataTransfer.getData('word')) as Word; - if (word) { - dispatch(placeWord({ - worldId: currentWorld, - levelId: currentLevel, - slotId: 'inventory', - word - })); - } - } - } catch (error) { - console.error('Error handling drop:', error); - } - }; - - return ( - { - e.preventDefault(); - e.currentTarget.classList.add('drag-over'); - }} - onDragLeave={(e) => { - e.currentTarget.classList.remove('drag-over'); - }} - onDrop={handleDrop} - > -

Inventory

-
e.preventDefault()} - onDrop={handleDrop} - > - {inventory.map(word => ( -
handleDragStart(e, word)} - > - {word.text} -
- ))} -
-
- ); -}; - -export default Inventory; \ No newline at end of file diff --git a/src/components/LevelSelector.tsx b/src/components/LevelSelector.tsx index 1388479..8315ef6 100644 --- a/src/components/LevelSelector.tsx +++ b/src/components/LevelSelector.tsx @@ -1,37 +1,138 @@ import React from 'react'; -import { useSelector, useDispatch } from 'react-redux'; -import { Card, Container, Row, Col } from 'react-bootstrap'; +import { useSelector } from 'react-redux'; +import { useNavigate } from 'react-router-dom'; +import { Card, Container } from 'react-bootstrap'; import { RootState } from '../store/store'; -import { setCurrentLevel } from '../store/gameSlice'; +import { FaLock, FaCheck, FaChevronRight } from 'react-icons/fa'; + +interface LevelCompletion { + isComplete: boolean; + uniqueSolutions: string[]; +} + +interface SectionCompletion { + isComplete: boolean; +} const LevelSelector: React.FC = () => { - const dispatch = useDispatch(); - const currentWorld = useSelector((state: RootState) => { - const worldId = state.game.currentWorld; - return state.game.worlds.find(w => w.id === worldId); - }); + const navigate = useNavigate(); + const levels = useSelector((state: RootState) => state.game.levels); + + const isLevelAccessible = (levelIndex: number): boolean => { + if (levelIndex === 0) return true; + const previousLevel = levels[levelIndex - 1]; + return isLevelComplete(`level_${levelIndex}`); + }; + + const isLevelComplete = (levelId: string): boolean => { + const saved = localStorage.getItem(`level_completion_${levelId}`); + if (!saved) return false; + const completion: LevelCompletion = JSON.parse(saved); + return completion.isComplete; + }; + + const getLevelSolutions = (levelId: string): string[] => { + const saved = localStorage.getItem(`level_completion_${levelId}`); + if (!saved) return []; + const completion: LevelCompletion = JSON.parse(saved); + return completion.uniqueSolutions; + }; - if (!currentWorld) return null; + const isSectionComplete = (levelId: string, sectionId: string): boolean => { + const level = levels.find(l => l.id === levelId); + if (!level) return false; + + const targetSectionIndex = level.sections.findIndex(s => s.id === sectionId); + if (targetSectionIndex === -1) return false; + + for (let i = 0; i <= targetSectionIndex; i++) { + const section = level.sections[i]; + const saved = localStorage.getItem(`completion_${levelId}_${section.id}`); + if (!saved) return false; + const completion: SectionCompletion = JSON.parse(saved); + if (!completion.isComplete) return false; + } + + return true; + }; return ( - - - {currentWorld.levels.map(level => ( - + +

Select a Level

+
+ {levels.map((level, index) => { + const levelId = `level_${index + 1}`; + const isLevelUnlocked = isLevelAccessible(index); + const isComplete = isLevelComplete(levelId); + const solutions = getLevelSolutions(levelId); + const completedSections = level.sections.filter((section, sectionIndex) => + isSectionComplete(levelId, `section_${index + 1}_${sectionIndex + 1}`) + ).length; + + return ( level.isUnlocked && dispatch(setCurrentLevel(level.id))} - className={`h-100 ${!level.isUnlocked ? 'opacity-50' : ''}`} + key={levelId} + onClick={() => isLevelUnlocked && navigate(`/play/${levelId}`)} + className={`level-select-card ${isComplete ? 'completed' : ''} ${!isLevelUnlocked ? 'locked' : ''}`} > - Level {level.id} - - {level.isUnlocked ? 'Click to play' : 'Complete previous level to unlock'} - +
+
+

{level.name || `Level ${index + 1}`}

+
+ {completedSections} / {level.sections.length} sections +
+
+ {!isLevelUnlocked ? ( +
+ +
+ ) : isComplete ? ( +
+ +
+ ) : ( +
+ +
+ )} +
+ + {solutions.length > 0 && ( +
+
+ {Array(solutions.length).fill('⭐').join(' ')} +
+
+ )} + + {!isLevelUnlocked && ( +
+ Complete previous level to unlock +
+ )}
- - ))} - + ); + })} + + {/* Coming Soon Card */} + + +
+
+

New Levels Coming Soon

+
+ Stay tuned for more challenges! +
+
+
+ +
+
+
+
+
); }; diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx new file mode 100644 index 0000000..da01ab3 --- /dev/null +++ b/src/components/Navbar.tsx @@ -0,0 +1,81 @@ +import React, { useState } from 'react'; +import { NavLink } from 'react-router-dom'; +import { useDispatch } from 'react-redux'; +import { Navbar as BootstrapNavbar, Container, Button, Modal, Nav } from 'react-bootstrap'; +import { FaInfoCircle, FaTrash, FaList } from 'react-icons/fa'; +import '../styles/Navbar.css'; + +const Navbar: React.FC = () => { + const dispatch = useDispatch(); + const [showInfoModal, setShowInfoModal] = useState(false); + const [showResetModal, setShowResetModal] = useState(false); + + const handleResetData = () => { + localStorage.clear(); + window.location.reload(); + }; + + return ( + <> + + + + Match Five + + + + + + setShowInfoModal(false)}> + + How to Play + + +
Game Rules:
+
    +
  • Complete each level by matching five words correctly
  • +
  • Drag and drop words into the correct slots
  • +
  • Click words to add them to your inventory for later use
  • +
  • Complete all levels in a pack to unlock new challenges
  • +
+
+ + + +
+ + setShowResetModal(false)}> + + Reset Game Progress + + + Are you sure you want to reset all game progress? This action cannot be undone. + + + + + + + + ); +}; + +export default Navbar; \ No newline at end of file diff --git a/src/components/SolutionsCounter.tsx b/src/components/SolutionsCounter.tsx new file mode 100644 index 0000000..593809e --- /dev/null +++ b/src/components/SolutionsCounter.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import { Card } from 'react-bootstrap'; + +interface SolutionsCounterProps { + solutionsCount: number; +} + +const SolutionsCounter: React.FC = ({ solutionsCount }) => { + return ( + + +
+
Solutions Found
+
+ {Array(solutionsCount).fill('⭐').join(' ')} +
+
+
+
+ ); +}; + +export default SolutionsCounter; \ No newline at end of file diff --git a/src/components/TutorialOverlay.tsx b/src/components/TutorialOverlay.tsx new file mode 100644 index 0000000..ac0188a --- /dev/null +++ b/src/components/TutorialOverlay.tsx @@ -0,0 +1,129 @@ +import React from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; + +interface TutorialStep { + targetSelector: string; + message: string; + position: 'top' | 'bottom' | 'left' | 'right'; +} + +interface TutorialOverlayProps { + isVisible: boolean; + currentStep: number; + steps: TutorialStep[]; + onComplete: () => void; + onNext: () => void; +} + +const TutorialOverlay: React.FC = ({ + isVisible, + currentStep, + steps, + onComplete, + onNext, +}) => { + const currentTutorialStep = steps[currentStep]; + const [messagePosition, setMessagePosition] = React.useState({ top: 0, left: 0 }); + + React.useEffect(() => { + if (isVisible && currentTutorialStep) { + const targetElement = document.querySelector(currentTutorialStep.targetSelector); + if (targetElement) { + const rect = targetElement.getBoundingClientRect(); + const spotlight = document.querySelector('.tutorial-spotlight') as HTMLElement; + + if (spotlight) { + spotlight.style.left = `${rect.left - 10}px`; + spotlight.style.top = `${rect.top - 10}px`; + spotlight.style.width = `${rect.width + 20}px`; + spotlight.style.height = `${rect.height + 20}px`; + + const messageWidth = 300; + const messageHeight = 120; + const padding = 20; + const viewportPadding = 20; + + let top = 0; + let left = 0; + + switch (currentTutorialStep.position) { + case 'top': + top = rect.top - messageHeight - padding; + left = rect.left + (rect.width - messageWidth) / 2; + break; + case 'bottom': + top = rect.bottom + padding; + left = rect.left + (rect.width - messageWidth) / 2; + break; + case 'left': + top = rect.top + (rect.height - messageHeight) / 2; + left = rect.left - messageWidth - padding; + break; + case 'right': + top = rect.top + (rect.height - messageHeight) / 2; + left = rect.right + padding; + break; + } + + const viewportWidth = window.innerWidth; + const viewportHeight = window.innerHeight; + + if (left < viewportPadding) { + left = viewportPadding; + } else if (left + messageWidth > viewportWidth - viewportPadding) { + left = viewportWidth - messageWidth - viewportPadding; + } + + if (top < viewportPadding) { + top = viewportPadding; + } else if (top + messageHeight > viewportHeight - viewportPadding) { + top = viewportHeight - messageHeight - viewportPadding; + } + + setMessagePosition({ top, left }); + } + } + } + }, [isVisible, currentStep, currentTutorialStep]); + + if (!isVisible) return null; + + return ( +
+
+
+

+ {currentTutorialStep.message} +

+ +
+
+ ); +}; + +export default TutorialOverlay; \ No newline at end of file diff --git a/src/components/WordTile.tsx b/src/components/WordTile.tsx new file mode 100644 index 0000000..3b31b06 --- /dev/null +++ b/src/components/WordTile.tsx @@ -0,0 +1,59 @@ +import React from 'react'; +import gameData from '../data/gameData.json'; + +interface WordTileProps { + word: string; + hint?: string; + disableHover?: boolean; + className?: string; + onDragStart?: (e: React.DragEvent) => void; + onClick?: () => void; +} + +const WordTile: React.FC = ({ + word, + hint, + disableHover = false, + className = 'word-tile', + onDragStart, + onClick +}) => { + const emoji = gameData.wordEmojis[word]; + + return ( +
+ {word} + {emoji && ( + + {emoji} + + )} +
+ ); +}; + +export default WordTile; \ No newline at end of file diff --git a/src/components/WorldSelector.tsx b/src/components/WorldSelector.tsx deleted file mode 100644 index 9d44ff0..0000000 --- a/src/components/WorldSelector.tsx +++ /dev/null @@ -1,135 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import { useDispatch, useSelector } from 'react-redux'; -import { Card, Row, Col, Collapse } from 'react-bootstrap'; -import { RootState } from '../store/store'; -import GameBoard from './GameBoard'; -import { Level } from '../store/types'; -import { setCurrentWorld, setCurrentLevel } from '../store/gameSlice'; - -interface ExpandedState { - [key: string]: { - isExpanded: boolean; - expandedLevels: Set; - }; -} - -const WorldSelector: React.FC = () => { - const dispatch = useDispatch(); - const worlds = useSelector((state: RootState) => state.game.worlds); - const currentWorld = useSelector((state: RootState) => state.game.currentWorld); - const currentLevel = useSelector((state: RootState) => state.game.currentLevel); - const [expandedStates, setExpandedStates] = useState({}); - - useEffect(() => { - if (worlds.length > 0 && Object.keys(expandedStates).length === 0) { - const firstWorld = worlds[0]; - dispatch(setCurrentWorld(firstWorld.id)); - - const initialStates: ExpandedState = { - [firstWorld.id]: { - isExpanded: true, - expandedLevels: new Set() - } - }; - - setExpandedStates(initialStates); - } - }, [worlds, dispatch]); - - const toggleWorld = (worldId: string) => { - dispatch(setCurrentWorld(worldId)); - setExpandedStates(prev => ({ - ...prev, - [worldId]: { - ...prev[worldId], - isExpanded: !prev[worldId]?.isExpanded, - expandedLevels: prev[worldId]?.expandedLevels || new Set() - } - })); - }; - - const toggleLevel = (worldId: string, levelId: string) => { - dispatch(setCurrentLevel(levelId)); - setExpandedStates(prev => { - const worldState = prev[worldId] || { isExpanded: true, expandedLevels: new Set() }; - const newExpandedLevels = new Set(worldState.expandedLevels); - - if (newExpandedLevels.has(levelId)) { - newExpandedLevels.delete(levelId); - } else { - newExpandedLevels.add(levelId); - } - - return { - ...prev, - [worldId]: { - ...worldState, - expandedLevels: newExpandedLevels - } - }; - }); - }; - - const isLevelCurrentlyComplete = (level: Level) => { - return level.slots.every(slot => - slot.currentWord && slot.acceptedWords.includes(slot.currentWord.text) - ); - }; - - const renderWorld = (world: any) => { - return ( -
- { - if (world.isUnlocked) { - toggleWorld(world.id); - } - }} - className={`world-card ${world.levels.every(isLevelCurrentlyComplete) ? 'completed' : ''}`} - > - - {world.name || `World ${world.id}`} -
- {world.levels.filter(isLevelCurrentlyComplete).length} / {world.levels.length} -
-
-
- - -
- {world.levels.map((level: Level) => ( -
- { - if (level.isUnlocked) { - toggleLevel(world.id, level.id); - } - }} - className={`level-card ${isLevelCurrentlyComplete(level) ? 'completed' : ''} ${!level.isUnlocked ? 'locked' : ''}`} - > - - {level.name || `Level ${level.id}`} - - - - {level.isUnlocked && expandedStates[world.id]?.expandedLevels.has(level.id) && ( -
- -
- )} -
- ))} -
-
-
- ); - }; - - return ( -
- {worlds.map(renderWorld)} -
- ); -}; - -export default WorldSelector; \ No newline at end of file diff --git a/src/data/gameData.json b/src/data/gameData.json new file mode 100644 index 0000000..0011ea1 --- /dev/null +++ b/src/data/gameData.json @@ -0,0 +1,349 @@ +{ + "wordEmojis": { + "Air": "💨", + "Above": "⬆️", + "Answer": "✅", + "Apple": "🍎", + "Average": "📊", + "Ball": "⚽", + "Banana": "🍌", + "Bark": "🌳", + "Bat": "🦇", + "Bean": "🫘", + "Bear": "🐻", + "Below": "⬇️", + "Blackberry": "🫐", + "Blood": "🩸", + "Blueberry": "🫐", + "Book": "📚", + "Brain": "🧠", + "Broccoli": "🥦", + "Cardinal": "🐦", + "Carrot": "🥕", + "Cave": "🕳️", + "Center": "⚪", + "Cherry": "🍒", + "Chocolate": "🍫", + "Circle": "⭕", + "Cloud": "☁️", + "Coal": "🪨", + "Coffee": "☕", + "Corn": "🌽", + "Crane": "🏗️", + "Daisy": "🌼", + "Dance": "💃", + "Date": "📅", + "Diamond": "💎", + "Dog": "🐕", + "Down": "⬇️", + "Drum": "🥁", + "Duck": "🦆", + "Earth": "🌍", + "Eggplant": "🍆", + "Eye": "👁️", + "Fact": "📝", + "Fall": "🍂", + "Feather": "🪶", + "Fig": "🪪", + "Fire": "🔥", + "Fish": "🐟", + "Five": "5️⃣", + "Flute": "🎵", + "Garlic": "🧄", + "Glue": "🫠", + "Gold": "🥇", + "Grape": "🍇", + "Grass": "🌱", + "Guitar": "🎸", + "Heart": "❤️", + "High": "⬆️", + "Ice": "🧊", + "Ink": "🖋️", + "Iris": "🌸", + "Kiwi": "🥝", + "Leaf": "🍃", + "Left": "⬅️", + "Lemon": "🍋", + "Lettuce": "🥬", + "Light": "💡", + "Lime": "🟢", + "Low": "⬇️", + "Love": "❤️", + "Metal": "🔩", + "Middle": "⏺️", + "Mirror": "🪞", + "Money": "💰", + "Moon": "🌙", + "Mountain": "⛰️", + "Mouse": "🐁", + "Mud": "🟫", + "Music": "🎵", + "Night": "🌙", + "Ocean": "🌊", + "Orange": "🍊", + "Pea": "🟢", + "Pear": "🍐", + "Penguin": "🐧", + "Pepper": "🌶️", + "Piano": "🎹", + "Pig": "🐷", + "Plum": "🟣", + "Potato": "🥔", + "Pumpkin": "🎃", + "Puzzle Game": "🧩", + "Rage": "😠", + "Right": "➡️", + "River": "🌊", + "Rock": "🪨", + "Rope": "➰", + "Rose": "🌹", + "Rude": "😤", + "Sadness": "😢", + "Salmon": "🐟", + "Salt": "🧂", + "Saxophone": "🎷", + "Science": "🧪", + "Score": "💯", + "Seal": "🦭", + "Seed": "🌱", + "Shadow": "👥", + "Sky": "🌤️", + "Snake": "🐍", + "Snow": "❄️", + "Spring": "🌸", + "Star": "⭐", + "Stone": "🪨", + "Strawberry": "🍓", + "Stream": "💫", + "Student": "👨‍🎓", + "Summer": "☀️", + "Sun": "☀️", + "Swan": "🦢", + "Time": "⏰", + "Tomato": "🍅", + "Tower": "🗼", + "Traffic": "🚦", + "Tree": "🌳", + "Up": "⬆️", + "Violet": "🟣", + "Window": "🪟", + "Wine": "🍷", + "Winter": "⛄", + "Wrench": "🔧" + }, + "hints": { + "Red": { + "accepts": ["Strawberry", "Apple", "Rage", "Rose", "Blood", "Cherry", "Tomato", "Fire", "Cardinal"] + }, + "Purple": { + "accepts": ["Eggplant", "Grape", "Blueberry", "Blackberry", "Plum", "Violet", "Wine"] + }, + "Yellow": { + "accepts": ["Banana", "Garlic", "Potato", "Lemon", "Sun", "Gold", "Corn", "Star"] + }, + "Green": { + "accepts": ["Lettuce", "Kiwi", "Strawberry", "Money", "Grass", "Lime", "Pear", "Leaf", "Apple", "Broccoli", "Tree"] + }, + "Black": { + "accepts": ["Blackberry", "Night", "Coal", "Ink", "Shadow", "Coffee"] + }, + "Orange": { + "accepts": ["Apple", "Pumpkin", "Orange", "Carrot", "Fire", "Sun"] + }, + "Blue": { + "accepts": ["Blueberry", "Sadness", "Sky", "Ocean", "River", "Ice"] + }, + "White": { + "accepts": ["Garlic", "Strawberry", "Potato", "Snow", "Cloud", "Ice", "Salt", "Moon"] + }, + "Brown": { + "accepts": ["Kiwi", "Potato", "Banana", "Coffee", "Chocolate", "Earth", "Bark", "Bear"] + }, + "Fruit": { + "accepts": ["Apple", "Banana", "Grape", "Kiwi", "Blackberry", "Blueberry", "Eggplant", "Strawberry", "Lemon", "Orange", "Cherry", "Plum", "Pear", "Lime", "Fig", "Date", "Tomato"] + }, + "Vegetable": { + "accepts": ["Lettuce", "Garlic", "Eggplant", "Potato", "Pumpkin", "Carrot", "Corn", "Tomato", "Pepper", "Bean", "Broccoli"] + }, + "Berry": { + "accepts": ["Strawberry", "Blackberry", "Kiwi", "Blueberry", "Cherry", "Grape", "Tomato"] + }, + "Flower": { + "accepts": ["Rose", "River", "Violet", "Iris", "Spring", "Daisy"] + }, + "Plant": { + "accepts": ["Strawberry", "Kiwi", "Garlic", "Potato", "Pumpkin", "Eggplant", "Apple", "Blueberry", "Grape", "Banana", "Blackberry", "Rose", "Lemon", "Tree", "Grass", "Corn", "Bean", "Violet", "Iris", "Daisy", "Broccoli", "Lettuce", "Pepper", "Tomato"] + }, + "Animal": { + "accepts": ["Dog", "Kiwi", "Snake", "Bear", "Mouse", "Fish", "Duck", "Seal", "Bat", "Penguin", "Bear", "Fish", "Snake"] + }, + "Bird": { + "accepts": ["Kiwi", "Duck", "Crane", "Swan", "Cardinal", "Penguin"] + }, + "Mammal": { + "accepts": ["Dog", "Bear", "Mouse", "Seal", "Bat"] + }, + "Pink": { + "accepts": ["Strawberry", "Rose", "Pig", "Salmon", "Heart"] + }, + "Round": { + "accepts": ["Apple", "Blueberry", "Grape", "Orange", "Moon", "Sun", "Ball", "Earth", "Tomato", "Pumpkin", "Kiwi", "Lemon", "Banana", "Cherry", "Plum", "Pear", "Lime", "Fig", "Date"] + }, + "Long": { + "accepts": ["Snake", "River", "Banana", "Time", "Bean", "Rope"] + }, + "Small": { + "accepts": ["Blueberry", "Grape", "Blackberry", "Mouse", "Seed", "Bean", "Pea"] + }, + "Music": { + "accepts": ["Rock", "Dance"] + }, + "Bright": { + "accepts": ["Sun", "Star", "Light", "Fire", "Student"] + }, + "Mean": { + "accepts": ["Rude", "Average"] + }, + "Direction": { + "accepts": ["Left", "Right", "Up", "Down", "Cardinal", "Duck"] + }, + "Correct": { + "accepts": ["Right"] + }, + "Bark": { + "accepts": ["Dog", "Tree"] + }, + "Jam": { + "accepts": ["Strawberry", "Traffic", "Music"] + }, + "Position": { + "accepts": ["Up", "Down", "Left", "Right", "Above", "Below", "Center", "Middle"] + }, + "Mood": { + "accepts": ["Up", "Down", "High", "Low", "Sadness", "Rage", "Love", "Heart"] + }, + "Season": { + "accepts": ["Summer", "Winter", "Spring", "Fall"] + }, + "Smart": { + "accepts": ["Brain", "Money", "Book", "Student"] + }, + "True": { + "accepts": ["Fact", "Answer", "Science"] + }, + "Perfect": { + "accepts": ["Circle", "Score", "Diamond"] + }, + "Look": { + "accepts": ["Eye", "Window", "Mirror"] + }, + "Flow": { + "accepts": ["River", "Stream", "Blood"] + }, + "Stuck": { + "accepts": ["Traffic", "Glue", "Mud"] + }, + "Heavy": { + "accepts": ["Stone", "Metal", "Pumpkin"] + }, + "Light": { + "accepts": ["Feather", "Cloud", "Air"] + }, + "Dark": { + "accepts": ["Night", "Shadow", "Cave"] + }, + "High": { + "accepts": ["Mountain", "Tower", "Sky"] + }, + "Instrument": { + "accepts": ["Drum", "Guitar", "Piano", "Flute", "Saxophone", "Wrench"] + }, + "Verb": { + "accepts": ["Dog", "Duck", "Bear", "Fish", "Snake"] + }, + "Noun": { + "accepts": [ + "Tomato", "Orange", "Banana", "Blueberry", "Daisy", "Dog", "Duck", "Bear", "Fish", "Snake", "Penguin" + ] + }, + "Reptile": { + "accepts": ["Snake"] + } + }, + "levels": [ + { + "sections": [ + { + "slots": ["Fruit", "Vegetable", "Berry", "Flower", "Plant"], + "words": ["Apple", "Broccoli", "Strawberry", "Rose", "Tree"] + }, + { + "slots": ["Red", "Orange", "Yellow", "Blue", "Green"], + "words": ["Tomato", "Orange", "Banana", "Blueberry", "Daisy"] + } + ] + }, + { + "sections": [ + { + "slots": ["Verb","Animal", "Bird", "Mammal", "Reptile"], + "words": ["Dog", "Penguin", "Bear", "Fish", "Snake"] + }, + { + "slots": ["Verb", "Noun", "Verb", "Noun", "Verb"], + "words": ["Dog", "Penguin", "Bear", "Fish", "Snake"] + }, + { + "slots": ["Verb", "Verb", "Verb", "Verb", "Verb"], + "words": ["Dog", "Penguin", "Bear", "Fish", "Snake"] + } + ] + }, + { + "sections": [ + { + "slots": ["Direction", "Direction", "Direction", "Direction", "Animal"], + "words": ["Left", "Right", "Up", "Down", "Dog"] + }, + { + "slots": ["Mood", "Bird", "Correct", "Verb", "Noun"], + "words": ["Cardinal", "Penguin", "Duck", "Fish", "Snake"] + }, + { + "slots": ["Red", "Red", "Mood", "Verb", "Noun"], + "words": ["Cardinal", "Rage", "Tomato", "Penguin", "Bear"] + } + ] + }, + { + "name": "Elements", + "sections": [ + { + "name": "Basic Elements", + "slots": ["Red", "Purple", "Yellow", "Green", "Black"], + "words": ["Strawberry", "Eggplant", "Banana", "Kiwi", "Blackberry"] + }, + { + "name": "Fruits", + "slots": ["Orange", "Blue", "Purple", "White", "Brown"], + "words": ["Apple", "Blueberry", "Grape", "Garlic", "Lettuce"] + }, + { + "name": "Vegetables", + "slots": ["Fruit", "Vegetable", "Berry", "Vegetable", "Fruit"], + "words": ["Sadness", "Money", "Rage", "Potato", "Pumpkin"] + }, + { + "name": "Animals", + "slots": ["Flower", "Plant", "Animal", "Bird", "Mammal"], + "words": ["Rose", "Lemon", "Dog", "River", "Snake"] + }, + { + "name": "Plants", + "slots": ["Orange", "Blue", "Purple", "White", "Brown"], + "words": ["Apple", "Blueberry", "Grape", "Garlic", "Lettuce"] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/store/gameSlice.ts b/src/store/gameSlice.ts index 15e1d5f..976a13a 100644 --- a/src/store/gameSlice.ts +++ b/src/store/gameSlice.ts @@ -1,220 +1,198 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; -import { GameState, Word } from './types'; -import { initialGameState } from './initialState'; +import gameData from '../data/gameData.json'; +import { Word, GameState, Section, Level, Slot, RawGameData } from './types'; + +function generateLevelId(levelIndex: number): string { + return `level_${levelIndex + 1}`; +} + +function generateSectionId(levelIndex: number, sectionIndex: number): string { + return `section_${levelIndex + 1}_${sectionIndex + 1}`; +} + +function generateSlotId(levelIndex: number, sectionIndex: number, slotIndex: number): string { + return `slot_${levelIndex + 1}_${sectionIndex + 1}_${slotIndex + 1}`; +} + +function generateWordId(levelIndex: number, sectionIndex: number, wordIndex: number): string { + return `word_${levelIndex + 1}_${sectionIndex + 1}_${wordIndex + 1}`; +} + +function transformGameData(data: RawGameData): Level[] { + return data.levels.map((level, levelIndex) => ({ + id: generateLevelId(levelIndex), + name: level.name, + sections: level.sections.map((section, sectionIndex) => ({ + id: generateSectionId(levelIndex, sectionIndex), + name: section.name, + slots: section.slots.map((hintId, slotIndex) => ({ + id: generateSlotId(levelIndex, sectionIndex, slotIndex), + hintId, + currentWord: null + })), + availableWords: section.words.map((word, wordIndex) => ({ + id: generateWordId(levelIndex, sectionIndex, wordIndex), + text: word + })), + isComplete: false, + // Only first section of first level is unlocked initially + isUnlocked: levelIndex === 0 && sectionIndex === 0 + })), + isComplete: false, + inventory: [] + })); +} + +const initialState: GameState = { + levels: transformGameData(gameData as RawGameData), + currentLevel: null, + currentSection: null, + hints: gameData.hints, + inventory: [] +}; const gameSlice = createSlice({ name: 'game', - initialState: initialGameState, + initialState, reducers: { - setCurrentWorld: (state, action: PayloadAction) => { - state.currentWorld = action.payload; - state.currentLevel = null; - }, - setCurrentLevel: (state, action: PayloadAction) => { + setCurrentLevel: (state, action: PayloadAction) => { state.currentLevel = action.payload; }, - addToInventory: (state, action: PayloadAction<{ - worldId: string, - levelId: string, - word: Word, - sourceWorldId?: string, - sourceLevelId?: string - }>) => { - const { worldId, levelId, word, sourceWorldId, sourceLevelId } = action.payload; - const world = state.worlds.find(w => w.id === worldId); - const level = world?.levels.find(l => l.id === levelId); - - if (level) { - // Clean up source location if provided - if (sourceWorldId && sourceLevelId) { - const sourceWorld = state.worlds.find(w => w.id === sourceWorldId); - const sourceLevel = sourceWorld?.levels.find(l => l.id === sourceLevelId); - if (sourceLevel) { - // Clean up from slots - sourceLevel.slots.forEach(slot => { - if (slot.currentWord?.id === word.id) { - slot.currentWord = null; - } - }); - // Clean up from available words - sourceLevel.availableWords = sourceLevel.availableWords.filter(w => w.id !== word.id); - } - } - - // Remove word from available words - level.availableWords = level.availableWords.filter(w => w.id !== word.id); - // Add to inventory if not already there - if (!state.inventory.some(w => w.id === word.id)) { - state.inventory.push(word); - } - } - }, - removeFromInventory: (state, action: PayloadAction) => { - state.inventory = state.inventory.filter(word => word.id !== action.payload); + setCurrentSection: (state, action: PayloadAction) => { + state.currentSection = action.payload; }, placeWord: (state, action: PayloadAction<{ - worldId: string, - levelId: string, - slotId: string, - word: Word, - sourceWorldId?: string, - sourceLevelId?: string + levelId: string; + sectionId: string; + slotId: string; + word: Word; + sourceLevelId: string; + sourceSectionId: string; }>) => { - const { worldId, levelId, slotId, word, sourceWorldId, sourceLevelId } = action.payload; + const { levelId, sectionId, slotId, word, sourceLevelId, sourceSectionId } = action.payload; - const world = state.worlds.find(w => w.id === worldId); - const level = world?.levels.find(l => l.id === levelId); - - if (!level) return; + // Remove from source location first + const sourceLevel = state.levels.find(w => w.id === sourceLevelId); + const sourceSection = sourceLevel?.sections.find(l => l.id === sourceSectionId); - // Clean up source location - if (sourceWorldId && sourceLevelId) { - const sourceWorld = state.worlds.find(w => w.id === sourceWorldId); - const sourceLevel = sourceWorld?.levels.find(l => l.id === sourceLevelId); - if (sourceLevel) { - // Clean up from slots - sourceLevel.slots.forEach(slot => { - if (slot.currentWord?.id === word.id) { - slot.currentWord = null; - } - }); - // Clean up from available words - sourceLevel.availableWords = sourceLevel.availableWords.filter(w => w.id !== word.id); - } + // Remove from level inventory if it was there + if (sourceLevel) { + sourceLevel.inventory = sourceLevel.inventory.filter(w => w.id !== word.id); + } + + // Remove from source section if applicable + if (sourceSection) { + // Remove from slots if it was in a slot + sourceSection.slots = sourceSection.slots.map(slot => ({ + ...slot, + currentWord: slot.currentWord?.id === word.id ? null : slot.currentWord + })); + // Remove from available words if it was there + sourceSection.availableWords = sourceSection.availableWords.filter(w => w.id !== word.id); } - - // Remove from available words if it's there - level.availableWords = level.availableWords.filter(w => w.id !== word.id); - - // Remove from inventory if it's there - state.inventory = state.inventory.filter(w => w.id !== word.id); - - // Remove from any slot in the target level - level.slots.forEach(slot => { - if (slot.currentWord?.id === word.id) { - slot.currentWord = null; - } - }); - // Place word in new location + // Handle moving to inventory if (slotId === 'inventory') { - if (!state.inventory.some(w => w.id === word.id)) { - state.inventory.push(word); - } - } else { - const slot = level.slots.find(s => s.id === slotId); - if (slot) { - if (slot.currentWord) { - state.inventory.push(slot.currentWord); - } - slot.currentWord = word; + const targetLevel = state.levels.find(w => w.id === levelId); + if (targetLevel && !targetLevel.inventory.some(w => w.id === word.id)) { + targetLevel.inventory.push(word); } + return; + } + + // Handle placing in slot + const targetLevel = state.levels.find(w => w.id === levelId); + const targetSection = targetLevel?.sections.find(l => l.id === sectionId); + if (targetSection) { + // Place in new slot + targetSection.slots = targetSection.slots.map(slot => ({ + ...slot, + currentWord: slot.id === slotId ? word : slot.currentWord + })); } }, - checkSolution: (state) => { - const world = state.worlds.find(w => w.id === state.currentWorld); - const level = world?.levels.find(l => l.id === state.currentLevel); - - if (!level || !world) return; + addToInventory: (state, action: PayloadAction<{ + levelId: string; + sectionId: string; + word: Word; + sourceLevelId: string; + sourceSectionId: string; + }>) => { + const { word, sourceLevelId, sourceSectionId, levelId } = action.payload; - const levelIndex = world.levels.findIndex(l => l.id === level.id); + // Add to target level's inventory if not already there + const targetLevel = state.levels.find(w => w.id === levelId); + if (targetLevel && !targetLevel.inventory.some(w => w.id === word.id)) { + targetLevel.inventory.push(word); + } - // Check if current level is completed - const isCurrentLevelComplete = level.slots.every(slot => - slot.currentWord && slot.acceptedWords.includes(slot.currentWord.text) - ); - - if (isCurrentLevelComplete) { - // Mark current level as completed - level.isCompleted = true; - - // Check if all previous levels are completed - const allPreviousLevelsCompleted = world.levels - .slice(0, levelIndex + 1) - .every(level => - level.slots.every(slot => - slot.currentWord && slot.acceptedWords.includes(slot.currentWord.text) - ) - ); - - if (allPreviousLevelsCompleted) { - // Unlock next level if exists - if (levelIndex >= 0 && levelIndex < world.levels.length - 1) { - world.levels[levelIndex + 1].isUnlocked = true; - } - - // Check if all levels in world are completed - const allLevelsCompleted = world.levels.every(l => - l.slots.every(slot => - slot.currentWord && slot.acceptedWords.includes(slot.currentWord.text) - ) - ); - - if (allLevelsCompleted) { - world.isCompleted = true; - - // Find and unlock next world if exists - const worldIndex = state.worlds.findIndex(w => w.id === world.id); - if (worldIndex >= 0 && worldIndex < state.worlds.length - 1) { - state.worlds[worldIndex + 1].isUnlocked = true; - } - } - - // Save progress to localStorage - const gameState = { - completedLevels: world.levels - .filter(l => l.isCompleted) - .map(l => ({ worldId: world.id, levelId: l.id })), - unlockedLevels: world.levels - .filter(l => l.isUnlocked) - .map(l => ({ worldId: world.id, levelId: l.id })) - }; - localStorage.setItem('gameProgress', JSON.stringify(gameState)); - } + // Remove from source section's available words + const sourceLevel = state.levels.find(w => w.id === sourceLevelId); + const sourceSection = sourceLevel?.sections.find(l => l.id === sourceSectionId); + if (sourceSection) { + sourceSection.availableWords = sourceSection.availableWords.filter(w => w.id !== word.id); } }, - goBack: (state) => { - if (state.currentLevel) { - state.currentLevel = null; - } else if (state.currentWorld) { - state.currentWorld = null; + removeFromInventory: (state, action: PayloadAction<{ + word: Word; + targetLevelId: string; + targetSectionId: string; + }>) => { + const { word, targetLevelId, targetSectionId } = action.payload; + + // Remove from level inventory + const level = state.levels.find(w => w.id === targetLevelId); + if (level) { + level.inventory = level.inventory.filter(w => w.id !== word.id); + } + + // Add back to target section's available words + const targetSection = level?.sections.find(l => l.id === targetSectionId); + if (targetSection && !targetSection.availableWords.some(w => w.id === word.id)) { + targetSection.availableWords.push(word); } }, - loadSavedProgress: (state) => { - const savedProgress = localStorage.getItem('gameProgress'); - if (savedProgress) { - const { completedLevels, unlockedLevels } = JSON.parse(savedProgress); - - // Restore completed and unlocked states - completedLevels.forEach(({ worldId, levelId }: { worldId: string, levelId: string }) => { - const world = state.worlds.find(w => w.id === worldId); - const level = world?.levels.find(l => l.id === levelId); - if (level) { - level.isCompleted = true; - } - }); + checkSolution: (state) => { + // Solution checking is now handled in the component + }, + markSectionComplete: (state, action: PayloadAction<{ + levelId: string; + sectionId: string; + }>) => { + const { levelId, sectionId } = action.payload; + const level = state.levels.find(w => w.id === levelId); + if (!level) return; + + const section = level.sections.find(l => l.id === sectionId); + if (!section) return; - unlockedLevels.forEach(({ worldId, levelId }: { worldId: string, levelId: string }) => { - const world = state.worlds.find(w => w.id === worldId); - const level = world?.levels.find(l => l.id === levelId); - if (level) { - level.isUnlocked = true; - } - }); + section.isComplete = true; + + // Unlock next section in the same level if it exists + const sectionIndex = level.sections.findIndex(l => l.id === sectionId); + if (sectionIndex < level.sections.length - 1) { + level.sections[sectionIndex + 1].isUnlocked = true; + } else { + // If this was the last section in the level + level.isComplete = true; + // Find and unlock first section of next level if it exists + const levelIndex = state.levels.findIndex(w => w.id === levelId); + if (levelIndex < state.levels.length - 1) { + state.levels[levelIndex + 1].sections[0].isUnlocked = true; + } } - }, + } } }); export const { - setCurrentWorld, setCurrentLevel, - addToInventory, + setCurrentSection, + placeWord, + addToInventory, removeFromInventory, - placeWord, checkSolution, - goBack, - loadSavedProgress, + markSectionComplete } = gameSlice.actions; export default gameSlice.reducer; \ No newline at end of file diff --git a/src/store/initialState.ts b/src/store/initialState.ts index 8532e46..32e23ce 100644 --- a/src/store/initialState.ts +++ b/src/store/initialState.ts @@ -1,134 +1,4 @@ import { GameState } from './types'; +import { parseGameData } from '../utils/gameDataParser'; -export const initialGameState: GameState = { - worlds: [ - { - id: 'world1', - name: 'Elements', - isUnlocked: true, - isCompleted: false, - levels: [ - { - id: 'level1', - name: 'Basic Elements', - isUnlocked: true, - isCompleted: false, - slots: [ - { id: 'slot111', acceptedWords: ['Strawberry', 'Apple', 'Rage'], currentWord: null, hintWord: 'Red' }, - { id: 'slot112', acceptedWords: ['Eggplant', 'Potato'], currentWord: null, hintWord: 'Purple' }, - { id: 'slot113', acceptedWords: ['Banana', 'Garlic', 'Potato', 'Lemon'], currentWord: null, hintWord: 'Yellow' }, - { id: 'slot114', acceptedWords: ['Lettuce', 'Kiwi', 'Strawberry', 'Money'], currentWord: null, hintWord: 'Green' }, - { id: 'slot115', acceptedWords: ['Blackberry'], currentWord: null, hintWord: 'Black' }, - ], - availableWords: [ - { id: 'w111', text: 'Strawberry' }, - { id: 'w112', text: 'Eggplant' }, - { id: 'w113', text: 'Banana' }, - { id: 'w114', text: 'Kiwi' }, - { id: 'w115', text: 'Blackberry' }, - - ] - }, - { - id: 'level2', - name: 'Fruits', - isUnlocked: false, - isCompleted: false, - slots: [ - { id: 'slot121', acceptedWords: ['Apple', 'Pumpkin'], currentWord: null, hintWord: 'Orange' }, - { id: 'slot122', acceptedWords: ['Blueberry', 'Sadness'], currentWord: null, hintWord: 'Blue' }, - { id: 'slot123', acceptedWords: ['Grape', 'Blueberry', 'Blackberry', 'Eggplant'], currentWord: null, hintWord: 'Purple' }, - { id: 'slot124', acceptedWords: ['Garlic', 'Strawberry', 'Potato'], currentWord: null, hintWord: 'White' }, - { id: 'slot125', acceptedWords: ['Kiwi', 'Potato', 'Banana'], currentWord: null, hintWord: 'Brown' } - ], - availableWords: [ - { id: 'w121', text: 'Apple' }, - { id: 'w122', text: 'Blueberry' }, - { id: 'w123', text: 'Grape' }, - { id: 'w124', text: 'Garlic' }, - { id: 'w125', text: 'Lettuce' }, - ] - }, - { - id: 'level3', - name: 'Vegetables', - isUnlocked: false, - isCompleted: false, - slots: [ - { id: 'slot131', acceptedWords: ['Apple', 'Banana', 'Grape', 'Kiwi', 'Blackberry', 'Blueberry', 'Eggplant', 'Strawberry', 'Lemon'], currentWord: null, hintWord: 'Fruit' }, - { id: 'slot132', acceptedWords: ['Lettuce', 'Garlic', 'Eggplant', 'Potato', 'Pumpkin'], currentWord: null, hintWord: 'Vegetable' }, - { id: 'slot133', acceptedWords: ['Strawberry', 'Blackberry', 'Kiwi', 'Blueberry'], currentWord: null, hintWord: 'Berry' }, - { id: 'slot134', acceptedWords: ['Lettuce', 'Garlic', 'Eggplant', 'Pumpkin', 'Potato'], currentWord: null, hintWord: 'Vegetable' }, - { id: 'slot135', acceptedWords: ['Apple', 'Banana', 'Grape', 'Kiwi', 'Blackberry', 'Blueberry', 'Eggplant', 'Strawberry', 'Lemon'], currentWord: null, hintWord: 'Fruit' } - ], - availableWords: [ - { id: 'w131', text: 'Sadness' }, // blue = sad synonym - { id: 'w132', text: 'Money' }, // green = envious synonym - { id: 'w133', text: 'Rage' }, // red = rage synonym - { id: 'w134', text: 'Potato' }, - { id: 'w135', text: 'Pumpkin' }, - ] - }, - { - id: 'level4', - name: 'Animals', - isUnlocked: false, - isCompleted: false, - slots: [ - { id: 'slot141', acceptedWords: ['Rose', 'River'], currentWord: null, hintWord: 'Flower' }, - { id: 'slot142', acceptedWords: [ - 'Strawberry', 'Kiwi', 'Garlic', 'Potato', 'Pumpkin', - 'Eggplant', 'Apple', 'Blueberry', 'Grape', 'Banana', - 'Blackberry', 'Rose', 'Lemon' - ], currentWord: null, hintWord: 'Plant' }, - { id: 'slot143', acceptedWords: ['Dog', 'Kiwi', 'Snake'], currentWord: null, hintWord: 'Animal' }, - { id: 'slot144', acceptedWords: ['Garlic', 'Kiwi'], currentWord: null, hintWord: 'Bird' }, - { id: 'slot145', acceptedWords: ['Dog'], currentWord: null, hintWord: 'Mammel' } - ], - availableWords: [ - { id: 'w141', text: 'Rose' }, - { id: 'w142', text: 'Lemon' }, - { id: 'w143', text: 'Dog' }, - { id: 'w144', text: 'River' }, - { id: 'w145', text: 'Snake' }, - ] - }, - { - id: 'level5', - name: 'Plants', - isUnlocked: false, - isCompleted: false, - slots: [ - { id: 'slot151', acceptedWords: ['Apple'], currentWord: null, hintWord: 'Orange' }, - { id: 'slot152', acceptedWords: ['Blueberry'], currentWord: null, hintWord: 'Blue' }, - { id: 'slot153', acceptedWords: ['Grape', 'Blueberry', 'Blackberry'], currentWord: null, hintWord: 'Purple' }, - { id: 'slot154', acceptedWords: ['Garlic', 'Strawberry'], currentWord: null, hintWord: 'White' }, - { id: 'slot155', acceptedWords: ['Kiwi'], currentWord: null, hintWord: 'Brown' } - ], - availableWords: [ - { id: 'w151', text: 'Apple' }, - { id: 'w152', text: 'Blueberry' }, - { id: 'w153', text: 'Grape' }, - { id: 'w154', text: 'Garlic' }, - { id: 'w155', text: 'Lettuce' }, - ] - }, - ] - } - ], - currentWorld: null, - currentLevel: null, - inventory: [] -}; - -// wind -// flower -// runner -// fire -// plant -// spring -// scale -// bat -// match - -// \ No newline at end of file +export const initialGameState: GameState = parseGameData(); \ No newline at end of file diff --git a/src/store/types.ts b/src/store/types.ts index 92c0b87..0072964 100644 --- a/src/store/types.ts +++ b/src/store/types.ts @@ -3,33 +3,62 @@ export interface Word { text: string; } +export interface Hint { + accepts: string[]; + emojis?: { [word: string]: string }; +} + +export interface HintDictionary { + [key: string]: Hint; +} + export interface Slot { id: string; - acceptedWords: string[]; + hintId: string; currentWord: Word | null; - hintWord: string; } -export interface Level { +export interface Section { id: string; name: string; - isUnlocked: boolean; - isCompleted: boolean; slots: Slot[]; availableWords: Word[]; + isComplete?: boolean; + isUnlocked?: boolean; } -export interface World { +export interface Level { id: string; name: string; - isUnlocked: boolean; - isCompleted: boolean; - levels: Level[]; + sections: Section[]; + isComplete?: boolean; + inventory: Word[]; } export interface GameState { - worlds: World[]; - currentWorld: string | null; + levels: Level[]; currentLevel: string | null; + currentSection: string | null; inventory: Word[]; + hints: HintDictionary; +} + +// Raw data interfaces (before transformation) +export type RawSlot = string; + +export interface RawSection { + name: string; + slots: RawSlot[]; + words: string[]; +} + +export interface RawLevel { + name: string; + sections: RawSection[]; +} + +export interface RawGameData { + hints: HintDictionary; + levels: RawLevel[]; + wordEmojis: { [word: string]: string }; } \ No newline at end of file diff --git a/src/styles/GameBoard.css b/src/styles/GameBoard.css new file mode 100644 index 0000000..71ad36c --- /dev/null +++ b/src/styles/GameBoard.css @@ -0,0 +1,50 @@ +.game-board-container { + min-height: calc(100vh - var(--navbar-height)); + background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); + padding: 1rem; + display: flex; + justify-content: center; + align-items: flex-start; + position: relative; + overflow: hidden; +} + +.game-board { + background: rgba(255, 255, 255, 0.95); + border-radius: 24px; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.2); + padding: 2rem; + width: 100%; + max-width: 1200px; + margin: 0 auto; + position: relative; + z-index: 1; +} + +.level-content { + padding: 0.5rem; +} + +.hint-word { + font-size: 2rem; + font-weight: 500; + margin-bottom: 0.5rem; + color: #424242; +} + +/* Responsive adjustments */ +@media (max-width: 768px) { + .game-board-container { + padding: 1rem; + } + + .game-board { + padding: 1rem; + } + + .level-content { + padding: 0.5rem; + } +} \ No newline at end of file diff --git a/src/styles/Home.css b/src/styles/Home.css new file mode 100644 index 0000000..659a571 --- /dev/null +++ b/src/styles/Home.css @@ -0,0 +1,166 @@ +.home-container { + min-height: calc(100vh - var(--navbar-height)); + background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); + display: flex; + justify-content: center; + align-items: center; + position: relative; + overflow: hidden; +} + +.hero-section { + text-align: center; + padding: 3rem 2rem 2rem; + max-width: 800px; + margin: 1rem; + background: rgba(255, 255, 255, 0.95); + border-radius: 24px; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.2); + position: relative; + z-index: 1; +} + +.title { + font-family: 'Outfit', sans-serif; + font-size: 3.5rem; + font-weight: 700; + color: #1a237e; + margin-bottom: 1.5rem; + text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1); +} + +.subtitle { + font-size: 1.2rem; + color: #424242; + margin-bottom: 2rem; + line-height: 1.8; +} + +.word-line { + margin: 1.5rem 0; + line-height: 2.2; +} + +.word-line:first-child { + margin-top: 0; +} + +.game-explanation { + margin-top: 2rem; + color: #666; + font-size: 1.1rem; +} + +.cta-buttons { + display: flex; + gap: 1rem; + justify-content: center; + margin-top: 2rem; + margin-bottom: 0; +} + +.play-button, +.leaderboard-button { + padding: 1rem 2rem; + font-size: 1.1rem; + border: none; + border-radius: 12px; + cursor: pointer; + font-weight: 600; + transition: all 0.3s ease; +} + +.play-button { + background: #2196f3; + color: white; + box-shadow: 0 4px 6px rgba(33, 150, 243, 0.3); +} + +.play-button:hover { + background: #1976d2; + transform: translateY(-2px); + box-shadow: 0 6px 8px rgba(33, 150, 243, 0.4); +} + +.leaderboard-button { + background: rgba(255, 255, 255, 0.9); + color: #2196f3; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); +} + +.leaderboard-button:hover { + background: white; + transform: translateY(-2px); + box-shadow: 0 6px 8px rgba(0, 0, 0, 0.15); +} + +.features-section { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 2rem; + padding: 2rem; + max-width: 1200px; + margin: 0 auto; +} + +.feature-card { + background: rgba(255, 255, 255, 0.9); + padding: 2rem; + border-radius: 16px; + text-align: center; + box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1); + transition: transform 0.3s ease; +} + +.feature-card:hover { + transform: translateY(-5px); +} + +.feature-icon { + font-size: 2.5rem; + margin-bottom: 1rem; +} + +.feature-card h3 { + color: #1a237e; + margin-bottom: 0.5rem; + font-size: 1.3rem; +} + +.feature-card p { + color: #666; + font-size: 1rem; + line-height: 1.5; +} + +@media (max-width: 768px) { + .title { + font-size: 2.5rem; + } + + .cta-buttons { + flex-direction: column; + } + + .features-section { + grid-template-columns: 1fr; + } +} + +/* Add falling words animation styles */ +@keyframes fall { + from { + transform: translateY(-100%); + } + to { + transform: translateY(100vh); + } +} + +.falling-word { + position: absolute; + animation: fall linear infinite; + pointer-events: none; +} \ No newline at end of file diff --git a/src/styles/Navbar.css b/src/styles/Navbar.css new file mode 100644 index 0000000..77760cf --- /dev/null +++ b/src/styles/Navbar.css @@ -0,0 +1,29 @@ +.custom-navbar { + backdrop-filter: blur(10px); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); +} + +.brand-link { + color: #1a237e !important; + text-decoration: none; + transition: color 0.3s ease; + font-family: 'Outfit', sans-serif; + font-weight: 600; + font-size: 1.4rem; + padding: 0.5rem 0; +} + +.brand-link:hover { + color: #151b60 !important; +} + +/* Mobile responsiveness */ +@media (max-width: 768px) { + .custom-navbar { + padding: 0.75rem; + } + + .brand-link { + font-size: 1.2rem; + } +} \ No newline at end of file diff --git a/src/styles/WorldSelect.css b/src/styles/WorldSelect.css new file mode 100644 index 0000000..6af3179 --- /dev/null +++ b/src/styles/WorldSelect.css @@ -0,0 +1,74 @@ +.world-select-container { + padding-top: 6rem; + min-height: 100vh; + background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); +} + +.world-select-title { + text-align: center; + color: #1a237e; + margin-bottom: 3rem; + font-weight: bold; + text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1); +} + +.worlds-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 2rem; + padding: 1rem; + max-width: 1200px; + margin: 0 auto; +} + +.world-card { + transition: transform 0.2s ease, box-shadow 0.2s ease; + cursor: pointer; + background: white; +} + +.world-card:hover:not(.disabled) { + transform: translateY(-5px); + box-shadow: 0 8px 15px rgba(0, 0, 0, 0.1) !important; +} + +.world-card.disabled { + opacity: 0.7; + cursor: not-allowed; + background: #f8f9fa; +} + +.world-icon-wrapper { + width: 64px; + height: 64px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + background: #2196f3; + color: white; +} + +.world-icon-wrapper.disabled { + background: #adb5bd; +} + +.container { + min-height: 100vh; + background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); + padding-top: 5rem !important; +} + +.card-title { + text-align: center; + font-size: 1.5rem; + margin-bottom: 1rem; + color: #1a237e; +} + +.card-text { + text-align: center; + color: #666; + font-size: 1rem; + line-height: 1.5; +} \ No newline at end of file diff --git a/src/utils/gameDataParser.ts b/src/utils/gameDataParser.ts new file mode 100644 index 0000000..52e7157 --- /dev/null +++ b/src/utils/gameDataParser.ts @@ -0,0 +1,50 @@ +import { GameState, RawGameData, Level, Section, Slot, Word } from '../store/types'; +import gameData from '../data/gameData.json'; + +function generateLevelId(levelIndex: number): string { + return `level_${levelIndex + 1}`; +} + +function generateSectionId(levelIndex: number, sectionIndex: number): string { + return `section_${levelIndex + 1}_${sectionIndex + 1}`; +} + +function generateSlotId(levelIndex: number, sectionIndex: number, slotIndex: number): string { + return `slot_${levelIndex + 1}_${sectionIndex + 1}_${slotIndex + 1}`; +} + +function generateWordId(levelIndex: number, sectionIndex: number, wordIndex: number): string { + return `word_${levelIndex + 1}_${sectionIndex + 1}_${wordIndex + 1}`; +} + +export function parseGameData(): GameState { + const rawData = gameData as RawGameData; + + return { + levels: rawData.levels.map((level, levelIndex) => ({ + id: generateLevelId(levelIndex), + name: level.name, + isComplete: false, + sections: level.sections.map((section, sectionIndex) => ({ + id: generateSectionId(levelIndex, sectionIndex), + name: section.name, + isUnlocked: levelIndex === 0 && sectionIndex === 0, // First section of first level is unlocked by default + isComplete: false, + slots: section.slots.map((hintId, slotIndex) => ({ + id: generateSlotId(levelIndex, sectionIndex, slotIndex), + hintId, + currentWord: null + })), + availableWords: section.words.map((word, wordIndex) => ({ + id: generateWordId(levelIndex, sectionIndex, wordIndex), + text: word + })) + })), + inventory: [] + })), + currentLevel: null, + currentSection: null, + inventory: [], + hints: rawData.hints + }; +} \ No newline at end of file diff --git a/test_output.txt b/test_output.txt new file mode 100644 index 0000000..8b0babe Binary files /dev/null and b/test_output.txt differ diff --git a/tsconfig.dev.json b/tsconfig.dev.json new file mode 100644 index 0000000..72c1d9f --- /dev/null +++ b/tsconfig.dev.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "skipLibCheck": true, + "noEmit": false, + "incremental": true, + "tsBuildInfoFile": "./node_modules/.cache/tsbuildinfo" + } +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index a273b0c..4bbd793 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,7 +18,9 @@ "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, - "jsx": "react-jsx" + "jsx": "react-jsx", + "incremental": true, + "noImplicitAny": false }, "include": [ "src" diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo new file mode 100644 index 0000000..b0dd8f7 --- /dev/null +++ b/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"program":{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/@types/react/ts5.0/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/prop-types/index.d.ts","./node_modules/@types/react/ts5.0/index.d.ts","./node_modules/@types/react/ts5.0/jsx-runtime.d.ts","./node_modules/@remix-run/router/dist/history.d.ts","./node_modules/@remix-run/router/dist/utils.d.ts","./node_modules/@remix-run/router/dist/router.d.ts","./node_modules/@remix-run/router/dist/index.d.ts","./node_modules/react-router/dist/lib/context.d.ts","./node_modules/react-router/dist/lib/components.d.ts","./node_modules/react-router/dist/lib/hooks.d.ts","./node_modules/react-router/dist/lib/deprecations.d.ts","./node_modules/react-router/dist/index.d.ts","./node_modules/react-router-dom/dist/dom.d.ts","./node_modules/react-router-dom/dist/index.d.ts","./node_modules/@types/react-dom/index.d.ts","./node_modules/react-redux/es/utils/reactBatchedUpdates.d.ts","./node_modules/redux/index.d.ts","./node_modules/react-redux/es/utils/Subscription.d.ts","./node_modules/@types/hoist-non-react-statics/index.d.ts","./node_modules/react-redux/es/connect/selectorFactory.d.ts","./node_modules/@types/use-sync-external-store/index.d.ts","./node_modules/@types/use-sync-external-store/with-selector.d.ts","./node_modules/react-redux/es/utils/useSyncExternalStore.d.ts","./node_modules/react-redux/es/components/connect.d.ts","./node_modules/react-redux/es/types.d.ts","./node_modules/react-redux/es/hooks/useSelector.d.ts","./node_modules/react-redux/es/components/Context.d.ts","./node_modules/react-redux/es/components/Provider.d.ts","./node_modules/react-redux/es/hooks/useDispatch.d.ts","./node_modules/react-redux/es/hooks/useStore.d.ts","./node_modules/react-redux/es/utils/shallowEqual.d.ts","./node_modules/react-redux/es/exports.d.ts","./node_modules/react-redux/es/index.d.ts","./node_modules/immer/dist/utils/env.d.ts","./node_modules/immer/dist/utils/errors.d.ts","./node_modules/immer/dist/types/types-external.d.ts","./node_modules/immer/dist/types/types-internal.d.ts","./node_modules/immer/dist/utils/common.d.ts","./node_modules/immer/dist/utils/plugins.d.ts","./node_modules/immer/dist/core/scope.d.ts","./node_modules/immer/dist/core/finalize.d.ts","./node_modules/immer/dist/core/proxy.d.ts","./node_modules/immer/dist/core/immerClass.d.ts","./node_modules/immer/dist/core/current.d.ts","./node_modules/immer/dist/internal.d.ts","./node_modules/immer/dist/plugins/es5.d.ts","./node_modules/immer/dist/plugins/patches.d.ts","./node_modules/immer/dist/plugins/mapset.d.ts","./node_modules/immer/dist/plugins/all.d.ts","./node_modules/immer/dist/immer.d.ts","./node_modules/reselect/es/versionedTypes/ts47-mergeParameters.d.ts","./node_modules/reselect/es/types.d.ts","./node_modules/reselect/es/defaultMemoize.d.ts","./node_modules/reselect/es/index.d.ts","./node_modules/@reduxjs/toolkit/dist/createDraftSafeSelector.d.ts","./node_modules/redux-thunk/es/types.d.ts","./node_modules/redux-thunk/es/index.d.ts","./node_modules/@reduxjs/toolkit/dist/devtoolsExtension.d.ts","./node_modules/@reduxjs/toolkit/dist/actionCreatorInvariantMiddleware.d.ts","./node_modules/@reduxjs/toolkit/dist/immutableStateInvariantMiddleware.d.ts","./node_modules/@reduxjs/toolkit/dist/serializableStateInvariantMiddleware.d.ts","./node_modules/@reduxjs/toolkit/dist/utils.d.ts","./node_modules/@reduxjs/toolkit/dist/tsHelpers.d.ts","./node_modules/@reduxjs/toolkit/dist/getDefaultMiddleware.d.ts","./node_modules/@reduxjs/toolkit/dist/configureStore.d.ts","./node_modules/@reduxjs/toolkit/dist/createAction.d.ts","./node_modules/@reduxjs/toolkit/dist/mapBuilders.d.ts","./node_modules/@reduxjs/toolkit/dist/createReducer.d.ts","./node_modules/@reduxjs/toolkit/dist/createSlice.d.ts","./node_modules/@reduxjs/toolkit/dist/entities/models.d.ts","./node_modules/@reduxjs/toolkit/dist/entities/create_adapter.d.ts","./node_modules/@reduxjs/toolkit/dist/createAsyncThunk.d.ts","./node_modules/@reduxjs/toolkit/dist/matchers.d.ts","./node_modules/@reduxjs/toolkit/dist/nanoid.d.ts","./node_modules/@reduxjs/toolkit/dist/isPlainObject.d.ts","./node_modules/@reduxjs/toolkit/dist/listenerMiddleware/exceptions.d.ts","./node_modules/@reduxjs/toolkit/dist/listenerMiddleware/types.d.ts","./node_modules/@reduxjs/toolkit/dist/listenerMiddleware/index.d.ts","./node_modules/@reduxjs/toolkit/dist/autoBatchEnhancer.d.ts","./node_modules/@reduxjs/toolkit/dist/index.d.ts","./src/data/gameData.json","./src/store/types.ts","./src/store/gameSlice.ts","./src/store/store.ts","./node_modules/react-bootstrap/esm/AccordionContext.d.ts","./node_modules/@restart/ui/esm/types.d.ts","./node_modules/react-bootstrap/esm/helpers.d.ts","./node_modules/react-bootstrap/esm/AccordionButton.d.ts","./node_modules/@types/react-transition-group/Transition.d.ts","./node_modules/react-bootstrap/esm/Collapse.d.ts","./node_modules/react-bootstrap/esm/AccordionCollapse.d.ts","./node_modules/react-bootstrap/esm/AccordionItem.d.ts","./node_modules/react-bootstrap/esm/AccordionHeader.d.ts","./node_modules/react-bootstrap/esm/AccordionBody.d.ts","./node_modules/react-bootstrap/esm/Accordion.d.ts","./node_modules/react-bootstrap/esm/CloseButton.d.ts","./node_modules/@popperjs/core/lib/enums.d.ts","./node_modules/@popperjs/core/lib/modifiers/popperOffsets.d.ts","./node_modules/@popperjs/core/lib/modifiers/flip.d.ts","./node_modules/@popperjs/core/lib/modifiers/hide.d.ts","./node_modules/@popperjs/core/lib/modifiers/offset.d.ts","./node_modules/@popperjs/core/lib/modifiers/eventListeners.d.ts","./node_modules/@popperjs/core/lib/modifiers/computeStyles.d.ts","./node_modules/@popperjs/core/lib/modifiers/arrow.d.ts","./node_modules/@popperjs/core/lib/modifiers/preventOverflow.d.ts","./node_modules/@popperjs/core/lib/modifiers/applyStyles.d.ts","./node_modules/@popperjs/core/lib/types.d.ts","./node_modules/@popperjs/core/lib/modifiers/index.d.ts","./node_modules/@popperjs/core/lib/utils/detectOverflow.d.ts","./node_modules/@popperjs/core/lib/createPopper.d.ts","./node_modules/@popperjs/core/lib/popper-lite.d.ts","./node_modules/@popperjs/core/lib/popper.d.ts","./node_modules/@popperjs/core/lib/index.d.ts","./node_modules/@popperjs/core/index.d.ts","./node_modules/@restart/ui/esm/usePopper.d.ts","./node_modules/react-bootstrap/esm/types.d.ts","./node_modules/react-bootstrap/esm/AlertLink.d.ts","./node_modules/react-bootstrap/esm/AlertHeading.d.ts","./node_modules/react-bootstrap/esm/Alert.d.ts","./node_modules/@restart/ui/esm/Anchor.d.ts","./node_modules/react-bootstrap/esm/Anchor.d.ts","./node_modules/react-bootstrap/esm/Badge.d.ts","./node_modules/react-bootstrap/esm/BreadcrumbItem.d.ts","./node_modules/react-bootstrap/esm/Breadcrumb.d.ts","./node_modules/@restart/ui/esm/Button.d.ts","./node_modules/react-bootstrap/esm/Button.d.ts","./node_modules/react-bootstrap/esm/ButtonGroup.d.ts","./node_modules/react-bootstrap/esm/ButtonToolbar.d.ts","./node_modules/react-bootstrap/esm/CardImg.d.ts","./node_modules/react-bootstrap/esm/CardTitle.d.ts","./node_modules/react-bootstrap/esm/CardSubtitle.d.ts","./node_modules/react-bootstrap/esm/CardBody.d.ts","./node_modules/react-bootstrap/esm/CardLink.d.ts","./node_modules/react-bootstrap/esm/CardText.d.ts","./node_modules/react-bootstrap/esm/CardHeader.d.ts","./node_modules/react-bootstrap/esm/CardFooter.d.ts","./node_modules/react-bootstrap/esm/CardImgOverlay.d.ts","./node_modules/react-bootstrap/esm/Card.d.ts","./node_modules/react-bootstrap/esm/CardGroup.d.ts","./node_modules/react-bootstrap/esm/CarouselCaption.d.ts","./node_modules/react-bootstrap/esm/CarouselItem.d.ts","./node_modules/react-bootstrap/esm/Carousel.d.ts","./node_modules/react-bootstrap/esm/Col.d.ts","./node_modules/react-bootstrap/esm/Container.d.ts","./node_modules/@restart/ui/esm/DropdownContext.d.ts","./node_modules/@restart/ui/esm/useClickOutside.d.ts","./node_modules/@restart/ui/esm/DropdownMenu.d.ts","./node_modules/@restart/ui/esm/DropdownToggle.d.ts","./node_modules/@restart/ui/esm/DropdownItem.d.ts","./node_modules/@restart/ui/esm/Dropdown.d.ts","./node_modules/react-bootstrap/esm/DropdownContext.d.ts","./node_modules/react-bootstrap/esm/DropdownToggle.d.ts","./node_modules/react-bootstrap/esm/DropdownMenu.d.ts","./node_modules/react-bootstrap/esm/DropdownItem.d.ts","./node_modules/react-bootstrap/esm/DropdownItemText.d.ts","./node_modules/react-bootstrap/esm/DropdownDivider.d.ts","./node_modules/react-bootstrap/esm/DropdownHeader.d.ts","./node_modules/react-bootstrap/esm/Dropdown.d.ts","./node_modules/react-bootstrap/esm/DropdownButton.d.ts","./node_modules/react-bootstrap/esm/Fade.d.ts","./node_modules/react-bootstrap/esm/Image.d.ts","./node_modules/react-bootstrap/esm/FigureCaption.d.ts","./node_modules/react-bootstrap/esm/Figure.d.ts","./node_modules/react-bootstrap/esm/FigureImage.d.ts","./node_modules/react-bootstrap/esm/FormGroup.d.ts","./node_modules/react-bootstrap/esm/Feedback.d.ts","./node_modules/react-bootstrap/esm/FormControl.d.ts","./node_modules/react-bootstrap/esm/FormFloating.d.ts","./node_modules/react-bootstrap/esm/FormCheckInput.d.ts","./node_modules/react-bootstrap/esm/FormCheckLabel.d.ts","./node_modules/react-bootstrap/esm/FormCheck.d.ts","./node_modules/react-bootstrap/esm/FormLabel.d.ts","./node_modules/react-bootstrap/esm/FormText.d.ts","./node_modules/react-bootstrap/esm/FormRange.d.ts","./node_modules/react-bootstrap/esm/FormSelect.d.ts","./node_modules/react-bootstrap/esm/FloatingLabel.d.ts","./node_modules/react-bootstrap/esm/Form.d.ts","./node_modules/react-bootstrap/esm/InputGroupText.d.ts","./node_modules/react-bootstrap/esm/InputGroup.d.ts","./node_modules/@restart/ui/esm/NavItem.d.ts","./node_modules/@restart/ui/esm/Nav.d.ts","./node_modules/react-bootstrap/esm/ListGroupItem.d.ts","./node_modules/react-bootstrap/esm/ListGroup.d.ts","./node_modules/@restart/ui/esm/ModalManager.d.ts","./node_modules/@restart/ui/esm/useWaitForDOMRef.d.ts","./node_modules/@restart/ui/esm/ImperativeTransition.d.ts","./node_modules/@restart/ui/esm/Modal.d.ts","./node_modules/react-bootstrap/esm/ModalBody.d.ts","./node_modules/react-bootstrap/esm/AbstractModalHeader.d.ts","./node_modules/react-bootstrap/esm/ModalHeader.d.ts","./node_modules/react-bootstrap/esm/ModalTitle.d.ts","./node_modules/react-bootstrap/esm/ModalFooter.d.ts","./node_modules/react-bootstrap/esm/ModalDialog.d.ts","./node_modules/react-bootstrap/esm/Modal.d.ts","./node_modules/react-bootstrap/esm/NavItem.d.ts","./node_modules/react-bootstrap/esm/NavLink.d.ts","./node_modules/react-bootstrap/esm/Nav.d.ts","./node_modules/react-bootstrap/esm/NavbarBrand.d.ts","./node_modules/react-bootstrap/esm/NavbarCollapse.d.ts","./node_modules/react-bootstrap/esm/OffcanvasBody.d.ts","./node_modules/react-bootstrap/esm/OffcanvasHeader.d.ts","./node_modules/react-bootstrap/esm/OffcanvasTitle.d.ts","./node_modules/react-bootstrap/esm/Offcanvas.d.ts","./node_modules/react-bootstrap/esm/NavbarOffcanvas.d.ts","./node_modules/react-bootstrap/esm/NavbarText.d.ts","./node_modules/react-bootstrap/esm/NavbarToggle.d.ts","./node_modules/react-bootstrap/esm/Navbar.d.ts","./node_modules/react-bootstrap/esm/NavDropdown.d.ts","./node_modules/react-bootstrap/esm/OffcanvasToggling.d.ts","./node_modules/@restart/ui/esm/useRootClose.d.ts","./node_modules/@restart/ui/esm/Overlay.d.ts","./node_modules/react-bootstrap/esm/Overlay.d.ts","./node_modules/react-bootstrap/esm/OverlayTrigger.d.ts","./node_modules/react-bootstrap/esm/PageItem.d.ts","./node_modules/react-bootstrap/esm/Pagination.d.ts","./node_modules/react-bootstrap/esm/usePlaceholder.d.ts","./node_modules/react-bootstrap/esm/PlaceholderButton.d.ts","./node_modules/react-bootstrap/esm/Placeholder.d.ts","./node_modules/react-bootstrap/esm/PopoverHeader.d.ts","./node_modules/react-bootstrap/esm/PopoverBody.d.ts","./node_modules/react-bootstrap/esm/Popover.d.ts","./node_modules/react-bootstrap/esm/ProgressBar.d.ts","./node_modules/react-bootstrap/esm/Ratio.d.ts","./node_modules/react-bootstrap/esm/Row.d.ts","./node_modules/react-bootstrap/esm/Spinner.d.ts","./node_modules/react-bootstrap/esm/SplitButton.d.ts","./node_modules/@react-aria/ssr/dist/types.d.ts","./node_modules/@restart/ui/esm/ssr.d.ts","./node_modules/react-bootstrap/esm/SSRProvider.d.ts","./node_modules/react-bootstrap/esm/createUtilityClasses.d.ts","./node_modules/react-bootstrap/esm/Stack.d.ts","./node_modules/react-bootstrap/esm/TabPane.d.ts","./node_modules/@restart/ui/esm/TabPanel.d.ts","./node_modules/@restart/ui/esm/Tabs.d.ts","./node_modules/react-bootstrap/esm/TabContainer.d.ts","./node_modules/react-bootstrap/esm/TabContent.d.ts","./node_modules/react-bootstrap/esm/Tab.d.ts","./node_modules/react-bootstrap/esm/Table.d.ts","./node_modules/react-bootstrap/esm/Tabs.d.ts","./node_modules/react-bootstrap/esm/ThemeProvider.d.ts","./node_modules/react-bootstrap/esm/ToastBody.d.ts","./node_modules/react-bootstrap/esm/ToastHeader.d.ts","./node_modules/react-bootstrap/esm/Toast.d.ts","./node_modules/react-bootstrap/esm/ToastContainer.d.ts","./node_modules/react-bootstrap/esm/ToggleButton.d.ts","./node_modules/react-bootstrap/esm/ToggleButtonGroup.d.ts","./node_modules/react-bootstrap/esm/Tooltip.d.ts","./node_modules/react-bootstrap/esm/index.d.ts","./node_modules/react-icons/lib/cjs/iconsManifest.d.ts","./node_modules/react-icons/lib/cjs/iconBase.d.ts","./node_modules/react-icons/lib/cjs/iconContext.d.ts","./node_modules/react-icons/lib/cjs/index.d.ts","./node_modules/react-icons/fa/index.d.ts","./src/components/Navbar.tsx","./src/components/FallingWords.tsx","./src/components/WordTile.tsx","./src/components/Home.tsx","./src/components/LevelSelector.tsx","./src/components/TutorialOverlay.tsx","./src/components/GameBoard.tsx","./src/App.tsx","./src/App.test.tsx","./node_modules/@types/react-dom/client.d.ts","./node_modules/web-vitals/dist/modules/types.d.ts","./node_modules/web-vitals/dist/modules/getCLS.d.ts","./node_modules/web-vitals/dist/modules/getFCP.d.ts","./node_modules/web-vitals/dist/modules/getFID.d.ts","./node_modules/web-vitals/dist/modules/getLCP.d.ts","./node_modules/web-vitals/dist/modules/getTTFB.d.ts","./node_modules/web-vitals/dist/modules/index.d.ts","./src/reportWebVitals.ts","./src/index.tsx","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/ts5.6/globals.typedarray.d.ts","./node_modules/@types/node/ts5.6/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/dom-events.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/ts5.6/index.d.ts","./node_modules/react-scripts/lib/react-app.d.ts","./src/react-app-env.d.ts","./src/setupTests.ts","./src/components/Inventory.tsx","./src/components/WorldSelector.tsx","./src/types/game.ts","./src/context/GameContext.tsx","./src/store/initialState.ts","./tsconfig.json","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@types/babel__generator/index.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@types/babel__template/index.d.ts","./node_modules/@types/babel__traverse/index.d.ts","./node_modules/@types/babel__core/index.d.ts","./node_modules/@types/connect/index.d.ts","./node_modules/@types/body-parser/index.d.ts","./node_modules/@types/bonjour/index.d.ts","./node_modules/@types/mime/index.d.ts","./node_modules/@types/send/index.d.ts","./node_modules/@types/qs/index.d.ts","./node_modules/@types/range-parser/index.d.ts","./node_modules/@types/express-serve-static-core/index.d.ts","./node_modules/@types/connect-history-api-fallback/index.d.ts","./node_modules/@types/eslint/helpers.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/@types/json-schema/index.d.ts","./node_modules/@types/eslint/index.d.ts","./node_modules/@types/eslint-scope/index.d.ts","./node_modules/@types/http-errors/index.d.ts","./node_modules/@types/serve-static/index.d.ts","./node_modules/@types/express/node_modules/@types/express-serve-static-core/index.d.ts","./node_modules/@types/express/index.d.ts","./node_modules/@types/graceful-fs/index.d.ts","./node_modules/@types/history/DOMUtils.d.ts","./node_modules/@types/history/createBrowserHistory.d.ts","./node_modules/@types/history/createHashHistory.d.ts","./node_modules/@types/history/createMemoryHistory.d.ts","./node_modules/@types/history/LocationUtils.d.ts","./node_modules/@types/history/PathUtils.d.ts","./node_modules/@types/history/index.d.ts","./node_modules/@types/html-minifier-terser/index.d.ts","./node_modules/@types/http-proxy/index.d.ts","./node_modules/@types/istanbul-lib-coverage/index.d.ts","./node_modules/@types/istanbul-lib-report/index.d.ts","./node_modules/@types/istanbul-reports/index.d.ts","./node_modules/@types/json5/index.d.ts","./node_modules/@types/node-forge/index.d.ts","./node_modules/@types/parse-json/index.d.ts","./node_modules/@types/prettier/index.d.ts","./node_modules/@types/q/index.d.ts","./node_modules/@types/react-redux/index.d.ts","./node_modules/@types/react-router/index.d.ts","./node_modules/@types/react-router-dom/index.d.ts","./node_modules/@types/react-transition-group/config.d.ts","./node_modules/@types/react-transition-group/CSSTransition.d.ts","./node_modules/@types/react-transition-group/SwitchTransition.d.ts","./node_modules/@types/react-transition-group/TransitionGroup.d.ts","./node_modules/@types/react-transition-group/index.d.ts","./node_modules/@types/resolve/index.d.ts","./node_modules/@types/retry/index.d.ts","./node_modules/@types/semver/classes/semver.d.ts","./node_modules/@types/semver/functions/parse.d.ts","./node_modules/@types/semver/functions/valid.d.ts","./node_modules/@types/semver/functions/clean.d.ts","./node_modules/@types/semver/functions/inc.d.ts","./node_modules/@types/semver/functions/diff.d.ts","./node_modules/@types/semver/functions/major.d.ts","./node_modules/@types/semver/functions/minor.d.ts","./node_modules/@types/semver/functions/patch.d.ts","./node_modules/@types/semver/functions/prerelease.d.ts","./node_modules/@types/semver/functions/compare.d.ts","./node_modules/@types/semver/functions/rcompare.d.ts","./node_modules/@types/semver/functions/compare-loose.d.ts","./node_modules/@types/semver/functions/compare-build.d.ts","./node_modules/@types/semver/functions/sort.d.ts","./node_modules/@types/semver/functions/rsort.d.ts","./node_modules/@types/semver/functions/gt.d.ts","./node_modules/@types/semver/functions/lt.d.ts","./node_modules/@types/semver/functions/eq.d.ts","./node_modules/@types/semver/functions/neq.d.ts","./node_modules/@types/semver/functions/gte.d.ts","./node_modules/@types/semver/functions/lte.d.ts","./node_modules/@types/semver/functions/cmp.d.ts","./node_modules/@types/semver/functions/coerce.d.ts","./node_modules/@types/semver/classes/comparator.d.ts","./node_modules/@types/semver/classes/range.d.ts","./node_modules/@types/semver/functions/satisfies.d.ts","./node_modules/@types/semver/ranges/max-satisfying.d.ts","./node_modules/@types/semver/ranges/min-satisfying.d.ts","./node_modules/@types/semver/ranges/to-comparators.d.ts","./node_modules/@types/semver/ranges/min-version.d.ts","./node_modules/@types/semver/ranges/valid.d.ts","./node_modules/@types/semver/ranges/outside.d.ts","./node_modules/@types/semver/ranges/gtr.d.ts","./node_modules/@types/semver/ranges/ltr.d.ts","./node_modules/@types/semver/ranges/intersects.d.ts","./node_modules/@types/semver/ranges/simplify.d.ts","./node_modules/@types/semver/ranges/subset.d.ts","./node_modules/@types/semver/internals/identifiers.d.ts","./node_modules/@types/semver/index.d.ts","./node_modules/@types/serve-index/index.d.ts","./node_modules/@types/sockjs/index.d.ts","./node_modules/@types/stack-utils/index.d.ts","./node_modules/@types/trusted-types/lib/index.d.ts","./node_modules/@types/trusted-types/index.d.ts","./node_modules/@types/warning/index.d.ts","./node_modules/@types/ws/index.d.ts","./node_modules/@types/yargs-parser/index.d.ts","./node_modules/@types/yargs/index.d.ts","./src/components/SolutionsCounter.tsx","./src/utils/gameDataParser.ts"],"fileInfos":[{"version":"8730f4bf322026ff5229336391a18bcaa1f94d4f82416c8b2f3954e2ccaae2ba","affectsGlobalScope":true},"dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6","7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467","8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9","5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06","4b421cbfb3a38a27c279dec1e9112c3d1da296f77a1a85ddadf7e7a425d45d18","1fc5ab7a764205c68fa10d381b08417795fc73111d6dd16b5b1ed36badb743d9","746d62152361558ea6d6115cf0da4dd10ede041d14882ede3568bce5dc4b4f1f","d11a03592451da2d1065e09e61f4e2a9bf68f780f4f6623c18b57816a9679d17","aea179452def8a6152f98f63b191b84e7cbd69b0e248c91e61fb2e52328abe8c",{"version":"3aafcb693fe5b5c3bd277bd4c3a617b53db474fe498fc5df067c5603b1eebde7","affectsGlobalScope":true},{"version":"f3d4da15233e593eacb3965cde7960f3fddf5878528d882bcedd5cbaba0193c7","affectsGlobalScope":true},{"version":"adb996790133eb33b33aadb9c09f15c2c575e71fb57a62de8bf74dbf59ec7dfb","affectsGlobalScope":true},{"version":"8cc8c5a3bac513368b0157f3d8b31cfdcfe78b56d3724f30f80ed9715e404af8","affectsGlobalScope":true},{"version":"cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a","affectsGlobalScope":true},{"version":"c5c05907c02476e4bde6b7e76a79ffcd948aedd14b6a8f56e4674221b0417398","affectsGlobalScope":true},{"version":"5f406584aef28a331c36523df688ca3650288d14f39c5d2e555c95f0d2ff8f6f","affectsGlobalScope":true},{"version":"22f230e544b35349cfb3bd9110b6ef37b41c6d6c43c3314a31bd0d9652fcec72","affectsGlobalScope":true},{"version":"7ea0b55f6b315cf9ac2ad622b0a7813315bb6e97bf4bb3fbf8f8affbca7dc695","affectsGlobalScope":true},{"version":"3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93","affectsGlobalScope":true},{"version":"eb26de841c52236d8222f87e9e6a235332e0788af8c87a71e9e210314300410a","affectsGlobalScope":true},{"version":"3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006","affectsGlobalScope":true},{"version":"17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a","affectsGlobalScope":true},{"version":"7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98","affectsGlobalScope":true},{"version":"6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577","affectsGlobalScope":true},{"version":"81cac4cbc92c0c839c70f8ffb94eb61e2d32dc1c3cf6d95844ca099463cf37ea","affectsGlobalScope":true},{"version":"b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e","affectsGlobalScope":true},{"version":"0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a","affectsGlobalScope":true},{"version":"da233fc1c8a377ba9e0bed690a73c290d843c2c3d23a7bd7ec5cd3d7d73ba1e0","affectsGlobalScope":true},{"version":"d154ea5bb7f7f9001ed9153e876b2d5b8f5c2bb9ec02b3ae0d239ec769f1f2ae","affectsGlobalScope":true},{"version":"bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c","affectsGlobalScope":true},{"version":"c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8","affectsGlobalScope":true},{"version":"9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951","affectsGlobalScope":true},{"version":"6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de","affectsGlobalScope":true},{"version":"6e7997ef61de3132e4d4b2250e75343f487903ddf5370e7ce33cf1b9db9a63ed","affectsGlobalScope":true},{"version":"2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993","affectsGlobalScope":true},{"version":"5e5e095c4470c8bab227dbbc61374878ecead104c74ab9960d3adcccfee23205","affectsGlobalScope":true},{"version":"09aa50414b80c023553090e2f53827f007a301bc34b0495bfb2c3c08ab9ad1eb","affectsGlobalScope":true},{"version":"d7f680a43f8cd12a6b6122c07c54ba40952b0c8aa140dcfcf32eb9e6cb028596","affectsGlobalScope":true},{"version":"3787b83e297de7c315d55d4a7c546ae28e5f6c0a361b7a1dcec1f1f50a54ef11","affectsGlobalScope":true},{"version":"e7e8e1d368290e9295ef18ca23f405cf40d5456fa9f20db6373a61ca45f75f40","affectsGlobalScope":true},{"version":"faf0221ae0465363c842ce6aa8a0cbda5d9296940a8e26c86e04cc4081eea21e","affectsGlobalScope":true},{"version":"06393d13ea207a1bfe08ec8d7be562549c5e2da8983f2ee074e00002629d1871","affectsGlobalScope":true},{"version":"2768ef564cfc0689a1b76106c421a2909bdff0acbe87da010785adab80efdd5c","affectsGlobalScope":true},{"version":"b248e32ca52e8f5571390a4142558ae4f203ae2f94d5bac38a3084d529ef4e58","affectsGlobalScope":true},{"version":"6c55633c733c8378db65ac3da7a767c3cf2cf3057f0565a9124a16a3a2019e87","affectsGlobalScope":true},{"version":"fb4416144c1bf0323ccbc9afb0ab289c07312214e8820ad17d709498c865a3fe","affectsGlobalScope":true},{"version":"5b0ca94ec819d68d33da516306c15297acec88efeb0ae9e2b39f71dbd9685ef7","affectsGlobalScope":true},{"version":"34c839eaaa6d78c8674ae2c37af2236dee6831b13db7b4ef4df3ec889a04d4f2","affectsGlobalScope":true},{"version":"34478567f8a80171f88f2f30808beb7da15eac0538ae91282dd33dce928d98ed","affectsGlobalScope":true},{"version":"ab7d58e6161a550ff92e5aff755dc37fe896245348332cd5f1e1203479fe0ed1","affectsGlobalScope":true},{"version":"6bda95ea27a59a276e46043b7065b55bd4b316c25e70e29b572958fa77565d43","affectsGlobalScope":true},{"version":"aedb8de1abb2ff1095c153854a6df7deae4a5709c37297f9d6e9948b6806fa66","affectsGlobalScope":true},{"version":"a4da0551fd39b90ca7ce5f68fb55d4dc0c1396d589b612e1902f68ee090aaada","affectsGlobalScope":true},{"version":"11ffe3c281f375fff9ffdde8bbec7669b4dd671905509079f866f2354a788064","affectsGlobalScope":true},{"version":"52d1bb7ab7a3306fd0375c8bff560feed26ed676a5b0457fa8027b563aecb9a4","affectsGlobalScope":true},{"version":"36a2e4c9a67439aca5f91bb304611d5ae6e20d420503e96c230cf8fcdc948d94","affectsGlobalScope":true},"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee",{"version":"759efc21a5ff1954e060fa54ddb4a739132b090a43ef9ee6fd63c7838bb07743","affectsGlobalScope":true},"016fe1e807dfdb88e8773616dde55bd04c087675662a393f20b1ec213b4a2b74","5af7c35a9c5c4760fd084fedb6ba4c7059ac9598b410093e5312ac10616bf17b","84bab568c7d984207ed4d872820e5b8185f1de19e0f42e906c8dcdb20e029154","3c8c1edb7ed8a842cb14d9f2ba6863183168a9fc8d6aa15dec221ebf8b946393","0a6e1a3f199d6cc3df0410b4df05a914987b1e152c4beacfd0c5142e15302cac","ec3c1376b4f34b271b1815674546fe09a2f449b0773afd381bbce7eb2f96a731","c2a262a3157e868d279327daf428dd629bd485f825800c8e62b001e6c879aff6","f7e84f314f9276b44b707289446303db8ef34a6c2c6d6b08d03a76e168367072","2b493706eb7879d42a8e8009379292b59827d612ab3a275bc476f87e60259c79","5542628b04d7bd4e0cd4871b6791b3b936a917ac6b819dcd20487f040acb01f1","f07b335f87cfac999fc1da00dfbc616837ced55be67bcaa41524d475b7394554",{"version":"938326adb4731184e14e17fc57fca2a3b69c337ef8d6c00c65d73472fe8feca4","affectsGlobalScope":true},"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","ca319b3b4e8c9c09d27bf3f3c4051bd56a4dc76977cc7a4daf5ad697ec9d605e",{"version":"fd624f7d7b264922476685870f08c5e1c6d6a0f05dee2429a9747b41f6b699d4","affectsGlobalScope":true},"abc162795ad6bf4fc3cf77dd02839ecfb12db1e3d81f817802caa1ce2997b233","b2d0630483bf337ef9dac326c3334a245aa4946e9f60f12baf7da5be44beafbb","5511d10f5955ddf1ba0df5be8a868c22c4c9b52ba6c23fef68cdbd25c8531ed5","61f41da9aaa809e5142b1d849d4e70f3e09913a5cb32c629bf6e61ef27967ff7","da0195f35a277ff34bb5577062514ce75b7a1b12f476d6be3d4489e26fcf00d8","0fdd32135a5a990ce5f3c4439249e4635e2d439161cfad2b00d1c88673948b5e","4bf386c871996a1b4da46fc597d3c16a1f3ddae19527c1551edd833239619219","c3ad993d4903afc006893e88e7ad2bae164e7137f7cd2a0ef1648ff4df4a2490","feaf45e9cfacd68dfdf466a0e0c2c6fa148cccf41e14a458c4d0424af7e94dfb","d33bf1137240c5d0b1949f121aed548bc05e644bb77fdc0070bf716d04491eb9","dbc614c36021e3813a771b426f2522a1dd3641d1fc137f99a145cb499da1b8c3","d2194a2e7680ad3c2d9a75391ba0b0179818ca1dc4abed6caac815a7513c7913","601bf048b074ce1238a426bccd1970330b30297b1a5e063b5910750c631994f1","0fc1fb55c2de7daac4f2378f0a5993ad9c369f6e449a9c87c604c2e78f00f12b","7082184f76e40fcf9562beb1c3d74f3441091501bd4bf4469fe6ced570664b09","6be1912935b6e4430e155de14077a6b443254a4e79a0b836484f6b2d510f6ff1","4df0891b133884cd9ed752d31c7d0ec0a09234e9ed5394abffd3c660761598db","b603b62d3dcd31ef757dc7339b4fa8acdbca318b0fb9ac485f9a1351955615f9","e642bd47b75ad6b53cbf0dfd7ddfa0f120bd10193f0c58ec37d87b59bf604aca","be90b24d2ee6f875ce3aaa482e7c41a54278856b03d04212681c4032df62baf9","78f5ff400b3cb37e7b90eef1ff311253ed31c8cb66505e9828fad099bffde021","372c47090e1131305d163469a895ff2938f33fa73aad988df31cd31743f9efb6","71c67dc6987bdbd5599353f90009ff825dd7db0450ef9a0aee5bb0c574d18512","6f12403b5eca6ae7ca8e3efe3eeb9c683b06ce3e3844ccfd04098d83cd7e4957","282c535df88175d64d9df4550d2fd1176fd940c1c6822f1e7584003237f179d3","c3a4752cf103e4c6034d5bd449c8f9d5e7b352d22a5f8f9a41a8efb11646f9c2","11a9e38611ac3c77c74240c58b6bd64a0032128b29354e999650f1de1e034b1c","4ed103ca6fff9cb244f7c4b86d1eb28ce8069c32db720784329946731badb5bb","d738f282842970e058672663311c6875482ee36607c88b98ffb6604fba99cb2a","ec859cd8226aa623e41bbb47c249a55ee16dc1b8647359585244d57d3a5ed0c7","8891c6e959d253a66434ff5dc9ae46058fb3493e84b4ca39f710ef2d350656b1","c4463cf02535444dcbc3e67ecd29f1972490f74e49957d6fd4282a1013796ba6","0cb0a957ff02de0b25fd0f3f37130ca7f22d1e0dea256569c714c1f73c6791f8","09c17c97eea458ebbabe6829c89d2e39e14b0f552e2a0edccd8dfcfb073a9224","344f2a247086a9f0da967f57fb771f1a2bcc53ef198e6f1293ef9c6073eb93e8","86e96c0b147a9bc378c5e3522156e4ad1334443edb6196b6e2c72ec98e9f7802","5ec92337be24b714732dbb7f4fa72008e92c890b0096a876b8481999f58d7c79","97f3c7370f9a2e28c695893b0109df679932a1cde3c1424003d92581f1b8dda7","d50a158fc581be7b1c51253ad33cb29c0a8ce3c42ca38775ffadf104c36376d0","1f2cdbf59d0b7933678a64ac26ae2818c48ff9ebf93249dde775dc3e173e16bf","62d5bea6d7dd2e9753fb9e0e47a6f401a43a51a3a36fe5082a0a5c200588754c","8fcc8b86f321e4c54820f57ccd0dcbeb0290c14bc05192fea8a096b0fc2be220","a4e0582d077bc6d43c39b60ddb23445c90981540240146e78b41cef285ae26c4","d511b029eaee4f1ec172e75357e21295c9d99690e6d834326bccd16d1a7a8527","89d63fe39f7262f62364de0a99c6be23b9b99841d4d22dee3720e7fd9982bb3d","d37b3eade1a85e9f19a397f790c8a6184ae61efafa97371a1ddff09923727ae7","c876fb242f4dc701f441c984a2136bee5faf52f90244cdc83074104a8fa7d89a","7c4ac500234a10250dd2cfa59f4507f27d4dcc0b69551a4310184a165d75c15e","97c3a26c493f08edc5df878a8c6ca53379c320ff1198c2edbb48ab4102ad7559","cd6aac9f28db710970181cfe3031b602afeec8df62067c632306fc3abd967d0f","03fffbdf01b82805127603c17065f0e6cd79d81e055ec2ed44666072e5a39aae","04af3a1ba7fad31f2ba9b421414a37ece8390fd818cc1de7737ccd3ef80f8381","9a72a659fa7e62ce142c585e0cc814004948d103b969e1971c92c3dfaffda46c","5a776b3003be0c9a9787b16cec55ab073c508bbe6ffa8e7c06e5ba145c85d054","5868cb5a3c2ec960f1380e814345287c7237d3cc21f18c3951011505c7cb2a76","2e45f48aa48512f8cd8872cbf6d3bde5d08acb894411287b85f637ddceeac140","3aaaf6f2f5eaf5fd88054937eece8704c261fad2224e687cef68c25c01c2d83e","71ed61999a29f4614f62ce5660cd3e363ae88a7908c70de794363bfc4c1e50eb","23b2cffed3afc85358c44bb5b85e9d59b78a245732fd573633b3df15b6bdcbbb","f9ca07d4177705fc92b1322d756c4b976c00f6e745c198f13b9c5774a6288a9b","f0974cf5c7df952d128503f08d079678023d49efa1b16bc83ccfd5ae22bd402a","72695932ff1704ba58de83ad6e8fa78612d6537245a794d08043b71f338c3878","c7cfa655e06288327e6c5638ac940098cd6e48a6b07f2bd99a57f5f5958532b0",{"version":"b3e4c1b1db15e753b906b7e45cffa9b518ea4ce4ee7e209e0ea51cd82c1af69f","signature":"b4a0eb33b8a6844b9ccec3d734cb396b9046a1b6ea0955266528663a625440bd"},{"version":"1c947432963cfeb99a5b714694494e3d6f30d3e2276c40cf2a9f5f6547e1b181","signature":"4f996e8efee35face6f6f1757b3b34c4fdcacee7f7696e0bb561b100bed87030"},{"version":"1277ff8690c7c5fe68d100588e09dd85f43f6a29247462a62e95af1e9f12aa34","signature":"614fc9b98271a6bcf1f664c4e68d03c0061314610ff80cf35a971aa20770396a"},"3e2dd16a51ccaca9939e8b608093e72245fa57a460bbe3d2e93e7a95d5e809da","905e543f34d5b01a7683c21b7174e86553add789e8e73322574e8986a01320bd","86dc9e9fd130e12f9eec3e6827caba36fca449361d5039b87fd69c1103e9eb9d","95c78cf183c5e9111e91d895a481dbf13ee29a0a95ef1c1d37513e1cfe913735","23e847832c900bd2360edc9a42a056137344f79aa1b43d72fa8ea3ee107aae73","7c52a6d05a6e68269e63bc63fad6e869368a141ad23a20e2350c831dc499c5f2","4fb9e98536b7318332003b303f87c18f82767ee03a5ea45a24d4d5a52c0aa4ce","c99c404f03d8bbeead149064b13d0962f08051c0e89d1aff74c9db14f2278a08","e5b63a24ca97f2f112ad6ee4907c69da2da1bb17d88bc78d661caab7ec752137","d4066357a89663d4c2f3ad413215114fc0913127c92e1f53b18b8fa834f868c6","6b83014e919aa4065dcd1f3979e4a36615515809344e9091e6fac7f8a49806b0","dbc06330145e5a66bf5e581cf5756d8fcc4f1759ceb54a2dc5bac0b5ebfa8d68","b32e93ba638ba1264c051966d9722733dbfedff365d38fdb982ea5bf7c5ed56c","70a29119482d358ab4f28d28ee2dcd05d6cbf8e678068855d016e10a9256ec12","869ac759ae8f304536d609082732cb025a08dcc38237fe619caf3fcdd41dde6f","0ea900fe6565f9133e06bce92e3e9a4b5a69234e83d40b7df2e1752b8d2b5002","e5408f95ca9ac5997c0fea772d68b1bf390e16c2a8cad62858553409f2b12412","3c1332a48695617fc5c8a1aead8f09758c2e73018bd139882283fb5a5b8536a6","9260b03453970e98ce9b1ad851275acd9c7d213c26c7d86bae096e8e9db4e62b","083838d2f5fea0c28f02ce67087101f43bd6e8697c51fd48029261653095080c","969132719f0f5822e669f6da7bd58ea0eb47f7899c1db854f8f06379f753b365","94ca5d43ff6f9dc8b1812b0770b761392e6eac1948d99d2da443dc63c32b2ec1","2cbc88cf54c50e74ee5642c12217e6fd5415e1b35232d5666d53418bae210b3b","ccb226557417c606f8b1bba85d178f4bcea3f8ae67b0e86292709a634a1d389d","5ea98f44cc9de1fe05d037afe4813f3dcd3a8c5de43bdd7db24624a364fad8e6","5260a62a7d326565c7b42293ed427e4186b9d43d6f160f50e134a18385970d02","0b3fc2d2d41ad187962c43cb38117d0aee0d3d515c8a6750aaea467da76b42aa","ed219f328224100dad91505388453a8c24a97367d1bc13dcec82c72ab13012b7","6847b17c96eb44634daa112849db0c9ade344fe23e6ced190b7eeb862beca9f4","d479a5128f27f63b58d57a61e062bd68fa43b684271449a73a4d3e3666a599a7","6f308b141358ac799edc3e83e887441852205dc1348310d30b62c69438b93ca0","f16aba91e2c61a7212ad4168386e272a871a351887e39115a36d25f770eb4c52","897ace290357b8e2460083fea21dc587f8503c787989cd9971cc63733ab88ce1","819cef4173bb37e7e8d523e88154af2329a4a258ccc036720cfcb217791b3868","e7cbe066de1dee3ea5fe58926aea6f1a07b1e71778fd8ff7144d4285574c7ed2","0d04b6c350398090d56a4e5bda575a560c95fdea6106f9744b5cc0905aab2553","e90f8bf88ed262c122d7f30c06e7f67c446e6e5236baed71ebafec7998b3f645","1ee226af7851d92c2fdc09c7ba8f84036d991edbda398a217e173821d62ad379","dd277157cf6aa8e937ad497026495adac453a064d7f9637c63a81b74d70d84e0","b84d5aeda18459510f6da1b821bce917622c51e184d1d58415ee3dc48d6180ef","bbe2b0d328e116df2e8cf8c2de9a078758fd422e6f0e117a3c73ac2e02855a2f","059dfb5dfbcafc00259b223a56c4957414b17d19b3e44b68f945ca02a6d80a02","7837dda0e930b2849976141cd7ad0637703f4cca76ff8539e4c76ac07dd678ca","04008a524815b9509d7d64dda18bf4594311a415dbbb271521d1078cb1c7850b","86c3a40fa2deabd9d08b8d835f12d2e6fb8bc2e572006c4f3302a2b4589ad9db","8f306dabdc2e130f1926f6abd04d233fd84ccf071e3d745a971112dcc87e591b","f41b3bea6012d76f83097c1079d99406054a22d04156afc9eb3955f9b288f8eb","f37d987a6b846dd948d310bf165ab4ac2327bc0d06182323920ef17a1852bec3","16a0a00c9b190a519950aadf21f16a7df1baf2346d64c4c054ad5f7fb71ea8ee","a228c6353575a3d21c2f579a4e860e6542950577f451062fdc578b02c95c22e3","90ed0b14083410a072cbf480a863e7f8ed7202ffb9ba625420a1b2455add33bb","1a75cca03c3c8f71f1a37618b2d3be5649630476761b59137245ec21110bfedf","9751ea85dad9ad6ceeae8fe142daf4d83ea78bede9d5424a326ad0869900ccf7","59cbc2704d281fce3f397e90e823117835deb20535ca8212f153f3bc74d811c6","74c20308aeb6da88368e0418a437d9718d10256ea50b6f428f56e0b982ec3229","21d78bad604829fe443eb962b7f00a17343fe621c2ac57114c7175bec879e17b","a0b27ac9a3c290c7281f922c1dd62afa02f76be63d1fff952f6348ffb019dce3","0b2cf5124c5f89d443dfdd7cae61a6a0b528a8e951ce6a00f3c7ab1ba0d2d534","e012ff0c33485d340ab68fa820d3372296b17efdb6e5cdc29ec99b82a8b159b0","be39c30b631dd7708628c2b40fb8b5164eac615e48de1e78bf02de70cc327283","51057e067bc5db4f55572329981b9ecd0e3d3b96c2b62fdb1dd0ccead1088e43","82f64bdecc73474993d9a44dec8ef0d3c02121580aa02072045bedab11ec882e","b7db045ad68ab5695ea97e40865a5981f146a62aa86f1261ad1aab59dd76e3c0","e90591e0e9e1b3ed53963b26c307bfe74f09131581f5ce6ed76a87f748d99991","52af945810b09a08235b252421270e767303cdf9b932bc5f957b2538f38a02d1","53029155e358b3b324dd5e38332f1809848e601057823892a9e77b6b3a9d140e","313f55101d2baeb5f01dc30f100d136190debad5ffa4453581843efa3219689a","05e638a171f5969fca61933d6d89f30f5acbbc70b74d2539957a688a5292b55c","43dd0f8de489f3111652b6c425cd01bb9259234bef62761440d2a982cb9d958e","0a36bd27b6af811f763d5f1254637ce9300574f02e875f5e1b23110829357e38","3ea0e65a45f7006261c963f7abcac37a91513eadf72aeef909cb2ad7676cc4f1","5637b24d008a13b63ac8e76579e3c0e595db5c4052bc052414a5fc4f57545bf5","909d0a3ae5c7e3aa435f53cbbeaec617a489283076c61f0cc0f73452e0c6232f","e75c93d9068a6664e2e2827a720def5d5bf6532af5952a6b8fe3eee440ca6b5c","9ea6687a30b28ef46c9cb3fb434d22e4f9b7bf1cbb7cca367bc5b2899583737b","f5f29a11cc28ee80696a7210b16e263fd5136ff04a79bf5df55ede3a4e68b3e9","cf3e2bee2220a6805904d14bf54d2c9e0ad3bf6d76add9244535f8ac34b919e4","98d88c8fd633d0054e791714742e9537b74a68d38a7ff81374e6a61242cea221","fcc19e67c9aa935dfd3e3d38d2b3d2b8215ccb28bc6106d159ed1ae65d667f73","e6f249463d9c5f898b1d0511c58dee7c3e3fe521fd6758749bf12be49e4e937f","3cf11201c92c4e7caf2696e144fa3fb524c6cb25157bb253a2beded585f410cf","d3c220e75847aa7bc24784572947bd48b843d094b22ae4899a45788f2ba70a43","818ea1645d3b08a7c3c4b84c32b4a18eb9f217e46dc8860fc751795ed14bdee0","943a5d4c85180884f41e96002f86848bb8c3dab9eb03c57c97aec80569e75957","d85d01cb4e957275b938d81e3cba52cefdda8b9c8bf84bbc5c70723b11aae30c","283b61717cf35dd0e5cea0726939556d12cd2b42317df2c58bebea511af0b2d5","3e612b62fb8e14ddff1770c41973c96eed5b6f9e5f01993f466f59af57f58f61","3923de820ed7c8998bd8170c8adb87721cbbe21637ba02c9c2dcb5e7d95b789b","aa25eafdac0666baec3e57ec29c08f06b9e21a584cff8d02455afb6e87be152d","e01827704d246accce473fe8e52cae498035950d9fa1673969502d65cd009295","a558a5b0db5e2a479a788d428012fd9172b20f51b4002523ca2ed40380ed7f24","5cd0a91bb8dccc1987e7cf77e5329de6388b5b14eb63d128607cc0465047ffe8","ba779307aa6dcbf7212d09d38e9776e923dcb367ed64f829e5b281b60bc658db","de6f929b32073b81e7206b995bd14cdbdd66b327207c3ccadd3b8f693a0eba19","c58f4a7ebfa3c20f5892b2c363072bc78667f6b7ffa218c8e3898f98a0990064","488762d92f8fa40efc1d1dde82b1d34c6603432fba46bcfd595557459858d695","264f4b5c51f7d901df3ee079949634e339b5fe157ae309ceed45192c63f9af8b","9869582ad4db8288b337d2aa1d0f6a44ac1f6d37e72f19f53188c520b652055a","04ef38fa44488af63b6927e529ccd1092532d5d8a17c8edf96d1d288d1897616","b2d00031dbf4cae85311aaac009fbba3d1b0b4f2e72ab690a86526e740427623","1122f8ac0822eeeb7cf7de02886c71109237d940be5234bc878e9f74a314cb47","88e01429eefdd2493f7d59170ec9fb961717339810cabf9147aed68f1a808f97","047719aed544e716b2243212264bc2e14a1da0d1c710fe6209e228981dc82ae4","47a03bf1241779ad40a0cd2982526cf7547557d720d4db2df410ee166c60aa89","922248fee358d198745ea609ed4c2b2d87a49299fb6be7a1d229a184bbf66fd5","4b4cd67fd08f4a39397ad27ea21468efe758b6e58606984db94e49e6c9186b96","223aff866672813df1b2caafd82b5dbbbbbff07e6994bbd5747df7549c75c427","a37a6e239d0aae9d850b48e4cb55b548162fabadb92beb6d7d0579abc61f5bf0","a06aded6e43b0e09545f26957e5c0a5b4514d327f4b962d97828539a1dd5552a","349250884d48cb12c72dbe59a2843affb6904f8429e3f7556d138db40ec8bcd0","65b6cc74c86bf2d5385fb9e10bc4ad5ad09fff05a6d6e872ca4db044bb46fb3a","e2efe68376a25ad9bc5af48ba3888cfb9355d004c561b0b2465c4e661bdee46b","5399098207d4cc8d407f49c932da771ed6ceb4434d7f20e56135bd7015f331ed","ab8287edb8dfcccefd318ad76a5849b3c80c6bf0caed154be12dfe1112cf936c","cd2200fbb1d1271782654fb7fdb6d8dca7db15f7b8db2a38e7143662d491d586","674d7208c85a0d903f7d3f1d2fda966d00bf0886ab3e5cefb96a8f1643540a1a","41ab5f4e8bcaddc43ce23a691011e897b1e50355fdcbafc8cba04b286e6f1c49","38fe031b36c5de94bb3b1b3ad390041f74aefb61df99746de85381c7ecda75f3","47277bb3b4bbda8c0326fe702b9f676e8f51f883b2a90a442f5dbcdabe252ad6","65b02d4c494f394f8988d4a6faa4aaab5347bf963b8792f7a2b2552b78120bab","025a67cb489d57f4363fbeff45ce51ba807884988d0d0aba65c892376be38bfe","897a6a62d6b6a5c0c806a4d5f1c223a9bf41f8c97fe86e648c5b20efa3a3c25c","8d8d909792777b0df3d5c6846e6cac0b300dd4e99ca0cc9e0047f14fd09a8704","1fbe231546cc436cdc016a3fe38342a70fc3c72dc4c868957dfe70e1b948f2a6","d492ab701db274e6005df9202d2a9370df12fa0bd6191885156894407e721f58","a71ecc5545c1ac3fff470887c1a20bb06e3cb0e36676dedffd20d14588578e6a","1e5c3d857b594638715e557a713925d82a462edf7adf912cace8c384ee88688a","b487c070d4da4c0210fc1069f3a7663b504ca85ba8a071568939c2237eab2988","89bc7b5b169ed78edf3e732f70558bbb0b309bdeddfe293dd99fc8a3857fe588","39dd82696ddb6a0a3b64b6dd737cab9ffef6e130ddb96a571daf504e868b7dd4","0cd6916333ffdc9899ba3d87c0b71c341d66c21fde10091188278e8e2dbefecc","927a6bd9f0344c2d3e897b182a685adeab1bbb48c2cc5a134c0ecf2596752282","3930c95340f3e3d08276b14659bafdc9e1d93afa1d4c649a9d353f377e4c83b4","23211a9818220e2fbffbb3c4f53ab2bb2dac9cc3ca998607e56e90c961c134f2","4372899ea8be93b7d1b0a21b487c5b726f91a6c1c0785f9ae7b851738bde88b0","59c1a9f97666d459ebaba5f5dacdb453ae0c671b317467697764c2e0e44bf196","ee72eb60620acd1c765a3c5a6919fdd6786fa1e04193f33c248118d17ad01378","f07d5eb6281efe08966d422297f256990f79ca31aa8bbce41510a8c67e4d9b26","8f33a2e973c015d4fb8ac6d0682adf9412770687912351d6f467b57716d86862","77eb8a1d7d95e8eede94c802d7a85ba12750d68a9b200d3419d836216317277a","92f2155186acb48c1c08fb8a9076e12b24111d660461b077b28b2d43472ee519","3fe4a676fc45b2369d84e7cec5516bfeaeb219e65f074f3dec5c33620cb53ca6","890e772f577db50212f462fb39c10eacc4cd169996d2955adc1676bcbf54520d","2627069d02d4df14d0c7adca350a1928853258d29a127db831cfd617d4e60536","8c1d7fe8d40405e39e8f7d3817b4ae399433bf08adcfb3582ae97618a7138375","3d6ca77f1d7bbf66fc0f967c3186eee8cb30acd4e2f41385193bdfab1d429ca9","fc9f3067d0496769c3426f19e8d901e954033dacc1f988af8196640470e56d7b","30df6f853d3f6f2ebc5b2c7e2bd173f002ae66f51b7fca3949832320b4eae141","203b67e6d33c81b74a8858fdee4f4d0a99e557121db927c96cbb2f305b17111e","29c9c6cb20d54a225e9de60cb924d4d40d29d1edb98c4859d1a2b2e8e8e95950","e20f5d1774ccd75f556033ae1400f0bf228c384f0f4c2c0264fa093e33dc2484","1129dcec54c5f5639eb2d711b3996bf0913dbd26912dc3cc792c0152e6049a9f","a663713aa6a9cc2295d94b0c137e8a80070c96c541fbc9987dd87e7a6dc5e0b2","1057a883b84c774d07e3eac8718fcda847f6ca682d1deaca90cdbb991579c16c","74bdd55516600d729e13503865eb67e94efea6af92851f250bf4586e805e562c","2a047ba3ca898ba8f08d25426b8e386aa783be57fb2c836bb04a30604996d807","01c27c03d5f7f80170d1f43b22af7bd639da27f2b37f5d7d37ff2a1ffce9306c","96642332c1c2c450579775f18df0cc08c373b0f1df69f678cdc95a1ad8813bb4","cd344619cb6fad71c80c120d38cd2ac51ba72975326b1b46e3e88d4c5adc3eb0","3f3823dc063ce069c9bbdc198d981a1e2ea8784c053b297ed3ca9bbbc3a80af5","c9abf080bfa07e56f7da30fbd043cabe4ea4758ae529f8c70c232bbcb17a3aee","6df354f6d3210b77d03ce7c5ab27ad0914fee60568996c570d20c9ad9f324845","35ecf5e5d1d0038c37a259a6bac12687887977afdea7fd5d60982013e4360755","9f7f86921e90060af47419bcafb12f3de4f2251c01de2f152510fa1d4feb972b","7106bf0f55dadff8c02b3ab28e5ff6e007baa02fc26cf58d1994eb6482114588","d04f947114fa00a20ee3c3182bb2863c30869df93293cc673f200defadbd69d9","7d3bc9393e3c86761b6149510712d654bf7bcfdfa4e46139ccce1f13e472cfa2","785926dee839d0b3f5e479615d5653d77f6a9ef8aa4eea5bbdce2703c860b254","66d5c68894bb2975727cd550b53cd6f9d99f7cb77cb0cbecdd4af1c9332b01dd","27606c61707a6d6360b5f84db1aa7040ab82d5ac6269d7cf8b5809dc8909cbfb",{"version":"3603a58a5a095da36fcc8ec23cac37745f1c58053413063296b131ad649a3089","signature":"46ad20a71828211dedb4004393e723a19f6fff976390d221a36f4476c1802c61"},{"version":"9ad0e25ce4702d52cdab6167f45c1940decd334f940fbbf47c75b44d3700d078","signature":"14c00d401cbffe1282df02185194c0493b728aaa685bb2facb743025b0284f1b"},{"version":"821047127ea0f029ec323b7249c575f9fa4e7233c971a510839a8b981bc812da","signature":"9567f6d72a79683534e830aa764b67b74620d2565fe2464f835a98d7f18099d6"},{"version":"b89c474de5d9e8f29b4290d3af9938ab906be7c92adfc05cd975a6981d4c8cb5","signature":"a7803edb44943fa45e0f8679a187d68119c335fde1bdf5b73d083f451669bb94"},{"version":"4ac124fb293b3eb5423a3a9c47bd24576ad24216fdd0c121fc94a6426bf4c8a6","signature":"22b04fa14a4d7554177d67bee80393a308eb1b3b15655aa9a7951374b4bf43c4"},{"version":"ca74a33530bbf228262193d6f3019292679d11716175fdf35fa483755ffc7f61","signature":"5263f2bff98fd40b19e2248c2078c321d657d5d0debe20e08ecc6456c7ebd428"},{"version":"d4f5788b1d632ffc54be13e08d6cf9c6438e73504ab16dba09516cb9e8f3e8d3","signature":"03603da4082e5b47ba34a582066b31dbcaa7dbc68c35e27ced34ae2db4edffc1"},{"version":"51c29e00c993639d8a5e7e79420b106dff934faee00ab7d832b33b43f696b1b6","signature":"254c5ba5fc9385d0fff7b0405838c4228bccb40a21d9b10c8f320f69b7652c21"},"752d80cb03f45b5deead507f19a06d22948781b91b5c43ad1c5bc9fdc14401e3","05321b823dd3781d0b6aac8700bfdc0c9181d56479fe52ba6a40c9196fd661a8",{"version":"6231095d0b356894ceec8856ce4e354a38a773a62067978f3af9c478acbcf2e9","affectsGlobalScope":true},"66754e21a2ac3ffc0eb3fc55cf5c33deb2c115b726fb2c4368b870c5e85106ce","ccd9f8f7c8760d8eb0c0c112c772a9756d59365a61fd5cc102a889fed79d0076","d7ccbcf0e92d0209f499729768c791fbc278ecad02c3f596db5b519eb4f5d496","85542ea0f889f8993e6b4631c541640c17c230bf5cf18d483184de9105536b4d","8cc2eed7caa0e187fae67a1e7fdb4da79079489744c6e5be9e0839d258fd5995","aaf2cc4016c33c836fcca0dbe20d7a97bf17cafeb581a57a62267b1c38930bd4","33adebc44971b6d96bdf9b1f3a7a9e42f40c322b966bd303e62f683874d35281","3406039f2208d02e99c0c41c9e429c5b559df4a32f494b5bbea4ee9c99bb437a",{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true},"2e864ea827318e5f490863a8cd412744d9ddb175acf488dd02a941703dad1e38",{"version":"613b21ccdf3be6329d56e6caa13b258c842edf8377be7bc9f014ed14cdcfc308","affectsGlobalScope":true},{"version":"894dae169f8193e3f07c3fec14149a60592d1f13720907ffdf7b0c05cfb62c38","affectsGlobalScope":true},{"version":"df01885cc27c14632a8c38bdeb053295e69209107bb6c53988b78db5f450cb3c","affectsGlobalScope":true},"38379fa748cc5d259c96da356a849bd290a159ae218e06ec1daa166850e4bf50","7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","f51b4042a3ac86f1f707500a9768f88d0b0c1fc3f3e45a73333283dea720cdc6",{"version":"a29bc8aa8cc100d0c09370c03508f1245853efe017bb98699d4c690868371fc7","affectsGlobalScope":true},"6f95830ca11e2c7e82235b73dc149e68a0632b41e671724d12adc83a6750746d","7aa011cda7cf0b9e87c85d128b2eeac9930bda215b0fee265d8bf2cec039fb5f",{"version":"92ec1aeca4e94bdab04083daa6039f807c0fce8f09bc42e8b24bf49fa5cdbbff","affectsGlobalScope":true},"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","8463ab6a156dc96200b3d8b8a52dc8d878f13a6b7404439aa2f911d568132808","6c39d4dbdb372b364442854e42d8c473e2ec67badb226745af17ed5ac41ce6f5","7693b90b3075deaccafd5efb467bf9f2b747a3075be888652ef73e64396d8628","bd01a987f0fcf2344a405e542ee681e420651eaff1222a5a6e0c02fda52343bc","693e50962e90a3548f41bff2c22676e3964212a836022d82e49eca0b20320a38",{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true},"300b0c12998391154d7b9115a85554e91632a3d3e1b66038e98f2b9cb3c1061d",{"version":"d63845babc589445113e4763795cb351fe3ea8b4becaa476be4e534f455bf0d2","affectsGlobalScope":true},"93891e576a698609695e5b8117bb128336e4b7b28772e7d7e38e8075790eb42f","5293d799856f47259146ccf0be9a1cc0a4a5343696182d7206ed25ea67d67920","d7cdb379f1a8febb8ba181b2bba4c89b7f9189c68ce00292253d9f827eb0b2d3","fab49059d6c2026bdb2e53e4e5cde1a39da44e61daff1867c8b3b10b507bfe17","5a551275f85bcc4003e543a1951a5b2f682cfba9b2922f65ae0df40ab71724a5","22d1a3163b9a961dbe78b0aedbd7bcbc071ce1f31efb76eb013b0aee230fef0e",{"version":"c31695696ade4514cfcbb22799997b690d3dca7fb72beab68fb2e73b6ef450dd","affectsGlobalScope":true},"d99ad56d57f2c96daaf4475a8b64344b24dedafdb8f3c32d43552bcc72279a75","a101ef17aece908c1029a1bd3f97132794dcff21b4ca0b997d9a633f962c46aa","511575e18249b64b90d8f884fdb8a383c767d1a7efccd9d66a4e125a4dc5c462",{"version":"6d8001f2c3b86c4f1de1d45ecb3f87f287ed7313d6999f8c8318cec4f50e6323","affectsGlobalScope":true},{"version":"0d09f4b48899d342b5d6cd846f95f969a401933b0dcd375a8a7e45832328bb86","affectsGlobalScope":true},"9c3d1222e6e3d8c35a4293d7a54d4142ebb8f7f70ec4111b8136df07fdc66169","70173c475c6e76ccebc37412b02b2e26f62bf45fc1534c3ebe6d7fa60fb88819","87ced739f77d80886ef2b923a7c52c363c549ad8799ae28eb8cc810892f511ad","863bc4e31de6c75423bb02da16190d582b0a69b8964b61d45920e5b2cb3832dd","849484324695b587f06abee7579641efe061b7338f9694ec410a76f477fe4df3","269929a24b2816343a178008ac9ae9248304d92a8ba8e233055e0ed6dbe6ef71","6e191fea1db6e9e4fa828259cf489e820ec9170effff57fb081a2f3295db4722","49e0da63a2398d2ae88467f60a69b07e594b7777e01120cd9ebcefa1932484cf","0435070b07e646b406b1c9b8b1b1878ea6917c32abc47e6435ec26d71212d513","f71188f97c9f7d309798ec02a56dd3bf50a4e4d079b3480f275ac13719953898",{"version":"c4454589a0aa92c10d684c8c9584574bc404d1db556d72196cd31f8f7651af1a","affectsGlobalScope":true},"b17790866e140a630fa8891d7105c728a1bd60f4e35822e4b345af166a4a728c","c50c75f4360f6fc06c4be29dafe28210e15c50cd6b04ad19c4808fa504efb51a","d4a1f5f7ee89b2afffd3c74282f8ee65b24266c92b7d40398c12a27054ed745c","900b5a9802192bc77eba35a5b87ce770df7b867a6d61772c554058c9ed635386",{"version":"d291d3d16fa252f6d460687491ea2c5c23098c9dc0d3e106b2803fdc98f48f29","affectsGlobalScope":true},{"version":"f43fcf89d75f13d0908a77cd3fa32b9fd28c915deded9b2778b08f2e242d07a7","affectsGlobalScope":true},"9b6fc34aca8b0411b96ba35b2315017236a47709a1a98d5e16aed3b84037b9e8","aebf613f7831125038942eba891005fd25fa5cadcc3e3d13af4768dc7549161f","0faee6b555890a1cb106e2adc5d3ffd89545b1da894d474e9d436596d654998f","247e5c34784d185bc81442e8b1a371a36c4a5307a766a3725454c0a191b5cfad","1c382a6446d63340be549a616ff5142a91653cea45d6d137e25b929130a4f29a","729ad315d8fa8556a1cbf88604ce9bfd73f4cc2459b0b9f6da00f75150c2bf9d",{"version":"9c52d1e0414faa6ee331024f249f9c1ab11a5c432c37370c2c74ba933aee25fc","affectsGlobalScope":true},"ba027b6f18800b0303aa700e73d8cbffeefd5df864df6be460f5bad437fdc61c","22583759d0045fdf8d62c9db0aacba9fd8bddde79c671aa08c97dcfd4e930cc6","993ec9030135202d7027a1a2a2faf6063e72423ed295fa7601c209d5748c3f49","5e935afea0383367e5159fad54d1828bf39e1181e8481a135139ea3c40f4ab8f","160f67b6334e8b9abb05b8c9eae1f66c5feb6cfb617e12ab3da38b595df79d7a","2f1305ab9042c951cbea9cff8d2155fa84c1390f0c814c2428ce86dc929f24a4",{"version":"3e9e453389daa494d4b6b0fbc7de7f80e41ae4a8eaad7918663046eee1248c2c","signature":"9479b73e461e6b226047c75ee4e1f60ee609f3b9f43a305a06c95085e8244a7a"},{"version":"7fb721a3e8fc4ca2b709e73846e977da394182d436b4423f50bd0647fabe5628","signature":"9a0b0df2aa82467b940f6f8fc3d7b5f2be78761a929b1645858446a879ca02ba"},"03f1d83d61696326ea29c8a1c15cbaccf61e92598d53f2ccae06078531f42448","2c8e55457aaf4902941dfdba4061935922e8ee6e120539c9801cd7b400fae050","3a9313fe5ace558b8b18e85f931da10b259e738775f411c061e5f15787b138eb","670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","9e0cf651e8e2c5b9bebbabdff2f7c6f8cedd91b1d9afcc0a854cdff053a88f1b","069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","f9e22729fa06ed20f8b1fe60670b7c74933fdfd44d869ddfb1919c15a5cf12fb","d3f2d715f57df3f04bf7b16dde01dec10366f64fce44503c92b8f78f614c1769","b78cd10245a90e27e62d0558564f5d9a16576294eee724a59ae21b91f9269e4a","f0c3a51c7314523b169d4756b2df6e3e59a3f0d9bc4848248362edaf75b5d315","2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed",{"version":"a899915e1fc41c6130d906ae77067b63ff2d678bb842b4c7a0741dca7f55c218","affectsGlobalScope":true},"689be50b735f145624c6f391042155ae2ff6b90a93bac11ca5712bc866f6010c",{"version":"64d4b35c5456adf258d2cf56c341e203a073253f229ef3208fc0d5020253b241","affectsGlobalScope":true},"785b9d575b49124ce01b46f5b9402157c7611e6532effa562ac6aebec0074dfc","f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","dd0c1b380ba3437adedef134b2e48869449b1db0b07b2a229069309ce7b9dd39","1f68ab0e055994eb337b67aa87d2a15e0200951e9664959b3866ee6f6b11a0fe","b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","0e13570a7e86c6d83dd92e81758a930f63747483e2cd34ef36fcdb47d1f9726a",{"version":"a45c25e77c911c1f2a04cade78f6f42b4d7d896a3882d4e226efd3a3fcd5f2c4","affectsGlobalScope":true},"5c45abf1e13e4463eacfd5dedda06855da8748a6a6cb3334f582b52e219acc04","afe73051ff6a03a9565cbd8ebb0e956ee3df5e913ad5c1ded64218aabfa3dcb5",{"version":"271cde49dfd9b398ccc91bb3aaa43854cf76f4d14e10fed91cbac649aa6cbc63","affectsGlobalScope":true},"2bcecd31f1b4281710c666843fc55133a0ee25b143e59f35f49c62e168123f4b","a6273756fa05f794b64fe1aff45f4371d444f51ed0257f9364a8b25f3501915d","9c4e644fe9bf08d93c93bd892705842189fe345163f8896849d5964d21b56b78","25d91fb9ed77a828cc6c7a863236fb712dafcd52f816eec481bd0c1f589f4404","4cd14cea22eed1bfb0dc76183e56989f897ac5b14c0e2a819e5162eafdcfe243","8d32432f68ca4ce93ad717823976f2db2add94c70c19602bf87ee67fe51df48b","ee65fe452abe1309389c5f50710f24114e08a302d40708101c4aa950a2a7d044","f9649058dc6542f821894390c2358cd71c9350bae97478eff06d9a39c8b082a4","035a5df183489c2e22f3cf59fc1ed2b043d27f357eecc0eb8d8e840059d44245","a4809f4d92317535e6b22b01019437030077a76fec1d93b9881c9ed4738fcc54","5f53fa0bd22096d2a78533f94e02c899143b8f0f9891a46965294ee8b91a9434","c5a14bdeb170e0e67fb4200c54e0e02fd0ec94aca894c212c9d43c2916891542","8b5402ae709d042c3530ed3506c135a967159f42aed3221267e70c5b7240b577","916be7d770b0ae0406be9486ac12eb9825f21514961dd050594c4b250617d5a8","d88a5e779faf033be3d52142a04fbe1cb96009868e3bbdd296b2bc6c59e06c0e","8b677e0b88f3c4501c6f3ec44d3ccad1c2ba08efd8faf714b9b631b5dba1421b","7233cac35711f43b7493061d2fe7636deb6d14f8cb58e4b3ff248be46f0b543d","1d4bc73751d6ec6285331d1ca378904f55d9e5e8aeaa69bc45b675c3df83e778","8017277c3843df85296d8730f9edf097d68d7d5f9bc9d8124fcacf17ecfd487e","960a68ced7820108787135bdae5265d2cc4b511b7dcfd5b8f213432a8483daf1","2e7ebdc7d8af978c263890bbde991e88d6aa31cc29d46735c9c5f45f0a41243b","b57fd1c0a680d220e714b76d83eff51a08670f56efcc5d68abc82f5a2684f0c0","8cf121e98669f724256d06bebafec912b92bb042a06d4944f7fb27a56c545109","1084565c68b2aed5d6d5cea394799bd688afdf4dc99f4e3615957857c15bb231","8a19491eba2108d5c333c249699f40aff05ad312c04a17504573b27d91f0aede","199f9ead0daf25ae4c5632e3d1f42570af59685294a38123eef457407e13f365","cf3d384d082b933d987c4e2fe7bfb8710adfd9dc8155190056ed6695a25a559e","9871b7ee672bc16c78833bdab3052615834b08375cb144e4d2cba74473f4a589","c863198dae89420f3c552b5a03da6ed6d0acfa3807a64772b895db624b0de707","8b03a5e327d7db67112ebbc93b4f744133eda2c1743dbb0a990c61a8007823ef","86c73f2ee1752bac8eeeece234fd05dfcf0637a4fbd8032e4f5f43102faa8eec","42fad1f540271e35ca37cecda12c4ce2eef27f0f5cf0f8dd761d723c744d3159","ff3743a5de32bee10906aff63d1de726f6a7fd6ee2da4b8229054dfa69de2c34","83acd370f7f84f203e71ebba33ba61b7f1291ca027d7f9a662c6307d74e4ac22","1445cec898f90bdd18b2949b9590b3c012f5b7e1804e6e329fb0fe053946d5ec","0e5318ec2275d8da858b541920d9306650ae6ac8012f0e872fe66eb50321a669","cf530297c3fb3a92ec9591dd4fa229d58b5981e45fe6702a0bd2bea53a5e59be","c1f6f7d08d42148ddfe164d36d7aba91f467dbcb3caa715966ff95f55048b3a4","f4e9bf9103191ef3b3612d3ec0044ca4044ca5be27711fe648ada06fad4bcc85","0c1ee27b8f6a00097c2d6d91a21ee4d096ab52c1e28350f6362542b55380059a","7677d5b0db9e020d3017720f853ba18f415219fb3a9597343b1b1012cfd699f7","bc1c6bc119c1784b1a2be6d9c47addec0d83ef0d52c8fbe1f14a51b4dfffc675","52cf2ce99c2a23de70225e252e9822a22b4e0adb82643ab0b710858810e00bf1","770625067bb27a20b9826255a8d47b6b5b0a2d3dfcbd21f89904c731f671ba77","d1ed6765f4d7906a05968fb5cd6d1db8afa14dbe512a4884e8ea5c0f5e142c80","799c0f1b07c092626cf1efd71d459997635911bb5f7fc1196efe449bba87e965","2a184e4462b9914a30b1b5c41cf80c6d3428f17b20d3afb711fff3f0644001fd","9eabde32a3aa5d80de34af2c2206cdc3ee094c6504a8d0c2d6d20c7c179503cc","397c8051b6cfcb48aa22656f0faca2553c5f56187262135162ee79d2b2f6c966","a8ead142e0c87dcd5dc130eba1f8eeed506b08952d905c47621dc2f583b1bff9","a02f10ea5f73130efca046429254a4e3c06b5475baecc8f7b99a0014731be8b3","c2576a4083232b0e2d9bd06875dd43d371dee2e090325a9eac0133fd5650c1cb","4c9a0564bb317349de6a24eb4efea8bb79898fa72ad63a1809165f5bd42970dd","f40ac11d8859092d20f953aae14ba967282c3bb056431a37fced1866ec7a2681","cc11e9e79d4746cc59e0e17473a59d6f104692fd0eeea1bdb2e206eabed83b03","b444a410d34fb5e98aa5ee2b381362044f4884652e8bc8a11c8fe14bbd85518e","c35808c1f5e16d2c571aa65067e3cb95afeff843b259ecfa2fc107a9519b5392","14d5dc055143e941c8743c6a21fa459f961cbc3deedf1bfe47b11587ca4b3ef5","a3ad4e1fc542751005267d50a6298e6765928c0c3a8dce1572f2ba6ca518661c","f237e7c97a3a89f4591afd49ecb3bd8d14f51a1c4adc8fcae3430febedff5eb6","3ffdfbec93b7aed71082af62b8c3e0cc71261cc68d796665faa1e91604fbae8f","662201f943ed45b1ad600d03a90dffe20841e725203ced8b708c91fcd7f9379a","c9ef74c64ed051ea5b958621e7fb853fe3b56e8787c1587aefc6ea988b3c7e79","2462ccfac5f3375794b861abaa81da380f1bbd9401de59ffa43119a0b644253d","34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","7d8ddf0f021c53099e34ee831a06c394d50371816caa98684812f089b4c6b3d4","ddef25f825320de051dcb0e62ffce621b41c67712b5b4105740c32fd83f4c449","1b3dffaa4ca8e38ac434856843505af767a614d187fb3a5ef4fcebb023c355aa","ab82804a14454734010dcdcd43f564ff7b0389bee4c5692eec76ff5b30d4cf66","15fe687c59d62741b4494d5e623d497d55eb38966ecf5bea7f36e48fc3fbe15e",{"version":"2c3b8be03577c98530ef9cb1a76e2c812636a871f367e9edf4c5f3ce702b77f8","affectsGlobalScope":true},"f05afa17cfc95a95923f48614bf3eb5ab2598850ee27a7c29f1b116a71090c5d","eb15edfcef078300657e1d5d678e1944b3518c2dd8f26792fdba2fe29f73d32b","bae8d023ef6b23df7da26f51cea44321f95817c190342a36882e93b80d07a960","c3e5b75e1af87b8e67e12e21332e708f7eccee6aac6261cfe98ca36652cdcb53"],"options":{"allowSyntheticDefaultImports":true,"declarationMap":false,"esModuleInterop":true,"inlineSourceMap":false,"jsx":4,"module":99,"noFallthroughCasesInSwitch":true,"noImplicitAny":false,"skipLibCheck":true,"sourceMap":false,"strict":true,"target":1},"fileIdsList":[[335,340,397],[335,340],[171,335,340],[165,167,335,340],[155,165,166,168,169,170,335,340],[165,335,340],[155,165,335,340],[156,157,158,159,160,161,162,163,164,335,340],[156,160,161,164,165,168,335,340],[156,157,158,159,160,161,162,163,164,165,166,168,169,335,340],[155,156,157,158,159,160,161,162,163,164,335,340],[60,335,340],[75,335,340],[75,116,120,121,122,335,340],[75,121,335,340],[75,115,121,124,335,340],[112,335,340],[75,108,121,125,335,340],[75,121,124,125,126,335,340],[128,335,340],[121,124,335,340],[75,115,117,118,119,120,121,335,340],[75,108,112,113,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,135,136,137,335,340],[138,335,340],[75,115,124,134,135,335,340],[75,115,124,134,335,340],[75,121,126,335,340],[121,130,335,340],[75,120,335,340],[62,63,64,335,340],[62,63,335,340],[62,335,340],[60,144,173,183,205,206,207,335,340],[60,173,335,340],[60,144,183,335,340],[60,173,203,204,335,340],[60,203,335,340],[60,144,335,340],[60,144,242,243,244,335,340],[60,144,183,238,335,340],[60,144,173,243,244,268,335,340],[60,144,291,335,340],[285,335,340],[172,335,340],[60,204,335,340],[60,172,173,335,340],[335,340,397,398,399,400,401],[335,340,397,399],[335,340,355,387,403],[335,340,346,387],[335,340,380,387,410],[335,340,355,387],[335,340,413,415],[335,340,412,413,414],[335,340,352,355,387,407,408,409],[335,340,404,408,410,418,419],[335,340,353,387],[335,340,428],[335,340,422,428],[335,340,423,424,425,426,427],[335,340,352,355,357,360,369,380,387],[335,340,431],[335,340,432],[335,340,387],[335,337,340],[335,339,340],[335,340,345,372],[335,340,341,352,353,360,369,380],[335,340,341,342,352,360],[331,332,335,340],[335,340,343,381],[335,340,344,345,353,361],[335,340,345,369,377],[335,340,346,348,352,360],[335,340,347],[335,340,348,349],[335,340,352],[335,340,351,352],[335,339,340,352],[335,340,352,353,354,369,380],[335,340,352,353,354,369],[335,340,352,355,360,369,380],[335,340,352,353,355,356,360,369,377,380],[335,340,355,357,369,377,380],[335,340,352,358],[335,340,359,380,385],[335,340,348,352,360,369],[335,340,361],[335,340,362],[335,339,340,363],[335,340,364,379,385],[335,340,365],[335,340,366],[335,340,352,367],[335,340,367,368,381,383],[335,340,352,369,370,371],[335,340,369,371],[335,340,369,370],[335,340,372],[335,340,373],[335,340,352,375,376],[335,340,375,376],[335,340,345,360,369,377],[335,340,378],[340],[333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386],[335,340,360,379],[335,340,355,366,380],[335,340,345,381],[335,340,369,382],[335,340,383],[335,340,384],[335,340,345,352,354,363,369,380,383,385],[335,340,369,386],[60,75,77,335,340],[60,70,335,340,428],[60,335,340,428],[60,147,335,340],[147,335,340,442,443,444,445],[57,58,59,335,340],[335,340,449,488],[335,340,449,473,488],[335,340,488],[335,340,449],[335,340,449,474,488],[335,340,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487],[335,340,474,488],[335,340,353,369,387,406],[335,340,353,420],[335,340,355,387,407,417],[335,340,492],[335,340,352,355,357,369,377,380,386,387],[335,340,496],[103,335,340],[103,104,105,106,107,335,340],[92,93,94,95,96,97,98,99,100,101,102,335,340],[60,154,335,340],[60,143,145,146,149,150,151,152,335,340],[60,144,145,335,340],[60,145,335,340],[145,148,335,340],[60,145,154,174,175,176,335,340],[178,335,340],[60,145,174,335,340],[60,145,181,335,340],[145,174,183,335,340],[60,145,174,187,188,189,190,191,192,193,194,195,335,340],[60,145,198,199,335,340],[60,144,147,335,340],[60,145,174,208,209,210,211,212,213,214,215,335,340],[60,145,210,211,216,335,340],[60,174,335,340],[145,207,335,340],[60,145,174,205,209,335,340],[60,145,184,335,340],[60,145,219,220,335,340],[60,219,335,340],[60,145,223,335,340],[60,145,223,224,225,226,227,228,229,230,231,232,233,234,335,340],[60,145,224,227,228,335,340],[60,145,224,335,340],[60,145,201,335,340],[59,60,145,335,340],[60,145,227,236,335,340],[144,145,239,240,335,340],[60,145,174,238,335,340],[60,145,245,246,248,249,250,251,335,340],[60,145,247,335,340],[144,145,239,253,254,335,340],[60,145,211,212,213,214,215,216,335,340],[145,238,335,340],[60,144,145,256,257,262,263,264,335,340],[60,145,148,335,340],[60,261,335,340],[60,145,245,258,259,260,335,340],[60,144,145,147,335,340],[60,145,174,269,335,340],[60,174,270,335,340],[60,145,272,335,340],[145,274,275,335,340],[145,174,274,335,340],[60,145,174,269,277,278,335,340],[286,335,340],[60,145,183,210,216,335,340],[60,145,174,288,335,340],[59,60,145,290,293,294,335,340],[59,60,145,292,335,340],[59,60,145,255,292,335,340],[60,144,145,174,299,300,335,340],[60,145,154,335,340],[60,184,335,340],[60,145,185,303,335,340],[59,335,340],[143,146,148,149,150,151,152,153,154,175,176,177,179,180,181,182,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,229,230,231,233,234,235,237,240,241,246,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,270,271,272,273,275,276,277,278,279,280,281,282,283,284,287,289,290,293,294,295,296,297,298,299,300,301,302,303,304,305,335,340],[59,173,335,340],[174,201,335,340],[310,335,340],[307,308,309,335,340],[60,75,76,84,335,340],[60,75,84,85,335,340],[75,78,81,83,85,335,340],[60,75,83,335,340],[76,78,82,83,84,85,86,87,88,89,335,340],[60,75,85,335,340],[60,75,81,83,85,335,340],[74,90,335,340],[60,75,77,82,84,335,340],[73,335,340],[79,80,335,340],[65,335,340],[60,65,70,71,335,340],[65,66,67,68,69,335,340],[60,65,66,335,340],[60,65,335,340],[65,67,335,340],[60,73,335,340,387],[75,114,335,340],[110,335,340],[110,111,335,340],[109,335,340],[322,335,340],[322,323,324,325,326,327,335,340],[60,61,319,335,340],[60,61,72,91,142,312,315,316,318,335,340],[60,61,139,335,340],[60,61,72,91,139,140,141,142,306,314,317,335,340],[60,61,72,91,142,313,314,335,340],[60,61,91,140,141,142,306,335,340],[60,61,72,91,142,306,311,335,340],[60,61,72,91,306,311,335,340],[60,61,335,340],[60,61,91,140,141,142,306,318,335,340],[60,61,335,340,393],[61,335,340],[60,61,319,321,329,335,340],[335,340,388],[61,328,335,340],[61,138,139,140,335,340],[61,140,335,340],[61,138,141,335,340],[61],[60],[75,138,140],[140]],"referencedMap":[[399,1],[397,2],[172,3],[168,4],[155,2],[171,5],[164,6],[162,7],[161,7],[160,6],[157,7],[158,6],[166,8],[159,7],[156,6],[163,7],[169,9],[170,10],[165,11],[167,7],[285,12],[117,13],[137,13],[123,14],[124,15],[130,16],[113,17],[126,18],[127,19],[116,13],[129,20],[128,21],[122,22],[118,13],[138,23],[133,2],[134,24],[136,25],[135,26],[125,27],[131,28],[132,2],[119,13],[121,29],[120,13],[62,2],[65,30],[64,31],[63,32],[178,12],[183,12],[208,33],[203,34],[207,35],[205,36],[206,37],[244,38],[245,39],[242,2],[239,40],[238,35],[269,41],[291,38],[292,42],[286,43],[144,12],[204,12],[173,44],[268,45],[243,46],[402,47],[398,1],[400,48],[401,1],[404,49],[405,50],[411,51],[403,52],[416,53],[412,2],[415,54],[413,2],[410,55],[420,56],[419,55],[421,57],[422,2],[426,58],[427,58],[423,59],[424,59],[425,59],[428,60],[77,12],[429,2],[417,2],[430,61],[431,2],[432,62],[433,63],[414,2],[434,2],[406,2],[435,64],[337,65],[338,65],[339,66],[340,67],[341,68],[342,69],[333,70],[331,2],[332,2],[343,71],[344,72],[345,73],[346,74],[347,75],[348,76],[349,76],[350,77],[351,78],[352,79],[353,80],[354,81],[336,2],[355,82],[356,83],[357,84],[358,85],[359,86],[360,87],[361,88],[362,89],[363,90],[364,91],[365,92],[366,93],[367,94],[368,95],[369,96],[371,97],[370,98],[372,99],[373,100],[374,2],[375,101],[376,102],[377,103],[378,104],[335,105],[334,2],[387,106],[379,107],[380,108],[381,109],[382,110],[383,111],[384,112],[385,113],[386,114],[436,2],[437,2],[59,2],[438,2],[408,2],[409,2],[321,12],[73,12],[439,115],[441,116],[440,117],[443,118],[444,12],[147,12],[445,118],[442,2],[446,119],[57,2],[60,120],[61,12],[447,64],[448,2],[473,121],[474,122],[449,123],[452,123],[471,121],[472,121],[462,121],[461,124],[459,121],[454,121],[467,121],[465,121],[469,121],[453,121],[466,121],[470,121],[455,121],[456,121],[468,121],[450,121],[457,121],[458,121],[460,121],[464,121],[475,125],[463,121],[451,121],[488,126],[487,2],[482,125],[484,127],[483,125],[476,125],[477,125],[479,125],[481,125],[485,127],[486,127],[478,127],[480,127],[407,128],[489,129],[418,130],[490,52],[491,2],[493,131],[492,2],[79,2],[80,2],[494,2],[495,132],[496,2],[497,133],[58,2],[102,2],[99,134],[101,134],[100,134],[98,134],[108,135],[103,136],[107,2],[104,2],[106,2],[105,2],[94,134],[95,134],[96,134],[92,2],[93,2],[97,134],[247,137],[153,138],[152,139],[146,140],[149,141],[143,12],[151,140],[150,140],[177,142],[176,140],[175,140],[179,143],[180,144],[182,145],[181,140],[184,146],[185,140],[186,140],[196,147],[190,140],[194,140],[197,140],[193,140],[187,140],[195,140],[191,140],[189,140],[192,140],[188,140],[200,148],[198,140],[199,140],[154,12],[201,140],[148,149],[202,140],[216,150],[217,151],[209,152],[214,140],[215,140],[212,153],[213,140],[211,154],[210,155],[218,149],[224,140],[221,156],[220,140],[222,157],[234,158],[235,159],[229,160],[227,140],[228,140],[225,161],[226,140],[223,140],[230,162],[232,140],[233,140],[231,140],[219,163],[237,164],[236,140],[241,165],[240,166],[252,167],[246,140],[251,140],[250,140],[248,168],[249,140],[255,169],[266,170],[253,140],[254,171],[265,172],[256,140],[257,173],[262,174],[263,140],[264,140],[261,175],[258,140],[259,168],[260,140],[267,176],[270,177],[271,178],[272,140],[273,179],[276,180],[275,181],[279,182],[278,140],[277,140],[280,140],[281,140],[282,140],[287,183],[283,144],[284,184],[289,185],[295,186],[293,187],[294,140],[290,139],[296,140],[297,188],[298,12],[301,189],[299,140],[302,140],[300,190],[303,191],[304,192],[305,177],[288,193],[145,38],[306,194],[174,195],[274,196],[311,197],[308,12],[309,12],[307,2],[310,198],[85,199],[86,200],[82,201],[78,202],[90,203],[87,204],[84,205],[88,204],[91,206],[83,207],[76,2],[74,208],[89,2],[81,209],[71,210],[72,211],[70,212],[67,213],[66,214],[69,215],[68,213],[388,216],[115,217],[114,13],[75,2],[111,218],[112,219],[110,220],[109,218],[11,2],[12,2],[14,2],[13,2],[2,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[3,2],[4,2],[26,2],[23,2],[24,2],[25,2],[27,2],[28,2],[29,2],[5,2],[30,2],[31,2],[32,2],[33,2],[6,2],[37,2],[34,2],[35,2],[36,2],[38,2],[7,2],[39,2],[44,2],[45,2],[40,2],[41,2],[42,2],[43,2],[8,2],[49,2],[46,2],[47,2],[48,2],[50,2],[9,2],[51,2],[52,2],[53,2],[54,2],[55,2],[1,2],[10,2],[56,2],[323,221],[324,221],[325,221],[326,221],[327,221],[328,222],[322,2],[320,223],[319,224],[313,225],[318,226],[315,227],[391,228],[316,229],[312,230],[317,231],[314,225],[392,232],[394,233],[139,234],[330,235],[389,236],[329,237],[390,234],[141,238],[395,239],[142,240],[140,234],[393,234],[396,234]],"exportedModulesMap":[[399,1],[397,2],[172,3],[168,4],[155,2],[171,5],[164,6],[162,7],[161,7],[160,6],[157,7],[158,6],[166,8],[159,7],[156,6],[163,7],[169,9],[170,10],[165,11],[167,7],[285,12],[117,13],[137,13],[123,14],[124,15],[130,16],[113,17],[126,18],[127,19],[116,13],[129,20],[128,21],[122,22],[118,13],[138,23],[133,2],[134,24],[136,25],[135,26],[125,27],[131,28],[132,2],[119,13],[121,29],[120,13],[62,2],[65,30],[64,31],[63,32],[178,12],[183,12],[208,33],[203,34],[207,35],[205,36],[206,37],[244,38],[245,39],[242,2],[239,40],[238,35],[269,41],[291,38],[292,42],[286,43],[144,12],[204,12],[173,44],[268,45],[243,46],[402,47],[398,1],[400,48],[401,1],[404,49],[405,50],[411,51],[403,52],[416,53],[412,2],[415,54],[413,2],[410,55],[420,56],[419,55],[421,57],[422,2],[426,58],[427,58],[423,59],[424,59],[425,59],[428,60],[77,12],[429,2],[417,2],[430,61],[431,2],[432,62],[433,63],[414,2],[434,2],[406,2],[435,64],[337,65],[338,65],[339,66],[340,67],[341,68],[342,69],[333,70],[331,2],[332,2],[343,71],[344,72],[345,73],[346,74],[347,75],[348,76],[349,76],[350,77],[351,78],[352,79],[353,80],[354,81],[336,2],[355,82],[356,83],[357,84],[358,85],[359,86],[360,87],[361,88],[362,89],[363,90],[364,91],[365,92],[366,93],[367,94],[368,95],[369,96],[371,97],[370,98],[372,99],[373,100],[374,2],[375,101],[376,102],[377,103],[378,104],[335,105],[334,2],[387,106],[379,107],[380,108],[381,109],[382,110],[383,111],[384,112],[385,113],[386,114],[436,2],[437,2],[59,2],[438,2],[408,2],[409,2],[321,12],[73,12],[439,115],[441,116],[440,117],[443,118],[444,12],[147,12],[445,118],[442,2],[446,119],[57,2],[60,120],[61,12],[447,64],[448,2],[473,121],[474,122],[449,123],[452,123],[471,121],[472,121],[462,121],[461,124],[459,121],[454,121],[467,121],[465,121],[469,121],[453,121],[466,121],[470,121],[455,121],[456,121],[468,121],[450,121],[457,121],[458,121],[460,121],[464,121],[475,125],[463,121],[451,121],[488,126],[487,2],[482,125],[484,127],[483,125],[476,125],[477,125],[479,125],[481,125],[485,127],[486,127],[478,127],[480,127],[407,128],[489,129],[418,130],[490,52],[491,2],[493,131],[492,2],[79,2],[80,2],[494,2],[495,132],[496,2],[497,133],[58,2],[102,2],[99,134],[101,134],[100,134],[98,134],[108,135],[103,136],[107,2],[104,2],[106,2],[105,2],[94,134],[95,134],[96,134],[92,2],[93,2],[97,134],[247,137],[153,138],[152,139],[146,140],[149,141],[143,12],[151,140],[150,140],[177,142],[176,140],[175,140],[179,143],[180,144],[182,145],[181,140],[184,146],[185,140],[186,140],[196,147],[190,140],[194,140],[197,140],[193,140],[187,140],[195,140],[191,140],[189,140],[192,140],[188,140],[200,148],[198,140],[199,140],[154,12],[201,140],[148,149],[202,140],[216,150],[217,151],[209,152],[214,140],[215,140],[212,153],[213,140],[211,154],[210,155],[218,149],[224,140],[221,156],[220,140],[222,157],[234,158],[235,159],[229,160],[227,140],[228,140],[225,161],[226,140],[223,140],[230,162],[232,140],[233,140],[231,140],[219,163],[237,164],[236,140],[241,165],[240,166],[252,167],[246,140],[251,140],[250,140],[248,168],[249,140],[255,169],[266,170],[253,140],[254,171],[265,172],[256,140],[257,173],[262,174],[263,140],[264,140],[261,175],[258,140],[259,168],[260,140],[267,176],[270,177],[271,178],[272,140],[273,179],[276,180],[275,181],[279,182],[278,140],[277,140],[280,140],[281,140],[282,140],[287,183],[283,144],[284,184],[289,185],[295,186],[293,187],[294,140],[290,139],[296,140],[297,188],[298,12],[301,189],[299,140],[302,140],[300,190],[303,191],[304,192],[305,177],[288,193],[145,38],[306,194],[174,195],[274,196],[311,197],[308,12],[309,12],[307,2],[310,198],[85,199],[86,200],[82,201],[78,202],[90,203],[87,204],[84,205],[88,204],[91,206],[83,207],[76,2],[74,208],[89,2],[81,209],[71,210],[72,211],[70,212],[67,213],[66,214],[69,215],[68,213],[388,216],[115,217],[114,13],[75,2],[111,218],[112,219],[110,220],[109,218],[11,2],[12,2],[14,2],[13,2],[2,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[3,2],[4,2],[26,2],[23,2],[24,2],[25,2],[27,2],[28,2],[29,2],[5,2],[30,2],[31,2],[32,2],[33,2],[6,2],[37,2],[34,2],[35,2],[36,2],[38,2],[7,2],[39,2],[44,2],[45,2],[40,2],[41,2],[42,2],[43,2],[8,2],[49,2],[46,2],[47,2],[48,2],[50,2],[9,2],[51,2],[52,2],[53,2],[54,2],[55,2],[1,2],[10,2],[56,2],[323,221],[324,221],[325,221],[326,221],[327,221],[328,222],[322,2],[320,223],[319,241],[313,242],[318,242],[315,242],[391,228],[316,242],[312,242],[317,242],[314,242],[392,232],[394,233],[330,235],[389,236],[329,237],[390,234],[141,243],[395,244],[142,240],[393,234]],"semanticDiagnosticsPerFile":[399,397,172,168,155,171,164,162,161,160,157,158,166,159,156,163,169,170,165,167,285,117,137,123,124,130,113,126,127,116,129,128,122,118,138,133,134,136,135,125,131,132,119,121,120,62,65,64,63,178,183,208,203,207,205,206,244,245,242,239,238,269,291,292,286,144,204,173,268,243,402,398,400,401,404,405,411,403,416,412,415,413,410,420,419,421,422,426,427,423,424,425,428,77,429,417,430,431,432,433,414,434,406,435,337,338,339,340,341,342,333,331,332,343,344,345,346,347,348,349,350,351,352,353,354,336,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,370,372,373,374,375,376,377,378,335,334,387,379,380,381,382,383,384,385,386,436,437,59,438,408,409,321,73,439,441,440,443,444,147,445,442,446,57,60,61,447,448,473,474,449,452,471,472,462,461,459,454,467,465,469,453,466,470,455,456,468,450,457,458,460,464,475,463,451,488,487,482,484,483,476,477,479,481,485,486,478,480,407,489,418,490,491,493,492,79,80,494,495,496,497,58,102,99,101,100,98,108,103,107,104,106,105,94,95,96,92,93,97,247,153,152,146,149,143,151,150,177,176,175,179,180,182,181,184,185,186,196,190,194,197,193,187,195,191,189,192,188,200,198,199,154,201,148,202,216,217,209,214,215,212,213,211,210,218,224,221,220,222,234,235,229,227,228,225,226,223,230,232,233,231,219,237,236,241,240,252,246,251,250,248,249,255,266,253,254,265,256,257,262,263,264,261,258,259,260,267,270,271,272,273,276,275,279,278,277,280,281,282,287,283,284,289,295,293,294,290,296,297,298,301,299,302,300,303,304,305,288,145,306,174,274,311,308,309,307,310,85,86,82,78,90,87,84,88,91,83,76,74,89,81,71,72,70,67,66,69,68,388,115,114,75,111,112,110,109,11,12,14,13,2,15,16,17,18,19,20,21,22,3,4,26,23,24,25,27,28,29,5,30,31,32,33,6,37,34,35,36,38,7,39,44,45,40,41,42,43,8,49,46,47,48,50,9,51,52,53,54,55,1,10,56,323,324,325,326,327,328,322,[320,[{"file":"./src/App.test.tsx","start":59,"length":24,"messageText":"Cannot find module '@testing-library/react' or its corresponding type declarations.","category":1,"code":2307},{"file":"./src/App.test.tsx","start":114,"length":8,"messageText":"Cannot find name 'describe'. Do you need to install type definitions for a test runner? Try `npm i --save-dev @types/jest` or `npm i --save-dev @types/mocha`.","category":1,"code":2582},{"file":"./src/App.test.tsx","start":151,"length":2,"messageText":"Cannot find name 'it'. Do you need to install type definitions for a test runner? Try `npm i --save-dev @types/jest` or `npm i --save-dev @types/mocha`.","category":1,"code":2582}]],319,313,318,315,[391,[{"file":"./src/components/Inventory.tsx","start":495,"length":12,"code":2339,"category":1,"messageText":"Property 'currentWorld' does not exist on type 'GameState'."},{"file":"./src/components/Inventory.tsx","start":1187,"length":21,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '{ worldId: any; levelId: string; slotId: string; word: Word; }' is not assignable to parameter of type '{ levelId: string; sectionId: string; slotId: string; word: Word; sourceLevelId: string; sourceSectionId: string; }'.","category":1,"code":2345,"next":[{"messageText":"Object literal may only specify known properties, and 'worldId' does not exist in type '{ levelId: string; sectionId: string; slotId: string; word: Word; sourceLevelId: string; sourceSectionId: string; }'.","category":1,"code":2353}]}}]],316,312,[317,[{"file":"./src/components/TutorialOverlay.tsx","start":68,"length":15,"messageText":"Cannot find module 'framer-motion' or its corresponding type declarations.","category":1,"code":2307}]],314,[392,[{"file":"./src/components/WorldSelector.tsx","start":304,"length":15,"messageText":"Module '\"../store/gameSlice\"' has no exported member 'setCurrentWorld'. Did you mean to use 'import setCurrentWorld from \"../store/gameSlice\"' instead?","category":1,"code":2614},{"file":"./src/components/WorldSelector.tsx","start":625,"length":6,"code":2339,"category":1,"messageText":"Property 'worlds' does not exist on type 'GameState'."},{"file":"./src/components/WorldSelector.tsx","start":703,"length":12,"code":2339,"category":1,"messageText":"Property 'currentWorld' does not exist on type 'GameState'."},{"file":"./src/components/WorldSelector.tsx","start":2345,"length":5,"code":2339,"category":1,"messageText":"Property 'slots' does not exist on type 'Level'."},{"file":"./src/components/WorldSelector.tsx","start":3427,"length":10,"code":2339,"category":1,"messageText":"Property 'isUnlocked' does not exist on type 'Level'."},{"file":"./src/components/WorldSelector.tsx","start":3647,"length":10,"code":2339,"category":1,"messageText":"Property 'isUnlocked' does not exist on type 'Level'."},{"file":"./src/components/WorldSelector.tsx","start":3892,"length":10,"code":2339,"category":1,"messageText":"Property 'isUnlocked' does not exist on type 'Level'."},{"file":"./src/components/WorldSelector.tsx","start":4054,"length":7,"code":2322,"category":1,"messageText":{"messageText":"Type '{ worldId: any; levelId: string; }' is not assignable to type 'IntrinsicAttributes'.","category":1,"code":2322,"next":[{"messageText":"Property 'worldId' does not exist on type 'IntrinsicAttributes'.","category":1,"code":2339}]}}]],394,139,330,389,329,390,141,[395,[{"file":"./src/store/initialState.ts","start":68,"length":25,"messageText":"Cannot find module '../utils/gameDataParser' or its corresponding type declarations.","category":1,"code":2307}]],142,140,393,396],"affectedFilesPendingEmit":[[399,1],[397,1],[172,1],[168,1],[155,1],[171,1],[164,1],[162,1],[161,1],[160,1],[157,1],[158,1],[166,1],[159,1],[156,1],[163,1],[169,1],[170,1],[165,1],[167,1],[285,1],[117,1],[137,1],[123,1],[124,1],[130,1],[113,1],[126,1],[127,1],[116,1],[129,1],[128,1],[122,1],[118,1],[138,1],[133,1],[134,1],[136,1],[135,1],[125,1],[131,1],[132,1],[119,1],[121,1],[120,1],[62,1],[65,1],[64,1],[63,1],[178,1],[183,1],[208,1],[203,1],[207,1],[205,1],[206,1],[244,1],[245,1],[242,1],[239,1],[238,1],[269,1],[291,1],[292,1],[286,1],[144,1],[204,1],[173,1],[268,1],[243,1],[402,1],[398,1],[400,1],[401,1],[404,1],[405,1],[411,1],[403,1],[416,1],[412,1],[415,1],[413,1],[410,1],[420,1],[419,1],[421,1],[422,1],[426,1],[427,1],[423,1],[424,1],[425,1],[428,1],[77,1],[429,1],[417,1],[430,1],[431,1],[432,1],[433,1],[414,1],[434,1],[406,1],[435,1],[337,1],[338,1],[339,1],[340,1],[341,1],[342,1],[333,1],[331,1],[332,1],[343,1],[344,1],[345,1],[346,1],[347,1],[348,1],[349,1],[350,1],[351,1],[352,1],[353,1],[354,1],[336,1],[355,1],[356,1],[357,1],[358,1],[359,1],[360,1],[361,1],[362,1],[363,1],[364,1],[365,1],[366,1],[367,1],[368,1],[369,1],[371,1],[370,1],[372,1],[373,1],[374,1],[375,1],[376,1],[377,1],[378,1],[335,1],[334,1],[387,1],[379,1],[380,1],[381,1],[382,1],[383,1],[384,1],[385,1],[386,1],[436,1],[437,1],[59,1],[438,1],[408,1],[409,1],[321,1],[73,1],[439,1],[441,1],[440,1],[443,1],[444,1],[147,1],[445,1],[442,1],[446,1],[57,1],[60,1],[61,1],[447,1],[448,1],[473,1],[474,1],[449,1],[452,1],[471,1],[472,1],[462,1],[461,1],[459,1],[454,1],[467,1],[465,1],[469,1],[453,1],[466,1],[470,1],[455,1],[456,1],[468,1],[450,1],[457,1],[458,1],[460,1],[464,1],[475,1],[463,1],[451,1],[488,1],[487,1],[482,1],[484,1],[483,1],[476,1],[477,1],[479,1],[481,1],[485,1],[486,1],[478,1],[480,1],[407,1],[489,1],[418,1],[490,1],[491,1],[493,1],[492,1],[79,1],[80,1],[494,1],[495,1],[496,1],[497,1],[58,1],[102,1],[99,1],[101,1],[100,1],[98,1],[108,1],[103,1],[107,1],[104,1],[106,1],[105,1],[94,1],[95,1],[96,1],[92,1],[93,1],[97,1],[247,1],[153,1],[152,1],[146,1],[149,1],[143,1],[151,1],[150,1],[177,1],[176,1],[175,1],[179,1],[180,1],[182,1],[181,1],[184,1],[185,1],[186,1],[196,1],[190,1],[194,1],[197,1],[193,1],[187,1],[195,1],[191,1],[189,1],[192,1],[188,1],[200,1],[198,1],[199,1],[154,1],[201,1],[148,1],[202,1],[216,1],[217,1],[209,1],[214,1],[215,1],[212,1],[213,1],[211,1],[210,1],[218,1],[224,1],[221,1],[220,1],[222,1],[234,1],[235,1],[229,1],[227,1],[228,1],[225,1],[226,1],[223,1],[230,1],[232,1],[233,1],[231,1],[219,1],[237,1],[236,1],[241,1],[240,1],[252,1],[246,1],[251,1],[250,1],[248,1],[249,1],[255,1],[266,1],[253,1],[254,1],[265,1],[256,1],[257,1],[262,1],[263,1],[264,1],[261,1],[258,1],[259,1],[260,1],[267,1],[270,1],[271,1],[272,1],[273,1],[276,1],[275,1],[279,1],[278,1],[277,1],[280,1],[281,1],[282,1],[287,1],[283,1],[284,1],[289,1],[295,1],[293,1],[294,1],[290,1],[296,1],[297,1],[298,1],[301,1],[299,1],[302,1],[300,1],[303,1],[304,1],[305,1],[288,1],[145,1],[306,1],[174,1],[274,1],[311,1],[308,1],[309,1],[307,1],[310,1],[85,1],[86,1],[82,1],[78,1],[90,1],[87,1],[84,1],[88,1],[91,1],[83,1],[76,1],[74,1],[89,1],[81,1],[71,1],[72,1],[70,1],[67,1],[66,1],[69,1],[68,1],[388,1],[115,1],[114,1],[75,1],[111,1],[112,1],[110,1],[109,1],[2,1],[3,1],[4,1],[5,1],[6,1],[7,1],[8,1],[9,1],[10,1],[323,1],[324,1],[325,1],[326,1],[327,1],[328,1],[322,1],[320,1],[319,1],[313,1],[318,1],[315,1],[391,1],[316,1],[312,1],[498,1],[317,1],[314,1],[392,1],[394,1],[139,1],[330,1],[389,1],[329,1],[390,1],[141,1],[395,1],[142,1],[140,1],[393,1],[499,1],[396,1]]},"version":"4.9.5"} \ No newline at end of file