From aafabba59527b9b7c99e7c0caf6ed66a9da9a9ad Mon Sep 17 00:00:00 2001 From: Philipp Urbschat Date: Sat, 12 Sep 2026 21:10:04 +0200 Subject: [PATCH] Initial commit: Clean portfolio codebase with security hardening --- .gitignore | 38 + .htaccess | 30 + admin-tools/index.php | 131 ++ auth.php | 38 + cooles-feature/index.php | 286 ++++ dinos/.env.example | 1 + dinos/.htaccess | 13 + dinos/Google Photo API Upload.pdf | Bin 0 -> 279070 bytes dinos/apis.php | 109 ++ dinos/auth.php | 65 + dinos/google_helper.php | 150 ++ dinos/index.php | 1179 +++++++++++++ dinos/prompts.js | 94 ++ dinos/test.html | 1049 ++++++++++++ dinos/upload_handler.php | 56 + home/.env.example | 13 + home/app/controllers/AdminController.php | 89 + home/app/controllers/HomeController.php | 28 + home/app/controllers/LoginController.php | 43 + home/app/controllers/SeoController.php | 40 + home/app/init.php | 32 + home/app/models/User.php | 67 + home/app/services/HealthService.php | 72 + home/core/Auth.php | 19 + home/core/Config.php | 20 + home/core/Controller.php | 46 + home/core/Database.php | 68 + home/core/Flash.php | 42 + home/core/Router.php | 35 + home/core/Security.php | 17 + home/package-lock.json | 1055 ++++++++++++ home/package.json | 17 + home/public/.htaccess | 9 + home/public/android-chrome-192x192.png | Bin 0 -> 38824 bytes home/public/android-chrome-512x512.png | Bin 0 -> 272710 bytes home/public/apple-touch-icon.png | Bin 0 -> 35108 bytes home/public/css/app.css | 2 + home/public/css/style.css | 125 ++ home/public/favicon-16x16.png | Bin 0 -> 920 bytes home/public/favicon-32x32.png | Bin 0 -> 2246 bytes home/public/favicon.ico | Bin 0 -> 15406 bytes .../fonts/jetbrains-mono-v24-latin-700.woff2 | Bin 0 -> 21908 bytes .../jetbrains-mono-v24-latin-regular.woff2 | Bin 0 -> 21168 bytes home/public/fonts/outfit-v15-latin-300.woff2 | Bin 0 -> 13956 bytes home/public/fonts/outfit-v15-latin-700.woff2 | Bin 0 -> 14060 bytes .../fonts/outfit-v15-latin-regular.woff2 | Bin 0 -> 14032 bytes home/public/index.php | 23 + home/public/js/main.js | 53 + home/src/input.css | 19 + home/views/about.php | 43 + home/views/admin/dashboard.php | 56 + home/views/admin/settings.php | 45 + home/views/admin/user_form.php | 50 + home/views/admin/users.php | 70 + home/views/error.php | 27 + home/views/home.php | 100 ++ home/views/imprint.php | 34 + home/views/inc/admin_footer.php | 6 + home/views/inc/admin_header.php | 25 + home/views/inc/footer.php | 15 + home/views/inc/header.php | 62 + home/views/privacy.php | 38 + philcore/.htaccess | 13 + philcore/app/controllers/AdminController.php | 36 + philcore/app/controllers/HomeController.php | 11 + philcore/app/init.php | 44 + philcore/app/services/HealthService.php | 80 + philcore/core/Auth.php | 25 + philcore/core/Config.php | 20 + philcore/core/Controller.php | 37 + philcore/core/Database.php | 68 + philcore/core/Flash.php | 26 + philcore/core/Router.php | 43 + philcore/core/Security.php | 18 + philcore/public/.htaccess | 7 + philcore/public/index.php | 32 + philcore/readme.md | 27 + philcore/views/admin/dashboard.php | 87 + philcore/views/admin/settings.php | 66 + philcore/views/admin/users.php | 66 + philcore/views/error.php | 26 + philcore/views/home.php | 24 + philcore/views/inc/admin_footer.php | 6 + philcore/views/inc/admin_header.php | 28 + philcore/views/inc/footer.php | 16 + philcore/views/inc/header.php | 29 + plants/.env.example | 2 + plants/.gitignore | 1 + plants/api.js | 173 ++ plants/api.php | 358 ++++ plants/api_proxy.php | 60 + plants/auth.js | 117 ++ plants/auth_api.php | 86 + plants/components.css | 761 +++++++++ plants/composer.json | 5 + plants/composer.lock | 492 ++++++ plants/db.php | 34 + plants/img/icon.png | Bin 0 -> 18709 bytes plants/img/logo.webp | Bin 0 -> 12720 bytes plants/index.php | 341 ++++ plants/lexikon.js | 200 +++ plants/lexikon.php | 115 ++ plants/main.js | 381 +++++ plants/style.css | 1314 +++++++++++++++ plants/test.html | 82 + plants/test_prompt.php | 228 +++ plants/ui.js | 553 ++++++ plants/vendor/autoload.php | 22 + plants/vendor/composer/ClassLoader.php | 579 +++++++ plants/vendor/composer/InstalledVersions.php | 396 +++++ plants/vendor/composer/LICENSE | 21 + plants/vendor/composer/autoload_classmap.php | 15 + plants/vendor/composer/autoload_files.php | 12 + .../vendor/composer/autoload_namespaces.php | 9 + plants/vendor/composer/autoload_psr4.php | 15 + plants/vendor/composer/autoload_real.php | 50 + plants/vendor/composer/autoload_static.php | 81 + plants/vendor/composer/installed.json | 497 ++++++ plants/vendor/composer/installed.php | 77 + plants/vendor/composer/platform_check.php | 25 + .../graham-campbell/result-type/LICENSE | 21 + .../graham-campbell/result-type/composer.json | 33 + .../graham-campbell/result-type/src/Error.php | 121 ++ .../result-type/src/Result.php | 69 + .../result-type/src/Success.php | 120 ++ plants/vendor/phpoption/phpoption/LICENSE | 201 +++ .../vendor/phpoption/phpoption/composer.json | 50 + .../phpoption/src/PhpOption/LazyOption.php | 175 ++ .../phpoption/src/PhpOption/None.php | 136 ++ .../phpoption/src/PhpOption/Option.php | 434 +++++ .../phpoption/src/PhpOption/Some.php | 169 ++ .../vendor/symfony/polyfill-ctype/Ctype.php | 232 +++ plants/vendor/symfony/polyfill-ctype/LICENSE | 19 + .../vendor/symfony/polyfill-ctype/README.md | 12 + .../symfony/polyfill-ctype/bootstrap.php | 50 + .../symfony/polyfill-ctype/bootstrap80.php | 46 + .../symfony/polyfill-ctype/composer.json | 38 + .../vendor/symfony/polyfill-mbstring/LICENSE | 19 + .../symfony/polyfill-mbstring/Mbstring.php | 1045 ++++++++++++ .../symfony/polyfill-mbstring/README.md | 13 + .../Resources/unidata/caseFolding.php | 119 ++ .../Resources/unidata/lowerCase.php | 1397 ++++++++++++++++ .../Resources/unidata/titleCaseRegexp.php | 5 + .../Resources/unidata/upperCase.php | 1489 +++++++++++++++++ .../symfony/polyfill-mbstring/bootstrap.php | 172 ++ .../symfony/polyfill-mbstring/bootstrap80.php | 167 ++ .../symfony/polyfill-mbstring/composer.json | 39 + plants/vendor/symfony/polyfill-php80/LICENSE | 19 + .../vendor/symfony/polyfill-php80/Php80.php | 115 ++ .../symfony/polyfill-php80/PhpToken.php | 106 ++ .../vendor/symfony/polyfill-php80/README.md | 25 + .../Resources/stubs/Attribute.php | 31 + .../Resources/stubs/PhpToken.php | 16 + .../Resources/stubs/Stringable.php | 20 + .../Resources/stubs/UnhandledMatchError.php | 16 + .../Resources/stubs/ValueError.php | 16 + .../symfony/polyfill-php80/bootstrap.php | 42 + .../symfony/polyfill-php80/composer.json | 37 + plants/vendor/vlucas/phpdotenv/LICENSE | 30 + plants/vendor/vlucas/phpdotenv/composer.json | 60 + plants/vendor/vlucas/phpdotenv/src/Dotenv.php | 267 +++ .../src/Exception/ExceptionInterface.php | 12 + .../Exception/InvalidEncodingException.php | 12 + .../src/Exception/InvalidFileException.php | 12 + .../src/Exception/InvalidPathException.php | 12 + .../src/Exception/ValidationException.php | 12 + .../vlucas/phpdotenv/src/Loader/Loader.php | 48 + .../phpdotenv/src/Loader/LoaderInterface.php | 20 + .../vlucas/phpdotenv/src/Loader/Resolver.php | 65 + .../vlucas/phpdotenv/src/Parser/Entry.php | 59 + .../phpdotenv/src/Parser/EntryParser.php | 300 ++++ .../vlucas/phpdotenv/src/Parser/Lexer.php | 58 + .../vlucas/phpdotenv/src/Parser/Lines.php | 127 ++ .../vlucas/phpdotenv/src/Parser/Parser.php | 53 + .../phpdotenv/src/Parser/ParserInterface.php | 19 + .../vlucas/phpdotenv/src/Parser/Value.php | 88 + .../Repository/Adapter/AdapterInterface.php | 15 + .../src/Repository/Adapter/ApacheAdapter.php | 89 + .../src/Repository/Adapter/ArrayAdapter.php | 80 + .../Repository/Adapter/EnvConstAdapter.php | 89 + .../src/Repository/Adapter/GuardedWriter.php | 85 + .../Repository/Adapter/ImmutableWriter.php | 110 ++ .../src/Repository/Adapter/MultiReader.php | 48 + .../src/Repository/Adapter/MultiWriter.php | 64 + .../src/Repository/Adapter/PutenvAdapter.php | 91 + .../Repository/Adapter/ReaderInterface.php | 17 + .../Repository/Adapter/ReplacingWriter.php | 104 ++ .../Repository/Adapter/ServerConstAdapter.php | 89 + .../Repository/Adapter/WriterInterface.php | 27 + .../src/Repository/AdapterRepository.php | 107 ++ .../src/Repository/RepositoryBuilder.php | 272 +++ .../src/Repository/RepositoryInterface.php | 51 + .../vlucas/phpdotenv/src/Store/File/Paths.php | 44 + .../phpdotenv/src/Store/File/Reader.php | 81 + .../vlucas/phpdotenv/src/Store/FileStore.php | 72 + .../phpdotenv/src/Store/StoreBuilder.php | 141 ++ .../phpdotenv/src/Store/StoreInterface.php | 17 + .../phpdotenv/src/Store/StringStore.php | 37 + .../vlucas/phpdotenv/src/Util/Regex.php | 112 ++ .../vendor/vlucas/phpdotenv/src/Util/Str.php | 108 ++ .../vendor/vlucas/phpdotenv/src/Validator.php | 207 +++ storymachine/.env.example | 1 + storymachine/api_proxy.php | 99 ++ storymachine/index.php | 877 ++++++++++ test/index.html | 22 + test/index.php | 22 + 206 files changed, 24947 insertions(+) create mode 100644 .gitignore create mode 100644 .htaccess create mode 100644 admin-tools/index.php create mode 100644 auth.php create mode 100644 cooles-feature/index.php create mode 100644 dinos/.env.example create mode 100644 dinos/.htaccess create mode 100644 dinos/Google Photo API Upload.pdf create mode 100644 dinos/apis.php create mode 100644 dinos/auth.php create mode 100644 dinos/google_helper.php create mode 100644 dinos/index.php create mode 100644 dinos/prompts.js create mode 100644 dinos/test.html create mode 100644 dinos/upload_handler.php create mode 100644 home/.env.example create mode 100644 home/app/controllers/AdminController.php create mode 100644 home/app/controllers/HomeController.php create mode 100644 home/app/controllers/LoginController.php create mode 100644 home/app/controllers/SeoController.php create mode 100644 home/app/init.php create mode 100644 home/app/models/User.php create mode 100644 home/app/services/HealthService.php create mode 100644 home/core/Auth.php create mode 100644 home/core/Config.php create mode 100644 home/core/Controller.php create mode 100644 home/core/Database.php create mode 100644 home/core/Flash.php create mode 100644 home/core/Router.php create mode 100644 home/core/Security.php create mode 100644 home/package-lock.json create mode 100644 home/package.json create mode 100644 home/public/.htaccess create mode 100644 home/public/android-chrome-192x192.png create mode 100644 home/public/android-chrome-512x512.png create mode 100644 home/public/apple-touch-icon.png create mode 100644 home/public/css/app.css create mode 100644 home/public/css/style.css create mode 100644 home/public/favicon-16x16.png create mode 100644 home/public/favicon-32x32.png create mode 100644 home/public/favicon.ico create mode 100644 home/public/fonts/jetbrains-mono-v24-latin-700.woff2 create mode 100644 home/public/fonts/jetbrains-mono-v24-latin-regular.woff2 create mode 100644 home/public/fonts/outfit-v15-latin-300.woff2 create mode 100644 home/public/fonts/outfit-v15-latin-700.woff2 create mode 100644 home/public/fonts/outfit-v15-latin-regular.woff2 create mode 100644 home/public/index.php create mode 100644 home/public/js/main.js create mode 100644 home/src/input.css create mode 100644 home/views/about.php create mode 100644 home/views/admin/dashboard.php create mode 100644 home/views/admin/settings.php create mode 100644 home/views/admin/user_form.php create mode 100644 home/views/admin/users.php create mode 100644 home/views/error.php create mode 100644 home/views/home.php create mode 100644 home/views/imprint.php create mode 100644 home/views/inc/admin_footer.php create mode 100644 home/views/inc/admin_header.php create mode 100644 home/views/inc/footer.php create mode 100644 home/views/inc/header.php create mode 100644 home/views/privacy.php create mode 100644 philcore/.htaccess create mode 100644 philcore/app/controllers/AdminController.php create mode 100644 philcore/app/controllers/HomeController.php create mode 100644 philcore/app/init.php create mode 100644 philcore/app/services/HealthService.php create mode 100644 philcore/core/Auth.php create mode 100644 philcore/core/Config.php create mode 100644 philcore/core/Controller.php create mode 100644 philcore/core/Database.php create mode 100644 philcore/core/Flash.php create mode 100644 philcore/core/Router.php create mode 100644 philcore/core/Security.php create mode 100644 philcore/public/.htaccess create mode 100644 philcore/public/index.php create mode 100644 philcore/readme.md create mode 100644 philcore/views/admin/dashboard.php create mode 100644 philcore/views/admin/settings.php create mode 100644 philcore/views/admin/users.php create mode 100644 philcore/views/error.php create mode 100644 philcore/views/home.php create mode 100644 philcore/views/inc/admin_footer.php create mode 100644 philcore/views/inc/admin_header.php create mode 100644 philcore/views/inc/footer.php create mode 100644 philcore/views/inc/header.php create mode 100644 plants/.env.example create mode 100644 plants/.gitignore create mode 100644 plants/api.js create mode 100644 plants/api.php create mode 100644 plants/api_proxy.php create mode 100644 plants/auth.js create mode 100644 plants/auth_api.php create mode 100644 plants/components.css create mode 100644 plants/composer.json create mode 100644 plants/composer.lock create mode 100644 plants/db.php create mode 100644 plants/img/icon.png create mode 100644 plants/img/logo.webp create mode 100644 plants/index.php create mode 100644 plants/lexikon.js create mode 100644 plants/lexikon.php create mode 100644 plants/main.js create mode 100644 plants/style.css create mode 100644 plants/test.html create mode 100644 plants/test_prompt.php create mode 100644 plants/ui.js create mode 100644 plants/vendor/autoload.php create mode 100644 plants/vendor/composer/ClassLoader.php create mode 100644 plants/vendor/composer/InstalledVersions.php create mode 100644 plants/vendor/composer/LICENSE create mode 100644 plants/vendor/composer/autoload_classmap.php create mode 100644 plants/vendor/composer/autoload_files.php create mode 100644 plants/vendor/composer/autoload_namespaces.php create mode 100644 plants/vendor/composer/autoload_psr4.php create mode 100644 plants/vendor/composer/autoload_real.php create mode 100644 plants/vendor/composer/autoload_static.php create mode 100644 plants/vendor/composer/installed.json create mode 100644 plants/vendor/composer/installed.php create mode 100644 plants/vendor/composer/platform_check.php create mode 100644 plants/vendor/graham-campbell/result-type/LICENSE create mode 100644 plants/vendor/graham-campbell/result-type/composer.json create mode 100644 plants/vendor/graham-campbell/result-type/src/Error.php create mode 100644 plants/vendor/graham-campbell/result-type/src/Result.php create mode 100644 plants/vendor/graham-campbell/result-type/src/Success.php create mode 100644 plants/vendor/phpoption/phpoption/LICENSE create mode 100644 plants/vendor/phpoption/phpoption/composer.json create mode 100644 plants/vendor/phpoption/phpoption/src/PhpOption/LazyOption.php create mode 100644 plants/vendor/phpoption/phpoption/src/PhpOption/None.php create mode 100644 plants/vendor/phpoption/phpoption/src/PhpOption/Option.php create mode 100644 plants/vendor/phpoption/phpoption/src/PhpOption/Some.php create mode 100644 plants/vendor/symfony/polyfill-ctype/Ctype.php create mode 100644 plants/vendor/symfony/polyfill-ctype/LICENSE create mode 100644 plants/vendor/symfony/polyfill-ctype/README.md create mode 100644 plants/vendor/symfony/polyfill-ctype/bootstrap.php create mode 100644 plants/vendor/symfony/polyfill-ctype/bootstrap80.php create mode 100644 plants/vendor/symfony/polyfill-ctype/composer.json create mode 100644 plants/vendor/symfony/polyfill-mbstring/LICENSE create mode 100644 plants/vendor/symfony/polyfill-mbstring/Mbstring.php create mode 100644 plants/vendor/symfony/polyfill-mbstring/README.md create mode 100644 plants/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php create mode 100644 plants/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php create mode 100644 plants/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php create mode 100644 plants/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php create mode 100644 plants/vendor/symfony/polyfill-mbstring/bootstrap.php create mode 100644 plants/vendor/symfony/polyfill-mbstring/bootstrap80.php create mode 100644 plants/vendor/symfony/polyfill-mbstring/composer.json create mode 100644 plants/vendor/symfony/polyfill-php80/LICENSE create mode 100644 plants/vendor/symfony/polyfill-php80/Php80.php create mode 100644 plants/vendor/symfony/polyfill-php80/PhpToken.php create mode 100644 plants/vendor/symfony/polyfill-php80/README.md create mode 100644 plants/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php create mode 100644 plants/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php create mode 100644 plants/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php create mode 100644 plants/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php create mode 100644 plants/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php create mode 100644 plants/vendor/symfony/polyfill-php80/bootstrap.php create mode 100644 plants/vendor/symfony/polyfill-php80/composer.json create mode 100644 plants/vendor/vlucas/phpdotenv/LICENSE create mode 100644 plants/vendor/vlucas/phpdotenv/composer.json create mode 100644 plants/vendor/vlucas/phpdotenv/src/Dotenv.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Exception/ExceptionInterface.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Exception/InvalidEncodingException.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Exception/InvalidFileException.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Exception/InvalidPathException.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Exception/ValidationException.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Loader/Loader.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Loader/LoaderInterface.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Loader/Resolver.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Parser/Entry.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Parser/EntryParser.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Parser/Lexer.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Parser/Lines.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Parser/Parser.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Parser/ParserInterface.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Parser/Value.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/AdapterInterface.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/GuardedWriter.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ImmutableWriter.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiReader.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiWriter.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReplacingWriter.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Repository/AdapterRepository.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Repository/RepositoryBuilder.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Repository/RepositoryInterface.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Store/File/Paths.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Store/File/Reader.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Store/FileStore.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Store/StoreBuilder.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Store/StoreInterface.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Store/StringStore.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Util/Regex.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Util/Str.php create mode 100644 plants/vendor/vlucas/phpdotenv/src/Validator.php create mode 100644 storymachine/.env.example create mode 100644 storymachine/api_proxy.php create mode 100644 storymachine/index.php create mode 100644 test/index.html create mode 100644 test/index.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..440896f --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +# Environment & Secrets +.env +*.env +**/.env +!.env.example +!*.env.example +!**/.env.example + +# OAuth & Sensitive Data +client_secret.json +**/client_secret.json +tokens.json +**/tokens.json +usage_stats.json +**/usage_stats.json +*.sql +*.sqlite + +# Dependencies +node_modules/ +**/node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# OS & IDE Files +.DS_Store +**/.DS_Store +Thumbs.db +.vscode/ +.idea/ +*.sublime-project +*.sublime-workspace + +# Temporary & Export Files +*export* +*.tmp +*.log diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..1e4533b --- /dev/null +++ b/.htaccess @@ -0,0 +1,30 @@ +# DATEI: ./.htaccess +Options -Indexes +RewriteEngine On + +# Interne PHP- und Template-Verzeichnisse vor direktem Webzugriff sperren +RewriteRule ^(home|philcore)/(app|core|views|src)/ - [F,L] + +# Sensible Dateien und Verzeichnisse vor direktem Webzugriff schützen + + Require all denied + + + + Require all denied + + +# 1. Dynamische XML/TXT Dateien -> Ab zum SeoController +RewriteRule ^sitemap\.xml$ home/public/index.php?url=seo/sitemap [L,QSA] +RewriteRule ^robots\.txt$ home/public/index.php?url=seo/robots [L,QSA] + +# 2. Domain-Einstieg +RewriteRule ^$ home/public/index.php [L] + +# 3. Echte Assets schützen +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_URI} !^/home/public/ + +# 4. Globales Routing +RewriteRule ^(.*)$ home/public/index.php?url=$1 [L,QSA] \ No newline at end of file diff --git a/admin-tools/index.php b/admin-tools/index.php new file mode 100644 index 0000000..22a6819 --- /dev/null +++ b/admin-tools/index.php @@ -0,0 +1,131 @@ + + + + + + + Admin: Hash-Generator + + + + +
+
+

ADMIN TOOLS

+

Password Hash Generator

+
+ +
+ +
+
+
+ + +
+ +
+ + +
+ Original:

+ Hash (klicken zum Kopieren):
+ +
+ + + BACK +
+
+ + + + \ No newline at end of file diff --git a/auth.php b/auth.php new file mode 100644 index 0000000..95a3f21 --- /dev/null +++ b/auth.php @@ -0,0 +1,38 @@ + '/', + 'httponly' => true, + 'samesite' => 'Lax' // Lax erlaubt den Wechsel zwischen /home und /test + ]); + session_start(); +} + +// 1. Ist der User eingeloggt? +if (!isset($_SESSION['user_email'])) { + header('Location: /'); + exit(); +} + +// 2. Browser-Check gegen Session Hijacking +if (!isset($_SESSION['user_agent'])) { + $_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT']; +} elseif ($_SESSION['user_agent'] !== $_SERVER['HTTP_USER_AGENT']) { + session_destroy(); + header('Location: /'); + exit(); +} + +// 3. Rechte-Check (Admins dürfen immer rein) +$isAdmin = isset($_SESSION['is_admin']) && $_SESSION['is_admin'] === true; +$hasProjectAccess = isset($current_project) && isset($_SESSION['user_projects']) && in_array($current_project, $_SESSION['user_projects']); + +if (!$isAdmin && !$hasProjectAccess) { + // Kein Admin und kein spezifischer Projekt-Zugriff + header('Location: /'); + exit(); +} +?> \ No newline at end of file diff --git a/cooles-feature/index.php b/cooles-feature/index.php new file mode 100644 index 0000000..430acff --- /dev/null +++ b/cooles-feature/index.php @@ -0,0 +1,286 @@ + + + + + + + Erster Login-Check: Erfolgreich! + + + +
+
+

Willkommen beim ersten Check! 🎉

+ +
+ +
+

Glückwunsch! Deine Zugangsdaten sind korrekt und du bist erfolgreich im System gelandet.

+

Um sicherzugehen, dass auch interaktive Elemente bei dir funktionieren, teste bitte unser hochmodernes Belohnungsmodul:

+ +
+
+

Hinweis: Sound bitte einschalten!

+
+
+ + +
+ + + + \ No newline at end of file diff --git a/dinos/.env.example b/dinos/.env.example new file mode 100644 index 0000000..c094e45 --- /dev/null +++ b/dinos/.env.example @@ -0,0 +1 @@ +GEMINI_API_KEY="your_gemini_api_key_here" diff --git a/dinos/.htaccess b/dinos/.htaccess new file mode 100644 index 0000000..6fbc535 --- /dev/null +++ b/dinos/.htaccess @@ -0,0 +1,13 @@ +# 2026-01-08 18:45:00 +# Verhindert, dass Fremde deine Schlüssel-Dateien herunterladen können. +# PHP kann sie weiterhin lesen, aber der Browser nicht. + +# Verhindert, dass Fremde Schlüssel- und Status-Dateien herunterladen können. + + Require all denied + + +# Erlaubt Zugriff auf dinos/auth.php (wichtig für Google OAuth Callback) + + Require all granted + \ No newline at end of file diff --git a/dinos/Google Photo API Upload.pdf b/dinos/Google Photo API Upload.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0cf5ee33e1dbd922fee6ffa061c4293ebdfd7ce1 GIT binary patch literal 279070 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 z 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 + + + + + + API Model Explorer + + + + +

+
+

🚀 Google API Model Explorer

+

Diese Modelle sind aktuell für deinen Key freigeschaltet.

+
+ + +
+ + + + + + + + + + + + + + + + + +
ID (für den Code)AnzeigenameFeatures
+ + + + +
+
+
+
+ + + + + +
+
+
+ +
+ Fehler: Modelle konnten nicht geladen werden. Prüfe deinen API-Key. +
+ + +
+ Stand: | Phili's Dino-Labor 🦕 +
+
+ + + \ No newline at end of file diff --git a/dinos/auth.php b/dinos/auth.php new file mode 100644 index 0000000..840f793 --- /dev/null +++ b/dinos/auth.php @@ -0,0 +1,65 @@ +authenticate($_GET['code']); + if ($success) { + echo '

Verbindung erfolgreich!

'; + echo '

Der Token wurde gespeichert (tokens.json). Du kannst dieses Fenster schließen.

'; + echo 'Zurück zum Dino-Generator'; + } else { + echo '

Fehler beim Login

'; + echo '

Konnte Code nicht gegen Token tauschen.

'; + } + exit; +} + +// Szenario 2: Fehler von Google +if (isset($_GET['error'])) { + die("Google Fehler: " . htmlspecialchars($_GET['error'])); +} + +// Szenario 3: Startseite - Button anzeigen +?> + + + + + Google Photos Verbindung + + + +
+

Google Photos verbinden

+

Erlaube der Dino-App, Bilder in dein Album zu laden.

+ + isAuthenticated()): ?> +

✅ Bereits verbunden!

+

(Erneuter Klick erneuert die Verbindung)

+ + + + Mit Google anmelden + +
+ + \ No newline at end of file diff --git a/dinos/google_helper.php b/dinos/google_helper.php new file mode 100644 index 0000000..a12f309 --- /dev/null +++ b/dinos/google_helper.php @@ -0,0 +1,150 @@ +clientId = $conf['client_id']; + $this->clientSecret = $conf['client_secret']; + $this->redirectUri = $redirectUri; + } + + // --- AUTH LOGIK (Unverändert) --- + public function getAuthUrl() { + $params = [ + 'client_id' => $this->clientId, 'redirect_uri' => $this->redirectUri, 'response_type' => 'code', + 'scope' => 'https://www.googleapis.com/auth/photoslibrary.appendonly', + 'access_type' => 'offline', 'prompt' => 'consent' + ]; + return 'https://accounts.google.com/o/oauth2/auth?' . http_build_query($params); + } + + public function authenticate($code) { + $data = $this->makeRequest('https://oauth2.googleapis.com/token', [ + 'code' => $code, 'client_id' => $this->clientId, 'client_secret' => $this->clientSecret, + 'redirect_uri' => $this->redirectUri, 'grant_type' => 'authorization_code' + ]); + if (isset($data['access_token'])) { $this->saveTokens($data); return true; } + return false; + } + + private function getAccessToken() { + $tokens = $this->loadTokens(); + if (!$tokens) return null; + if (time() >= ($tokens['created'] + $tokens['expires_in'] - 60)) { + return $this->refreshToken($tokens['refresh_token']); + } + return $tokens['access_token']; + } + + private function refreshToken($refresh) { + $data = $this->makeRequest('https://oauth2.googleapis.com/token', [ + 'refresh_token' => $refresh, 'client_id' => $this->clientId, + 'client_secret' => $this->clientSecret, 'grant_type' => 'refresh_token' + ]); + if (isset($data['access_token'])) { + $data['refresh_token'] = $refresh; // Alten Refresh Token behalten + $this->saveTokens($data); + return $data['access_token']; + } + return null; + } + + // --- NEU: UPLOAD LOGIK --- + + public function uploadImage($imageData, $description) { + $token = $this->getAccessToken(); + if (!$token) return ['error' => 'Nicht eingeloggt']; + + // 1. Das Album finden oder erstellen + $albumId = $this->getOrCreateAlbum($token); + + // 2. Die Bytes hochladen (Schritt 1 von 2 bei Google) + $uploadUrl = 'https://photoslibrary.googleapis.com/v1/uploads'; + $ch = curl_init($uploadUrl); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + "Authorization: Bearer $token", + "Content-type: application/octet-stream", + "X-Goog-Upload-Protocol: raw" + ]); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $imageData); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + $uploadToken = curl_exec($ch); + curl_close($ch); + + if (!$uploadToken) return ['error' => 'Upload der Bilddaten fehlgeschlagen']; + + // 3. Das MediaItem erstellen (Schritt 2 von 2) + $createUrl = 'https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate'; + $body = [ + "albumId" => $albumId, + "newMediaItems" => [[ + "description" => $description, + "simpleMediaItem" => ["uploadToken" => $uploadToken] + ]] + ]; + + $ch = curl_init($createUrl); + curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer $token", "Content-type: application/json"]); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + $result = json_decode(curl_exec($ch), true); + curl_close($ch); + + return $result; + } + + // Hilfsfunktion: Album Management + private function getOrCreateAlbum($token) { + // Haben wir die ID schon gespeichert? + if (file_exists($this->albumFile)) { + return trim(file_get_contents($this->albumFile)); + } + + // Nein, wir erstellen es neu. + // (Hinweis: Wir könnten erst suchen, aber Erstellen ist sicherer/einfacher) + $url = 'https://photoslibrary.googleapis.com/v1/albums'; + $body = json_encode(["album" => ["title" => "Dino Wissenskarten"]]); + + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer $token", "Content-type: application/json"]); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $body); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + $response = json_decode(curl_exec($ch), true); + curl_close($ch); + + if (isset($response['id'])) { + file_put_contents($this->albumFile, $response['id']); + return $response['id']; + } + return null; + } + + // --- UTIL --- + private function makeRequest($url, $fields) { + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + $res = curl_exec($ch); curl_close($ch); + return json_decode($res, true); + } + private function saveTokens($data) { $data['created'] = time(); file_put_contents($this->tokenFile, json_encode($data)); } + private function loadTokens() { return file_exists($this->tokenFile) ? json_decode(file_get_contents($this->tokenFile), true) : null; } + public function isAuthenticated() { return file_exists($this->tokenFile); } +} +?> \ No newline at end of file diff --git a/dinos/index.php b/dinos/index.php new file mode 100644 index 0000000..0d44e53 --- /dev/null +++ b/dinos/index.php @@ -0,0 +1,1179 @@ + 0, 'total_pro' => 0, 'total_ultra' => 0, 'dates' => []]; + } + $content = file_get_contents($file); + $data = $content ? json_decode($content, true) : []; + + // Fallback/Initialisierung + if (!isset($data['total_eco'])) $data['total_eco'] = 0; + if (!isset($data['total_pro'])) $data['total_pro'] = 0; + if (!isset($data['total_ultra'])) $data['total_ultra'] = 0; + if (!isset($data['dates'])) $data['dates'] = []; + + return $data; +} + +// AJAX Handler für Stats Logging +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'log_success') { + $stats = getStats($logFile); + $today = date('Y-m-d'); + $type = isset($_POST['type']) ? $_POST['type'] : 'eco'; // eco, pro, ultra + + // Gesamt hochzählen + if ($type === 'ultra') $stats['total_ultra']++; + elseif ($type === 'pro') $stats['total_pro']++; + else $stats['total_eco']++; + + // Heute initialisieren (falls noch nicht da) + if (!isset($stats['dates'][$today])) { + $stats['dates'][$today] = ['eco' => 0, 'pro' => 0, 'ultra' => 0]; + } + // Sicherstellen dass alle Keys existieren + if (!isset($stats['dates'][$today]['eco'])) $stats['dates'][$today]['eco'] = 0; + if (!isset($stats['dates'][$today]['pro'])) $stats['dates'][$today]['pro'] = 0; + if (!isset($stats['dates'][$today]['ultra'])) $stats['dates'][$today]['ultra'] = 0; + + $stats['dates'][$today][$type]++; + + // REIHENFOLGE ERZWINGEN (SORTIERUNG) + foreach ($stats['dates'] as $dateKey => $dayStats) { + $stats['dates'][$dateKey] = [ + 'eco' => isset($dayStats['eco']) ? $dayStats['eco'] : 0, + 'pro' => isset($dayStats['pro']) ? $dayStats['pro'] : 0, + 'ultra' => isset($dayStats['ultra']) ? $dayStats['ultra'] : 0 + ]; + } + + // Hauptstruktur sortieren + $orderedStats = [ + 'total_eco' => $stats['total_eco'], + 'total_pro' => $stats['total_pro'], + 'total_ultra' => $stats['total_ultra'], + 'dates' => $stats['dates'] + ]; + + // Speichern + file_put_contents($logFile, json_encode($orderedStats, JSON_PRETTY_PRINT)); + + header('Content-Type: application/json'); + echo json_encode([ + 'status' => 'logged', + 'today_eco' => $stats['dates'][$today]['eco'], + 'today_pro' => $stats['dates'][$today]['pro'], + 'today_ultra' => $stats['dates'][$today]['ultra'], + 'total_eco' => $stats['total_eco'], + 'total_pro' => $stats['total_pro'], + 'total_ultra' => $stats['total_ultra'] + ]); + exit; +} + +// Stats laden für Initial-Anzeige +$currentStats = getStats($logFile); +$todayDate = date('Y-m-d'); +$todayEco = isset($currentStats['dates'][$todayDate]['eco']) ? $currentStats['dates'][$todayDate]['eco'] : 0; +$todayPro = isset($currentStats['dates'][$todayDate]['pro']) ? $currentStats['dates'][$todayDate]['pro'] : 0; +$todayUltra = isset($currentStats['dates'][$todayDate]['ultra']) ? $currentStats['dates'][$todayDate]['ultra'] : 0; + +$totalEco = $currentStats['total_eco']; +$totalPro = $currentStats['total_pro']; +$totalUltra = $currentStats['total_ultra']; +?> + + + + + + + Dino Wissenskarten Generator + + + + + + + + + + +
+ + +
+ +

+ 🦕 + + Dino Wissenskarten + +

+

Generiere fotorealistische Bilder und entdecke spannende Fakten.

+
+ + +
+
+ + + + + +
+ + + +
+ + +
+ + + +
+ + + +
+
+
+ + +
+ + + + + + + + +
+
+ 🦖 +
+

Tippe einen Dino-Namen ein und schau zu, was passiert.

+
+
+ + +
+ Statistik - Heute: + Eco | + Pro | + Ultra +
+ + Gesamt: + Eco | + Pro | + Ultra +
+ + + + + + + \ No newline at end of file diff --git a/dinos/prompts.js b/dinos/prompts.js new file mode 100644 index 0000000..db41195 --- /dev/null +++ b/dinos/prompts.js @@ -0,0 +1,94 @@ +/* + DINO LERNTAFEL - PROMPT KONFIGURATION (FINAL) + */ + + const DinoPrompts = { + + // 1. PROMPT FÜR DIE FAKTEN (Gemini Flash) + // Ziel: Sauberes JSON ohne Markdown, Zahlen als echte Numbers + getFacts: (term) => ` + Du bist ein Experte für Paläontologie. Erstelle ein Daten-Profil für einen "${term}". + + WICHTIG ZUM FORMAT: + - Antworte NUR mit dem rohen JSON-String. + - KEINE Markdown-Formatierung (kein \`\`\`json). + - Alle Text-Werte auf DEUTSCH. + + JSON STRUKTUR: + { + "name": "Name des Dinos (z.B. Tyrannosaurus Rex)", + "is_fictional": true, // true bei Fantasie, false bei echten Dinos + + // Brücke zum Bild-Generator: + "visual_details": "Beschreibe visuell: Körperbau, Hautstruktur (Schuppen/Federn/Panzer), markante Merkmale (Hörner, Kämme) und Farbe. Sei präzise.", + + "fun_fact": "Max. 10 Wörter. Ein spannendes Detail für Kinder.", + "translation": "Namensbedeutung (z.B. 'König der Tyrannenechsen')", + "period": "Zeitraum Name (z.B. Oberkreide)", + "years": "Zeitraum Zahlen (z.B. vor 68–66 Mio. Jahren)", + + "mya_start": 68, // Zahl (Millionen Jahre) + "mya_end": 66, // Zahl (Millionen Jahre) + + "height": 5.5, // Höhe in Metern (nur die Zahl als Number/Float) + "length": 12.0, // Länge in Metern (nur die Zahl als Number/Float) + "weight": 8000, // Gewicht in KG (nur die Zahl als Integer) + "diet": "Fleisch" // Genau einer dieser Werte: 'Pflanzen', 'Fleisch', 'Alles', 'Fisch' + } + `, + +// 2. PROMPT FÜR DAS BILD (Generalisiert für alle Habitate) +getImage: (data) => ` + [KONZEPT]: Ein "Environmental Wide Shot" (Weitwinklige Landschaftsaufnahme). + [DAS MOTIV]: Eine weite prähistorische Landschaft (${data.period}). In der MITTLEREN DISTANZ befindet sich ein einzelner ${data.name}. + + [VISUELLE DETAILS]: + ${data.visual_details} + + [KOMPOSITION & LAYOUT - DIE "ANTI-CROP" REGELN]: + - DISTANZ: Die Kamera ist weit entfernt. Der ${data.name} darf maximal 70% der gesamten Bildhöhe einnehmen. + + - VORDERGRUND: Es muss signifikant viel Umgebung UNTER dem Tier sichtbar sein. + - Wir müssen klar sehen, worauf oder worin das Tier steht (z.B. Waldboden, Wasser, Sand, Fels). Die Füße/Basis dürfen den unteren Bildrand NICHT berühren. + + - HINTERGRUND OBEN: Es muss signifikant viel Umgebung ÜBER dem Kopf sichtbar sein (Negativraum). + - Egal ob Himmel, Baumkronen oder Felswand: Dieser Bereich muss visuell "ruhig" und hell genug sein, damit dunkler Text darauf lesbar ist. + + [FEHLER-VERMEIDUNG]: + - KEIN enges Portrait. Das Tier muss "atmen" können. + - Wenn das Tier oben oder unten anstößt, ist die Kamera zu nah -> Gehe weiter weg. + + [ATMOSPHÄRE]: + - Habitat: Passend zur Spezies (z.B. dichter Dschungel, Sumpf, Küste oder offene Ebene). + - Licht: Helles, diffuses Tageslicht für gute Sichtbarkeit. + + [REALISMUS]: + - ${data.is_fictional ? "Glaubwürdige Biologie." : "Wissenschaftlich akkurat."} + - 8k Auflösung, fotorealistisch. + + [TECHNISCHES]: + - Seitenverhältnis: 16:10 + - Objektiv: Weitwinkel (ca. 24mm). +`, + // 3. PROMPT FÜR DEN ZUFALLSGENERATOR (Gemini Flash) + getRandom: () => ` + Nenne mir ein zufälliges, spannendes prähistorisches Tier aus dem Zeitalter der Dinosaurier (Mesozoikum) oder davor. + + WICHTIGE REGELN: + 1. Die Zeitgrenze ist das Massenaussterben vor 66 Mio. Jahren. (Keine Mammuts etc.) + 2. SPRACHE: Die 'tagline' MUSS zwingend auf DEUTSCH sein. + 3. VIELFALT: Sei kreativ! Nenne nicht nur die bekanntesten Tiere. Grabe tief in der Datenbank der Paläontologie. Bringe gerne auch unbekanntere, bizarre oder bunte Arten. Wähle jedes Mal etwas ganz anderes. + + Erlaubte Gruppen: + - Dinosaurier (Theropoden, Sauropoden, Ornithischia...) + - Flugsaurier (Pterosaurier - aber nicht immer Quetzalcoatlus!) + - Meeresechsen (Mosasaurier, Plesiosaurier, Ichthyosaurier) + - Urzeitliche Krokodile, Amphibien oder frühe Synapsiden (z.B. Dimetrodon). + + Antworte als reines JSON: + { + "name": "Name des Tiers (Einfacher Name, z.B. Deinocheirus statt Deinocheirus mirificus )", + "tagline": "Eine sehr kurze, knackige Beschreibung auf Deutsch (max 6-8 Wörter)" + } + ` +}; \ No newline at end of file diff --git a/dinos/test.html b/dinos/test.html new file mode 100644 index 0000000..451d5f8 --- /dev/null +++ b/dinos/test.html @@ -0,0 +1,1049 @@ + + + + Dino Wissenskarten Generator + + + + + + + + + + +
+ + +
+ +

+ 🦕 + + Dino Wissenskarten + +

+

Generiere fotorealistische Bilder und entdecke spannende Fakten.

+
+ + +
+
+ + + + + +
+ + + +
+ + +
+ + + +
+ + + +
+
+
+ + +
+ + + + + + + + +
+
+ 🦖 +
+

Tippe einen Dino-Namen ein und schau zu, was passiert.

+
+
+ + +
+ Statistik - Heute: + + + Eco | + + + Pro | + + + Ultra +
+ + Gesamt: + + + Eco | + + + Pro | + + + Ultra +
+ + + + + + + \ No newline at end of file diff --git a/dinos/upload_handler.php b/dinos/upload_handler.php new file mode 100644 index 0000000..b73da7c --- /dev/null +++ b/dinos/upload_handler.php @@ -0,0 +1,56 @@ +isAuthenticated()) { + echo json_encode(['success' => false, 'error' => 'Server nicht mit Google verbunden.']); + exit; +} + +// 2. Daten empfangen +$input = json_decode(file_get_contents('php://input'), true); +if (!isset($input['image']) || !isset($input['name'])) { + echo json_encode(['success' => false, 'error' => 'Keine Bilddaten empfangen.']); + exit; +} + +// 3. Base64 bereinigen (Das "data:image/png;base64," entfernen) +$imgParts = explode(',', $input['image']); +$base64Data = end($imgParts); +$binaryImage = base64_decode($base64Data); + +if (!$binaryImage) { + echo json_encode(['success' => false, 'error' => 'Bild konnte nicht verarbeitet werden.']); + exit; +} + +// 4. Beschreibung bauen +$desc = "🦖 " . $input['name'] . "\n" . + "💡 " . ($input['fun_fact'] ?? '') . "\n" . + "📅 " . ($input['years'] ?? ''); + +// 5. Hochladen +$result = $google->uploadImage($binaryImage, $desc); + +if (isset($result['newMediaItemsResult'])) { // Google Success Structure + echo json_encode(['success' => true]); +} else { + echo json_encode(['success' => false, 'error' => 'Google Fehler', 'details' => $result]); +} +?> \ No newline at end of file diff --git a/home/.env.example b/home/.env.example new file mode 100644 index 0000000..c51b5da --- /dev/null +++ b/home/.env.example @@ -0,0 +1,13 @@ +# App Einstellungen +APP_NAME=philippurbschat.de +APP_ENV=production +BASE_URL=https://philippurbschat.de/ + +# Datenbank (Optional - leer lassen, wenn keine DB benötigt wird) +DB_HOST=localhost +DB_NAME=your_db_name +DB_USER=your_db_user +DB_PASS=your_db_password + +# APIs & Externe Dienste +GEMINI_API_KEY=your_gemini_api_key_here diff --git a/home/app/controllers/AdminController.php b/home/app/controllers/AdminController.php new file mode 100644 index 0000000..c51ba2c --- /dev/null +++ b/home/app/controllers/AdminController.php @@ -0,0 +1,89 @@ +view('admin/dashboard', [ + 'title' => 'Admin Dashboard', + 'health' => $report + ]); + } + // Settings + public function settings() { + $this->view('admin/settings', [ + 'title' => 'Einstellungen' + ]); + } + // User List + public function users() { + $userModel = $this->model('User'); + $users = $userModel->getAll(); + $this->view('admin/users', [ + 'title' => 'Benutzerverwaltung', + 'users' => $users + ]); + } + // User Form + public function user_form($id = null) { + $user = null; + if ($id) { + $userModel = $this->model('User'); + $user = $userModel->getById($id); + if (!$user) { + Flash::set('Nutzer nicht gefunden.', 'error'); + header('Location: ' . Config::get('BASE_URL') . 'admin/users'); + exit; + } + } + $this->view('admin/user_form', [ + 'title' => $id ? 'Benutzer bearbeiten' : 'Neuen Benutzer anlegen', + 'user' => $user + ]); + } + // Save User + public function user_save() { + if ($_SERVER['REQUEST_METHOD'] !== 'POST') { + header('Location: ' . Config::get('BASE_URL') . 'admin/users'); + exit; + } + try { + Security::checkCsrf($_POST['csrf_token']); + $id = !empty($_POST['id']) ? $_POST['id'] : null; + $userModel = $this->model('User'); + if (empty($_POST['name']) || empty($_POST['email'])) { + throw new Exception("Name und E-Mail sind Pflichtfelder."); + } + $userModel->save($_POST, $id); + Flash::set('Nutzer erfolgreich gespeichert!', 'success'); + } catch (Exception $e) { + Flash::set($e->getMessage(), 'error'); + } + header('Location: ' . Config::get('BASE_URL') . 'admin/users'); + exit; + } + // Delete User + public function user_delete($id) { + if ($_SERVER['REQUEST_METHOD'] === 'POST') { + try { + Security::checkCsrf($_POST['csrf_token']); + $userModel = $this->model('User'); + $userModel->delete($id); + Flash::set('Nutzer wurde gelöscht.', 'success'); + } catch (Exception $e) { + Flash::set('Fehler beim Löschen: ' . $e->getMessage(), 'error'); + } + } + header('Location: ' . Config::get('BASE_URL') . 'admin/users'); + exit; + } +} \ No newline at end of file diff --git a/home/app/controllers/HomeController.php b/home/app/controllers/HomeController.php new file mode 100644 index 0000000..7c45293 --- /dev/null +++ b/home/app/controllers/HomeController.php @@ -0,0 +1,28 @@ +{$routeName}(); + } + if ($routeName !== 'home' && $routeName !== '') { + throw new Exception("Route not found."); + } + $this->view('home', [ + 'name' => $name + ]); + } + // Static Views + public function about() { + $this->view('about'); + } + public function imprint() { + $this->view('imprint'); + } + public function privacy() { + $this->view('privacy'); + } +} \ No newline at end of file diff --git a/home/app/controllers/LoginController.php b/home/app/controllers/LoginController.php new file mode 100644 index 0000000..d6837fa --- /dev/null +++ b/home/app/controllers/LoginController.php @@ -0,0 +1,43 @@ +model('User'); + $user = $userModel->authenticate($email, $password); + if ($user) { + $_SESSION['user_email'] = $email; + $_SESSION['user_projects'] = $user['projects'] ?? []; + $_SESSION['is_admin'] = $user['is_admin'] ?? false; + header('Location: ' . Config::get('BASE_URL', '/')); + } else { + Flash::set('Access denied: Invalid credentials.'); + header('Location: ' . Config::get('BASE_URL', '/')); + } + } catch (Exception $e) { + Flash::set('System error: ' . $e->getMessage()); + header('Location: ' . Config::get('BASE_URL', '/')); + } + exit; + } + // Logout Handler + public function logout() { + session_destroy(); + header('Location: ' . Config::get('BASE_URL', '/')); + exit; + } +} \ No newline at end of file diff --git a/home/app/controllers/SeoController.php b/home/app/controllers/SeoController.php new file mode 100644 index 0000000..579661d --- /dev/null +++ b/home/app/controllers/SeoController.php @@ -0,0 +1,40 @@ +'; + $xml .= ''; + foreach ($pages as $page) { + $priority = ($page === '') ? '1.0' : '0.8'; + $xml .= ''; + $xml .= '' . $baseUrl . $page . ''; + $xml .= '' . $lastMod . ''; + $xml .= '' . $priority . ''; + $xml .= ''; + } + $xml .= ''; + return $this->xml($xml); + } + // Robots.txt Generation + public function robots() { + $baseUrl = Config::get('BASE_URL', 'https://philippurbschat.de/'); + $txt = "User-agent: *\n"; + $txt .= "Allow: /\n\n"; + $txt .= "Disallow: /admin\n"; + $txt .= "Disallow: /admin/\n"; + $txt .= "Disallow: /admin/users\n"; + $txt .= "Disallow: /admin/settings\n"; + $txt .= "Disallow: /login\n"; + $txt .= "Disallow: /login/\n"; + $txt .= "Disallow: /core/\n"; + $txt .= "Disallow: /app/\n"; + $txt .= "Disallow: /views/\n"; + $txt .= "Disallow: /src/\n\n"; + $txt .= "Sitemap: " . $baseUrl . "sitemap.xml\n"; + return $this->text($txt); + } +} \ No newline at end of file diff --git a/home/app/init.php b/home/app/init.php new file mode 100644 index 0000000..a6c9648 --- /dev/null +++ b/home/app/init.php @@ -0,0 +1,32 @@ + '/', + 'httponly' => true, + 'samesite' => 'Lax' + ]); + session_start(); +} +date_default_timezone_set('Europe/Berlin'); +// Autoloader +spl_autoload_register(function($className) { + $paths = [ + __DIR__ . '/../core/', + __DIR__ . '/models/', + __DIR__ . '/services/' + ]; + foreach ($paths as $path) { + $file = $path . $className . '.php'; + $fileLower = $path . strtolower($className) . '.php'; + if (file_exists($file)) { + require_once $file; + return; + } elseif (file_exists($fileLower)) { + require_once $fileLower; + return; + } + } +}); +// Environment +Config::load(__DIR__ . '/../.env'); \ No newline at end of file diff --git a/home/app/models/User.php b/home/app/models/User.php new file mode 100644 index 0000000..1052d6f --- /dev/null +++ b/home/app/models/User.php @@ -0,0 +1,67 @@ +db = new Database(); + } + // Auth-Logic + public function authenticate($email, $password) { + $this->db->query("SELECT * FROM home_users WHERE email = :email AND status = 'Active'"); + $this->db->bind(':email', $email); + $user = $this->db->single(); + if ($user && password_verify($password, $user['password'])) { + $user['projects'] = json_decode($user['projects'], true) ?? []; + $user['is_admin'] = (bool)$user['is_admin']; + return $user; + } + return false; + } + // Data-Retrieval + public function getAll() { + $this->db->query("SELECT id, name, email, is_admin, status, projects FROM home_users ORDER BY id DESC"); + $users = $this->db->resultSet(); + foreach ($users as &$user) { + $user['projects'] = json_decode($user['projects'], true) ?? []; + } + return $users; + } + public function getById($id) { + $this->db->query("SELECT * FROM home_users WHERE id = :id"); + $this->db->bind(':id', $id); + $user = $this->db->single(); + if ($user) { + $user['projects'] = json_decode($user['projects'], true) ?? []; + } + return $user; + } + // Persistence + public function save($data, $id = null) { + $projectsJson = json_encode(array_map('trim', explode(',', $data['projects']))); + if ($id) { + $sql = "UPDATE home_users SET name = :name, email = :email, projects = :projects, is_admin = :is_admin, status = :status "; + if (!empty($data['password'])) { + $sql .= ", password = :password "; + } + $sql .= "WHERE id = :id"; + $this->db->query($sql); + $this->db->bind(':id', $id); + } else { + $sql = "INSERT INTO home_users (name, email, password, projects, is_admin, status) VALUES (:name, :email, :password, :projects, :is_admin, :status)"; + $this->db->query($sql); + } + $this->db->bind(':name', $data['name']); + $this->db->bind(':email', $data['email']); + $this->db->bind(':projects', $projectsJson); + $this->db->bind(':is_admin', isset($data['is_admin']) ? 1 : 0); + $this->db->bind(':status', $data['status']); + if (!$id || !empty($data['password'])) { + $this->db->bind(':password', password_hash($data['password'], PASSWORD_DEFAULT)); + } + return $this->db->execute(); + } + public function delete($id) { + $this->db->query("DELETE FROM home_users WHERE id = :id"); + $this->db->bind(':id', $id); + return $this->db->execute(); + } +} \ No newline at end of file diff --git a/home/app/services/HealthService.php b/home/app/services/HealthService.php new file mode 100644 index 0000000..acd1a17 --- /dev/null +++ b/home/app/services/HealthService.php @@ -0,0 +1,72 @@ + PHP_VERSION, + 'disk_free' => self::getDiskStatus(), + 'memory' => self::formatBytes(self::getMemoryLimit()), + 'env_status' => self::checkEnvFile(), + 'db_status' => self::checkDatabase(), + 'writable' => self::checkWritableFolders(['public', 'app']) + ]; + } + // Memory Helpers + private static function getMemoryLimit() { + $limit = ini_get('memory_limit'); + if (preg_match('/^(\d+)(.)$/', $limit, $matches)) { + $val = (int)$matches[1]; + switch (strtoupper($matches[2])) { + case 'G': $val *= 1024 * 1024 * 1024; break; + case 'M': $val *= 1024 * 1024; break; + case 'K': $val *= 1024; break; + } + return $val; + } + return (int)$limit; + } + private static function formatBytes($bytes, $precision = 2) { + $units = ['B', 'KB', 'MB', 'GB', 'TB']; + $bytes = max($bytes, 0); + $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); + $pow = min($pow, count($units) - 1); + return round($bytes / pow(1024, $pow), $precision) . ' ' . $units[$pow]; + } + // System Status + private static function getDiskStatus() { + if (function_exists('disk_free_space') && function_exists('disk_total_space')) { + try { + $free = @disk_free_space("/"); + $total = @disk_total_space("/"); + if ($free !== false && $total > 0) { + return round(($free / $total) * 100) . "% frei"; + } + } catch (Exception $e) {} + } + return "Eingeschränkt (Hosting)"; + } + private static function checkEnvFile() { + return file_exists(__DIR__ . '/../../.env') ? 'Bereit' : 'Fehlt!'; + } + private static function checkDatabase() { + try { + if (empty(Config::get('DB_NAME'))) { + return 'Deaktiviert'; + } + $db = new Database(); + $db->query("SELECT VERSION() as v"); + $res = $db->single(); + return $res['v'] ?? 'Online'; + } catch (Exception $e) { + return 'Offline / Fehler'; + } + } + private static function checkWritableFolders($folders) { + foreach ($folders as $folder) { + $path = realpath(__DIR__ . '/../../' . $folder); + if (!$path || !is_dir($path)) return "Fehlt: $folder"; + if (!is_writable($path)) return "Rechte: $folder"; + } + return "OK"; + } +} \ No newline at end of file diff --git a/home/core/Auth.php b/home/core/Auth.php new file mode 100644 index 0000000..c2c8b5a --- /dev/null +++ b/home/core/Auth.php @@ -0,0 +1,19 @@ + true, + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC + ]; + + try { + $this->dbh = new PDO($dsn, $user, $pass, $options); + } catch (PDOException $e) { + $this->error = $e->getMessage(); + // Exception werfen statt sterben! + throw new Exception("Datenbank-Verbindungsfehler."); + } + } + + public function query($sql) { + $this->stmt = $this->dbh->prepare($sql); + } + + public function bind($param, $value, $type = null) { + if (is_null($type)) { + switch (true) { + case is_int($value): $type = PDO::PARAM_INT; break; + case is_bool($value): $type = PDO::PARAM_BOOL; break; + case is_null($value): $type = PDO::PARAM_NULL; break; + default: $type = PDO::PARAM_STR; + } + } + $this->stmt->bindValue($param, $value, $type); + } + + public function execute() { + return $this->stmt->execute(); + } + + public function resultSet() { + $this->execute(); + return $this->stmt->fetchAll(); + } + + public function single() { + $this->execute(); + return $this->stmt->fetch(); + } + + public function rowCount() { + return $this->stmt->rowCount(); + } +} \ No newline at end of file diff --git a/home/core/Flash.php b/home/core/Flash.php new file mode 100644 index 0000000..8ae772a --- /dev/null +++ b/home/core/Flash.php @@ -0,0 +1,42 @@ + $message, + 'type' => $type + ]; + } + public static function display() { + if (isset($_SESSION['flash_messages'])) { + foreach ($_SESSION['flash_messages'] as $flash) { + // Style-Mapping + $styles = [ + 'error' => ['class' => 'border-rose-500/50 text-rose-400 shadow-[0_0_20px_rgba(244,63,94,0.25)]', 'prefix' => '[ ERR ]'], + 'success' => ['class' => 'border-emerald-500/50 text-emerald-400 shadow-[0_0_20px_rgba(16,185,129,0.25)]', 'prefix' => '[ OK ]'], + 'warning' => ['class' => 'border-amber-500/50 text-amber-400 shadow-[0_0_20px_rgba(245,158,11,0.25)]', 'prefix' => '[ WARN ]'], + 'info' => ['class' => 'border-cyan-500/50 text-cyan-400 shadow-[0_0_20px_rgba(6,182,212,0.25)]', 'prefix' => '[ INFO ]'] + ]; + $currentStyle = $styles[$flash['type']] ?? $styles['error']; + $cssClasses = $currentStyle['class']; + $prefix = $currentStyle['prefix']; + // Output HUD Element + echo "
+ {$prefix} + " . htmlspecialchars($flash['message']) . " +
"; + } + unset($_SESSION['flash_messages']); + // Auto-Hide Script + echo ""; + } + } +} \ No newline at end of file diff --git a/home/core/Router.php b/home/core/Router.php new file mode 100644 index 0000000..c6f0f67 --- /dev/null +++ b/home/core/Router.php @@ -0,0 +1,35 @@ +parseUrl(); + $controllerPath = __DIR__ . '/../app/controllers/'; + // Controller Check + if (isset($url[0]) && file_exists($controllerPath . ucfirst($url[0]) . 'Controller.php')) { + $this->controller = ucfirst($url[0]) . 'Controller'; + unset($url[0]); + } + require_once $controllerPath . $this->controller . '.php'; + $this->controller = new $this->controller; + // Method Check + if (isset($url[1])) { + if (method_exists($this->controller, $url[1])) { + $this->method = $url[1]; + unset($url[1]); + } + } + // Params & Execution + $this->params = $url ? array_values($url) : []; + call_user_func_array([$this->controller, $this->method], $this->params); + } + // URL Parser + private function parseUrl() { + if (isset($_GET['url'])) { + return explode('/', filter_var(rtrim($_GET['url'], '/'), FILTER_SANITIZE_URL)); + } + return []; + } +} \ No newline at end of file diff --git a/home/core/Security.php b/home/core/Security.php new file mode 100644 index 0000000..b23dcb6 --- /dev/null +++ b/home/core/Security.php @@ -0,0 +1,17 @@ +=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/cli": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.2.1.tgz", + "integrity": "sha512-b7MGn51IA80oSG+7fuAgzfQ+7pZBgjzbqwmiv6NO7/+a1sev32cGqnwhscT7h0EcAvMa9r7gjRylqOH8Xhc4DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/watcher": "^2.5.1", + "@tailwindcss/node": "4.2.1", + "@tailwindcss/oxide": "4.2.1", + "enhanced-resolve": "^5.19.0", + "mri": "^1.2.0", + "picocolors": "^1.1.1", + "tailwindcss": "4.2.1" + }, + "bin": { + "tailwindcss": "dist/index.mjs" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.1.tgz", + "integrity": "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.31.1", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.1.tgz", + "integrity": "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-x64": "4.2.1", + "@tailwindcss/oxide-freebsd-x64": "4.2.1", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-x64-musl": "4.2.1", + "@tailwindcss/oxide-wasm32-wasi": "4.2.1", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.1.tgz", + "integrity": "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.1.tgz", + "integrity": "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.1.tgz", + "integrity": "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.1.tgz", + "integrity": "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.1.tgz", + "integrity": "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.1.tgz", + "integrity": "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.1.tgz", + "integrity": "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.1.tgz", + "integrity": "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.1.tgz", + "integrity": "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.1.tgz", + "integrity": "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.1.tgz", + "integrity": "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.1.tgz", + "integrity": "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", + "integrity": "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/lightningcss": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tailwindcss": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.1.tgz", + "integrity": "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + } + } +} diff --git a/home/package.json b/home/package.json new file mode 100644 index 0000000..5733383 --- /dev/null +++ b/home/package.json @@ -0,0 +1,17 @@ +{ + "name": "home", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "dev": "npx @tailwindcss/cli -i ./src/input.css -o ./public/css/app.css --watch", + "build": "npx @tailwindcss/cli -i ./src/input.css -o ./public/css/app.css --minify" + }, + "keywords": [], + "author": "", + "license": "ISC", + "description": "", + "devDependencies": { + "@tailwindcss/cli": "^4.2.1", + "tailwindcss": "^4.2.1" + } +} \ No newline at end of file diff --git a/home/public/.htaccess b/home/public/.htaccess new file mode 100644 index 0000000..1eb8b95 --- /dev/null +++ b/home/public/.htaccess @@ -0,0 +1,9 @@ +RewriteEngine On + +# Falls die angefragte Datei oder das Verzeichnis wirklich existiert, nimm sie direkt +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d + +# Ansonsten schicke alles an die index.php +# Der Router im HomeController kümmert sich um den Rest +RewriteRule ^(.*)$ index.php?url=$1 [L,QSA] \ No newline at end of file diff --git a/home/public/android-chrome-192x192.png b/home/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..55f8ec919a2a7d87e45224772ef8bc034cf735e3 GIT binary patch literal 38824 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 CP0UpQ literal 0 HcmV?d00001 diff --git a/home/public/apple-touch-icon.png b/home/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..66182899d644702e540e8f2255e13433018d7e54 GIT binary patch literal 35108 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 literal 0 HcmV?d00001 diff --git a/home/public/css/app.css b/home/public/css/app.css new file mode 100644 index 0000000..e07e815 --- /dev/null +++ b/home/public/css/app.css @@ -0,0 +1,2 @@ +/*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-900:oklch(37.8% .077 168.94);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-900:oklch(39.8% .07 227.392);--color-blue-900:oklch(37.9% .146 265.522);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-900:oklch(35.9% .144 278.697);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-900:oklch(38.1% .176 304.987);--color-fuchsia-300:oklch(83.3% .145 321.434);--color-fuchsia-400:oklch(74% .238 322.16);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-lg:32rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--text-8xl:6rem;--text-8xl--line-height:1;--font-weight-light:300;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-tighter:-.05em;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-normal:1.5;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--drop-shadow-2xl:0 25px 25px #00000026;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--animate-bounce:bounce 1s infinite;--blur-sm:8px;--blur-md:12px;--blur-xl:24px;--blur-2xl:40px;--blur-3xl:64px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.-inset-4{inset:calc(var(--spacing) * -4)}.inset-0{inset:calc(var(--spacing) * 0)}.top-0{top:calc(var(--spacing) * 0)}.top-4{top:calc(var(--spacing) * 4)}.top-6{top:calc(var(--spacing) * 6)}.top-\[-20\%\]{top:-20%}.top-\[10\%\]{top:10%}.-right-10{right:calc(var(--spacing) * -10)}.right-4{right:calc(var(--spacing) * 4)}.right-6{right:calc(var(--spacing) * 6)}.right-\[-10\%\]{right:-10%}.right-\[10\%\]{right:10%}.-bottom-10{bottom:calc(var(--spacing) * -10)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-4{bottom:calc(var(--spacing) * 4)}.bottom-\[-20\%\]{bottom:-20%}.left-0{left:calc(var(--spacing) * 0)}.left-4{left:calc(var(--spacing) * 4)}.left-\[-10\%\]{left:-10%}.z-0{z-index:0}.z-10{z-index:10}.z-50{z-index:50}.z-100{z-index:100}.z-9999{z-index:9999}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-16{margin-bottom:calc(var(--spacing) * 16)}.mb-20{margin-bottom:calc(var(--spacing) * 20)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1{height:calc(var(--spacing) * 1)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-\[50\%\]{height:50%}.h-\[60\%\]{height:60%}.h-\[70\%\]{height:70%}.h-fit{height:fit-content}.h-full{height:100%}.h-px{height:1px}.min-h-screen{min-height:100vh}.w-0{width:calc(var(--spacing) * 0)}.w-1{width:calc(var(--spacing) * 1)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-24{width:calc(var(--spacing) * 24)}.w-32{width:calc(var(--spacing) * 32)}.w-\[50\%\]{width:50%}.w-\[60\%\]{width:60%}.w-\[70\%\]{width:70%}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-lg{max-width:var(--container-lg)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.rotate-3{rotate:3deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-bounce{animation:var(--animate-bounce)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-10{gap:calc(var(--spacing) * 10)}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-12>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 12) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 12) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-slate-800>:not(:last-child)){border-color:var(--color-slate-800)}:where(.divide-slate-800\/50>:not(:last-child)){border-color:#1d293d80}@supports (color:color-mix(in lab, red, red)){:where(.divide-slate-800\/50>:not(:last-child)){border-color:color-mix(in oklab, var(--color-slate-800) 50%, transparent)}}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-amber-500{border-color:var(--color-amber-500)}.border-amber-500\/50{border-color:#f99c0080}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/50{border-color:color-mix(in oklab, var(--color-amber-500) 50%, transparent)}}.border-cyan-500{border-color:var(--color-cyan-500)}.border-cyan-500\/20{border-color:#00b7d733}@supports (color:color-mix(in lab, red, red)){.border-cyan-500\/20{border-color:color-mix(in oklab, var(--color-cyan-500) 20%, transparent)}}.border-cyan-500\/50{border-color:#00b7d780}@supports (color:color-mix(in lab, red, red)){.border-cyan-500\/50{border-color:color-mix(in oklab, var(--color-cyan-500) 50%, transparent)}}.border-emerald-500{border-color:var(--color-emerald-500)}.border-emerald-500\/20{border-color:#00bb7f33}@supports (color:color-mix(in lab, red, red)){.border-emerald-500\/20{border-color:color-mix(in oklab, var(--color-emerald-500) 20%, transparent)}}.border-emerald-500\/50{border-color:#00bb7f80}@supports (color:color-mix(in lab, red, red)){.border-emerald-500\/50{border-color:color-mix(in oklab, var(--color-emerald-500) 50%, transparent)}}.border-fuchsia-500{border-color:var(--color-fuchsia-500)}.border-fuchsia-500\/20{border-color:#e12afb33}@supports (color:color-mix(in lab, red, red)){.border-fuchsia-500\/20{border-color:color-mix(in oklab, var(--color-fuchsia-500) 20%, transparent)}}.border-fuchsia-500\/40{border-color:#e12afb66}@supports (color:color-mix(in lab, red, red)){.border-fuchsia-500\/40{border-color:color-mix(in oklab, var(--color-fuchsia-500) 40%, transparent)}}.border-red-500{border-color:var(--color-red-500)}.border-rose-500{border-color:var(--color-rose-500)}.border-rose-500\/20{border-color:#ff235733}@supports (color:color-mix(in lab, red, red)){.border-rose-500\/20{border-color:color-mix(in oklab, var(--color-rose-500) 20%, transparent)}}.border-rose-500\/30{border-color:#ff23574d}@supports (color:color-mix(in lab, red, red)){.border-rose-500\/30{border-color:color-mix(in oklab, var(--color-rose-500) 30%, transparent)}}.border-rose-500\/50{border-color:#ff235780}@supports (color:color-mix(in lab, red, red)){.border-rose-500\/50{border-color:color-mix(in oklab, var(--color-rose-500) 50%, transparent)}}.border-slate-700{border-color:var(--color-slate-700)}.border-slate-700\/50{border-color:#31415880}@supports (color:color-mix(in lab, red, red)){.border-slate-700\/50{border-color:color-mix(in oklab, var(--color-slate-700) 50%, transparent)}}.border-slate-700\/60{border-color:#31415899}@supports (color:color-mix(in lab, red, red)){.border-slate-700\/60{border-color:color-mix(in oklab, var(--color-slate-700) 60%, transparent)}}.border-slate-700\/80{border-color:#314158cc}@supports (color:color-mix(in lab, red, red)){.border-slate-700\/80{border-color:color-mix(in oklab, var(--color-slate-700) 80%, transparent)}}.border-slate-800{border-color:var(--color-slate-800)}.border-slate-800\/60{border-color:#1d293d99}@supports (color:color-mix(in lab, red, red)){.border-slate-800\/60{border-color:color-mix(in oklab, var(--color-slate-800) 60%, transparent)}}.border-slate-800\/80{border-color:#1d293dcc}@supports (color:color-mix(in lab, red, red)){.border-slate-800\/80{border-color:color-mix(in oklab, var(--color-slate-800) 80%, transparent)}}.bg-\[\#0b1120\]{background-color:#0b1120}.bg-amber-500{background-color:var(--color-amber-500)}.bg-black{background-color:var(--color-black)}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.bg-black\/40{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.bg-blue-900{background-color:var(--color-blue-900)}.bg-blue-900\/5{background-color:#1c398e0d}@supports (color:color-mix(in lab, red, red)){.bg-blue-900\/5{background-color:color-mix(in oklab, var(--color-blue-900) 5%, transparent)}}.bg-cyan-500{background-color:var(--color-cyan-500)}.bg-cyan-500\/5{background-color:#00b7d70d}@supports (color:color-mix(in lab, red, red)){.bg-cyan-500\/5{background-color:color-mix(in oklab, var(--color-cyan-500) 5%, transparent)}}.bg-cyan-900{background-color:var(--color-cyan-900)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/5{background-color:#00bb7f0d}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/5{background-color:color-mix(in oklab, var(--color-emerald-500) 5%, transparent)}}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/10{background-color:color-mix(in oklab, var(--color-emerald-500) 10%, transparent)}}.bg-emerald-500\/20{background-color:#00bb7f33}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/20{background-color:color-mix(in oklab, var(--color-emerald-500) 20%, transparent)}}.bg-emerald-900{background-color:var(--color-emerald-900)}.bg-fuchsia-500{background-color:var(--color-fuchsia-500)}.bg-fuchsia-500\/5{background-color:#e12afb0d}@supports (color:color-mix(in lab, red, red)){.bg-fuchsia-500\/5{background-color:color-mix(in oklab, var(--color-fuchsia-500) 5%, transparent)}}.bg-indigo-900{background-color:var(--color-indigo-900)}.bg-indigo-900\/10{background-color:#312c851a}@supports (color:color-mix(in lab, red, red)){.bg-indigo-900\/10{background-color:color-mix(in oklab, var(--color-indigo-900) 10%, transparent)}}.bg-purple-900{background-color:var(--color-purple-900)}.bg-red-500{background-color:var(--color-red-500)}.bg-rose-400{background-color:var(--color-rose-400)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-rose-500\/5{background-color:#ff23570d}@supports (color:color-mix(in lab, red, red)){.bg-rose-500\/5{background-color:color-mix(in oklab, var(--color-rose-500) 5%, transparent)}}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-800{background-color:var(--color-slate-800)}.bg-slate-800\/80{background-color:#1d293dcc}@supports (color:color-mix(in lab, red, red)){.bg-slate-800\/80{background-color:color-mix(in oklab, var(--color-slate-800) 80%, transparent)}}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-900\/30{background-color:#0f172b4d}@supports (color:color-mix(in lab, red, red)){.bg-slate-900\/30{background-color:color-mix(in oklab, var(--color-slate-900) 30%, transparent)}}.bg-slate-900\/50{background-color:#0f172b80}@supports (color:color-mix(in lab, red, red)){.bg-slate-900\/50{background-color:color-mix(in oklab, var(--color-slate-900) 50%, transparent)}}.bg-slate-900\/80{background-color:#0f172bcc}@supports (color:color-mix(in lab, red, red)){.bg-slate-900\/80{background-color:color-mix(in oklab, var(--color-slate-900) 80%, transparent)}}.bg-slate-950{background-color:var(--color-slate-950)}.bg-slate-950\/50{background-color:#02061880}@supports (color:color-mix(in lab, red, red)){.bg-slate-950\/50{background-color:color-mix(in oklab, var(--color-slate-950) 50%, transparent)}}.bg-slate-950\/80{background-color:#020618cc}@supports (color:color-mix(in lab, red, red)){.bg-slate-950\/80{background-color:color-mix(in oklab, var(--color-slate-950) 80%, transparent)}}.bg-slate-950\/90{background-color:#020618e6}@supports (color:color-mix(in lab, red, red)){.bg-slate-950\/90{background-color:color-mix(in oklab, var(--color-slate-950) 90%, transparent)}}.bg-linear-to-r{--tw-gradient-position:to right}@supports (background-image:linear-gradient(in lab, red, red)){.bg-linear-to-r{--tw-gradient-position:to right in oklab}}.bg-linear-to-r{background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-cyan-400{--tw-gradient-from:var(--color-cyan-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-emerald-400{--tw-gradient-from:var(--color-emerald-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-emerald-500{--tw-gradient-from:var(--color-emerald-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-emerald-500\/20{--tw-gradient-from:#00bb7f33}@supports (color:color-mix(in lab, red, red)){.from-emerald-500\/20{--tw-gradient-from:color-mix(in oklab, var(--color-emerald-500) 20%, transparent)}}.from-emerald-500\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-fuchsia-400{--tw-gradient-from:var(--color-fuchsia-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-slate-500{--tw-gradient-from:var(--color-slate-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.via-cyan-500{--tw-gradient-via:var(--color-cyan-500);--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-cyan-500\/40{--tw-gradient-via:#00b7d766}@supports (color:color-mix(in lab, red, red)){.via-cyan-500\/40{--tw-gradient-via:color-mix(in oklab, var(--color-cyan-500) 40%, transparent)}}.via-cyan-500\/40{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-emerald-500{--tw-gradient-via:var(--color-emerald-500);--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-emerald-500\/40{--tw-gradient-via:#00bb7f66}@supports (color:color-mix(in lab, red, red)){.via-emerald-500\/40{--tw-gradient-via:color-mix(in oklab, var(--color-emerald-500) 40%, transparent)}}.via-emerald-500\/40{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-fuchsia-500{--tw-gradient-via:var(--color-fuchsia-500);--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-fuchsia-500\/40{--tw-gradient-via:#e12afb66}@supports (color:color-mix(in lab, red, red)){.via-fuchsia-500\/40{--tw-gradient-via:color-mix(in oklab, var(--color-fuchsia-500) 40%, transparent)}}.via-fuchsia-500\/40{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-purple-400{--tw-gradient-via:var(--color-purple-400);--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-purple-500{--tw-gradient-via:var(--color-purple-500);--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-purple-500\/20{--tw-gradient-via:#ac4bff33}@supports (color:color-mix(in lab, red, red)){.via-purple-500\/20{--tw-gradient-via:color-mix(in oklab, var(--color-purple-500) 20%, transparent)}}.via-purple-500\/20{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-rose-500{--tw-gradient-via:var(--color-rose-500);--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-rose-500\/40{--tw-gradient-via:#ff235766}@supports (color:color-mix(in lab, red, red)){.via-rose-500\/40{--tw-gradient-via:color-mix(in oklab, var(--color-rose-500) 40%, transparent)}}.via-rose-500\/40{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-cyan-400{--tw-gradient-to:var(--color-cyan-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-cyan-500{--tw-gradient-to:var(--color-cyan-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-cyan-500\/20{--tw-gradient-to:#00b7d733}@supports (color:color-mix(in lab, red, red)){.to-cyan-500\/20{--tw-gradient-to:color-mix(in oklab, var(--color-cyan-500) 20%, transparent)}}.to-cyan-500\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-fuchsia-400{--tw-gradient-to:var(--color-fuchsia-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-slate-700{--tw-gradient-to:var(--color-slate-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pt-10{padding-top:calc(var(--spacing) * 10)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-10{padding-bottom:calc(var(--spacing) * 10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.text-8xl{font-size:var(--text-8xl);line-height:var(--tw-leading,var(--text-8xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.2em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-tighter{--tw-tracking:var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.text-amber-400{color:var(--color-amber-400)}.text-cyan-400{color:var(--color-cyan-400)}.text-cyan-500{color:var(--color-cyan-500)}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-500{color:var(--color-emerald-500)}.text-fuchsia-400{color:var(--color-fuchsia-400)}.text-fuchsia-400\/80{color:#ec6cffcc}@supports (color:color-mix(in lab, red, red)){.text-fuchsia-400\/80{color:color-mix(in oklab, var(--color-fuchsia-400) 80%, transparent)}}.text-fuchsia-500{color:var(--color-fuchsia-500)}.text-fuchsia-500\/50{color:#e12afb80}@supports (color:color-mix(in lab, red, red)){.text-fuchsia-500\/50{color:color-mix(in oklab, var(--color-fuchsia-500) 50%, transparent)}}.text-indigo-400{color:var(--color-indigo-400)}.text-purple-400{color:var(--color-purple-400)}.text-red-400{color:var(--color-red-400)}.text-rose-400{color:var(--color-rose-400)}.text-rose-500{color:var(--color-rose-500)}.text-slate-100{color:var(--color-slate-100)}.text-slate-200{color:var(--color-slate-200)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-900{color:var(--color-slate-900)}.text-transparent{color:#0000}.uppercase{text-transform:uppercase}.italic{font-style:italic}.underline{text-decoration-line:underline}.accent-emerald-500{accent-color:var(--color-emerald-500)}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_5px_rgba\(6\,182\,212\,0\.8\)\]{--tw-shadow:0 0 5px var(--tw-shadow-color,#06b6d4cc);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_5px_rgba\(244\,63\,94\,0\.8\)\]{--tw-shadow:0 0 5px var(--tw-shadow-color,#f43f5ecc);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_10px_rgba\(217\,70\,239\,0\.05\)\]{--tw-shadow:0 0 10px var(--tw-shadow-color,#d946ef0d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_20px_rgba\(6\,182\,212\,0\.25\)\]{--tw-shadow:0 0 20px var(--tw-shadow-color,#06b6d440);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_20px_rgba\(16\,185\,129\,0\.25\)\]{--tw-shadow:0 0 20px var(--tw-shadow-color,#10b98140);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_20px_rgba\(244\,63\,94\,0\.25\)\]{--tw-shadow:0 0 20px var(--tw-shadow-color,#f43f5e40);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_20px_rgba\(245\,158\,11\,0\.25\)\]{--tw-shadow:0 0 20px var(--tw-shadow-color,#f59e0b40);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_30px_rgba\(6\,182\,212\,0\.15\)\]{--tw-shadow:0 0 30px var(--tw-shadow-color,#06b6d426);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_30px_rgba\(16\,185\,129\,0\.15\)\]{--tw-shadow:0 0 30px var(--tw-shadow-color,#10b98126);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_30px_rgba\(217\,70\,239\,0\.15\)\]{--tw-shadow:0 0 30px var(--tw-shadow-color,#d946ef26);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_30px_rgba\(244\,63\,94\,0\.15\)\]{--tw-shadow:0 0 30px var(--tw-shadow-color,#f43f5e26);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur-2xl{--tw-blur:blur(var(--blur-2xl));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.blur-3xl{--tw-blur:blur(var(--blur-3xl));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow-2xl{--tw-drop-shadow-size:drop-shadow(0 25px 25px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--drop-shadow-2xl));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow-\[0_0_8px_rgba\(16\,185\,129\,0\.8\)\]{--tw-drop-shadow-size:drop-shadow(0 0 8px var(--tw-drop-shadow-color,#10b981cc));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow-\[0_0_8px_rgba\(34\,211\,238\,0\.3\)\]{--tw-drop-shadow-size:drop-shadow(0 0 8px var(--tw-drop-shadow-color,#22d3ee4d));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow-\[0_0_8px_rgba\(52\,211\,153\,0\.3\)\]{--tw-drop-shadow-size:drop-shadow(0 0 8px var(--tw-drop-shadow-color,#34d3994d));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow-\[0_0_8px_rgba\(129\,140\,248\,0\.3\)\]{--tw-drop-shadow-size:drop-shadow(0 0 8px var(--tw-drop-shadow-color,#818cf84d));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow-\[0_0_8px_rgba\(192\,132\,252\,0\.3\)\]{--tw-drop-shadow-size:drop-shadow(0 0 8px var(--tw-drop-shadow-color,#c084fc4d));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow-\[0_0_8px_rgba\(251\,113\,133\,0\.3\)\]{--tw-drop-shadow-size:drop-shadow(0 0 8px var(--tw-drop-shadow-color,#fb71854d));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow-\[0_0_8px_rgba\(251\,191\,36\,0\.3\)\]{--tw-drop-shadow-size:drop-shadow(0 0 8px var(--tw-drop-shadow-color,#fbbf244d));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow-\[0_0_10px_rgba\(236\,72\,153\,0\.8\)\]{--tw-drop-shadow-size:drop-shadow(0 0 10px var(--tw-drop-shadow-color,#ec4899cc));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow-\[0_0_12px_rgba\(232\,121\,249\,0\.6\)\]{--tw-drop-shadow-size:drop-shadow(0 0 12px var(--tw-drop-shadow-color,#e879f999));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.drop-shadow-\[0_0_15px_rgba\(168\,85\,247\,0\.8\)\]{--tw-drop-shadow-size:drop-shadow(0 0 15px var(--tw-drop-shadow-color,#a855f7cc));--tw-drop-shadow:var(--tw-drop-shadow-size);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-2xl{--tw-backdrop-blur:blur(var(--blur-2xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.duration-700{--tw-duration:.7s;transition-duration:.7s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:w-full:is(:where(.group):hover *){width:100%}.group-hover\:scale-125:is(:where(.group):hover *){--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:bg-cyan-400:is(:where(.group):hover *){background-color:var(--color-cyan-400)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\/btn\:translate-x-1:is(:where(.group\/btn):hover *){--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\/btn\:text-emerald-400:is(:where(.group\/btn):hover *){color:var(--color-emerald-400)}}.placeholder\:text-slate-500::placeholder{color:var(--color-slate-500)}@media (hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-emerald-500\/50:hover{border-color:#00bb7f80}@supports (color:color-mix(in lab, red, red)){.hover\:border-emerald-500\/50:hover{border-color:color-mix(in oklab, var(--color-emerald-500) 50%, transparent)}}.hover\:bg-emerald-500\/40:hover{background-color:#00bb7f66}@supports (color:color-mix(in lab, red, red)){.hover\:bg-emerald-500\/40:hover{background-color:color-mix(in oklab, var(--color-emerald-500) 40%, transparent)}}.hover\:bg-fuchsia-500\/10:hover{background-color:#e12afb1a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-fuchsia-500\/10:hover{background-color:color-mix(in oklab, var(--color-fuchsia-500) 10%, transparent)}}.hover\:bg-slate-800:hover{background-color:var(--color-slate-800)}.hover\:bg-slate-800\/50:hover{background-color:#1d293d80}@supports (color:color-mix(in lab, red, red)){.hover\:bg-slate-800\/50:hover{background-color:color-mix(in oklab, var(--color-slate-800) 50%, transparent)}}.hover\:text-cyan-300:hover{color:var(--color-cyan-300)}.hover\:text-cyan-400:hover{color:var(--color-cyan-400)}.hover\:text-emerald-300:hover{color:var(--color-emerald-300)}.hover\:text-emerald-400:hover{color:var(--color-emerald-400)}.hover\:text-fuchsia-300:hover{color:var(--color-fuchsia-300)}.hover\:text-fuchsia-400:hover{color:var(--color-fuchsia-400)}.hover\:text-rose-300:hover{color:var(--color-rose-300)}.hover\:text-slate-200:hover{color:var(--color-slate-200)}.hover\:shadow-\[0_0_15px_rgba\(217\,70\,239\,0\.2\)\]:hover{--tw-shadow:0 0 15px var(--tw-shadow-color,#d946ef33);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.hover\:shadow-emerald-500\/20:hover{--tw-shadow-color:#00bb7f33}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-emerald-500\/20:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-emerald-500) 20%, transparent) var(--tw-shadow-alpha), transparent)}}}.focus\:border-emerald-500\/50:focus{border-color:#00bb7f80}@supports (color:color-mix(in lab, red, red)){.focus\:border-emerald-500\/50:focus{border-color:color-mix(in oklab, var(--color-emerald-500) 50%, transparent)}}.focus\:border-fuchsia-500\/50:focus{border-color:#e12afb80}@supports (color:color-mix(in lab, red, red)){.focus\:border-fuchsia-500\/50:focus{border-color:color-mix(in oklab, var(--color-fuchsia-500) 50%, transparent)}}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-fuchsia-500\/50:focus{--tw-ring-color:#e12afb80}@supports (color:color-mix(in lab, red, red)){.focus\:ring-fuchsia-500\/50:focus{--tw-ring-color:color-mix(in oklab, var(--color-fuchsia-500) 50%, transparent)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}@media (min-width:40rem){.sm\:mx-0{margin-inline:calc(var(--spacing) * 0)}.sm\:mt-8{margin-top:calc(var(--spacing) * 8)}.sm\:mt-12{margin-top:calc(var(--spacing) * 12)}.sm\:mb-4{margin-bottom:calc(var(--spacing) * 4)}.sm\:mb-8{margin-bottom:calc(var(--spacing) * 8)}.sm\:mb-10{margin-bottom:calc(var(--spacing) * 10)}.sm\:mb-20{margin-bottom:calc(var(--spacing) * 20)}.sm\:ml-2{margin-left:calc(var(--spacing) * 2)}.sm\:block{display:block}.sm\:w-auto{width:auto}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:gap-3{gap:calc(var(--spacing) * 3)}.sm\:gap-6{gap:calc(var(--spacing) * 6)}.sm\:gap-8{gap:calc(var(--spacing) * 8)}.sm\:gap-10{gap:calc(var(--spacing) * 10)}:where(.sm\:space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.sm\:space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)))}:where(.sm\:space-y-12>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 12) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 12) * calc(1 - var(--tw-space-y-reverse)))}.sm\:rounded-\[2\.5rem\]{border-radius:2.5rem}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:pt-8{padding-top:calc(var(--spacing) * 8)}.sm\:pt-10{padding-top:calc(var(--spacing) * 10)}.sm\:pb-6{padding-bottom:calc(var(--spacing) * 6)}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.sm\:text-8xl{font-size:var(--text-8xl);line-height:var(--tw-leading,var(--text-8xl--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.sm\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}}@media (min-width:48rem){.md\:mt-0{margin-top:calc(var(--spacing) * 0)}.md\:mt-12{margin-top:calc(var(--spacing) * 12)}.md\:mt-24{margin-top:calc(var(--spacing) * 24)}.md\:h-32{height:calc(var(--spacing) * 32)}.md\:w-32{width:calc(var(--spacing) * 32)}.md\:w-64{width:calc(var(--spacing) * 64)}.md\:max-w-none{max-width:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:items-start{align-items:flex-start}.md\:justify-start{justify-content:flex-start}.md\:p-12{padding:calc(var(--spacing) * 12)}.md\:text-left{text-align:left}.md\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.md\:text-7xl{font-size:var(--text-7xl);line-height:var(--tw-leading,var(--text-7xl--line-height))}.md\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.md\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.md\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.md\:whitespace-normal{white-space:normal}}}@font-face{font-family:Outfit;font-style:normal;font-weight:300 700;font-display:swap;src:url(../fonts/outfit-v15-latin-regular.woff2)format("woff2")}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400 700;font-display:swap;src:url(../fonts/jetbrains-mono-v24-latin-regular.woff2)format("woff2")}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}} \ No newline at end of file diff --git a/home/public/css/style.css b/home/public/css/style.css new file mode 100644 index 0000000..3a1f546 --- /dev/null +++ b/home/public/css/style.css @@ -0,0 +1,125 @@ +@import "app.css"; +:root { + --bg-base: #020617; +} +body { + background-color: var(--bg-base); + overflow-x: hidden; + font-family: 'Outfit', sans-serif; +} +.font-mono { + font-family: 'JetBrains Mono', monospace !important; +} +/* CRT Overlay */ +.crt-overlay { + position: fixed; + top: 0; left: 0; width: 100%; height: 100%; + background: linear-gradient(rgba(18, 16, 16, 0) 50%, rgba(0, 0, 0, 0.1) 50%), + linear-gradient(90deg, rgba(255, 0, 0, 0.02), rgba(0, 255, 0, 0.01), rgba(0, 0, 255, 0.02)); + background-size: 100% 3px, 3px 100%; + pointer-events: none; + z-index: 50; +} +/* Noise Texture */ +.noise { + position: fixed; + top: 0; left: 0; width: 100%; height: 100%; + background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E"); + opacity: 0.025; + pointer-events: none; + z-index: 40; +} +/* Background Glow */ +.bg-glow { + position: fixed; + top: 50%; left: 50%; + transform: translate(-50%, -50%); + width: 120vw; height: 120vh; + background: radial-gradient(circle at center, rgba(99, 102, 241, 0.08) 0%, rgba(0, 0, 0, 0) 70%); + pointer-events: none; + z-index: -1; +} +.selection-pink::selection { + background: #f43f5e; + color: white; +} +/* Animations */ +@keyframes blob-bounce { + 0%, 100% { transform: translate(0, 0) scale(1); } + 33% { transform: translate(30px, -50px) scale(1.1); } + 66% { transform: translate(-20px, 20px) scale(0.9); } +} +@keyframes particle-drift { + 0% { transform: translateY(0) rotate(0deg); opacity: 0; } + 50% { opacity: 0.5; } + 100% { transform: translateY(-100vh) rotate(360deg); opacity: 0; } +} +@keyframes invader-patrol { + 0%, 100% { transform: translateX(-12px); } + 50% { transform: translateX(12px); } +} +.animate-blob { + animation: blob-bounce 25s infinite alternate ease-in-out; + filter: blur(80px); +} +.animate-invader { + animation: invader-patrol 4s infinite ease-in-out; +} +.particle { + position: fixed; + background: white; + border-radius: 50%; + pointer-events: none; + z-index: 1; + animation: particle-drift var(--p-duration) infinite linear; + animation-delay: var(--p-delay); +} +/* UI Components */ +.bullshit-terminal { + background: rgba(15, 23, 42, 0.6); + border: 1px dashed rgba(100, 116, 139, 0.3); + border-left: 4px solid #f0abfc; + position: relative; +} +.bullshit-terminal::before { + content: "CORPORATE_BULLSHIT_V1.0"; + position: absolute; + top: -10px; + left: 20px; + background: #0f172a; + padding: 0 10px; + font-family: 'JetBrains Mono', monospace; + font-size: 10px; + color: #64748b; + letter-spacing: 0.1em; +} +.btn-slim { + display: inline-flex; + align-items: center; + border: 1px solid rgba(240, 171, 252, 0.3); + color: #f0abfc; + font-family: 'JetBrains Mono', monospace; + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.1em; + padding: 0.75rem 1.5rem; + border-radius: 12px; + transition: all 0.3s ease; +} +.btn-slim:hover { + background: rgba(240, 171, 252, 0.1); + border-color: #f0abfc; + transform: translateY(-2px); + box-shadow: 0 0 20px rgba(240, 171, 252, 0.1); +} +.sr-only { + position: absolute !important; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border-width: 0 !important; +} \ No newline at end of file diff --git a/home/public/favicon-16x16.png b/home/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..c3c36271d5cced8760184da3181a29ecc7917467 GIT binary patch literal 920 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%0ANn zA_#EKMSMsElEPv{o(1Py1O)|u%m2`ju#Z%f=Mm~3h$LE<2_cd2Q>m#BF9D9pfvO(- zr27zNn|2`FHxRV;{$pfhV&c%D>CD$=uYG48Y1gg;F|>|9524(T6Lnkh)4roP+q?t* zK5B}KlD;7*2Zi9LRug=MR8t-OHh#x$$w|}k@dFkMv3>h?OTOoP tobTJW)Q3Xa}PV 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 literal 0 HcmV?d00001 diff --git a/home/public/fonts/jetbrains-mono-v24-latin-regular.woff2 b/home/public/fonts/jetbrains-mono-v24-latin-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..585887339efd032b6b715466ae72d86e306bec79 GIT binary patch literal 21168 zcmV)FK)=6tPew8T0RR9108+335C8xG0O80008&f<0RR9100000000000000000000 z0000QfessnP#l4pat2^OQ&d4zUI2w65eN!_+&F=(E(?Yh00A}vBm;~Z1Rw>400*NC z3OjnDrQ41$ zku4jAdY(h=YH?Q9T~KMlzwZ!Tk6XX@GiB;(kgcy_S%vf9>QZB<#m3B{T@3lCUU1K#MJYCtJ$}? zluNjuAA8m}JT`ar&x}3FT@2*rhYB_4_2Kz#{<-&|0(J~hQBlzuJw-*#O=b@(5Uba^ zHkPf+^t&ttCx-;2-K@@9z=b1e`%nW1TPo1Xnd~xr4?(X9fTB zZqWrE$bKIz`BR7;xv^WhHUA)2yId_#9~xMfeT!)>eKnuNmkuIu8}0HwYZ3&Z>~b%H zAeesM^^=>A?+&pfh**#a5D1!Im38kjcb>bf9h{f*z{867@VuM;A5&8$iAk!KMiCqc zBB;n(cfw`M;R1?R0S6jUab_$#vN}wfZN@UA>C4z=?2iAE{TtJ%U1pBAmN{J8ecgyR z!>u)yNGP-*ZVex{ZC|!Mofo4MEB=3-ezi}w=YM^+XJ&!8XeNIFps2Ry`<|XG>B)*^ zJ0L?6Tgl(Z9~I|=JQ!Q{A1g3~D91z0)dFBUXHLIOxphHMl=Yr1x;^WEEo-*l{GGa< z%gaGlTPP&LHF=P(ceXF|_WlbwI6|6>eSugWp)e*y7qUbxC3hFAePbnyORU zmDH(?!$~jepmzX;SR_rQv@*7a54fDp8J1-8v?hM;OU)aU-CpY)$f3>(;}IDnj0mRK z?XCar(F4+D7$bqV@fE^s8O#yF7jI3pimHY+fag+O{C{D5*))w1LI`1m@u&2DY2O3U zDP2gqQ7n_&?|a&5O>5AYZ6)by6gvV2R0N`+TfSHRtbzd00RR9LrU=*|;KBugkPv~p zNCXnm2x2877-t*;nM?$7as=6m5h#@-s8olbK?8y&tq4B&fZ(gI2q_^YV2Fa0fgu&7 z8VqSAlfaN^q#XkSfD1?7s6?8W3cbpL#%kz+1pwco$g6t|umKRp^3a@rB`OZBjAM;=RdIr=lk&NW-Ci1F`)N9h;f&5u8 zg0w1q!SXYZq1;*R8dw+eUtR$qg}LLKBBygShq4FAHvc98ted>Vz#4><0Yk=LQb7mi zjwH^0uO~tKI0*qzfO7?T(db$+(1Bj5E9*|cd4Z1}lx#3M;me+&FhIZtnw;3=OfD2o z5hSG;lF@jQQ#KV+5h>P|(F2e>$V75k?wJIM04c->E|Vtv1BB>Bb@6Yohul-ZUQiGa z5SY*-C7p!Js3cVnR%9ZXWK1V*kI3idchoA7!(67pWa>`7$vjTR=2#iwQU2ljZhHlX(a`j}|*58Q2cj>tr$xfr^6UQgpj_n^Q2 z+umt6nlDY$&umnU3{2W4dee>yx`W&xEfY&izAV{5s9{NAycQ) zeNzvc0!gLzs+H0zYEj?99pB%yYLk+VR%&@YE>>=KKKK z=-WZcKtX384VpLgU_W{T<7N8H$@fQ+$r%3sxt7$CdeT4|NfT*~^1oQ9mq|zujBh83 z^ZZg!kUN86-x}$XhBd1du;isBE2#dblXe^2N;?*Yf(_KlOk zM8Bt}onURs6n^|8bPr@5s{0E!sY0~KiR~y4(bZn8WAYHqmGJMW(SFyd;ct8{Q$N{x1bPWPSXV}BiGu}XJ=T*`uEg%9{@vy`_4yl{<{ zZ)XJzmCrnzR`TUjN%-PlihA|8CVy=v9HU*jaZY9eqAm_4p@cn7b>Eh|q{h{5(diPK zEbVV2EXDH4N~g2Z6>PnyW5ZN{j1}$Y)IM#X&eFax`{d;HRB%921eDkVZxaCV^RoaC zMoeFOo z6ww_=#h>aQe_-}cRhPq&8eLH*+!<_MIUmPwsR75q@ZkHfn&17j5p<>RZ!h7$?a*B< zg#G;+H-OoDeO~pWfpi|-YyFD?7mr4Gh`r!?RQ(z&d%3>{^DFj*^jnF@dqk)A3fNyq zc!)jf_HFtZ-(-GQo1d{eWtX}3>F(J{OJ*e_KE%E--1=RVe#F;fY&F+m^rL(oIjqi3 z^CPzY!ItW_6_K_ZokO>iP7NoQ5k}Z{T*sjA@x}KY(R`0hE6*>kom!=x{%n|4jWEKt z>^2&Gi%-UHfcX|1UDlp!pO$E6tv6=JjyS@a8?LeEGJWBr#OilXkiO(2c39mE%@#sHb9AVTEFagFmZPu6oc~ld(#feBll8jv^K5Xvnatlia|l{ zHdAy8^zFoUiY;x|HQE_Fy{%QqZg21dZ57ZJR(dC(2i6qmtZM^wmo?U5bxxW)=m?KI z#F2^iQPDG=rXw9EH#kM-KHMUXR#A&}!P64c;$|Pxy!nsgR3kHHBJ*uSYcv^&^0ZBp z<@nz#&bcY)bJSpbxrfno@Z;VEi~VY55W_OkYs)@t}y+9n@ED z+$rLj#sPcJ#2DfS_0hONL>fZ+2U=qzglBjkfv(`?jxH?2b}CSSsg;K{1t^rMr^OQWz79Y1qyGbHskwO#zht0>(3C8Dz6r_ zKTwG@NleGJ)*{kL`9Gmia;(!?U`JzPLO{fdeG^1*&VJQH6du;&A^H z9GXM_N&YMtl~>mT9I?1&A4A0>nL=mwM0W6!uXu^F$z{tll z=|DpYULp@GM!^$%4hRmzYftC3I6d##6mN#`g8;q{@~H{(vth|~+CmbB7bs~i-y>0m zlQ2Fx0vof7p&$hqHFU7Gh;ZcE=9v2t?@`3b7V^2Q_-VsGdf$gLI9D5hOIUY z5rr;}cGabBBBcw4@u}I8N-OQ$W!2OQrI2=7Jvb{pf+w1)q;yv(km8mpPyhv<(O`Vi zH3-eoUQ$IwYA`Kml2f0BWF?PT2#to_B(1*(HRsQkM$RBX2T;i~kg(c2ya*KH2)g2rq*C+zO{9(jFKnN(q1r1c_oIw>B0!}gDZ$|qT$r}KD} zl^9;&A732azPbk_{`h6%byjm&cfJ5D;{(4S0INof_#}o)ElUfghIKS<9H*;CNI}z* znsvt*;2R$IP?HBuX@IZt*l<|4WdKVwGzqEdmrq?X9adqf3hKGLSUQSW870}G0)584 zT_#YWrcZJ&Ct#)alj2FjGOMO$D25~y_2A0(2%}LkrFK%G_@Iz^J*gt1ct3-i@z=h2 zk84e8*=0qh>w7I|z2K{PZfqh7M9h^biyVy^;4M7=BoP;#L}Vvltve5&*BcZE#EUt?5H#}@I31ooY zhzHw@CywSdhyi=d$OIKNJzkaNuEiC81@74loF6z#26zegWpMV6n+RaTbDVj0*}wvE zHb_LqG_5%!@83tM>B&Z!bnXyZI2X^A+2gSL3~>_ZV~Xo>!FzNcaR15;uHSfekOl|% z6U_xucicoE8c1qMM2=cID>bxEF*L#hH(kX zXL;2SDV!6eUr}Fs$8CN^1P&cbj*L@HpBYj+wnVKt>Z*NM*oDs@GrWPw9KJ_@enzeH z;VbhL;W@(rL@O-1o8Vs9$yb6kyGLOu}}N<_|kI^7j@ z>n?i){x}zVH0H7V^K)@^iPiH6+4!*w|UA~XmUBXLi?7^SkH z=Y9--E!YxRH5UV#q*%_`rYll>QCQs?%@t(dc-YyIFl7xYMjW1cED>=9a6lqUI?GCz zPFVy&t6Xq{TOWTs>DKb{|_tC6j;lSKhtK*2&LbmoB0OF{0ix(3a8WE39x zeZi4Plt_oHY^IUY78E_*Of-T0+5TW2VMqBKiZsq}CDTMYiyTFIz)I!@=#1ou!&`Vy zrrh-DTL`(@!oHIaEaM{=YG4f)OnM!%ky0_NHFLxSsR&--YLh?<^Q15UI*F_X&ErBR zoscZwVRZ=231~VV31LSjO-V)14CS|Cj_V&sprxsyQEsy{M&HmeWNWY!#-L-8NfOqC z<`~q%i*2_7m?br>^QdjnduJ|Pt70r4A5dM+7SR!;Id5~!5vaPMJ!86HoNCoRVCmgT zwQltX)&?Mg^M*=gaaE+BkiuCRF+hEi%FKABWe!6rvB!)|$|V(LU2BfI;rBO0Ob6dQ zdH)6?M7Vpfx_&DY?nZs`uG;nTEK;4Pj33A50*WLKvUAt4fTvt%FEnLM=f?Wk|MHGT0 zbFPTCNaRjf9h+tg+-Z>*mmQg$krq@Uy2pE*I*6PfLkqk$DkKxi#T_J^98c?HPn!_Y zv-1@90DxZiCjva)iJBfb7{m2hIS1Hi$F>78PU#60!o#WqHX16*>T?4LJgSo&&;qmp zq0KuqvmOq>>>HjU9N2xJa7Dj;yUt#99DNYW@~_!|HAy+Sc)`b*eVZKzA~iv45ez>o zl>nRg=`VPIN|%}XDw{};Z$#aJ;4!ODq@U3O%$Qd&^i;eIRA=ss}I9Wo@AD-~!t{6cA& z3KOjm{|y1VWtKxG?^zJ);xq#-s3p|Z?(B!w;A`@03lKgqvh+p)S_*&FOL4OVQiusB zdhL3-7f+n9Ivve?cnWcrFMHa6V=bt|^|hywql#aQ89}{d zEwj}+C#b7*)2igoA?gx09>$;DrmHl^i^RE_x?D|1?Dq(tvrEKYQ9a+nOo`q}1)2wU zIqMY#s6$-PVRc!Wc`zNKC-vFW8$gY0A7NU>u@+Rv)C*JsrZ;0r-a{uICYzm1(?N6K zoWY!S`bslHUc8=s^ewGeF1Oi(*)pEtv%9fDd+Z=yeR zBn$G6t5R*!0*h#?X4?(z&@*PW6aWnzFOF;fq65o@4EVfbLo^*$&9fde9sHTF)hZ zpTSjFToq|D%y#Co4A3Mo%Vs>6G!wx^*keW}&PPRAedmqM5Y!x*gDudsxND@7W4n1% zs+#R3MM7>QZVny3eL)5A>{IqquoLFWmxbyvTov!cu{Z3E9j)bB`Dje=Jjb3>BaAm- zgI8^`(kcEG)*b7}w`PGBbzC#X7-!y;-^BtpSK?2zQmR9pIwFkeAh}Zihy>?ir>+9k z!m4ay7x81Q;}*!hdZopfuUH{ zGnHU@qBN*mP=R2XlWS&X$y!&kEk&fPXva`TE(21-DSJh^zGHVxc`0SCGtq)9C3U)@ zyBT`F9!LtwIaGK?E~J1u$qF3-DigKSj8_1ofFu*S%V(*_V51kduTjToX0@PlUdyga z6muUDa5Dt4wkKn(Kt)jXkZnAyic})1g7DVpH8v{VQ-v1XDQJoyda^8JL=r8!g^}mD z>|W+@_-`#60T7q&p*h4Dr~t}S&{RkIsX&yd8BaP)0WMz-sFoXvNSC_Kqg2`9AU1i# z2`;hWsp7OEPk}gP9Wg2LW;13y(Xn~TcyNl8A!=w?!5@C|m5aPLSq3tl6^DnbBIQ6n z&lf5Klr8ds8Gjy`ESy{HF(cEtOhs8e4$p5$dn_$*D3d8xAOVvD+L+x904AW6xn1B} zyUb57P@w*-@D!xlG&enQS{TRL)+weXDQ{GWk#?oHW?S$4W14uIfHTnnMCp()4?>f^ zcBA+!Pk*b&;eX*&^{A^TLz18z9RBSz)uoZ6e^3KI+?j=Mc zK_k#;Jj58pHNoRdcNTaN<8BCUsiI0|4Mbb$iF-GGCj8bMEO8qD#_B3HPxS@nGPHB` z2dvht^!Hx?fPf0Nr~-|H2xP2NfRg0WHRG|ujDsNG!y?rF&5{-rbJTM$p=71!u_4^N z*+G4Cs7;BuI6bO#iJ$(#A{1Q_38}t(S}LpcNHZP=CJtOLc>bpU+aB8K3~+x6F7tV*EjS*<(f~+D1iLJ^nteg@wtl zRe^i9nO;_ae8Dw6%{4xt=}b7$Ylq0*`ukLc_sIr%#94!S%I2y_qrq7-6=i_Dgws2$ z4x{k|W#<`NWTK2zl+~|takk>)nE}*-qX6;%+w)}4cz_}cS-TT}918g{5gI_YJ(-?g zOjCUq(=N|rkJ@htEe~#g*y?bfX-BnO<3Q>ii4|^IWgW(?Bqh5@({=tG4bIiKL#pXB zdFn`7poy)3nfRtPl3mH)$4=-vTQ%qXc)+WYNNvFwCYO?lX;~p7S7H1KSiW&73CA`A zb&v)Tdq(t<%gx)x-yj6+ge!mqU|4g4gx-LhgdsQM(YbK~{>By^DEb4rfE%nV*Cyd2 z6g^AkVN$$Y>9-qY;Gjc7asci2h;1BzEzd$!92GDDHe7^B#%iuX51Zg+;I~y~%$ZIq zkUeN>gH?feLXDd7Xk>syFz5*w|!=DN4y^N{~T^bz}w>-=ou*fgHGk z*5caLYRwfC?$}Ry)`dj7QdeK_x8ILso`Z?RYKjv`Hum)L!hvudX(JObnVwV|lQq0( zh>RgEgS8%^2gJldLPntfcz7El;BBDgA>(&U^FQ1(slM0qn!PhkZ&OCR{w%fRBt#|5 z=G|%LpwU0H=?&A#=T%!v2G5`pD!Cvh{XHsrc{Pl_!SzHM1{bVoQzFJc9^Tl|8_g0w zVS`lijGro!F31j$bQY^3=~P4YRzk!!CTZ`HDJ$cN&~QOa*pZQmfQlKje?8dXnYiHx z+zM`Pf!H8A8OISIt@u~>UB)&TO<)PTdTL-z8#O(y?KhCz@ZB2{ORP7?tT&uFZdFrT z)9bc}Q_VF~l#mtiL`oRhz=$d#HCgKrc?Bssvo)Hj+XsIRSTvI?q5;s(9Y!qS!^4Q= z!aFfQ0S*8FZJ+>@1K0o%e+F=tu4*BC=fS`X$DIeV@pl8LfIb26Xn>Rz{qk<*h_)!o z8VP_!K1?I}Spl=wm;{vM#zBQJO$qBm2K3}8*@VI%=S4bBK(PM!n5Mp@%TIe&xaSxlSCIW$9{2qn9%s9s{aXe zfz3;>p5UqQivR*aAiub^PAfyn4mI3{=~%B>?dI zUAfjiup$fD3KtLLVkfnK5U>mYq>}_=Mbf5b@;2kG}wcg7sQsQ&`xZ zI)sQKAr)(^agxYnm_RN|wp^vkD3z;JrCx(ZOU_ za^Yl{Ghd^5^AW^Ng>a$9h!93BQnW;I;w4CzEJdmqISS>;SFFH@B6X_OsMSoNg{zWE zNEP?bOOMb0F(>ZeE`=ZpkW6v>i_@)s=nz!zaZYiMwmz*z?NPG zpLC(UX_POf9YX?07NDhRI#ydtd2EkuV-tC+qU0f@6+12!BFRaFBeGyeOi(=N=aFf4h+v!}*o$ko!>a})GB^@lz~0l=5z6F2 zE?q+OO;S<5E=x@Mo5XT;QjS$X5Zx#j9-wD$s&B>HH%Rfmo*CCZOIt*1ns?(K(bXXy zfi@=~5@#c$x#&*0ZLjsnd%VY-OGfsVwwa3)XmZbQz%3{vsG^UMpR&B=#aov|b(ydt z7D*Z1%k@*|m`;X~HFj&%gdmQTvFV$s(rM!^WbW}+6dFbIoZfDi=)Fy!VyUU zv=4x0Lm?j(gq6)BZb=)!@hIS~%q(2B%Uj%Tg2n!DR4nbA%ab8Fxw@ixC7`8q>*m+rzwIx;OW1=co;M*_@Q_a{0*DZ!!T4&3U8X+ZHi`=@w!{h<@ zl;VhXA~HEqx;8`^?>u!1W@q+j8}f)AvYu6d3`?(j6?W}kZVN(#a%8or z0+!wO>1A%b(?iBNv96?c1uD|SRv!sT5v1|q5SIo#lr7i_Vj*!WcuxgaHiH9(Pwklr zz8KeI2w`{bdqG$}acDofSR;n17q*(6#Sf0O`SUHr4v5_XRmkgq04Pk;x>4;}=!QiI zg~2kJTq*%ok~GXBlbw9f;&e_Q){0|7LWDqzJ(j5?(0AA^y9Trb*xr?=GXmi?@ zy(}|ghp57)iaTLPf7DnP_9BnLiW<^m8uXMrc-OnPhY0R60-b=HuJbLt!h!{F;A~6B z7Aw+Ta(v9lSR3#YbS5tNDfU?q)W)sJI~3SP8{uu1)67VoNV(lqbUiT}x{^Dq&EJF$K*Ivw4)hg#JmS62T{^hw%G5rk zNGWS8*>V}~j}BseU#Hzl^J>AGU7}R|wQSn&d-BJsjNhtP?2(&UjIhxtK)&O#%{l_; z6vGPCpzUjlK&!$vP^~5mOnL27*fG8CkGfFkK5FbViz(>hVIhwdJc3?{YrQ^_Zn2C^ z^D9NFq7h+rt5%evd~O++*_d?RULzjywli8B9$Keffh4(RWc{YAU^lMlLT%~tr8a|N zT{2*n8un<>T9nHJsmBc?+KHPWp(0VmJ}-trT{{{O#JaaZ;p*<34C{95huHThdJ3#F z57QIdzvS8)g9c1f?w#cqk2Ctgq0hNzQr?u&c4;ZD^i<+&qMI4eGe~%GichZ7^wCQ) zTu(G*e+KzVw6Xv1qkT#X?qgVam=9o+rux)#=Udv6;_tcR_6`zBs`w4~}APwksP zzO%FM3Nkg%%W$_}jOgd-JLRKQ*v#D-6Q;aUOV3KV$Vvtz*%U*rk{ODLN33A9Z7{rR z9kfyF*X%kAqZNgz&bPKLgFtYpLy&4UPf>WZP}<(kbBx( zElyXBNneTRs-lH*h$uaXvK4)L4ct+8>>^RXNKMx*%a3(|`!nT;dYCt?bYOTA4tOh4 zLdnD|Ib&RxjvBJBp;BYVuH~ll_oaUqo>w1U?MfThq|+u+k?@4`iD9wMEyFI;csZZQ z+5Dqc(i*=t8WIw^OC!g|p-S~#$TQ*Dri3UIF1V;GX(P;BGHQb#(!sTCTmcD1Byvgu zCowxwo~qDb3&eqEKLd%5^#`jYIqBW!xtge7OUI z`T})?o$X|TOt7w0O!FRB%P3XpG&d=k#&0c{yST_cIB@fmKp%5UPaFCMd)z!eYmYwM zQN3Vc;7F5>x(j5uyT#2PXVKQ)EZ}!*ItD{@c-VX~8T8iv>>vH&pLE?xM$#<-eHb0*(kfFDpJ1Hj`5)&z7&Q_~McN`cbshvb30(;oXmcQEdt^?{ zM%E)v36^T+^n5(6HL1&rz!Hy^w3pWO&SY$glWsDVThnPSBecfM#7nd(rI`gLAWUQZ z!>CDoMQCwI3mJcF?j~fPXQDaT2A`j?~^`hnq8; znJ?+07|w6!XF4d2d!fgar%4a5=MFzu|1jTZ!=1l7^Cn}fJabY$Ss6i!X&)bi4G0ogt$&5D9EaQwELRhSMzpz2v|760tO^32hb~l}zd$^L_~$;v#+85}FK%B+jrq#n?bPaFZa z>RiTvB=@<(oaq^j;+cS#Ti4(whN{MX(%Bf2p^BNWR?OKErYu*Fr)8MAY{-J1rodzy zI_2}^JeAxjpP}=7jIMp;TvdJJHLF#%b#7+kea znYz8;n8}Q|0zB5o5zBJLnhP_rMrhI}3Qkm?Nx4c9OWjz#zRgZOo$*mlckal~CpQ$H zGrh{sT;xkA+2Y27B$G*9W?;Epy2Qn`d=&Ts^>mHy*=FX0O!&Vw{%nm~*l)|UW&)j} z?LSFhAbwvjJ`+0V@QX;9J~yYF6{d|hWxGqP8y^eZvwTjq1f-E@2ZFPFMpy)4dYy)` zea>EoGHv=Ki56r#o%Nz(Ek!GYj#=r-XildktTQagir|zdq@K-HphioLP#X=ZdH~QU zOLr>*BYkrDnOECs@%Wiqz0>R4UtSmvk4}?9`+&qmtFL^G;up(uY^pF4$*-S6chHzB zrOOz1k-NmGeMnBBclx556)?o+x6}9Ye?Qtx!BcNvsuIh6TVKpY1|E4QM9H^yRWOL% zd`xx^-zy9dueXtLXk+eCHXipIqpnw513UO*BY3j5c3$}{vzs#f#}C+7KNYq6%p=J9 zmY4YvDZ5Vb&cq@70LarzU<~$)g2TeNbxM+4!o_L>Q79 z;dDCsJdWtp@m-UB6RvP$`vh{q7De5@r5ev9(38+{RwpBtKZb|_2w1P5dD>7fE4C4+$8LE*HL`1F#;S7Qi1_Oa3PJ|d?Wg!fv2&aF2 z1B2HBr0iWOhDv!}Sm#>V?aR!=OV!C|%llUkpR+cqw6!Fk)Yh3M);do;;jj~YT#oyC zz$#0a;{0P-`mf69@J`x!M>JmaMnW=({Ct2e|4V4H-h3S#iO7M~^oxCT*h9mN_DP_; zYXzS`5Tn_z6TFKS;BZOIxRd>S0FLx=mX*5I#R=>TYk0 z2HnHVM-CdehG#gR9^{o`ql;pm%oq-`iZp6C)40t6(_14mS}9heR+mQSXcpwdvwrKC zk{C;&7Fmr#vDLh4BhNcj6JC1BV8LKpco<40`kkFa#8E z?wY0Y7T3ou;`%z_$utAF7n3IFX= zulToc?T_r?r;>W5Izr&;8haa?R}}TEFi8*3}@YZA}0qY9O(8XO~35zLe3S|ywp0wZ;^rFczuGYB$j%xKVK8hNo4zfqrUV|(Hbqoy({1Ft(SCqJPte+=AM zr4=2usZ6R-Z!sAS7Go-tTG!kTUYr=pnfvl28m}E4A|wPrG+1|WYE#FL?+Y1+@cphI>o3+0 z&YU{$;rl|TQ}BMzBcL|?c_3%Gj!6o6A_B+nJNdTgGydxB`w9zbOT7UXGU=Ks_#8kg+f)kvFJhyK;I2F)#QHFt)M+pa z(uZIcAZ0}s%2Z*zk5Gl`WJIL9VN8WQAJb|L76Ms|SV)5w)A5-x6%7sGrZPdSl~ekP zk7p$p$HUtq^>LrsYe&-46Q=Yq!%QqS9rfA-ZY@d?NV}HC+Zl*i5`{+FK$6P3uo~qK zeyh;aee4r6+nsQx##+~OVU-!iO5Gh7luI#6*VL%9crcd-FUrI2O2S4NXMZ4JMdT}# zVYClZhJfLL2X+XnEmz^V*`)kyu{_z_2nz@Sj#&^BZo#=@@$>qAx<7(@9ky-sw(JSE zdAI4?n?cWE`k=T$L?zT4O$<%4kb&B^@U(DkJV1IZ#)*c?O1*;#c=PkGAQ(f49>av_ zp#K^T#M1I{H)ZkFHUztvCIf=0wU`A9g8=>Y{5^EycgJYpKkEAcF%za^50bH@+Lq1+ z5E*9HHgCP7I63yjsMyxOR(wKBsZ~&5kv>00r=fY}IR|M#2t7pVk0K4BNJb)`i3>^u zVx`uNZTIcS`=gEZJ^mKk4*oqGn}NKYAX~_gpu8ZCG$l!qd77A88Hn&QrM?P}V07Rf z1CC=WG07P81OQk&C_dg&b)w}!nkH-07g}rc7zwkfk95*#Zg&#tGZAKRloK_!-2U(Q zu>n$4xEin~&ngs=?tr83w_>3&JJX{JY&i9?|1Aj3&Z%}*_Q}`K zO-fFj164Eat1{356U1R)o;T^NkLorP7p7*|DOYbck=z!9@v*Ts*h%%s5N zyh#c2YP?9S(&zIZ4aJRzx@EDHBLu@jPsF~3sT_3`DDDgR@9naW59-1Mo2#b04pg%d zMRiz?VG*&CHp<2BGKryZe=(^-5hYI0TBC*1>&>{Ss7$OyEGqr$w+6@cY|vyab6Uua z^u~?M#$S?uAyH!=4aBUxx{lf~6Gl+8MvIw|`MlJ2cYv2i1l6-U`?E^1tmQL0tAf)8 zb1MW;y+}|udGdULaZ$Mu0`vcfXcxJv1ois4hPBz*Go7ZnK>n3g|G4tX-OX1t&R5Fg zyJN@4pR+8Vezf_zP5W%pjHBS-Vfg(urg*xq<~)j?hckV(6NeyY6tj!y6^w4Sg$C0u zYM5?wF)ve!5hpWnP(&|azB)U;xT&*7iK;{OO0c2Fu{392o#=w-)gk##;L4g%SH*J69isu^ z2#Ht`d6*Qe`%<2`s*Nrj^FHgC)S*IypsuanTHDzHidfPzy)H&+c(IY=!s!1yf}#v))1uZOEz;JxpvWv% zQz$rtpEm^8)M&Blnx^V4^v!ItZsLR-VjdS8mSGFTv&%g-R3z4ffzOszY?~EX!WM4e z^EU{oF?f<2GrL_lztHMyDN=@=W}>}fAw!)rnl&%#te5h&z;d-G%imEkxlX+ z1Ip=C4XKk#ExK9D%3NkQmf*UR^9_OEhO^T(Y}x2h&;LLTBeQwU4oOH%hQ}CE$b}EC)ILCfx|8e8{SB2Vs?f}|9m~_r+o^>sj{A^{I z=?ors#5hwk!QT&0O<#<`lT8mYl`G?LP;NRG;bh6U;MR>kIp&}Y1_y=r1bV1Or8Yw7 zq>NwH6*CT2aE89!)<(G|jOj`${EGQ8rqqjYgWf@G!UxqTosz%$Mv+PtN$~AJ5Go}> zf`J^XOy&McDgIe#|5q-Rk1(o<-XyO_{7aCMe<=;GfG z?0vbvJ!@H-xB15MfjZlk#qlb3U^FLH(c>9#%X`A~DC%ccViQBj@*ekqN6{1VkEUg_ z7sYK`>IT+qzJUi-2ES0^;IlS6hVeGohKKX5F0m)o@ zN#?;I1crL&h!g0=MpXj?l-?v6&T5kbdYhZ4deiyp{{#P*-*|rWUGhnXmSVoW)>B@@ zlbr;z+u)Edz4rW8F}d7%j{y!Rhsyoq@5*bLaf7A@9VBYLd_`^FxaDxqgVJtj-N%0Gh8&vBwNXQ(Jbx9rGA6wUvVZ3H(Gk+YH+C zLXqR}cwqUdL- zl%IQ5mNJ%Kl%3fs?p-35n)yPk$QUr@1adg7`rdiK(8?dZ8+L-J z;4C{BYR_%Ao~HLfTPjUPdBQ}9!|nLekMAIUuJa&*;%AD83e{TCgu3>uWWQC+{vV2c zoq5_~<7qpB8`OO1J{`|`D1-`JoqtA&gi1!wq@9#-fKI+H&A_<8BHKw^An7u?mj zHANQDaey(#bhsOh$qBtW%K?fwHI3lwW*@lYmB+n=O+I5$d4z`b;B`e zxPOjVO?fO7?f+M){KN-N96FzCN|z z9SZ1V&usR;PSt)=`EzEk-TpxakNdveK0kAqg`$=wJedqM68cDs(r#~2>FY>SNyw*J z6=e>}ajTuc%N!QUV?~W`I$Wv4dr+-?-uK+FERKwuJ_>C*ct}U%Ti-pY5}o|z20Hz% zA>d`xL3r-5^+5gEDr-S{yq;$@XV-zU1E86h1z7n-BvOzCZxK|hQwEa0geT#Nf5{Gp z-MrlD=IDBj#H~I5@WPSr3BlXq_uD_PKk6NWhBIhoZa1+JyEtYaeIv z=PQjqtlkMbpd8fq@gR;y%RBt~1jdXMI~OI%wH74+PQ6p>1n=}BMuh*tvdM$%MQwR` zsEwE17WeyqrG0x{BQ5PkMMXTsLq}6muG93xe~cQH{4&)KP{DSNP{`RX5FC*R zg_0w{sCPjqsktm6AeZegfAjON-7XZYo9ati7`lK?s#gFnBOQ17>y$6tCZU^JDv}or zYGrwSNq6!`4fd4d8g9NQbrOWzRYj2(_eMD;vaik;5-QP_w=w~ty@*B9W0uQPWR*3RWGdD@reEnTvFIsX8? ztXLf_C=xoCI|m1~!N${Oyp#d|dUycte<|At{McBK7=v|i92vI+NU77eah}K9$0>k~ zN<*xaUZA6X_?L!*o$lIRKeX%g;yO~`H zV8YR1dDN)I5LAa5qfE3W))J9oQ%Fx@!ldF!#s-3?KNRf-m{FASD(GKpDKC=)!{d3O(7R_ zH&qAVr_87DQ(&`R9TaNKJ(2f+658p`7vz^@RHd3ze3^Qk-5X8fta(@EXetl$JgpuU zme;zVfT!pc=9COgNTnuv(@c7s$Cz{ha1xL0_W%8gvN%&Wk$!M(9-luTv`_s0+Uz{x zE;f+FU0nvW#nxv-Te=J`cjqhWJS~~AvP2fp_332(N~zJvFc3!$C=Sf8H6zOTN-?xr zaxB9+Ad>?)^V!M-99+4r8Rc=8(iOhWM67$avg*^9RffCNkG#Ad`TH+9ug?6%%HL-G zpsQ0Il_z=^t3Palxee}5xZGxUPD5Ff=2v42<@l6)BHKnq&Q#H03MXHb_AA`JjG{d_ z&S}!@9RSYEEH6wGOVSEOZ@3BHz!qzvs@0Gjt(vY5Rh>hbd6iPhfzF(k z$thm7y0QA~Tlu&|rJvQ;d8fd&j){#O^i`7>`tCQ`W;=*!cb{NaVbvRI19rSM!biO8X7HK)F@(GQoDc zsIcOtBRQ$|nUf(7ptAs#Fe2S01Mc`>@nOdMU!NK{!*5<3%mJ`Eho^;X0|2)o%Z1cl zF>HS9Rm#LruKnrdurIP)R_<=+J3I4Yi|e5P@w^NHj4q-@@7ZVFx01wnZ-KWOx9VWr zIt_1w-$#tFW1}DVm5B=m1CZS0LuTC2Z9}hbOxTs}73a-s4fFW(vCs39YMzgMy(?Hd z60QA$=@?V;DBd`|aW0Q7?iVe2ThRN5A2xxddc!$cPm^n2wsq=^d!4-YHIkUA}CiXKDD2E0+q}jE{7K&)8Q19 zKZF$)`X;00(=WBZ+8t4{%e$I;=_cNtFq|&vlT^AjN_R43<@eNmwbl7yQheX|B^5^A_O_tLqgxcZi0_#~ zFiNiMn-=Ho{H4g>727ZMksoVUN0qXsE2BPV)$a<}n2=`?dVbb!o9r03yC)-!3+rmV zWa%3DWFr#$q6f7}$q(|n+S@@-`?`1wh{?x<#O@#NEA*rs0-NmHY5R-O_}KXxCT&oWLo>lG}bB+CqZ<;u1kbVitahc*!S{*36s= z-dH2qU`}*Cn692rT@bmgNNtx^lmxYQdyzu$IQ@s+>|KotP(t`?7dRz$Nx8h7w1*}5 zENzsqaXrZy{;_*a!c%L%F=A1PrBI+#|G)-*+navDR;ykV5OI3h=^_3qsjHYk%OHU; z(eCtjrd-W`1;V>yAbh`@o8biixs!3}kDF89sgd}u3HXw;|7w58b=fg*3<{5p98Y860EHg z+=T$3?qi;RJbgVHQ>x~wxz9`E^TSlW%2)X+U-eSGR4>)b4+MogQsywmlp1PD zO!3k$=UfFSHdbaAQ$j6qiu5%8ky3rc$~;O+Wk}P;(sISSQl<*h{OnxRTs2qC4Rh}S zRrpn5YL!~0R{2fRmL`9#7P@^MO*t3~dK6{>lMEZ8wYpl%H3g-K}Pz~bqdDqs9q zw{+IKs{5*9!IO?`G7sJ-Rt~L9o@@_OvGPazYaN*K)p&L0t5+_!%pf4~0Ikvo&!fYD zATKZOG@yB2Gqg0D@x@cbc;wkD)G8h5Llc{xtajhfzd%5-!C+23@_>3oJ!~;Z&`6DV z$g9qg|AxBzy!>%gU@{lQ<8UQoxdK#1N-C!cs-zlfrHM3&Ceu`!CZ_+@gl})(=5D>D zv#l$>>I(pt1-l#0{E=en0vUh>=qy?Xs}0l$-vD?66)^o~uY-2WpB#$8PSd>*$|sZm z(Q*)wTa}&5oCAt98A_9oOQKqb?xmaqP(O;;%Mg2U5K3xwkR~a!9y|`lfx6iVH6o=_ zl!Rtg28OaBb}&qlLE2`W6817wEgV`2n47VO=B|Ali%ciG7E46xGon?(?l9R=4`u)A#dip zlH=5C_-Y$|!|f6twUGkCY_Iljm2_vjc92@Nv*2CAlXV)L1e;*b>z`>s!$0N_pnlit3(XO zG;&Qbwrr^F$0rh}J_1umN1iqZ{WUxD+7N>V8_|M4-q%<8WJ^oXU7fknI!0{xse0|^ z^doCnnYxT7Py3+$7Ls}0Z_r>PTJXo}zEWjN{~03NQ%mxMSTn=O=Td*x?6qk!&=38@ zW|&t1Jbi3igX^Dn-hT^nN;AV=4QPS_00{7Vm^G(8@=+2bb>Bv2x>m04$6Lb=IbkNU z!M#v1@;FnvpAzg5iUuSyH5pte$b7>hIT(ftwm`Fyf}Ar#m=6Rl7H57;KLAIm4FF?H zP`X7R0v?EiR;vuZF%Patfp*8xCd*|FSUwtU2nTU0gs?GXBfw@ALTtoZ{z%F^jZ6&j zX9jy<p{Qi7+l}4ZVyHxo` zKYkY5q$;~@WMuTVsy3A&AxfN(--aXA0)&bC(eOf18>!lnE$&9cSFMC_*t(NT_8Emu z;*uQsDu47;sg|R_X1HQ)afIv$UCedyy8XxEFV1@?`qAJ%3`9_->r(0>rcEjozK3sR(0lsY)g)q8vxT>bQ zB`Gq}wr^2n|Fh92R>|R(==(Ihuv)a&X@B$WP{TFGvA*QT#O6=wGJTyYq1&l4Y`doV z>%^{5#h^NlVG6)hjpyjcAX?BDcJn=7@+E_*=*J*hyuL3XO%m3Nv2S;r1iH)nb%(wL zf&hG-NT82{%+SD!mmvDwD%=~&09*jcYE&suEl#5Xm6VEPD50cKrcvYWRckc} z=Be2>_-uV=Ydbw=MH;TJBvPZELYvhwpw7v4z?P79+LT-LX%4E%cUz( zPs%wSZz63+cN>Ja@cQ%c?hUXZ{nLsRl00o~KB0}$E43!7uS}Aw^P)bUR0kzn$hl9Z z-Yk?WQ4~55p{c_8+7(25yHtBXLFw&lQux6YHETc51PApjmtB9o8G*WFc8&D?A0(Xs zM^~e`qR?JN_F2SJG-&48Q&%s%%uxW7zvL}IM9X;a^(vnW)K&L92V)KOZxnz-w`|Qa@rXh z;Jyx0X=5ESg-W9{m@GDj%i{}#BC$j&lPi?2Dz!%I=I-IC(;K{uCU3LFYO_0heE9|d zAsC5qF}zt$(ej#YMOb>h^vaDVSGH9OY!Q(X+o$D#)ko&&(y80bC`Nf+g<-KdTpnK_ z6p1BLnOvb%sWn=i-e5GDS1Y^6(RVplJo^l<&%f^3e-DVm6Nn@-g-W9{m@GDj%i{}# zBC$j&lPi=ewMMIp1)|LN$ghSB`z^h}Xfi_cNTC1v8a(EH~s#6 zI$KYpR;N2OM_QNTu+!N!R`Sj60?rG^^j}?k|EJy#AoJ$9)fd-%xSxe6fhRpoMS-pD ze?^C#qKEaE({0OKb8LGz!9QZS$hU02WO3SbCB?Mzf9$0jMXMP)9 z$AA1|-#_nk+WoKRGqbD~2cB-%GYtLu>C@?2_S5Nt?*Gc$E1}gsR_)0wyksi{oak+` z%gBYziERf`yOnsS@I9tsPSuusOraPe`Pn^q19ph`!98WpM?DttH z1Z^{7MDZkELjBAPox^%bk^ zN{Z)^fhc~&T$uZZS6|Je@>|s}(Wxk*s^(ze6)ECET#k@*KqI~35=%hoa<2(BEz(ou zAXZW_&=XbIAk>zU(JTZ}R*Lu16{U454zpCWHcut!h=otQQM3}xY3!I8gSf}?31-2H z(PPv=2^$(pmBIc6NYkqHW~lg0oq*j-@g8pc{~&1w@f_#O<<oFXct>f0{>5#OdL4PYZ*@aP6s|!d-ZQ{nHwBig?}hv?M0g T=ND-DucNQ`tADQ-AuI&|D5jKI literal 0 HcmV?d00001 diff --git a/home/public/fonts/outfit-v15-latin-300.woff2 b/home/public/fonts/outfit-v15-latin-300.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..24dc09663f191b9ccdc590d475d24843e78929fe GIT binary patch literal 13956 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 literal 0 HcmV?d00001 diff --git a/home/public/fonts/outfit-v15-latin-700.woff2 b/home/public/fonts/outfit-v15-latin-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8674e73594a26b7670d3ba93e42063f39e11c3ee GIT binary patch literal 14060 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 literal 0 HcmV?d00001 diff --git a/home/public/fonts/outfit-v15-latin-regular.woff2 b/home/public/fonts/outfit-v15-latin-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2c401f59f92b53a2d43643a81a4dcb6a35c6947b GIT binary patch literal 14032 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 +} catch (Exception $e) { + // Error Handling + http_response_code(404); + $errorMessage = Config::get('APP_ENV') === 'development' ? $e->getMessage() : 'Page not found or access denied.'; + $errorView = __DIR__ . '/../views/error.php'; + if(file_exists($errorView)) { + require_once $errorView; + } else { + echo "

System Error

" . htmlspecialchars($errorMessage) . "

"; + } +} \ No newline at end of file diff --git a/home/public/js/main.js b/home/public/js/main.js new file mode 100644 index 0000000..fc83d51 --- /dev/null +++ b/home/public/js/main.js @@ -0,0 +1,53 @@ +let clickCount = 0; +let resetTimer = null; +let isNaughtyMode = false; +function triggerGimmick(e) { + const icon = document.getElementById('invader-icon'); + clearTimeout(resetTimer); + // Counter & Mode + clickCount++; + if (clickCount >= 10 && !isNaughtyMode) { + isNaughtyMode = true; + icon.innerText = '🍆'; + } + // Icon Animation + icon.style.transition = 'transform 0.5s ease-out'; + icon.style.transform = `rotate(${Math.random() > 0.5 ? 360 : -360}deg) scale(1.4)`; + setTimeout(() => { + icon.style.transition = 'transform 0.3s ease-in'; + icon.style.transform = 'rotate(0deg) scale(1)'; + }, 500); + // Particle Explosion + for(let i = 0; i < 12; i++) { + let bit = document.createElement('div'); + if (isNaughtyMode) { + bit.innerText = Math.random() > 0.5 ? '' : '💕'; + bit.className = 'fixed pointer-events-none text-2xl z-50 drop-shadow-[0_0_10px_rgba(236,72,153,0.8)]'; + } else { + bit.innerText = Math.random() > 0.5 ? '1' : '0'; + bit.className = 'fixed font-mono text-emerald-500 pointer-events-none text-xl z-50 font-bold drop-shadow-[0_0_8px_rgba(16,185,129,0.8)]'; + } + bit.style.left = e.clientX + 'px'; + bit.style.top = e.clientY + 'px'; + bit.style.transition = 'all 0.8s cubic-bezier(0.1, 0.8, 0.2, 1)'; + document.body.appendChild(bit); + setTimeout(() => { + const angle = Math.random() * Math.PI * 2; + const dist = 60 + Math.random() * 100; + bit.style.transform = `translate(${Math.cos(angle)*dist}px, ${Math.sin(angle)*dist}px) scale(${Math.random() + 0.5})`; + bit.style.opacity = '0'; + }, 10); + setTimeout(() => bit.remove(), 800); + } + // Auto-Reset + resetTimer = setTimeout(() => { + clickCount = 0; + if (isNaughtyMode) { + isNaughtyMode = false; + icon.innerText = '👾'; + icon.style.transition = 'transform 0.3s ease'; + icon.style.transform = 'scale(1.2)'; + setTimeout(() => icon.style.transform = 'scale(1)', 300); + } + }, 5000); +} \ No newline at end of file diff --git a/home/src/input.css b/home/src/input.css new file mode 100644 index 0000000..d6cf66b --- /dev/null +++ b/home/src/input.css @@ -0,0 +1,19 @@ +/* DATEI: ./src/input.css */ +@import "tailwindcss"; + +/* --- FONTS (Pfade korrigiert) --- */ +@font-face { + font-family: 'Outfit'; + font-style: normal; + font-weight: 300 700; + font-display: swap; + src: url('../fonts/outfit-v15-latin-regular.woff2') format('woff2'); +} + +@font-face { + font-family: 'JetBrains Mono'; + font-style: normal; + font-weight: 400 700; + font-display: swap; + src: url('../fonts/jetbrains-mono-v24-latin-regular.woff2') format('woff2'); +} \ No newline at end of file diff --git a/home/views/about.php b/home/views/about.php new file mode 100644 index 0000000..46bf4dd --- /dev/null +++ b/home/views/about.php @@ -0,0 +1,43 @@ + +
+ +
+
+
+
+
+

+ „Als ergebnisorientierter Game-Changer mit einem disruptiven Mindset fokussiere ich mich auf die Maximierung holistischer Synergien im agilen Deep-Dive, um Low-Hanging Fruits in skalierbare Next-Level-Blueprints zu transformieren.“ +

+
+

Merkst du selbst, oder?

+
+

Wenn du jemanden suchst, der dich mit Bullshit-Bingo einlullt, bist du hier falsch.

+
    +
  • Klares Design & durchdachtes Frontend statt „disruptiver Interface-Paradigmen“ oder „User-Experience-Visionen“.
  • +
  • solides Backend, das einfach läuft, statt „hyper-skalierbarer Microservice-Ökosysteme“.
  • +
  • Echte Sichtbarkeit statt „Performance-Driven Reach Orchestration“.
  • +
  • Sinnvolle KI-Integrationen statt „Big-Data-Orchestrierung“ im luftleeren Raum.
  • +
  • Starke Konzepte, die alles zusammenhalten, statt „holistischer Transformations-Roadmaps“.
  • +
+

Ich baue Systeme, die funktionieren, und löse Probleme, anstatt sie hinter Fachbegriffen zu verstecken.

+
+
+
+
+

Willst du wissen, wie ich arbeite, wer ich bin oder welche Musik ich höre?

+ +
+
+
+
+
+
+ \ No newline at end of file diff --git a/home/views/admin/dashboard.php b/home/views/admin/dashboard.php new file mode 100644 index 0000000..e83b344 --- /dev/null +++ b/home/views/admin/dashboard.php @@ -0,0 +1,56 @@ + +
+ +
+
+
+
+
+
philcore-dashboard.sh
+
terminal_session_main
+
+
+
+

> Dashboard_

+

System-Status für

+
+
+
+

> db_connection

+

+ + +

+
+
+

> php_engine

+

v ()

+
+
+

> disk_space

+

+
+
+

> write_permissions

+

+
+
+
+

> [] SYS_LOAD: OPTIMAL

+

> [] ENV_STATUS:

+

> [] Alle Systeme bereit.

+
+
+
+
+ \ No newline at end of file diff --git a/home/views/admin/settings.php b/home/views/admin/settings.php new file mode 100644 index 0000000..d56249b --- /dev/null +++ b/home/views/admin/settings.php @@ -0,0 +1,45 @@ + +
+ +
+
+
+
+
+
philcore-settings.sh
+
+
+
+

> _

+

Systemkonfiguration anpassen.

+
+
+
+

> env_variables

+
+
+ + +
+
+ + +

// Hinweis: Änderungen direkt in der .env vornehmen.

+
+
+
+
+
+
+
+ \ No newline at end of file diff --git a/home/views/admin/user_form.php b/home/views/admin/user_form.php new file mode 100644 index 0000000..eec5160 --- /dev/null +++ b/home/views/admin/user_form.php @@ -0,0 +1,50 @@ + +
+
+

+ > +

+ < Zurück zur Liste +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + class="w-full bg-slate-950/80 border border-slate-700/80 rounded-lg p-3 text-slate-200 text-sm focus:outline-none focus:border-emerald-500/50 transition-colors"> +
+
+ + +
+
+
+ + +

Verzeichnisse im Root für Zugriffsberechtigung.

+
+
+ class="w-4 h-4 accent-emerald-500 bg-slate-900 border-slate-700 rounded"> + +
+
+ +
+
+
+
+ \ No newline at end of file diff --git a/home/views/admin/users.php b/home/views/admin/users.php new file mode 100644 index 0000000..6ae1920 --- /dev/null +++ b/home/views/admin/users.php @@ -0,0 +1,70 @@ + +
+ +
+
+
+ + + +
philcore-users.sh
+
+ + NEW_USER +
+
+
+

> _

+

Registrierte System-Accounts.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDNameEmailRolleProjekteStatusAction
Keine Benutzer gefunden.
#Admin' : 'User' ?> +
+ Edit +
+ + +
+
+
+
+
+
+
+ \ No newline at end of file diff --git a/home/views/error.php b/home/views/error.php new file mode 100644 index 0000000..742cbec --- /dev/null +++ b/home/views/error.php @@ -0,0 +1,27 @@ + +
+
+ 👾 +
+

+ GAME OVER +

+
+
+
+

+ / system_failure_404 +

+

+ > +

+
+
+
+ +
+ \ No newline at end of file diff --git a/home/views/home.php b/home/views/home.php new file mode 100644 index 0000000..8eaa5d4 --- /dev/null +++ b/home/views/home.php @@ -0,0 +1,100 @@ + + +
+
+

+ Philipp Urbschat – Webentwickler für Individualsoftware, Webdesign, SEO, Datenanalyse und KI-Lösungen in Detmold. Fullstack-Entwicklung für Frontend und Backend. + PhilippUrbschat +

+
+
+
+
+
+ 👾 +
+
+
+
+

Developer, Designer, Punkrocker, Problem Solver.

+

Digital with zero Bullshit. Whether it's a thoughtful frontend, a solid backend, hands-on SEO, deep data analysis, smart AI integrations, or a sharp concept tying it all together – I build systems that just work.

+

Active staging ground for raw code experiments and live test environments.

+
+ +
+
+
+ +
+
+
+

Projects

+ Logout +
+

/ access_granted

+
+ +

Keine aktiven Projekte gefunden.

+ + + + + + +
+
+
+ +
+
+

Login

+

/ access_restricted

+
+ + + + +
+
+
+ +
+
+
+

Directory

+ +
+
+ + + Kernel Access + + + Kernel Access (Locked) + +
+
+
+
+
+ + \ No newline at end of file diff --git a/home/views/imprint.php b/home/views/imprint.php new file mode 100644 index 0000000..ed0965a --- /dev/null +++ b/home/views/imprint.php @@ -0,0 +1,34 @@ + +
+
+

+ _Impressum +

+ + < Back to Root + +
+
+
+
+
+

Angaben gemäß § 5 TMG

+

Philipp Urbschat
Leopoldstr. 32
32756 Detmold

+
+
+

Kontakt

+

E-Mail: hi@philippurbschat.de

+
+
+

Haftung für Inhalte

+

Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen.

+
+
+

Urheberrecht

+

Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers.

+
+
+
+
+
+ \ No newline at end of file diff --git a/home/views/inc/admin_footer.php b/home/views/inc/admin_footer.php new file mode 100644 index 0000000..23dec52 --- /dev/null +++ b/home/views/inc/admin_footer.php @@ -0,0 +1,6 @@ + +
+ PHILCORE_SYSTEM_OS [v1.0.4] +
+ + \ No newline at end of file diff --git a/home/views/inc/admin_header.php b/home/views/inc/admin_header.php new file mode 100644 index 0000000..86ef22f --- /dev/null +++ b/home/views/inc/admin_header.php @@ -0,0 +1,25 @@ + + + + + + + Admin | <?= htmlspecialchars(Config::get('APP_NAME', 'PhilCore')) ?> + + + + + + + +
+
+
+ 👾 + / Admin +
+ Home +
+
+ +
\ No newline at end of file diff --git a/home/views/inc/footer.php b/home/views/inc/footer.php new file mode 100644 index 0000000..74249ae --- /dev/null +++ b/home/views/inc/footer.php @@ -0,0 +1,15 @@ +
+
+ © . Made with 🍺 and 🍕. +
+ +
+ + + + + ENV: +
+ + + \ No newline at end of file diff --git a/home/views/inc/header.php b/home/views/inc/header.php new file mode 100644 index 0000000..033307f --- /dev/null +++ b/home/views/inc/header.php @@ -0,0 +1,62 @@ + + + + + + + + <?= htmlspecialchars($pageTitle) ?> + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
\n"; + } + ?> + + +
\ No newline at end of file diff --git a/home/views/privacy.php b/home/views/privacy.php new file mode 100644 index 0000000..114a1f9 --- /dev/null +++ b/home/views/privacy.php @@ -0,0 +1,38 @@ + +
+
+

+ _Datenschutz +

+ + < Back to Root + +
+
+
+
+
+

1. Datenschutz auf einen Blick

+

Die folgenden Hinweise geben einen einfachen Überblick darüber, was mit deinen personenbezogenen Daten passiert, wenn du diese Website besuchst.

+

Verantwortliche Stelle

+

Philipp Urbschat
Leopoldstr. 32
32756 Detmold
E-Mail: hi@philippurbschat.de

+
+
+

2. Datenerfassung auf dieser Website

+

Server-Log-Dateien

+

Der Provider der Seiten erhebt und speichert automatisch Informationen in so genannten Server-Log-Dateien, die dein Browser automatisch an uns übermittelt. Dies sind: Browsertyp/Browserversion, verwendetes Betriebssystem, Referrer URL, Hostname des zugreifenden Rechners, Uhrzeit der Serveranfrage und IP-Adresse.

+

Technisch notwendige Cookies (Session)

+

Diese Website verwendet ausschließlich sogenannte "Session-Cookies". Diese sind kleine Textdateien, die nur für die Dauer deines Besuchs im Speicher deines Browsers abgelegt werden. Sie sind technisch notwendig, um Kernfunktionen wie den internen Login-Bereich oder die Darstellung von Animationen über Seitenwechsel hinweg bereitzustellen. Session-Cookies werden nach dem Schließen des Browsers automatisch gelöscht. Ein Tracking oder eine Analyse deines Nutzerverhaltens findet dadurch nicht statt.

+

Login und Authentifizierung

+

Wenn du den internen Login-Bereich nutzt, speichern wir die von dir eingegebenen Anmeldedaten (E-Mail, Passwort in verschlüsselter Form) zur Bereitstellung der Systemfunktionen und zum Schutz vor unbefugtem Zugriff.

+
+
+

3. Lokale Assets

+

Schriftarten

+

Diese Seite nutzt zur einheitlichen Darstellung von Schriftarten Web Fonts (Outfit, JetBrains Mono), die lokal auf unserem Server bereitgestellt werden. Es findet keine Verbindung zu externen Servern von Drittanbietern statt.

+
+
+
+
+
+ \ No newline at end of file diff --git a/philcore/.htaccess b/philcore/.htaccess new file mode 100644 index 0000000..8123b8a --- /dev/null +++ b/philcore/.htaccess @@ -0,0 +1,13 @@ +Options -Indexes +RewriteEngine On + +# Leitet den Aufruf ohne Pfad direkt in den public-Ordner +RewriteRule ^$ public/index.php [L] + +# GANZ WICHTIG: Stoppt die Umleitung, wenn eine echte Datei (Bilder, CSS) oder ein echter Ordner aufgerufen wird +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d + +# Leitet alle anderen Aufrufe an den Router um +RewriteCond %{REQUEST_URI} !^/public/ +RewriteRule ^(.*)$ public/index.php?url=$1 [L,QSA] \ No newline at end of file diff --git a/philcore/app/controllers/AdminController.php b/philcore/app/controllers/AdminController.php new file mode 100644 index 0000000..9c995b2 --- /dev/null +++ b/philcore/app/controllers/AdminController.php @@ -0,0 +1,36 @@ +view('admin/dashboard', [ + 'title' => 'Admin Dashboard', + 'health' => $report + ]); + } + + // 2. Die Einstellungen + public function settings() { + $this->view('admin/settings', [ + 'title' => 'Einstellungen' + ]); + } + + // 3. Die Benutzerverwaltung + public function users() { + // Erstmal mit Dummy-Daten, bis wir das Model anbinden + $dummyUsers = [ + ['id' => 1, 'name' => 'Admin Phili', 'email' => 'admin@philcore.local', 'status' => 'Active'] + ]; + + $this->view('admin/users', [ + 'title' => 'Benutzerverwaltung', + 'users' => $dummyUsers + ]); + } +} \ No newline at end of file diff --git a/philcore/app/controllers/HomeController.php b/philcore/app/controllers/HomeController.php new file mode 100644 index 0000000..e7ba2db --- /dev/null +++ b/philcore/app/controllers/HomeController.php @@ -0,0 +1,11 @@ + philcore), dann in core +require_once __DIR__ . '/../../core/Controller.php'; + +class HomeController extends Controller { + public function index($name = 'Phili') { + $this->view('home', [ + 'name' => $name + ]); + } +} \ No newline at end of file diff --git a/philcore/app/init.php b/philcore/app/init.php new file mode 100644 index 0000000..ee4e744 --- /dev/null +++ b/philcore/app/init.php @@ -0,0 +1,44 @@ + PHP_VERSION, + 'disk_free' => self::getDiskStatus(), + 'memory' => self::formatBytes(self::getMemoryLimit()), + 'env_status' => self::checkEnvFile(), + 'db_status' => self::checkDatabase(), + 'writable' => self::checkWritableFolders(['public', 'app']) + ]; + } + + private static function getMemoryLimit() { + $limit = ini_get('memory_limit'); + if (preg_match('/^(\d+)(.)$/', $limit, $matches)) { + $val = (int)$matches[1]; + switch (strtoupper($matches[2])) { + case 'G': $val *= 1024 * 1024 * 1024; break; + case 'M': $val *= 1024 * 1024; break; + case 'K': $val *= 1024; break; + } + return $val; + } + return (int)$limit; + } + + private static function formatBytes($bytes, $precision = 2) { + $units = ['B', 'KB', 'MB', 'GB', 'TB']; + $bytes = max($bytes, 0); + $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); + $pow = min($pow, count($units) - 1); + return round($bytes / pow(1024, $pow), $precision) . ' ' . $units[$pow]; + } + + private static function getDiskStatus() { + if (function_exists('disk_free_space') && function_exists('disk_total_space')) { + try { + $free = @disk_free_space("/"); + $total = @disk_total_space("/"); + if ($free !== false && $total > 0) { + return round(($free / $total) * 100) . "% frei"; + } + } catch (Exception $e) {} + } + return "Eingeschränkt (Hosting)"; + } + + private static function checkEnvFile() { + // Springt aus app/services/ zwei Ebenen hoch zum Hauptverzeichnis + return file_exists(__DIR__ . '/../../.env') ? 'Bereit' : 'Fehlt!'; + } + + private static function checkDatabase() { + try { + // Checkt, ob überhaupt ein Name gesetzt ist + if (empty(Config::get('DB_NAME'))) { + return 'Deaktiviert'; + } + + $db = new Database(); + $db->query("SELECT VERSION() as v"); + $res = $db->single(); + return $res['v'] ?? 'Online'; + } catch (Exception $e) { + return 'Offline / Fehler'; + } + } + + private static function checkWritableFolders($folders) { + foreach ($folders as $folder) { + // Geht vom aktuellen Verzeichnis (app/services/) zwei Ebenen hoch + $path = realpath(__DIR__ . '/../../' . $folder); + if (!$path || !is_dir($path)) return "Fehlt: $folder"; + if (!is_writable($path)) return "Rechte: $folder"; + } + return "OK"; + } +} \ No newline at end of file diff --git a/philcore/core/Auth.php b/philcore/core/Auth.php new file mode 100644 index 0000000..0aa0ca0 --- /dev/null +++ b/philcore/core/Auth.php @@ -0,0 +1,25 @@ + true, + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC + ]; + + try { + $this->dbh = new PDO($dsn, $user, $pass, $options); + } catch (PDOException $e) { + $this->error = $e->getMessage(); + // Exception werfen statt sterben! + throw new Exception("Datenbank-Verbindungsfehler."); + } + } + + public function query($sql) { + $this->stmt = $this->dbh->prepare($sql); + } + + public function bind($param, $value, $type = null) { + if (is_null($type)) { + switch (true) { + case is_int($value): $type = PDO::PARAM_INT; break; + case is_bool($value): $type = PDO::PARAM_BOOL; break; + case is_null($value): $type = PDO::PARAM_NULL; break; + default: $type = PDO::PARAM_STR; + } + } + $this->stmt->bindValue($param, $value, $type); + } + + public function execute() { + return $this->stmt->execute(); + } + + public function resultSet() { + $this->execute(); + return $this->stmt->fetchAll(); + } + + public function single() { + $this->execute(); + return $this->stmt->fetch(); + } + + public function rowCount() { + return $this->stmt->rowCount(); + } +} \ No newline at end of file diff --git a/philcore/core/Flash.php b/philcore/core/Flash.php new file mode 100644 index 0000000..3dde680 --- /dev/null +++ b/philcore/core/Flash.php @@ -0,0 +1,26 @@ + $message, + 'type' => $type + ]; + } + + // Nachrichten ausgeben und danach löschen + public static function display() { + if (isset($_SESSION['flash_messages'])) { + foreach ($_SESSION['flash_messages'] as $flash) { + // Farben je nach Typ + $color = $flash['type'] === 'error' ? 'red' : 'emerald'; + + echo "
+ " . htmlspecialchars($flash['message']) . " +
"; + } + // Nach dem Anzeigen direkt aufräumen! + unset($_SESSION['flash_messages']); + } + } +} \ No newline at end of file diff --git a/philcore/core/Router.php b/philcore/core/Router.php new file mode 100644 index 0000000..2050d09 --- /dev/null +++ b/philcore/core/Router.php @@ -0,0 +1,43 @@ +parseUrl(); + + // Absoluter Pfad zu den Controllern (geht von core/ einen Ordner hoch und in app/controllers) + $controllerPath = __DIR__ . '/../app/controllers/'; + + // 1. Controller prüfen (z.B. /user/ -> UserController) + if (isset($url[0]) && file_exists($controllerPath . ucfirst($url[0]) . 'Controller.php')) { + $this->controller = ucfirst($url[0]) . 'Controller'; + unset($url[0]); + } + + require_once $controllerPath . $this->controller . '.php'; + $this->controller = new $this->controller; + + // 2. Methode prüfen (z.B. /user/edit -> Methode edit()) + if (isset($url[1])) { + if (method_exists($this->controller, $url[1])) { + $this->method = $url[1]; + unset($url[1]); + } + } + + // 3. Restliche Parameter sammeln + $this->params = $url ? array_values($url) : []; + + // 4. Controller-Methode mit den Parametern aufrufen + call_user_func_array([$this->controller, $this->method], $this->params); + } + + private function parseUrl() { + if (isset($_GET['url'])) { + return explode('/', filter_var(rtrim($_GET['url'], '/'), FILTER_SANITIZE_URL)); + } + return []; + } +} \ No newline at end of file diff --git a/philcore/core/Security.php b/philcore/core/Security.php new file mode 100644 index 0000000..bdf8548 --- /dev/null +++ b/philcore/core/Security.php @@ -0,0 +1,18 @@ +route(); +} catch (Exception $e) { + // Fehler abfangen und hübsche Error-View laden + http_response_code(404); + + // In Produktion zeigen wir keine genauen Fehlermeldungen an + $errorMessage = Config::get('APP_ENV') === 'development' ? $e->getMessage() : 'Seite nicht gefunden oder Zugriff verweigert.'; + + $errorView = __DIR__ . '/../views/error.php'; + if(file_exists($errorView)) { + require_once $errorView; + } else { + echo "

Systemfehler

" . htmlspecialchars($errorMessage) . "

"; + } +} \ No newline at end of file diff --git a/philcore/readme.md b/philcore/readme.md new file mode 100644 index 0000000..1d02ba0 --- /dev/null +++ b/philcore/readme.md @@ -0,0 +1,27 @@ +# 🍕 PhilCore MVC + +Ein leichtgewichtiges, schnelles und sicheres PHP MVC-Grundgerüst für neue Projekte. C&P ready! + +## 🚀 Features +* **Routing:** Automatisches URL-Routing (`/controller/method/params`). +* **Datenbank:** Sichere PDO-Klasse mit Prepared Statements (optional nutzbar). +* **Sicherheit:** Integrierter CSRF-Schutz & globale `.env`-Konfiguration. +* **Autoloader:** Kein nerviges `require_once` mehr für Klassen. +* **Admin-Dashboard:** Integrierter `HealthService` für System-Checks. + +## 🛠 Installation + +1. **Dateien kopieren:** Lade das komplette Projektverzeichnis auf deinen Server oder in deine lokale Entwicklungsumgebung. +2. **Umgebungsvariablen:** Kopiere die `.env.example`, benenne sie in `.env` um und trage deine Daten ein (Base-URL, DB-Credentials etc.). +3. **Routing aktivieren:** Stelle sicher, dass `mod_rewrite` auf deinem Apache-Server aktiv ist. Die `.htaccess`-Dateien leiten alle Anfragen auf `public/index.php` um. +4. **(Optional) DocumentRoot:** Für maximale Sicherheit beim Hosting das Web-Stammverzeichnis direkt auf den Ordner `/public` legen. + +## 📂 Struktur +* `/app`: Deine Anwendungslogik (Controllers, Models, Services). +* `/core`: Das Herzstück (Router, Database, Config, Auth, Security). +* `/public`: Der Einstiegspunkt (`index.php`) und statische Assets. +* `/views`: Deine HTML/PHP-Templates (TailwindCSS vorbereitet). + +## 💡 Nutzung +Neue Seiten erstellst du einfach durch neue Controller in `/app/controllers/`. +Eine Methode `profile()` im `UserController.php` ist direkt über `deinedomain.de/user/profile` aufrufbar. \ No newline at end of file diff --git a/philcore/views/admin/dashboard.php b/philcore/views/admin/dashboard.php new file mode 100644 index 0000000..b7d4082 --- /dev/null +++ b/philcore/views/admin/dashboard.php @@ -0,0 +1,87 @@ + + +
+ + + +
+
+
+
+
+
philcore-dashboard.sh
+
terminal_session_main
+
+ +
+
+

+ > Dashboard_ +

+

System-Status für

+
+ +
+ +
+

> db_connection

+

+ + +

+
+ +
+

> php_engine

+

+ v () +

+
+ +
+

> disk_space

+

+ +

+
+ +
+

> write_permissions

+

+ +

+
+ +
+ +
+

> [] SYS_LOAD: OPTIMAL

+

> [] ENV_STATUS:

+

> [] Alle Systeme bereit.

+
+
+
+
+ + \ No newline at end of file diff --git a/philcore/views/admin/settings.php b/philcore/views/admin/settings.php new file mode 100644 index 0000000..bb9e927 --- /dev/null +++ b/philcore/views/admin/settings.php @@ -0,0 +1,66 @@ + + +
+ + + +
+
+
+
+
+
philcore-settings.sh
+
+ +
+
+

+ > _ +

+

Systemkonfiguration anpassen.

+
+ +
+
+

> env_variables

+ +
+
+ + +
+ +
+ + +

+ // Hinweis: Änderungen direkt in der .env vornehmen. +

+
+
+
+
+
+
+
+ + \ No newline at end of file diff --git a/philcore/views/admin/users.php b/philcore/views/admin/users.php new file mode 100644 index 0000000..b0ee14e --- /dev/null +++ b/philcore/views/admin/users.php @@ -0,0 +1,66 @@ + + +
+ + + +
+
+
+
+
+
philcore-users.sh
+
+ +
+
+

+ > _ +

+

Registrierte System-Accounts.

+
+ +
+ + + + + + + + + + + + + + + + + + + +
IDNameEmailStatus
#
+
+
+
+
+ + \ No newline at end of file diff --git a/philcore/views/error.php b/philcore/views/error.php new file mode 100644 index 0000000..b98ef4e --- /dev/null +++ b/philcore/views/error.php @@ -0,0 +1,26 @@ + + +
+
+ 🍕 +
+ +

+ Fehler 404 +

+ +
+

+ > +

+
+ + +
+ + \ No newline at end of file diff --git a/philcore/views/home.php b/philcore/views/home.php new file mode 100644 index 0000000..e59a89f --- /dev/null +++ b/philcore/views/home.php @@ -0,0 +1,24 @@ + + +
+
+ 🍕 +
+ +

+ Hallo, . +

+ +

+ Das Fundament steht. Zeit, etwas Großartiges zu bauen. +

+ + +
+ + \ No newline at end of file diff --git a/philcore/views/inc/admin_footer.php b/philcore/views/inc/admin_footer.php new file mode 100644 index 0000000..d0b4f4f --- /dev/null +++ b/philcore/views/inc/admin_footer.php @@ -0,0 +1,6 @@ +
+
+ PHILCORE_SYSTEM_OS [v1.0.4] +
+ + \ No newline at end of file diff --git a/philcore/views/inc/admin_header.php b/philcore/views/inc/admin_header.php new file mode 100644 index 0000000..02e737e --- /dev/null +++ b/philcore/views/inc/admin_header.php @@ -0,0 +1,28 @@ + + + + + + Admin | <?= htmlspecialchars(Config::get('APP_NAME', 'PhilCore')) ?> + + + + + +
+
+
+ 🍕 + / Admin +
+ Home +
+
+ +
\ No newline at end of file diff --git a/philcore/views/inc/footer.php b/philcore/views/inc/footer.php new file mode 100644 index 0000000..0b65304 --- /dev/null +++ b/philcore/views/inc/footer.php @@ -0,0 +1,16 @@ +
+
+ © . Made with ❤️ and Pizza. +
+ + +
+ + + + + ENV: +
+ + + \ No newline at end of file diff --git a/philcore/views/inc/header.php b/philcore/views/inc/header.php new file mode 100644 index 0000000..cc84f0d --- /dev/null +++ b/philcore/views/inc/header.php @@ -0,0 +1,29 @@ + + + + + + <?= htmlspecialchars(Config::get('APP_NAME', 'PhilCore')) ?> + + + + + +
+
+
+ 🍕 +
+ +
+
+ +
\ No newline at end of file diff --git a/plants/.env.example b/plants/.env.example new file mode 100644 index 0000000..810d64f --- /dev/null +++ b/plants/.env.example @@ -0,0 +1,2 @@ +DB_PASSWORD="your_db_password_here" +GEMINI_API_KEY="your_gemini_api_key_here" diff --git a/plants/.gitignore b/plants/.gitignore new file mode 100644 index 0000000..2eea525 --- /dev/null +++ b/plants/.gitignore @@ -0,0 +1 @@ +.env \ No newline at end of file diff --git a/plants/api.js b/plants/api.js new file mode 100644 index 0000000..ed5fc9a --- /dev/null +++ b/plants/api.js @@ -0,0 +1,173 @@ +// Version: 01.10.2025 11:45 (FINAL FIX) +const API_URL = 'api.php'; + +// --- Hilfsfunktion für Fehlerbehandlung --- +async function handleResponse(response) { + if (!response.ok) { + const errorData = await response.json().catch(() => ({ error: 'Unbekannter API-Fehler' })); + throw new Error(errorData.error || `HTTP-Fehler! Status: ${response.status}`); + } + return response.json(); +} + +// --- Nutzer-Funktionen --- +export async function getUserSettings() { + const response = await fetch(`${API_URL}?action=get_user_settings`); + return handleResponse(response); +} + +export async function updateUserSettings(settings) { + const response = await fetch(API_URL, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ request_type: 'update_user_settings', settings: settings }), + }); + return handleResponse(response); +} + +// --- Lexikon-Funktionen --- +export async function getLexiconEntries() { + const response = await fetch(`${API_URL}?action=get_lexicon_entries`); + return handleResponse(response); +} + +export async function getLexiconEntryDetails(latinName) { + const response = await fetch(`${API_URL}?action=get_lexicon_entry_details&latin_name=${encodeURIComponent(latinName)}`); + return handleResponse(response); +} + + +// --- Pflanzen-Funktionen --- +export async function getPlants() { + const response = await fetch(`${API_URL}?action=get_plants`); + return handleResponse(response); +} + +export async function savePlant(formData) { + const response = await fetch(API_URL, { method: 'POST', body: formData }); + return handleResponse(response); +} + +export async function deletePlant(plantId) { + const response = await fetch(`${API_URL}?id=${plantId}`, { method: 'DELETE' }); + return handleResponse(response); +} + +export async function recordCareAction(plantId, action) { + const response = await fetch(API_URL, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ request_type: 'care_action', id: plantId, action }), + }); + return handleResponse(response); +} + +export async function setProfilePicture(plantId, photoPath) { + const response = await fetch(API_URL, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ request_type: 'set_profile_picture', plant_id: plantId, photo_path: photoPath }), + }); + return handleResponse(response); +} + +// --- Tagebuch-Funktionen --- +export async function getDiaryEntries(plantId) { + const response = await fetch(`${API_URL}?action=get_diary&plant_id=${plantId}`); + return handleResponse(response); +} + +export async function addDiaryEntry(formData) { + formData.append('action', 'add_diary_entry'); + const response = await fetch(API_URL, { method: 'POST', body: formData }); + return handleResponse(response); +} + +export async function deleteDiaryEntry(entryId) { + const response = await fetch(`${API_URL}?diary_entry_id=${entryId}`, { method: 'DELETE' }); + return handleResponse(response); +} + +// --- KI-Funktionen --- + +// Schritt 1: Identifikation & Foto-Analyse +export async function performInitialAnalysis(base64Image, excludedLatinNames = []) { + let prompt = ` + Du bist ein Botaniker und Foto-Analyst. Führe ZWEI Aufgaben aus und gib das Ergebnis als EINEN einzigen, sauberen JSON-String zurück. Das JSON-Objekt muss zwei Hauptschlüssel haben: "identification" und "photo_analysis". + + 1. **Im "identification"-Objekt:** Identifiziere die Pflanze. + - "name": Der gebräuchlichste Name, so wie er im deutschen Einzelhandel genutzt wird. + - "latin_name": Der korrekte, zweiteilige botanische Name. + - "confidence_score": Bewerte deine Sicherheit KRITISCH (0-100). + - "identification_notes": Kurze Notiz zur Identifizierung. + - REGEL: Falls dein confidence_score < 75 ist, setze alle Werte auf "Unbekannt" oder 0. + + 2. **Im "photo_analysis"-Objekt:** Analysiere die Fotoqualität. + - "photo_quality_score" (integer): Bewerte die Qualität KRITISCH (0-100). + - "is_high_quality" (boolean): true, wenn photo_quality_score > 70 ist. + - "rejection_reason" (string): Kurzer Grund, falls is_high_quality false ist, sonst null. + - "photo_type" (string): 'whole_plant', 'leaf_detail', 'flower_detail', oder 'other'. + - "focal_point" (object): Ein Objekt mit "x"- und "y"-Koordinaten (Prozent von 0-100) des visuellen Mittelpunkts. + - "dominant_color_hex" (string): Der dominante Farbton des Hauptmotivs als HEX-Code. + `; + if (excludedLatinNames.length > 0) { + prompt += ` Ignoriere dabei diese falschen Vorschläge: ${excludedLatinNames.join(', ')}.`; + } + const payload = { + request_type: 'ai_identification', + payload: { "contents": [{ "parts": [ { "text": prompt }, { "inline_data": { "mime_type": "image/jpeg", "data": base64Image } } ] }] } + }; + const response = await fetch(API_URL, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(payload) + }); + const result = await handleResponse(response); + const resultText = result.candidates[0].content.parts[0].text; + return JSON.parse(resultText.replace(/```json|```/g, '').trim()); +} + +// Schritt 2: Detaillierte Anreicherung +export async function aiEnrich(latinName) { + const prompt = ` + Du bist ein Botanik-Experte. Gib detaillierte Pflegedaten für "${latinName}" als sauberen JSON-String zurück. + + ANWEISUNGEN FÜR DEN INHALT: + - Für "description_full": Erstelle einen ausführlichen, enzyklopädischen Text. **Verwende KEINE einleitenden Grußformeln, Willkommenssätze oder persönlichen Anreden wie "Du"**. Gliedere den Text in Abschnitte mit Titeln (z.B. 'Standort & Licht:') und spreche den Leser neutral an (z.B. "Diese Pflanze benötigt..."). Die Titel dürfen KEIN Markdown enthalten. + - Für "care_tips": Erstelle genau drei kurze, prägnante Tipps aus der Ich-Perspektive der Pflanze. + - Für "tags": Gib 3-5 passende Schlagwörter als kommaseparierten String an (z.B. "Anfängerfreundlich, Haustier-sicher, Buntblatt"). + + Das JSON-Objekt MUSS die folgenden Schlüssel enthalten, auch wenn der Wert null ist: "plant_family", "plant_genus", "description_full", "watering_interval_days", "fertilizing_interval_days", "care_tips", "light_requirement", "water_requirement", "humidity_requirement", "care_difficulty", "growth_habit", "mature_size", "toxicity", "edibility", "temperature_preference", "flowering_period", "substrate_recommendation", "native_to", "tags". + + WICHTIGE REGELN FÜR KATEGORIEN: + - Für "substrate_recommendation": Wähle einen oder MEHRERE passende Werte aus der Liste und gib sie als kommaseparierten String zurück: 'Universal-Erde', 'Sukkulenten/Kakteen-Erde', 'Anzucht-Erde', 'Kräuter-Erde', 'Saurer Boden (Moorbeet-Erde)', 'Orchideen-Substrat', 'Hydrokultur/Pon', 'Erde-frei (Aroid-Mix)'. + - Für die folgenden Felder, wähle EXAKT EINEN der angegebenen Werte in Kleinbuchstaben: + - "light_requirement": 'wenig', 'mittel', 'viel'. + - "water_requirement": 'niedrig', 'mittel', 'hoch'. + - "humidity_requirement": 'normal', 'erhöht'. + - "care_difficulty": 'einfach', 'mittel', 'schwer'. + - "growth_habit": 'kletternd', 'hängend', 'aufrecht', 'buschig', 'rosette'. + - "mature_size": 'klein', 'mittel', 'groß'. + - "toxicity": 'ungiftig', 'leicht giftig', 'giftig'. + - "edibility": 'essbar', 'nicht essbar', 'zierfrüchte'. + - "temperature_preference": 'zimmerwarm', 'kühl', 'winterhart'. + - "flowering_period": 'frühling', 'sommer', 'herbst', 'winter', 'ganzjährig', 'selten', oder null. + + FORMATIERUNGSREGELN für "care_tips": + 1. Jeder Tipp MUSS mit einem passenden Emoji und einem Titel beginnen (z.B. "☀️ Licht:"). + 2. Zwischen den Tipps MUSS sich ein doppelter Zeilenumbruch (\\n\\n) befinden.`; + + const payload = { + request_type: 'ai_enrichment', + payload: { "contents": [{ "parts": [ { "text": prompt } ] }] } + }; + const response = await fetch(API_URL, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(payload) + }); + const result = await handleResponse(response); + const resultText = result.candidates[0].content.parts[0].text; + return JSON.parse(resultText.replace(/```json|```/g, '').trim()); +} + diff --git a/plants/api.php b/plants/api.php new file mode 100644 index 0000000..0b8bf8e --- /dev/null +++ b/plants/api.php @@ -0,0 +1,358 @@ +load(); + +if (!isset($_SESSION['user_id'])) { + http_response_code(401); + echo json_encode(['error' => 'Benutzer nicht authentifiziert.']); + exit; +} +$currentUserId = $_SESSION['user_id']; + +// === HELPER FUNCTIONS === +function callGeminiAPI(array $payload, string $apiKey): array { + $googleApiUrl = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent'; + $fullApiUrl = $googleApiUrl . '?key=' . $apiKey; + $ch = curl_init(); + curl_setopt_array($ch, [ + CURLOPT_URL => $fullApiUrl, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => json_encode($payload), + CURLOPT_HTTPHEADER => ['Content-Type: application/json'], + CURLOPT_TIMEOUT => 90, + ]); + $response_body = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + if (curl_errno($ch) || $http_code >= 400) { + $error_message = curl_errno($ch) ? curl_error($ch) : 'KI-API-Fehler mit Status ' . $http_code . ' - ' . $response_body; + curl_close($ch); + throw new Exception('Fehler bei der Kommunikation mit der KI: ' . $error_message); + } + curl_close($ch); + return json_decode($response_body, true); +} + +function processUploadedPhoto(array $fileInfo, int $targetWidth = 800): ?string { + if ($fileInfo['error'] !== UPLOAD_ERR_OK) return null; + $allowedMimeTypes = ['image/jpeg', 'image/png', 'image/webp']; + if (!in_array(mime_content_type($fileInfo['tmp_name']), $allowedMimeTypes) || $fileInfo['size'] > (10 * 1024 * 1024)) return null; + $uploadDir = 'uploads/'; + if (!is_dir($uploadDir)) mkdir($uploadDir, 0755, true); + $fileName = uniqid() . '-' . pathinfo($fileInfo['name'], PATHINFO_FILENAME) . '.webp'; + $targetFilePath = $uploadDir . $fileName; + $sourceImage = null; + switch (exif_imagetype($fileInfo['tmp_name'])) { + case IMAGETYPE_JPEG: $sourceImage = imagecreatefromjpeg($fileInfo['tmp_name']); break; + case IMAGETYPE_PNG: $sourceImage = imagecreatefrompng($fileInfo['tmp_name']); break; + case IMAGETYPE_WEBP: $sourceImage = imagecreatefromwebp($fileInfo['tmp_name']); break; + } + if (!$sourceImage) return null; + $resizedImage = (imagesx($sourceImage) > $targetWidth) ? imagescale($sourceImage, $targetWidth) : $sourceImage; + imagewebp($resizedImage, $targetFilePath, 85); + imagedestroy($sourceImage); + if ($resizedImage !== $sourceImage) imagedestroy($resizedImage); + return $targetFilePath; +} + +function getPlantWithDueDates($pdo, $plantId, $userId) { + $stmt = $pdo->prepare("SELECT p.id, p.name, p.latin_name, p.photo, p.last_watered, p.last_fertilized, p.watering_interval_days, p.fertilizing_interval_days, p.care_tips FROM plants p WHERE p.id = ? AND p.user_id = ?"); + $stmt->execute([$plantId, $userId]); + $plant = $stmt->fetch(PDO::FETCH_ASSOC); + if ($plant) { + $plant['watering_interval'] = $plant['watering_interval_days']; + $plant['fertilizing_interval'] = $plant['fertilizing_interval_days']; + $isValidDate = fn($dateStr) => !empty($dateStr) && $dateStr !== '0000-00-00'; + if ((int)$plant['watering_interval'] > 0 && $isValidDate($plant['last_watered'])) { + $plant['next_watering_due'] = (new DateTime($plant['last_watered']))->add(new DateInterval('P' . $plant['watering_interval'] . 'D'))->format('Y-m-d'); + } else { $plant['next_watering_due'] = null; } + if ((int)$plant['fertilizing_interval'] > 0 && $isValidDate($plant['last_fertilized'])) { + $plant['next_fertilizing_due'] = (new DateTime($plant['last_fertilized']))->add(new DateInterval('P' . $plant['fertilizing_interval'] . 'D'))->format('Y-m-d'); + } else { $plant['next_fertilizing_due'] = null; } + } + return $plant; +} + +// === CREDIT MANAGEMENT === +try { + $stmt = $pdo->prepare("SELECT ai_credits_last_reset FROM users WHERE id = ?"); + $stmt->execute([$currentUserId]); + $lastReset = $stmt->fetchColumn(); + $now = new DateTime(); + if ($lastReset === null || (new DateTime($lastReset))->format('Y-m') < $now->format('Y-m')) { + $stmt = $pdo->prepare("UPDATE users SET ai_credits = 100, ai_credits_last_reset = NOW() WHERE id = ?"); + $stmt->execute([$currentUserId]); + } +} catch (Exception $e) { /* non-blocking */ } + +// === API ROUTING === +$method = $_SERVER['REQUEST_METHOD']; +$json_data = json_decode(file_get_contents('php://input'), true); +header('Content-Type: application/json'); + +try { + // --- Handle JSON-based POST requests FIRST --- + if ($method === 'POST' && !empty($json_data)) { + $request_type = $json_data['request_type'] ?? ''; + switch ($request_type) { + case 'ai_identification': + case 'ai_enrichment': + $pdo->beginTransaction(); + $stmt = $pdo->prepare("UPDATE users SET ai_credits = ai_credits - 1 WHERE id = ? AND ai_credits >= 1"); + $stmt->execute([$currentUserId]); + if ($stmt->rowCount() === 0) throw new Exception('Nicht genügend KI-Credits (1 benötigt).', 402); + $response_data = callGeminiAPI($json_data['payload'], $_ENV['GEMINI_API_KEY']); + $pdo->commit(); + echo json_encode($response_data); + break; + case 'update_user_settings': + $settings = $json_data['settings'] ?? []; + $allowedKeys = ['theme', 'allow_photo_sharing', 'auto_fill_watering', 'auto_fill_fertilizing', 'auto_fill_care_tips']; + $sqlParts = []; $params = []; + foreach ($settings as $key => $value) { + if (in_array($key, $allowedKeys)) { + $sqlParts[] = "$key = ?"; + $params[] = is_bool($value) ? (int)$value : $value; + } + } + if (empty($sqlParts)) throw new Exception('Keine gültigen Einstellungsfelder.', 400); + $params[] = $currentUserId; + $stmt = $pdo->prepare("UPDATE users SET " . implode(', ', $sqlParts) . " WHERE id = ?"); + $stmt->execute($params); + echo json_encode(['success' => true]); + break; + case 'care_action': + $plantId = $json_data['id']; + $column = ($json_data['action'] === 'water') ? 'last_watered' : 'last_fertilized'; + $entryType = ($json_data['action'] === 'water') ? 'watered' : 'fertilized'; + $pdo->beginTransaction(); + $stmt = $pdo->prepare("UPDATE plants SET $column = CURDATE() WHERE id = ? AND user_id = ?"); + $stmt->execute([$plantId, $currentUserId]); + $stmt = $pdo->prepare("INSERT INTO plant_diary (plant_id, user_id, entry_type) VALUES (?, ?, ?)"); + $stmt->execute([$plantId, $currentUserId, $entryType]); + $pdo->commit(); + echo json_encode(['success' => true, 'plant' => getPlantWithDueDates($pdo, $plantId, $currentUserId)]); + break; + case 'set_profile_picture': + $stmt = $pdo->prepare("UPDATE users SET profile_image = ? WHERE id = ?"); + $stmt->execute([$json_data['photo_path'], $currentUserId]); + echo json_encode(['success' => true, 'new_image' => $json_data['photo_path']]); + break; + default: + throw new Exception('Unbekannter JSON-Request-Typ.', 400); + } + exit; + } + + // --- Handle GET, DELETE, and multipart/form-data POST requests --- + switch ($method) { + case 'GET': + $action = $_GET['action'] ?? 'get_plants'; + switch ($action) { + case 'get_plants': + $stmt = $pdo->prepare("SELECT id FROM plants WHERE user_id = ? ORDER BY id DESC"); + $stmt->execute([$currentUserId]); + $plant_ids = $stmt->fetchAll(PDO::FETCH_COLUMN); + echo json_encode(array_map(fn($id) => getPlantWithDueDates($pdo, $id, $currentUserId), $plant_ids)); + break; + case 'get_diary': + $stmt = $pdo->prepare("SELECT * FROM plant_diary WHERE plant_id = ? AND user_id = ? ORDER BY entry_date DESC"); + $stmt->execute([$_GET['plant_id'], $currentUserId]); + echo json_encode($stmt->fetchAll()); + break; + case 'get_user_settings': + $stmt = $pdo->prepare("SELECT username, email, profile_image, theme, allow_photo_sharing, ai_credits, auto_fill_watering, auto_fill_fertilizing, auto_fill_care_tips FROM users WHERE id = ?"); + $stmt->execute([$currentUserId]); + $userSettings = $stmt->fetch(); + $stmt_count = $pdo->prepare("SELECT COUNT(id) as plant_count FROM plants WHERE user_id = ?"); + $stmt_count->execute([$currentUserId]); + $userSettings['plant_count'] = $stmt_count->fetchColumn(); + echo json_encode($userSettings); + break; + case 'get_lexicon_entries': + $stmt = $pdo->prepare("SELECT pl.name, pl.latin_name, lp.photo_path as photo_url FROM plant_lexicon pl LEFT JOIN (SELECT plant_latin_name, photo_path, ROW_NUMBER() OVER(PARTITION BY plant_latin_name ORDER BY ai_photo_quality_score DESC, id DESC) as rn FROM lexicon_photos WHERE status = 'approved') lp ON pl.latin_name = lp.plant_latin_name AND lp.rn = 1 WHERE pl.entry_count > 0 ORDER BY pl.name ASC"); + $stmt->execute(); + echo json_encode($stmt->fetchAll()); + break; + case 'get_lexicon_entry_details': + $latinName = $_GET['latin_name'] ?? ''; + if (empty($latinName)) throw new Exception('Kein botanischer Name angegeben.', 400); + $stmt = $pdo->prepare("SELECT * FROM plant_lexicon WHERE latin_name = ?"); + $stmt->execute([$latinName]); + $plantDetails = $stmt->fetch(); + if (!$plantDetails) throw new Exception('Pflanze nicht im Lexikon gefunden.', 404); + $stmtPhotos = $pdo->prepare("SELECT photo_path FROM lexicon_photos WHERE plant_latin_name = ? AND status = 'approved' ORDER BY ai_photo_quality_score DESC, id DESC LIMIT 10"); + $stmtPhotos->execute([$latinName]); + $plantDetails['photo_gallery'] = $stmtPhotos->fetchAll(PDO::FETCH_COLUMN); + echo json_encode($plantDetails); + break; + default: + throw new Exception('Ungültige GET-Aktion.', 400); + } + break; + + case 'POST': + $action = $_POST['action'] ?? 'save_plant'; + switch ($action) { + case 'add_diary_entry': + $photoPath = isset($_FILES['photo']) ? processUploadedPhoto($_FILES['photo'], 600) : null; + $stmt = $pdo->prepare("INSERT INTO plant_diary (plant_id, user_id, notes, photo, entry_type) VALUES (?, ?, ?, ?, ?)"); + $stmt->execute([$_POST['plant_id'], $currentUserId, $_POST['notes'] ?? null, $photoPath, isset($_POST['is_milestone']) ? 'milestone' : 'manual']); + $newEntryId = $pdo->lastInsertId(); + $stmt = $pdo->prepare("SELECT * FROM plant_diary WHERE id = ?"); + $stmt->execute([$newEntryId]); + echo json_encode(['success' => true, 'entry' => $stmt->fetch()]); + break; + case 'save_plant': + $name = trim($_POST['name'] ?? ''); + if (empty($name)) throw new Exception('Der Name der Pflanze darf nicht leer sein.', 400); + + $plantId = $_POST['id'] ?? null; + $latinName = trim($_POST['latin_name'] ?? '') ?: null; + $photoPath = isset($_FILES['photo']) ? processUploadedPhoto($_FILES['photo']) : null; + $finalPhotoPath = $photoPath ?? $_POST['current_photo'] ?? null; + + // ROBUSTE PRÜFUNG DER INTERVALLE + $wateringInterval = (isset($_POST['watering_interval']) && is_numeric($_POST['watering_interval'])) ? (int)$_POST['watering_interval'] : null; + $fertilizingInterval = (isset($_POST['fertilizing_interval']) && is_numeric($_POST['fertilizing_interval'])) ? (int)$_POST['fertilizing_interval'] : null; + + $careTips = trim($_POST['care_tips'] ?? '') ?: null; + + $pdo->beginTransaction(); + + $oldLatinName = null; + if ($plantId) { // Edit + $stmtOld = $pdo->prepare("SELECT latin_name FROM plants WHERE id = ? AND user_id = ?"); + $stmtOld->execute([$plantId, $currentUserId]); + $oldLatinName = $stmtOld->fetchColumn(); + + $stmt = $pdo->prepare("UPDATE plants SET name = ?, latin_name = ?, photo = ?, watering_interval_days = ?, fertilizing_interval_days = ?, care_tips = ? WHERE id = ? AND user_id = ?"); + $stmt->execute([$name, $latinName, $finalPhotoPath, $wateringInterval, $fertilizingInterval, $careTips, $plantId, $currentUserId]); + } else { // Add + $stmt = $pdo->prepare("INSERT INTO plants (user_id, name, latin_name, photo, last_watered, last_fertilized, watering_interval_days, fertilizing_interval_days, care_tips) VALUES (?, ?, ?, ?, CURDATE(), CURDATE(), ?, ?, ?)"); + $stmt->execute([$currentUserId, $name, $latinName, $finalPhotoPath, $wateringInterval, $fertilizingInterval, $careTips]); + $plantId = $pdo->lastInsertId(); + $stmt = $pdo->prepare("INSERT INTO plant_diary (plant_id, user_id, entry_type, notes) VALUES (?, ?, 'milestone', 'Pflanze hinzugefügt')"); + $stmt->execute([$plantId, $currentUserId]); + } + + // Handle lexicon entry count changes + if ($oldLatinName && $oldLatinName !== $latinName) { + $stmtDec = $pdo->prepare("UPDATE plant_lexicon SET entry_count = entry_count - 1 WHERE latin_name = ? AND entry_count > 0"); + $stmtDec->execute([$oldLatinName]); + } + if ($latinName && (!$oldLatinName || $oldLatinName !== $latinName)) { + $stmt = $pdo->prepare("INSERT INTO plant_lexicon (latin_name, name) VALUES (?, ?) ON DUPLICATE KEY UPDATE entry_count = entry_count + 1, name = VALUES(name)"); + $stmt->execute([$latinName, $name]); + } + + // Process AI data for lexicon if available + $enrichmentData = json_decode($_POST['ai_enrichment_json'] ?? '{}', true); + + if(!empty($enrichmentData)) { + $stmt = $pdo->prepare("UPDATE plant_lexicon SET plant_family = :plant_family, plant_genus = :plant_genus, description_full = :description_full, care_tips = :care_tips, watering_interval_days = :watering_interval_days, fertilizing_interval_days = :fertilizing_interval_days, light_requirement = :light_requirement, water_requirement = :water_requirement, humidity_requirement = :humidity_requirement, care_difficulty = :care_difficulty, growth_habit = :growth_habit, mature_size = :mature_size, toxicity = :toxicity, edibility = :edibility, temperature_preference = :temperature_preference, flowering_period = :flowering_period, substrate_recommendation = :substrate_recommendation, native_to = :native_to, tags = :tags, updated_at = NOW() WHERE latin_name = :latin_name AND description_full IS NULL"); + $stmt->execute([ + 'plant_family' => $enrichmentData['plant_family'] ?? null, + 'plant_genus' => $enrichmentData['plant_genus'] ?? null, + 'description_full' => $enrichmentData['description_full'] ?? null, + 'care_tips' => $enrichmentData['care_tips'] ?? null, + 'watering_interval_days' => $enrichmentData['watering_interval_days'] ?? null, + 'fertilizing_interval_days' => $enrichmentData['fertilizing_interval_days'] ?? null, + 'light_requirement' => $enrichmentData['light_requirement'] ?? null, + 'water_requirement' => $enrichmentData['water_requirement'] ?? null, + 'humidity_requirement' => $enrichmentData['humidity_requirement'] ?? null, + 'care_difficulty' => $enrichmentData['care_difficulty'] ?? null, + 'growth_habit' => $enrichmentData['growth_habit'] ?? null, + 'mature_size' => $enrichmentData['mature_size'] ?? null, + 'toxicity' => $enrichmentData['toxicity'] ?? null, + 'edibility' => $enrichmentData['edibility'] ?? null, + 'temperature_preference' => $enrichmentData['temperature_preference'] ?? null, + 'flowering_period' => $enrichmentData['flowering_period'] ?? null, + 'substrate_recommendation' => $enrichmentData['substrate_recommendation'] ?? null, + 'native_to' => $enrichmentData['native_to'] ?? null, + 'tags' => $enrichmentData['tags'] ?? null, + 'latin_name' => $latinName + ]); + } + + // Process photo for lexicon if allowed and available + $fullAiResponse = json_decode($_POST['ai_full_response_json'] ?? '{}', true); + $stmtAllow = $pdo->prepare("SELECT allow_photo_sharing FROM users WHERE id = ?"); + $stmtAllow->execute([$currentUserId]); + if ($stmtAllow->fetchColumn() && $finalPhotoPath && $photoPath && !empty($fullAiResponse['photo_analysis'])) { + $photoData = $fullAiResponse['photo_analysis']; + $isHighQuality = $photoData['is_high_quality'] ?? false; + + $stmt = $pdo->prepare("INSERT INTO lexicon_photos (user_id, plant_latin_name, photo_path, status, rejection_reason, ai_confidence, photo_type, focal_point_x, focal_point_y, dominant_color_hex, ai_photo_quality_score) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + $stmt->execute([ + $currentUserId, + $latinName, + $finalPhotoPath, + ($isHighQuality ? 'approved' : 'rejected'), + $photoData['rejection_reason'] ?? null, + $fullAiResponse['identification']['confidence_score'] ?? null, + $photoData['photo_type'] ?? null, + $photoData['focal_point']['x'] ?? null, + $photoData['focal_point']['y'] ?? null, + $photoData['dominant_color_hex'] ?? null, + $photoData['photo_quality_score'] ?? null + ]); + } + + $pdo->commit(); + echo json_encode(['success' => true, 'plant' => getPlantWithDueDates($pdo, $plantId, $currentUserId)]); + break; + default: + throw new Exception('Ungültige Formular-Aktion.', 400); + } + break; + + case 'DELETE': + $plantId = $_GET['id'] ?? null; + if ($plantId) { + $pdo->beginTransaction(); + + $stmtLatin = $pdo->prepare("SELECT latin_name FROM plants WHERE id = ? AND user_id = ?"); + $stmtLatin->execute([$plantId, $currentUserId]); + $latinNameToDecrement = $stmtLatin->fetchColumn(); + + $stmt = $pdo->prepare("DELETE FROM plants WHERE id = ? AND user_id = ?"); + $stmt->execute([$plantId, $currentUserId]); + + if ($latinNameToDecrement) { + $stmtDec = $pdo->prepare("UPDATE plant_lexicon SET entry_count = entry_count - 1 WHERE latin_name = ? AND entry_count > 0"); + $stmtDec->execute([$latinNameToDecrement]); + } + + $pdo->commit(); + echo json_encode(['success' => true]); + } else if (isset($_GET['diary_entry_id'])) { + $entryId = $_GET['diary_entry_id']; + $stmt = $pdo->prepare("DELETE FROM plant_diary WHERE id = ? AND user_id = ?"); + $stmt->execute([$entryId, $currentUserId]); + echo json_encode(['success' => $stmt->rowCount() > 0]); + } + else { + throw new Exception('Keine ID zum Löschen angegeben.', 400); + } + break; + + default: + throw new Exception('Methode nicht erlaubt.', 405); + } +} catch (Exception $e) { + if ($pdo->inTransaction()) $pdo->rollBack(); + $code = $e->getCode(); + if (!is_int($code) || $code < 400 || $code >= 600) { + $code = 500; + } + http_response_code($code); + echo json_encode(['error' => $e->getMessage()]); +} +?> + diff --git a/plants/api_proxy.php b/plants/api_proxy.php new file mode 100644 index 0000000..7995910 --- /dev/null +++ b/plants/api_proxy.php @@ -0,0 +1,60 @@ +load(); + +header('Content-Type: application/json'); + +if ($_SERVER['REQUEST_METHOD'] !== 'POST') { + http_response_code(405); + echo json_encode(['error' => 'Nur POST-Anfragen sind erlaubt.']); + exit; +} + +// Dein geheimer API-Schlüssel wird sicher aus der .env-Datei geladen +$apiKey = $_ENV['GEMINI_API_KEY']; + +$json_input = file_get_contents('php://input'); +$request_data = json_decode($json_input, true); + +if (json_last_error() !== JSON_ERROR_NONE || !isset($request_data['payload'])) { + http_response_code(400); + echo json_encode(['error' => 'Ungültige Anfrage-Daten.']); + exit; +} + +$payload = $request_data['payload']; + +// Die Ziel-URL ist jetzt fest im Code hinterlegt und kann nicht von außen manipuliert werden. +$googleApiUrl = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent'; + +$fullApiUrl = $googleApiUrl . '?key=' . $apiKey; + +$ch = curl_init(); + +curl_setopt_array($ch, [ + CURLOPT_URL => $fullApiUrl, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => json_encode($payload), + CURLOPT_HTTPHEADER => ['Content-Type: application/json'], +]); + +$response_body = curl_exec($ch); +$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + +if (curl_errno($ch)) { + http_response_code(500); + echo json_encode(['error' => 'Fehler bei der Weiterleitung: ' . curl_error($ch)]); + exit; +} + +curl_close($ch); + +http_response_code($http_code); +echo $response_body; +?> \ No newline at end of file diff --git a/plants/auth.js b/plants/auth.js new file mode 100644 index 0000000..0f97b68 --- /dev/null +++ b/plants/auth.js @@ -0,0 +1,117 @@ +// Version: 24.09.2025 16:29 + +// === DOM-Elemente === +const loginFormContainer = document.getElementById('login-form-container'); +const registerFormContainer = document.getElementById('register-form-container'); +const showRegisterLink = document.getElementById('showRegister'); +const showLoginLink = document.getElementById('showLogin'); +const registerForm = document.getElementById('registerForm'); +const loginForm = document.getElementById('loginForm'); + +const AUTH_API_URL = 'auth_api.php'; + +// === Toast-Funktion (isoliert für diese Seite) === +function showToast(message, isError = false) { + const existingToast = document.querySelector('.toast'); + if (existingToast) existingToast.remove(); + + const toast = document.createElement('div'); + toast.className = `toast ${isError ? 'error' : ''}`; + toast.textContent = message; + document.body.appendChild(toast); + + setTimeout(() => toast.classList.add('show'), 10); + + setTimeout(() => { + toast.classList.remove('show'); + setTimeout(() => document.body.removeChild(toast), 300); + }, 3000); +} + + +// === Event Handlers === + +function switchForms(e) { + e.preventDefault(); + if (loginFormContainer.style.display === 'none') { + registerFormContainer.style.display = 'none'; + loginFormContainer.style.display = 'block'; + } else { + loginFormContainer.style.display = 'none'; + registerFormContainer.style.display = 'block'; + } +} + +async function handleRegister(e) { + e.preventDefault(); + const submitBtn = registerForm.querySelector('button[type="submit"]'); + submitBtn.disabled = true; + submitBtn.textContent = 'Erstelle Konto...'; + + const formData = new FormData(registerForm); + const data = Object.fromEntries(formData.entries()); + data.action = 'register'; + + try { + const response = await fetch(AUTH_API_URL, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(data), + }); + const result = await response.json(); + if (!response.ok) throw new Error(result.error); + + showToast(result.message || 'Registrierung erfolgreich!'); + registerForm.reset(); + switchForms(e); // Zum Login wechseln + } catch (error) { + showToast(error.message, true); + } finally { + submitBtn.disabled = false; + submitBtn.textContent = 'Konto erstellen'; + } +} + + +async function handleLogin(e) { + e.preventDefault(); + const submitBtn = loginForm.querySelector('button[type="submit"]'); + submitBtn.disabled = true; + submitBtn.textContent = 'Logge ein...'; + + const formData = new FormData(loginForm); + const data = Object.fromEntries(formData.entries()); + data.action = 'login'; + + try { + const response = await fetch(AUTH_API_URL, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(data), + }); + const result = await response.json(); + if (!response.ok) throw new Error(result.error); + + // Login war erfolgreich, lade die Seite neu + // Der Server wird uns jetzt die Pflanzen-Ansicht schicken + location.reload(); + + } catch(error) { + showToast(error.message, true); + } finally { + submitBtn.disabled = false; + submitBtn.textContent = 'Einloggen'; + } +} + + +// === Initialisierung === +function init() { + showRegisterLink.addEventListener('click', switchForms); + showLoginLink.addEventListener('click', switchForms); + registerForm.addEventListener('submit', handleRegister); + loginForm.addEventListener('submit', handleLogin); +} + +document.addEventListener('DOMContentLoaded', init); + diff --git a/plants/auth_api.php b/plants/auth_api.php new file mode 100644 index 0000000..7f8291f --- /dev/null +++ b/plants/auth_api.php @@ -0,0 +1,86 @@ +prepare("SELECT id FROM users WHERE email = ?"); + $stmt->execute([$email]); + if ($stmt->fetch()) { + throw new Exception('Diese E-Mail-Adresse ist bereits registriert.'); + } + + $password_hash = password_hash($password, PASSWORD_ARGON2ID); + $stmt = $pdo->prepare("INSERT INTO users (username, email, password_hash) VALUES (?, ?, ?)"); + $stmt->execute([$username, $email, $password_hash]); + + echo json_encode(['success' => true, 'message' => 'Konto erfolgreich erstellt! Du kannst dich jetzt einloggen.']); + + } elseif ($action === 'login') { + // --- Login --- + $email = $data['email'] ?? ''; + $password = $data['password'] ?? ''; + + if (!filter_var($email, FILTER_VALIDATE_EMAIL) || empty($password)) { + throw new Exception('Bitte gib E-Mail und Passwort ein.'); + } + + $stmt = $pdo->prepare("SELECT id, username, password_hash FROM users WHERE email = ?"); + $stmt->execute([$email]); + $user = $stmt->fetch(); + + if ($user && password_verify($password, $user['password_hash'])) { + // Passwort ist korrekt, starte die Session + session_regenerate_id(true); // Wichtig für die Sicherheit + $_SESSION['user_id'] = $user['id']; + $_SESSION['username'] = $user['username']; + + echo json_encode(['success' => true, 'message' => 'Login erfolgreich!']); + } else { + throw new Exception('E-Mail oder Passwort ist falsch.'); + } + + } elseif ($action === 'logout') { + // --- Logout --- + session_destroy(); + echo json_encode(['success' => true, 'message' => 'Du wurdest ausgeloggt.']); + + } else { + throw new Exception('Ungültige Aktion.'); + } +} catch (Exception $e) { + http_response_code(400); // Bad Request + echo json_encode(['success' => false, 'error' => $e->getMessage()]); +} +?> + diff --git a/plants/components.css b/plants/components.css new file mode 100644 index 0000000..8e95740 --- /dev/null +++ b/plants/components.css @@ -0,0 +1,761 @@ +/* Version: 30.09.2025 08:00 */ + +/* =============================================== */ +/* === PLANT CARDS (GRID VIEW) === */ +/* =============================================== */ +.plant-card { + background-color: transparent; + width: 100%; + aspect-ratio: 1 / 1.35; + perspective: 1000px; + opacity: 0; + transform: translateY(20px); + animation: fadeIn 0.5s ease-out forwards; +} +.list-view .plant-card { + display: none; +} +.plant-card.menu-open { + position: relative; + z-index: 10; +} +.plant-card-inner { + position: relative; + width: 100%; + height: 100%; + transition: transform 0.6s, box-shadow 0.3s ease; + transform-style: preserve-3d; + border-radius: var(--border-radius-large); + border: 1px solid var(--border-color); + box-shadow: 0 4px 10px var(--shadow-color); +} +.plant-card:hover .plant-card-inner { + box-shadow: 0 8px 20px var(--shadow-color-hover); +} +.plant-card-inner.is-flipped { + transform: rotateY(180deg); +} +.plant-card-front, .plant-card-back { + position: absolute; + width: 100%; + height: 100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + background-color: var(--surface-color); + border-radius: var(--border-radius-large); + overflow: hidden; + display: flex; + flex-direction: column; +} +.plant-card-back { + transform: rotateY(180deg); + padding: 25px 20px 20px; + justify-content: flex-start; + cursor: pointer; +} +.plant-img-container { + width: 100%; + aspect-ratio: 1 / 1; + overflow: hidden; + position: relative; +} +.plant-img { + width: 100%; + height: 100%; + object-fit: cover; + transition: transform 0.3s ease; +} +.plant-name-overlay { + position: absolute; + bottom: 0; + left: 0; + right: 0; + background: linear-gradient(to top, rgba(0,0,0,0.6), transparent); + padding: 20px 15px 15px; +} +.plant-name-overlay h3 { + margin: 0; + color: white; + font-size: 1.5rem; + text-shadow: 1px 1px 3px rgba(0,0,0,0.5); +} +.plant-info { + padding: 15px; + flex-grow: 1; + display: flex; + flex-direction: column; + justify-content: center; +} +.card-actions { + display: flex; + flex-direction: column; + gap: 12px; + width: 100%; +} +.action-btn { + width: 100%; + height: auto; + background-color: transparent; + border: 1px solid var(--border-color); + border-radius: 10px; + position: relative; + overflow: hidden; + display: flex; + align-items: center; + padding: 10px 12px; + font-size: 0.9rem; + cursor: pointer; + transition: background-color 0.2s, border-color 0.2s; +} +.action-btn:hover { + background-color: #fafafa; + border-color: #e0e0e0; +} +.action-btn:active { + background-color: #f5f5f5; + transform: none !important; +} +.action-btn-progress { + position: absolute; + bottom: 0; + left: 0; + height: 4px; + border-radius: 0; + transition: width 0.4s ease, background-color 0.4s ease; +} +.action-btn-content { + position: relative; + z-index: 1; + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + font-weight: 600; + pointer-events: none; + color: var(--text-color); + padding: 0; +} +.action-btn.simple { + background-color: transparent; + border-color: var(--border-color); +} +.action-btn.simple:hover { + background-color: #f5f5f5; +} +.action-btn.simple .action-btn-content { + justify-content: flex-start; + color: var(--text-color); +} +.action-btn.simple .care-status, +.action-btn.simple .action-btn-progress { + display: none; +} +.action-btn-content .care-status { + font-size: 0.8rem; + font-weight: 600; + color: var(--text-light); + background-color: transparent; + padding: 0; +} +.water-btn .action-btn-progress[data-status="green"], +.water-btn .action-btn-progress[data-status="yellow"] { + background-color: var(--status-blue); +} +.fertilize-btn .action-btn-progress[data-status="green"] { + background-color: var(--secondary-color); +} +.action-btn-progress[data-status="yellow"] { + background-color: var(--status-yellow); +} +.action-btn-progress[data-status="red"] { + background-color: var(--status-red); +} +.action-btn-progress[data-status="disabled"] { + background-color: #e0e0e0; +} +.action-btn:disabled { + cursor: wait; +} +.action-btn.is-loading .action-btn-content > span:first-child { + display: none; +} +.action-btn.is-loading .care-status { + animation: pulse 1.5s infinite ease-in-out; +} +.plant-card-back h3 { + margin-top: 0; + margin-bottom: 15px; + color: var(--primary-color); +} +.care-tips-content { + flex-grow: 1; + overflow-y: auto; + font-size: 0.85rem; + line-height: 1.5; + padding-right: 5px; +} +.care-tips-content p { + margin: 0 0 1em 0; +} +.care-tips-content p:last-child { + margin-bottom: 0; +} +.care-tips-content strong { + color: var(--primary-color); + font-weight: 700; +} +.care-tips-latin-name { + background-color: #f8f8f8; + border-radius: 8px; + padding: 10px 12px; + margin-bottom: 15px; + font-size: 0.9em; + border: 1px solid var(--border-color); + display: flex; + justify-content: space-between; + align-items: flex-start; /* HIER IST DIE ÄNDERUNG */ + cursor: pointer; + transition: background-color 0.2s, box-shadow 0.2s; +} +.care-tips-latin-name:hover { + background-color: #fefefe; + box-shadow: 0 2px 8px var(--shadow-color); +} +.care-tips-latin-name strong { + color: var(--primary-color); + display: block; + font-weight: 600; + font-size: 0.9em; + margin-bottom: 2px; +} +.care-tips-latin-name em { + font-style: italic; + color: var(--text-color); +} +.latin-name-hint { + font-size: 0.8em; + font-weight: 600; + color: var(--text-light); + transition: color 0.2s; + flex-shrink: 0; + padding-left: 10px; +} +.care-tips-latin-name:hover .latin-name-hint { + color: var(--text-color); +} +.back-controls { + margin-top: auto; + padding-top: 15px; + text-align: center; + color: var(--text-light); + font-size: 0.85rem; + flex-shrink: 0; +} +.back-controls svg { + vertical-align: middle; + margin-right: 5px; +} +.card-overlay { + position: absolute; + top: 10px; + right: 10px; + display: flex; + gap: 8px; + z-index: 5; +} +.card-btn { + width: 36px; + height: 36px; + border-radius: 50%; + border: none; + background-color: rgba(255, 255, 255, 0.8); + backdrop-filter: blur(5px); + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + color: var(--text-color); + transition: background-color 0.2s, transform 0.2s; +} +.card-btn:hover { + background-color: white; + transform: scale(1.1); +} +.card-btn:active { + transform: scale(1); +} +.menu-container { + position: relative; +} +.menu-dropdown { + display: none; + position: absolute; + top: 40px; + right: 0; + background: white; + border-radius: var(--border-radius); + box-shadow: 0 4px 15px var(--shadow-color); + overflow: hidden; + z-index: 10; + width: 150px; +} +.menu-dropdown.show { + display: block; +} +.menu-dropdown button { + display: block; + width: 100%; + padding: 12px 15px; + background: none; + border: none; + text-align: left; + cursor: pointer; + font-size: 0.95rem; + color: var(--text-color); +} +.menu-dropdown button:hover { + background-color: #f5f5f5; +} +.menu-dropdown .delete-btn:hover { + background-color: var(--status-red); + color: white; +} + +/* =============================================== */ +/* === LIST VIEW === */ +/* =============================================== */ +.plant-list-item { + display: none; +} +.list-view .plant-list-item { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 15px; + background-color: var(--surface-color); + padding: 12px; + border-radius: var(--border-radius-large); + border: 1px solid var(--border-color); + opacity: 0; + transform: translateY(20px); + animation: fadeIn 0.5s ease-out forwards; + width: 100%; + transition: background-color 0.3s ease; +} +.plant-list-item.menu-open { + position: relative; + z-index: 10; +} +.plant-list-item.tips-visible { + background-color: #f9f9f9; +} +.list-item-img-container { + width: 70px; + height: 70px; + flex-shrink: 0; + border-radius: var(--border-radius); + overflow: hidden; +} +.list-item-img { + width: 100%; + height: 100%; + object-fit: cover; +} +.list-item-info { + flex-grow: 1; +} +.list-item-info h3 { + margin: 0 0 4px 0; + font-size: 1.2rem; +} +.list-item-actions { + display: flex; + gap: 10px; + align-items: center; +} +.list-item-actions .action-btn { + min-width: 165px; +} +.list-item-menu { + display: flex; + gap: 8px; +} +.list-item-care-tips { + max-height: 0; + overflow: hidden; + transition: max-height 0.4s ease-out; + width: 100%; + font-size: 0.85rem; + box-sizing: border-box; + color: var(--text-color); + grid-column: 1 / -1; +} +.list-item-care-tips-content { + padding: 0; + border-top: 1px solid transparent; + transition: padding 0.4s ease-out, border-color 0.4s ease-out; +} +.list-item-care-tips-content p { + margin: 0 0 1em 0; +} +.list-item-care-tips-content p:last-child { + margin-bottom: 0; +} +.list-item-care-tips-content strong { + color: var(--primary-color); + font-weight: 700; +} +.plant-list-item.tips-visible .list-item-care-tips { + max-height: 500px; +} +.plant-list-item.tips-visible .list-item-care-tips-content { + padding: 15px 0 5px; + margin-top: 10px; + border-top: 1px solid var(--border-color); +} + + +/* =============================================== */ +/* === MOBILE & RESPONSIVE STYLES === */ +/* =============================================== */ +.plant-compact-card { + display: none; +} +.plant-detail-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(30, 32, 30, 0.6); + backdrop-filter: blur(8px); + -webkit-backdrop-filter: blur(8px); + z-index: 1100; + display: flex; + align-items: center; + justify-content: center; + padding: 20px; + opacity: 0; + visibility: hidden; + transition: opacity 0.3s ease, visibility 0.3s ease; +} +.plant-detail-overlay.show { + opacity: 1; + visibility: visible; +} +.plant-detail-content { + position: relative; + width: 100%; + max-width: 380px; + transform: scale(0.95); + transition: transform 0.3s ease; +} +.plant-detail-content .plant-card { + display: block; + opacity: 1; + transform: none; +} +.plant-detail-overlay.show .plant-detail-content { + transform: scale(1); +} +.plant-detail-close-btn { + position: absolute; + top: 15px; + right: 15px; + width: 32px; + height: 32px; + border-radius: 50%; + border: none; + background-color: rgba(255, 255, 255, 0.9); + color: var(--text-color); + font-size: 1.5rem; + line-height: 1; + cursor: pointer; + z-index: 1101; + box-shadow: 0 2px 10px rgba(0,0,0,0.2); + display: flex; + align-items: center; + justify-content: center; +} + +@media (max-width: 768px) { + .add-btn span { + display: none; + } + .user-menu .username { + display: none; + } + .list-view .plant-list-item { + display: grid; + } + .list-view .plant-card { + display: none; + } + .list-view .plant-list-item { + grid-template-columns: 60px 1fr; + grid-template-rows: auto auto; + gap: 2px 12px; + align-items: center; + position: relative; + padding: 12px; + } + .list-view .list-item-img-container { + grid-row: 1 / 3; + width: 60px; + height: 60px; + } + .list-view .list-item-info { + grid-column: 2; + grid-row: 1; + align-self: end; + } + .list-view .list-item-info h3 { + font-size: 1.1rem; + margin-bottom: 2px; + } + .list-view .list-item-actions { + grid-column: 2; + grid-row: 2; + align-self: start; + flex-direction: row; + gap: 8px; + width: 100%; + } + .list-view .list-item-actions .action-btn { + flex: 1; + min-width: 0; + padding: 6px 8px; + height: auto; + border-radius: 8px; + } + .list-view .list-item-actions .action-btn-progress { + top: 0; + bottom: 0; + height: 100%; + opacity: 0.15; + } + .list-view .list-item-actions .action-btn-content span:first-child { + font-size: 0.8rem; + } + .list-view .list-item-actions .action-btn-content .care-status { + font-size: 0.75rem; + } + .list-view .list-item-menu { + position: absolute; + top: 8px; + right: 8px; + } + .compact-view-enabled.plant-grid:not(.list-view) { + grid-template-columns: repeat(3, 1fr); + gap: 15px; + align-items: start; + } + .compact-view-enabled:not(.list-view) .plant-list-item, + .compact-view-enabled:not(.list-view) .plant-card { + display: none; + } + .compact-view-enabled:not(.list-view) .plant-compact-card { + display: flex; + flex-direction: column; + width: 100%; + background-color: var(--surface-color); + border-radius: var(--border-radius); + overflow: hidden; + position: relative; + box-shadow: 0 2px 6px var(--shadow-color); + cursor: pointer; + transition: transform 0.2s ease, box-shadow 0.2s ease; + -webkit-tap-highlight-color: transparent; + opacity: 0; + transform: translateY(20px); + animation: fadeIn 0.5s ease-out forwards; + } + .plant-compact-card:active { + transform: scale(0.96); + box-shadow: 0 1px 3px var(--shadow-color); + } + .compact-img-container { + width: 100%; + aspect-ratio: 1 / 1; + position: relative; + flex-shrink: 0; + overflow: hidden; + } + .compact-img { + width: 100%; + height: 100%; + object-fit: cover; + } + .compact-name-overlay { + position: absolute; + bottom: 0; + left: 0; + right: 0; + background: linear-gradient(to top, rgba(0,0,0,0.7), transparent); + padding: 15px 8px 8px; + color: white; + text-align: center; + font-size: 0.8rem; + font-weight: 600; + pointer-events: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + .compact-card-actions { + padding: 8px; + display: flex; + flex-direction: column; + gap: 6px; + border-top: 1px solid var(--border-color); + flex-shrink: 0; + container-type: inline-size; + container-name: compact-actions; + } + .compact-action-pill { + width: 100%; + background-color: transparent; + border: 1px solid var(--border-color); + border-radius: 8px; + position: relative; + overflow: hidden; + display: flex; + align-items: center; + padding: 5px 8px; + font-size: 0.8rem; + } + .compact-action-progress { + position: absolute; + top: 0; + bottom: 0; + left: 0; + opacity: 0.2; + transition: width 0.4s ease, background-color 0.4s ease; + } + .compact-action-content { + position: relative; + z-index: 1; + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + font-weight: 600; + pointer-events: none; + color: var(--text-color); + } + .action-label { + display: flex; + align-items: center; + gap: 4px; + } + .action-emoji { + display: none; + font-size: 0.9rem; + } + .compact-action-content .care-status { + font-size: 0.75rem; + color: var(--text-light); + } + .compact-action-progress[data-status="green"] { + background-color: var(--status-blue); + } + .compact-action-pill[data-action="fertilize"] .compact-action-progress[data-status="green"] { + background-color: var(--secondary-color); + } + .compact-action-progress[data-status="yellow"] { + background-color: var(--status-yellow); + } + .compact-action-progress[data-status="red"] { + background-color: var(--status-red); + } + .compact-action-progress[data-status="disabled"] { + background-color: #e0e0e0; + } +} + +@container compact-actions (max-width: 110px) { + .compact-action-pill .action-text { + display: none; + } + .compact-action-pill .action-emoji { + display: inline; + } + .compact-action-content { + justify-content: space-between; + } +} + +/* =============================================== */ +/* === DARK MODE OVERRIDES === */ +/* =============================================== */ + +/* --- Manually selected Dark Mode --- */ +body[data-theme='dark'] .action-btn:hover { + background-color: #2a2a2a; + border-color: #444; +} +body[data-theme='dark'] .card-btn { + background-color: rgba(0, 0, 0, 0.3); + color: var(--text-color); +} +body[data-theme='dark'] .card-btn:hover { + background-color: rgba(0, 0, 0, 0.5); +} +body[data-theme='dark'] .menu-dropdown { + background: #2c2c2c; + box-shadow: 0 4px 15px var(--shadow-color); +} +body[data-theme='dark'] .menu-dropdown button:hover { + background-color: #3a3a3a; +} +body[data-theme='dark'] .menu-dropdown .delete-btn:hover { + background-color: var(--status-red); + color: white; +} +body[data-theme='dark'] .care-tips-latin-name { + background-color: #2a2a2a; +} +body[data-theme='dark'] .plant-list-item.tips-visible { + background-color: #252525; +} +body[data-theme='dark'] .plant-detail-close-btn { + background-color: rgba(40, 40, 40, 0.8); + color: var(--text-color); +} + +/* --- Auto Dark Mode (from System) --- */ +@media (prefers-color-scheme: dark) { + body[data-theme='auto'] .action-btn:hover { + background-color: #2a2a2a; + border-color: #444; + } + body[data-theme='auto'] .card-btn { + background-color: rgba(0, 0, 0, 0.3); + color: var(--text-color); + } + body[data-theme='auto'] .card-btn:hover { + background-color: rgba(0, 0, 0, 0.5); + } + body[data-theme='auto'] .menu-dropdown { + background: #2c2c2c; + box-shadow: 0 4px 15px var(--shadow-color); + } + body[data-theme='auto'] .menu-dropdown button:hover { + background-color: #3a3a3a; + } + body[data-theme='auto'] .menu-dropdown .delete-btn:hover { + background-color: var(--status-red); + color: white; + } + body[data-theme='auto'] .care-tips-latin-name { + background-color: #2a2a2a; + } + body[data-theme='auto'] .plant-list-item.tips-visible { + background-color: #252525; + } + body[data-theme='auto'] .plant-detail-close-btn { + background-color: rgba(40, 40, 40, 0.8); + color: var(--text-color); + } +} + diff --git a/plants/composer.json b/plants/composer.json new file mode 100644 index 0000000..d7c6bb7 --- /dev/null +++ b/plants/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "vlucas/phpdotenv": "^5.6" + } +} diff --git a/plants/composer.lock b/plants/composer.lock new file mode 100644 index 0000000..82fd965 --- /dev/null +++ b/plants/composer.lock @@ -0,0 +1,492 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "108be68e4e2b97fed51d36a10eed0849", + "packages": [ + { + "name": "graham-campbell/result-type", + "version": "v1.1.3", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:45:45+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.4", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2025-08-21T11:53:16+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-23T08:48:59+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-02T08:10:11+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.2", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2025-04-30T23:37:27+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/plants/db.php b/plants/db.php new file mode 100644 index 0000000..59b224d --- /dev/null +++ b/plants/db.php @@ -0,0 +1,34 @@ +load(); + +// Datenbankverbindung herstellen +$host = 'localhost'; +$dbname = 'cmwrbwr55_philidb'; +$username = 'cmwrbwr55_philidb'; +// Das Passwort wird jetzt sicher aus der Umgebungsvariable geladen +$password = $_ENV['DB_PASSWORD']; +$charset = 'utf8mb4'; + +$dsn = "mysql:host=$host;dbname=$dbname;charset=$charset"; +$options = [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, +]; + +try { + $pdo = new PDO($dsn, $username, $password, $options); +} catch (\PDOException $e) { + http_response_code(500); + header('Content-Type: application/json'); + echo json_encode(['error' => 'Datenbankverbindung fehlgeschlagen.']); + exit; +} +?> \ No newline at end of file diff --git a/plants/img/icon.png b/plants/img/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0f6223e8e944d1863b006571e31afbea21e5dd25 GIT binary patch literal 18709 zcmV)FK)=6S>>*Q@sKg{d7$JrP z+yfC6tSBn76h*267Oa*bbs~y`f~erOAVoy2#VRfweWK6P+CKfhuV3Fk?tP#0JLlft zdEavYXaON2aTclqkSUf)BmKSEaq$UkVh^A|1_Iat@c7x1&?vuX0DwSWE;~EY-y8mf zmji$(-dC*x!r5&2|Dej3NM!&>H~=^ZgxP!mBp(1Wa%B=ld>jCn3(^%F#VNQnEC(3TzO%XPAIadNVF2 zsQ-HS525h(GkYHK$uor2{YUKY^0I0GI1>Qa=09Q!$^lx}0%+X&BWAQ4Ksg_vrT2?| zSc-W`mB}QoHa5Arxz-{f-&!H)@A#hy{{Ub7&sy=h-{oQZ2$Om83>jOY8$T-}OD<(+ zOL%-C+v=}F{I3iD{vOjJg~>vxP|O#yV?@GSkvN6T%@PYlGEtV8EfW7H6aQt|U+{UZ z0f15a0hsfxL8X@o*w5X7V^9H0+@)~+ci%$DF`(GISiRBDbN>mSw)xLMixrP-QOc(} zZe%o@FPG+gK2xkE;DG|lzywXu1w$|cE3gM=a05^9g&+unXo!b-z=u@G1S#agGFS}- zPz0M{J5)e5)IuFJ!eMBIV{jVI!6mp1{csxwVFVt-IJ|^O1VM-h9bq7vh#q2$SR(ca z2bqcZA|Xg55|1PyDTo-6Bg>FAND)$kR3LkhI^?$^hJ;C1K2sj3gjkChJ;R0~8aeUlD+zQ-ATm|j` zt_9bLyNVmajpIJx>3D6tCEgVuh>ydk;B)Z>_)`2nd^7$mz8^n=e@P$^SOimoGa-Nw zPe>yyC2S<@Bs39D5&8(jgb5;%s7bUWx)Z~QJfe(PKrAO7B%UN*A&wAVlc*#;l0C_f zlt2=b@<^qmdeRBf71AhalB_~DCcBcu$O7_WaxuA<+)nN#kB}!RsuWX-J0+TuMp;cM zqcl>^QtnWmQ>jz~stYxODx$8UmQfE;&r^q}Z)j>X3mTV}NR!hx(e~3$(QeY7)9G{* zx+gt>E~9Uv*U`_=@6lf?F_f&80+j?xE0rphT9mFRJyj+v8!LM$&r@EaT&jFTxmWp# z3R%TOg{#6-S)o#?a#ZEI%7iLI)lM}`HB)t?YQ5?O)rV?CH4`;oHGx{b+FrFYYQqeS zVaVVz_>47-TEM`nz)GO7Gs}Hg;mI*76mBA`z z9cB%%-cHe(;x$D$Wy6%lDOaYv(wM5@sUg%T)M(P^*LbVR*7Vg(*W9Ans(Dunr)8lP zp_Qw(OY5xGlc~(9Zd3VF3#T5QdP^JCw$P5$UaGxUyIXrgM_0#RN1{`%b4KThE=$)_ zH%)h&?g`y7J%-*)J(1ovy_0&6*y?OAb_TnQ-N_!;*VYfvm+SA*@6n$$Fg2KMkY~_j zaMzGx$T3Vd+-BHeIBuk86l%20sKMx#G1-`7oNBzoxXbvJiK$7f$vTr(lZU1nrh%qQ zOdCw^n9Z$EmAEiEqX0cOD9W_I|j@M+H{| z-w&|}k%qK~qM<>dTSM>6GM*)#)fxt2fni(2?uMI&FAV=af)EiNQ5o?d(k^mYWLFd; zYJOCG)XQk^=;G+xv(0A9XLrOX$0Wwo#k`93i7km8jI)Vb9(O5TD_#`emOxC1N!XV# zF~@h#_BkVoj)?_{19MI1E}DB`p4PmKdB^7~&*#lQl7vr+O{!0N#|z`t@Fo@nE~r{C z&gb%X@E;321=|E;LU&<_a5ULHxg_~vihIh|l(AHg)Y8-^BCe=H^einPtvc;hdRY4Y z^p6>_8BLj_%%setVl{EPxHC&PYf)C8#8Ofq8C>YPaQnh>X|Qx(Hj+IzyG_QFNo3t} zGx=KiP|nPp%AD7^F}X(;sV)*P>RxQIc*Ek+C4Ni3UW!}FU)r%uf7$9~L(9FE?^%JY zSg@jFrQyo_l_RVCR~=YQS)IQ6hdkT7lDrpdV%N0i>*TM>A71OfwxK|&Kw5Bpo!h$V z^|f@&5O+Cd<#k)2WHj6h8Z1LD~ zphUG~Ny+fm(5)@o*xL%Xz1Ti~`-Rf!rPVtqJLEeC%Rt>~}xu57B( zuG&!bYNuf5m0g~@8mo1xi>lx57VW;V$A3>tjY&=EUc%m-y$@<*YP-JXd|kIsYhTg6 z_xr{B2MO{}J(LvTob=+U=H-wqrO zKHPDHbENS*dIe*ZE3W0l9%j~Aby zoX9`%@#K<|6Q?Ano}5lOJ=`(BbYxy*Dm$X>hBwv zJ#gcC;`PBBf*TKSX54&sE9cha?NxX1cM9*S+%3JQeXr(6^B=P%vk zapNP;q|ZM7y79T@^ZhTTzv!3L>3SRcc62iL9r0b+d-M10 zAA&#J`I!0f<8Swb^ZUi9i9!GX010qNS#tmY3ljhU3ljkVnw%H_06u|9L_t(|ob7!F zbXdmmed(k0lh&7Nk$FW zT?5e8>j02>SXH(+=^bIFJ1>m^a9KmlU-04oGRD6EDF z8TCd-nCH5el~x|f%uYTWtFyM8Z|~@9ve&}$1#3W0>Y%#g7+B3|keg8i?vM|LTuw-` z5)eaMp~n>flfeK7Yqx=p)d5KxU_t&uC`&8=iXblY*MAfyFphgaeFg6|hY5mZSR|p| z=k+Z+d;a9c&d#RwUZ1Ck=XnFi3qX?;$chXkK>|S#NTv^=0N}+R4sa0khtdgxsM>mP z*ZsPaIxrdx1A3k5j70HUWkr66W!MgqBw;#Wj#!fjnx=su$ig$tXCJ6Z0#Oki_V7@U^@kfYaql98{be36j{j#sA(n(~?qmGJ5iNY%H^r zqAvb^lZ`oIU1K0wXqo|3ZME(7U+L)X-gMeuYeq6rB&ABPYXK4^+Zgh=T>WtagN{d7 zR`ZC@?SIc~PWTbaY7VOs@H$|QSl18~g%XO;b=o_gs&A?%OQ}Wr!Gewr6 zp|#;2o1^FUg8Y)#3o;77$~Zw`va7pm6MAsh z%7(g@4urrfA$CYg%xFsHc=Ga4wH;IRd|I!+euaw!`4IFf8W;Lwn>fWO%qrD zLXac@2CV_A>rbuRyz9+P7)p?R|;iOZ01lZ82A0e~orKqzPz;6L&rH(HG!`S}3z=I(d? zaQy7adoc?z6G$}zjBf=4p~Twr4etnoxMH&6T{paqg(}VM9RfN`LX0jB0HljNTLVY! zN14AJ{`+t3w%!MH8tsfC)d-MGK5rnYsj2bJ;;eb=*?9K63?j^GV&REajbe%dnx@nf zH*!O$f0L1jHRkFf2K3cmb)3jUPzZqn^0<%Vr^|{6-F-dJb#!z;p`Brp>O!FBI?(U1 z?m4jiwc>ko))}-0CyMQf<_nFKVR{k^i9u78N+bX>#_b=<^auT=c88;cVcA?R$XR7s zre#GY(ZrEuS(G@DYi?_8=OwW>GcBjyLosy}MYYp39lR2w6p7j5wnI?pj2a|B`=rU% za>s#V`@XH2AvV>epkX!8Ve2UW`Fp>3`N6dh-^WrKNm9nYu%aP8DR%l0D-!#m)u5t3 z6fCj#Id1OhvE3f>`4-lmt526@i4a8zu<(MSK1vjU6I4sO*4+SjZaX?UfTStOU@&&X zCM53F(6Bk)6t|ZI(xZ~>GLDlh%aCA+1Fc4fp5DhEX9yY`p8mAc=T81sksEelt`79n=h0}8Whu$!>A$=BeAnas{e4SA;gAl0%UG3n zQKOOoV93ZCh;H{#mdoY-Qb%{kX9}_k-zdy4`5z0DRE>$?Xb?mm zB();zqr_r?f$GkhJC4?#cx<`_Kd-4V?+@tS+Pn2v8IR^HAt)tuxwUDr*Na$@(h(x2 zv7`A5=bGyOdC22QLn&~zgt{0;NG5Qiwz|IhiFRAZBgKWKuf)fg|CgfZhL693R1Nbm zxQ3%u!|wwmcqPvGw|#H^Hzs!p`udilOeRngcXqdz9jw{&+?tA2-wBD~%X^_JFQ$-K zky;}L?ESWT&NtP5uf4mi3=7)OP@gKG_sEhg1cL$n@l%JtXf~T4DacFzFP33`KGyig zKaoytJ#E18e8hk!A_jX)cl&4U4o4~eme~%Pq+!p|BhRuL^I!CguHkYF`HaHC@!x9_ zzMm?IL_$t#@9y|vYg_AQL_tu?iLV#Xh)042{K2^D+NPf|ie}mRl^ecHQ#6Vw6|yWr z*PtCJ+Ncr@rK%|T;|`ua_B=|i8vztW!Jyk^>FDYBuTO6H^vFdw4-XgV#PD5+q z$oa#c_IZ6Nv(>g54_IDvvgXtyE6UgYswk;&KL^qk)oEPQOA!m&>e}m{cyHh4?cFw; zsy?P$ya&IJR-=Ks=K6{~2Y2r3>F<7!rto``AP6B~WeMUK6OgiKK6Y~d)6?zyPd4!P z@*Gd>Ke6j;k`w?*^nrMh+oTc;)rMZHhi-fK_y4@*?U%ehzn+bFfzuXhF1C3 z1^yTc*?(%sPg|Q?p2q8YrUVetrjSI5uC1&4zJb-|SmN~m>Tvf3Sdy{qJF)*+wXS@c zLQ#~_n`fH@iM-Tf)bCI&?55qGT13ri2IpS39*=GwA3-*!nMP3ud zN+7PbuaJ@{V*810KijjF* zeosk^G-YTsyhfwxGU&DEQxj90JA1mELq2a@S!ArXRj1qfZCNpTOQLhA zKa=AGlPC&mMgvP`$cuz~FdL!KFx=-K+O)u8v^1%Go#S9$?80&Hk1ARuxVT5a01XXY zO|b9ufgd+E)y-H^jSb-T_d6F24V~B{%QB&vf(D3*0LyjsdOe?)Ua&nYG4)+H??0fB zU;~j0mKBt!6&h}@2P9d7Y-&~5cyQf=^uFVNw_4-U3ma`+l|HX$)sV+| zli%;NN@|dLxS#O?PdX3`X-?Ij|Lo$@s^?JxP9#Dam008@d;u0%=RO zR8n228bwizgt4a4?~!B)3bOO|TGP}2Jv}Ash*p%rYi|Qi;z5xl5JXXxFe5;zCg6Wj zI>|ErCXuFSo7rHrr6y@}4{Nc3^ z+;ybwQ~=XpBVE&YA;=OL89y*mQZ)SiF}R6;;`8vrR|zJG>J3v16s-)HjK~n#f5-<1&K&?oV+5_%1SAnqB_IN&946lhf^0~)W;W!c zW&U5+Q2(dS*46xrbI@7HaU7V<7O6CKzSE>LsbsxeL?xC?jeq5mGz~}3ocOJye<15d z3LIV+5QHjeBv~XadIQ*9ebDdh0|TQ6gH{i*+8EF<8t?`DpwnqpZ=7KnkU@d~9{>ti z2!#A_zM~e(auz~DY!)1A%)$b*~X%c~A>% zsy{q%x*)aaY#eL(h$2+3lvqyhgJU;_JhC+94IUR4+4_>!{H?usgDwGh)S#r^JD0m4!Q?R zY8%ddZ#vo{vlTQ=gRR$A^5R=BAF^0t&V>1JgJO)a)wb3)^{{bLM{g%j5~N>I6j4zW zUXc`0k|d`niUC3fkst^UL6QSF%Y)v2$G8CufKu$s~L|laA@xOPp9~5Va`PdJvZaVYRfIkp3Tw67V zDFRK=5DJAffnZ=MNsvp2TyAJ;Z&sxfN+u+U&+P}_P(US158(*clT8>OkVKFIe3%Q@ z1!^1vy?p~t*WeIML040IQ+qfZ?vo^`0|2@hh6$3G7gR$pIyhOo8=5=LfR@pMD29Px zIT-XgK&vx>AmLkoymsv)-#OX?ZvSZFAG>|Q+1dsrc%?;y9oKHd^@mS(8K zCUep$Aiy3Hf~pM{X>g%|BI%E)!HXd(OP0*5_{fiV`TakAB^>4m4LfJBPgf8hsWBUK z^06cw`y$80sF0{g$PgFS5~=S5|V#S#a8DX_@yw9g;wP0ZoO z21($I`>@{O>|YY(qPK`eCDwo#ggQs(EnzN9&Z)sUjDi5b3X5HC zj!z435c64B>4@G)q}B+3*j)JIdIOs)DzX-&MteN!8FCJ}3a_WM!a8nsp%F<7$2Uc!(;JL`lkqDTdm7iOrQX4YBd@?K!Dw z?-!=$ZZ;+u&u%-kYcS3fr=-ND+_U@8-oHwcJZrN7qNvuPM@nU|HERsF@S?)>3fjKd zXfaa8GO|r<>Og?k=S`k?B7$Hc6 z!J>-+Sth|34(`xswZ4Eq5I@_9CCiw7Qy@Dtf49M6*v?W+T~lX+izZ351wh~hBGwSA zFUl)QY_YZG#B1X-oqkuLFA&HN2K|`=&yO~=PCn5TU??_a;>{G2%uM=;QzGq6G($sK zVey{K%&Zp_hTRerL>Uh?s41!F+CssTPyXy8pcVGACgTdgeB$eJ^3@lx=>>i-i2;io9-w1(B4UNV0%7|aZ-*ToBgMP9`OkP(III)L5D+nCWnpmKCAH*0EVDZAWP}h1A zXqp95lpxU(tC|f4jUE^ZS4WQw29ZD}WR+}^B=LH^@l0A`%9-4h#Q*imRBnG?*PV|3 z!AFNY-X(!h0AF}j!&_7vkLQikVrnv8T@+18w=UoKzg2|`ztisO_V7YjHCC~zP^&dU zjxhne9uG*^Ny0EV=5g84QwLw@=xSSn;g4BKDu}2#&rskgV}8s&FQ+siQNnx}XpI3h z8lBoDm7bIUNfr|f1cFeRR|@4qdI!|Pz=e}+> zu-kR4=@dm0-6N_iLY7GFIeLSf7zT=>TOGs zBx`8R(ahBJqlLNI-#u{R=))eb|H;0-z9o2mCOjzbB2T3+)`S~n!qJ3)KM3uig=Lkm zmgJW_D@o!2{s>mVt0eLj7*Yp5(FX*pQGZ+@6j*wu`p64C-JMJEDK|=UEUhk33YhEa z&wi1ns4p4}O&){E(x8A?qca!|$R_y^MNw@uO{igrkvh4NSq?b+zGJWx%5$qA#JRv| zF@Z^w0t0@}sLG6tLP8r&9x@mVznfoF`cfd^zq_TQ=gVzfEo*s>Q*(irLoh{Ah=~)6 zBqT+|ss2}doB+2=7!3OGf|9a-UsAsMg`R<~2+@eh{=A`}8w?r)2%@AORGFrrsjKOk z9S67nAQTMhrpxTosRTL3xc2*f7N6I%gdm6|1Vw&su(vlDXR(~q87)V(8Cg4%5|fV7 zG(AXD5u;q47Ne>{%vOjXfdWQT613V|AVw1lX1xVmA&;uZ)ZIW4btzgCtZ!!~&wqzt z$&F#Z|EoQ{J?nX1P^IX_KoCUKNOja#vKq!461c=Gb?Z@gYxT7Ev-dsvM1WV`4uwO* z>qH3X_w)l5F%@L-^t^UD6@vo**5=Tzy2uAJjZ$Z^l$Cm-OJJTjcVi*gg9Yh#aa@3{NBzy98)w=pj6Ts z^q$=O)Q2*YtvhSlyMbac4M0O$auU?ER)ax@lTS#MR8Eik<}C-e{m#+XUogCIV8Wky zqe(MGQ6~Z=D{fbEPYppXv~gn}f@ zcb;8u-r^*ND1wUTR1+q`_yl5GXqd5_jK)PCFE*OxPPMnvTEF+j>h9s3x4qMsr; zu0#zYsZ1ulD=jPY6AVM_MAsOBSCC_<2P*P&R96+f9PCqU>u!6#uA$-EfnZQO*SdfC zz-w>pnirHhKA$hw>-FaL^*BChG8_6cQnPkIA@dqR5C<5V@sD`ak&bB+;w=fF_;__` zf=C7;DpZkGr%Dh-A;X&b$Ly5UZRZ;5pQ~wU_*b9bPmdV*_*{cd7o2#*s$Snc(M{|a zV~UM6y4I~(c-Ohc{v%;dR2Kl@+thcRhX9AOnIiUp1d^ev+xF{o^|k*%5jcO~`d3oS zWDsM9uAw;d4EdAXuA0Z|8|xo8n+>hORN>v6?2JD%EOT5QKJ6INK&=rJI51HGsLWdc zTAhCMJy9r-G&QiKq~du)jDB}rWBYe{`+IK^1zsIpnVw{IPncNqGK$VLH8rYJkuO(L zSuAGX1GnAt57y+EBRbj*T84t5upexmesK9+pwloT(|vQ^+x_mVHe2`d*)|byT7bY^ zMR<#}(YxKgyko8t&sMk8Je`)Ba=@CH@=|tM$(t<0h9Y4JRFwc3iRlnfMCf-%loi^< zDBXAr3(@4ZN7g;Ir+;YR%g1Z?eM**zrj46$HaTkNCn`Hs+U3=Fv zi?VL|dk}(tf>bmo9c6Qr~=jK36K8O*LVW?D)=+@TG zHSHZ;Yr1T`&y^Mwziv%Tc!gmYJE0J&1QQhzdR={>h#VAU=7GRTYT#8(kSoB=&z=91 zRrBZl)b1Kk+WLB;es0vH(aMUY^+vtE?{aFNkXQ>!%YKrQnDSCU^s7Z+K0W|@P9K6m zIIJ%JK~fEQJrDivFRyOzw)M`D>N+4Yq9~HRu=RA5ZQZ-|2U~V;JK50M_Mlcv+Al4kC+FcRjo(Dk|6}0Kbn@M^}Vp-Xk!PLZ*YTVXvG2n>7+^n2k zpIGzY*R-?-e10DYfe?rxzp95ZvyMh)C>Z=?Yh&{p1B1@AIV1i0gQgjE(x21iN~t+_ z?(19jZ98?QsrtVpNlZ{Zb0E~ZFErMJ3J(Sr$5LMYbnK|a+Shs#g210sjqfNxH5n6Q zaXo(9eP2j4n56`x5fV)nNHHgZj>XqS_7eL1-p87o>R%Rkfts7IHN7x0-OuguShw!o z@~t(Z?iHTnnaQXLx*Uwwb_x7&Oec~Mza}}W zSpo{jZ_^C8T!Y!iP8|PjeRI=Je<*wtYL^j@)8^^`K@5YIK+h4Q`&Td&BsV1&in5E( z=naPc@$4)NEo7vnpGZou{`y=;J=AtLg3IRv9c@xa2%=>2`+bkKHa5N}2@-uhNQK{9 zl0?vIbz)XV_KuCq*8ZC*&hU6ra^h!-3yNQ)Xeu0SmB)<=YB&(u+v{5K;#+U*KHFIR zyoS}N-CC;sg()MDAU@6r`I%`~&|=RI0tehsW_s4X3lBbC>8yqo%L+^Xogzqym%^ZB zSV)bHe2@lM@CMy08k_2W&vV?AORACGI69p^l#!kF%Uf1&SXMQE$;NrvML!});&m;n zc{wjD@3XhByZ1h$(d4}$n=>u}6bwGU&$w;xjvs9~u=72Nq*6zt{^|w`5@O9!`&BQ} zrPF1H{%#u%p?{aUU>7n5&hoQ!-p)_U+DQ^vbjCtydKu^$gPNP_^7PJsWy{}Q3HW{5 zscs<~@m7lR3O@MM15d6@O-=tYOKVQz{iq7@u%OqP5R(k6OK#p?QCj(zsC!~=aM0?x zBcQRR<*v>9H}4LF0xQ|!N)xrQ<4T6xRu;`u-OiG%to^l3=R6+2&w_5MTAQuYiI3d! z&<|5%t-wiP5EU$UiB&&r*ZIwPI}d&Ew#zk?t6`_s`{Vd9Sd-HSmMy6IhDERYe=R zr!#*lNri+#&!r%5-r?KU-Muy|HRrd2D9B?~_(;8Xc18~5X5@ldXMh-^5ky{?KWD^W z=1S&(FZQ*qul@PF{rp3E&|UQT(W@I`lSjqjn#H&Ly0f$6L66@9@o`C9RmJKTfC9d(_|cWJs0J+t z15g?Y7Uq|!YeaC&^q|+7eYo%Neb>udooP^uF#UerZ{K`k1#){_}vK;E6woX zB06ijdDp`mAG#HQ$p^FkOlExM5s%*mF;$ zs*NvXApmC@s=pQrhAnf`pf4X7ei-ul zjjwHa_oe4IrBx=Fp?$pPMZHudb=6PgCMW_}8;PALorsRjTEshEvSOk1&hJRTEMJ{1Cu5W z;x$&NX>HoH|KyR+PsgeXWw=INwF$8j1lzqLHS5zN_J$W?z#oWx|Hz&vqCMxbk1DE@ z5QK1tG8kDM7+C^>k_X&;AN%&+zx<2~g|+My<^M+7ol-MW|06de_xrfWC{mp|{P=La zlGSJdeM};75~tpeufb&qtsp_BX1P&=Uj6Tze4s*Z816J3TYhRm8%|IyK?>QiAjkyC_$z&gMi1dp{L0g_3>yA$mB;S;u;J( zi1btA!XFwOzTUEiw#J91s#<~PdC1Mot9^9+aS`w*@Vsh3zLk z_^R7Gq{U60Q=uY^CcUq+to-x-kk>I3aH{vCL_!tKQY@sIt!iyOs>=}!&ycD(U*GWV zfO9Z&I;y|1!0&gg{`do=mVQANBnfB|(yjSmwZ?(dZ3KrK8&44*Ivm46V1H3g{=ZsG z#@%PnH~h@)c4bc{x$wee8P<1e)g9x88ZNQL-WGk?I3G^0sXu!^%S`^#CcHYZB;{JinRbJQUq&45-2hYG|2%-_**_~RgYA53SiQkHb1oC&c?s(-SV=t-?i*Y zW-?qB6a{p8UDuiR69eUOg%cyzz{hq%M}W3WyRGA1zdvA_3N;w!La=7>>c4C#yyO3c zl<+tc6LC2sJ(>_jVqu~*$c2)Q)t-FK>+{YCQX$k@FpY;4UwXnmMvVemJjkj-F{%lm$2>bTHBN;vCMkoxmc}n z;ti|S_0{9vk2Z^YXlVUZ80>fzW@O}b-gWbX|LO+R z`v-UbwXv;b(M(%~M^iL72K(a%jyc~honQVfmSKNL;TB41)0 z>I)K(BI$5NY4JY|`rPep?d{(h^0*DxRtPAN7?*J9Vx!ulep;Vve2Inc#dExNvIC2% z3M2qFEWh*Lfr_yY2%%Bi0_`dd&47W#lCzP4I%@p_G&ve{@9o|4N~g`XdZv+T1V{o| zlBwF7>hDP$th!}M<@0eyW6j7h$KQ(HZXgtdK*$eTHZp^BWCAX>Yz4zXD9fw(@$z}A zx_|xGpT8`Ll4fj!>(!hWomM9&$0eR16msIkTDEZM_%EPn=;-cft*Nh>)G08SqA4sW zd{Z+I!oU zt*Bi5gQU2WU(ysk>f$5OBpkOX2O)+@0ZEHy!H2dNhG#1CE8h6z-S?BPZ+_<`Q4ray zm0YN9lj0M*s`3_{XUOR1KkBCxr;opMfF&596nTG5L(Nk#NkHdJ9ov48k(U0*%Brfb zF*LK|L+LeKXGXF>&;U-K3s_n+svNP|G(SE2^+)f1oO^%Q=2tu(xBhC#g`Z_In-A3Y zw*|0pGJReaOe_hF4UFU5!ios#$vL|d;*$C>3O*UY_nlu<`t$tMytB!cBuI&~syAzF zG8ClcL5$uE5@6LQ5>5mbNaz{perVs3JujfgGTrijR|`~Oc(K^*_J!|$uzhQDd+To~ zlDZ&!5Q)&c1AZt@%ZETXF#1S{=b$93^sW2X-t!bm6VlZLQfY<(jgEb%(bfoUy{*xo z7wrLyHd;Ni0vb{?Sdfvmy>Gy==~{anC~6bp68aVvEqbA=zjrj6jCK`HtI4-!s0SK5 zdn2vk1RUx-UH;zAcYaBsI-JF|RSZqz4jZbqwc`un;LdgB#TDOV8Rm_#<6_Yx_5_E( zq#L2Tnj9Ww)YIFY@94MxDLX6Yfug+BuhA4W8mz>N5ebIZSeOfpPX0r?)nYV# zZ|UOsnxn^RzcJBS@E8h-iHX_Q*4H_x&W#0tyyEfK=|pAE$+o78|3He|pPZC*#MWb9 zL0%(QHqrna)1foyUpUkDVYmYm$mLn{!9baYLkk#cAc0o|^5v~>ylCt0nm^Nx^@#%2 zAYO2-tt}6`+>YfpFOGSR(dqs)N)&>CAgV*mS{M_6AQ+HjJ*=v{1~Rzw{BtAi?)C=&9r zbN^RIYdso*8GTdC@;iszusL05fq|i+VA|HbAH1HO zleMxqyWm?iMGuZH2&ZUh>A}*Wct|!UL4pY{KmzVqecP8iyF2H#b#*M(UdBa&(Al~`6&)WuFJQ2oUe#Q$}7+R^7*yW8ep?a4*)9UB+Zx2)o(KcX!) znn*@fC^O&>hK7lz086mo@by>i*uCW^BUP3+GH8kdQ4pZ9zVV;9KzNm5q2@EJhB<}4 z4IY~zzZ>f8Hi%_4Ac`EQBWV=~uXAq-q!@;gO) zAV6NaLs&;^!>g;7ztGa%`XXEzA=PN0ASea( zyEgConb+qt-DoQCQnpuTcUM`Tvv2qMm8+jhw#2@Q4i4rZc}ap^j}y{k5Fh<3Nc=NVByZ_kG*7ze0gN^8s(~N4tE5t8Rz;7T*syR8)Q& z?bv9*Lc;ll1%EZ^7&|ZdL6k$Iw+TxuOqN^-y+YF76eMc?-}GEc|}+>wh_W?%cz;ooXUbKc7(Gfm2vbP){a7L%+wNN;2JW zlLr3SoV&y)yU?CgrtPCM!n$(&+!Wf1_qX5$?!}h7lG~ZGy?;D1C<1Q z?%llny!$AU>Oz~#In)PvN!e;TOaTG1^{K5lSFHHiTRY$W_6V`mco@q{tE<-jAUV#e zo~z46R0bsI5+?K`(zR)w>z8eO{!d$8eG$Lxr)6G7AWI=C**=m zYieYJC`n?@%X;|qk^jV5nUk>+dZZ7reEx!;BqSz&!yEF3GZWL86E!D)*V)ni>1$CL zaJ_(Om_A$ALYjd0GIR3oWOZZ@diA{E1(J+Rj^TiURpk}GI#P4^bNz$PbQBI@o`cop zi{Gxw&NYRj+~hMnlOZbg^9%}qY^90lsNHkt|*{q4Sf%;HGTe9Z~bB$7vhW;lQ5`y zlH!v;aCkiuC-SP%F32KKdPWWUpU&LE%lAKj>zAGvKmrp(f`)cM=Rlk42?piRRrM)GB^C}T zx>9HrfICZXekJU6&j0&?UC&{P=0b8|?NCBOQcq!8;VHEdLN%TN@{%*aq%%dzk69MB zAKUq4Fc{QL2C+uGp7l%CeJ3O;z{@<4gaQc`BP3dksts|t?!=lvFhI|?$_bX%z{$Fk z&nzf7vU7Rv(hoS`AxRqpR$~H)awL{`HHf~i@G9OEJq`v)s4S`Y`swDHf_}%qeK?VK zEF>8V^5gc#naxAE)k58&M^F&p1n`9h)#aIrq9mVdJpbfm@YrX{a1X-sY&WGKtX29B52_}9o9 zz$<$HXb&h?aYF%$~-)s1%Hx$HgQZrAZBt!?i_(ECa`dBBmlKlHK<1Cnn2a z#$aDzLGk+m-g~Cjb~e&gEej9~c~v_R<2a|zpZaVl7-VPjCJmaPVfV=cU(QHN`3*@> zKBNl*kGj#wLd#I|X!p-}m>*L${`*FI!N><(De%=4?$99_V1XIDdD-f_2~v2muA${2 zTnn3(nRQB`hz4IcvL_EE*gzOS4hPk0QGd|Cpv`7mJQ;)0)N$ghMp{x@^qJ9#EY+%E^JQzZjzJ+=M8c30Qi7+ahO z9<027-210&p3m@FSh*-;-s=RdgZ3k>s-2^Hf0PCYjs!0kX&2`~BAQ!TZ@c=s)bW8{ z=%S*Em-4LH>g;!%o9Yn)Fck8rGam$kg!<-|$1t;h`4hxuE*OS^^BwgC=ez4C{MzeI ztP!Zg`sI?`m^AY1-ja`ZU z><2*+RY$>Ov_ffi)rV@K{`?(k)OmKBS04^uNy%tTwWht}47$}ixEW0>G#cw#>%boj z!dR7qwL)IMw}c+vxPC1WY1oKu^zoi!H8v;6k_55FcqlO?fvj-qXFI*F;_lwAn{E_o zB`Y#4DPQv6sR^k84kPZ@Nc&%xqlb=&KNNt$ey3{ld^Fob03Qy=j;O|K2}~muXU}`D zB4cS74PSsVsbw|P8#SG0t|+olR5HPa z)yYC+T8s(qxaEGZ7%ZR=AN@62MGJq~_PY7>*%P4AXs)Rm#G0hCyqs-uCJIC)vWC_k z<{&JID!ExofzH0(jkBSO;ZneK4NX(>gX`~lI@_8NPmLfwa5Cp*&0;lVv zX&waD&jTmnoV7_%gYgd9XgTXrldJ@UxggXwRI5^RcmqV5t*2u#)-BC;aC{inExY-T zQ7zC;EHI#CIXYubfjmX z-=)@W4;K|0wA#pQEsBI8k7s!}6tc_#)d(v0_Gr6^^W@{=?Kdx2_8*eMgL0A9uS&iHO?oZvAHD`42q?_T-koALsh$wp za1Qq%ND?-B5?M{mye{UJ73;p95}(<_;f%2h7M)%TObM}YL|RUA zCa`MlF~+?w9)u%+mhW1z;h6zfPhL%Z-3q-{ch&ZUmeq=t85IW-EeYy@MV0Id@t~)5 zswAawhjmNi(rK^*X;Oi4s;UL$e_d8u`Kk|s7u}LN?TLl?LbKL{n|OvtW?vjQR87Y) zLr>iO$p_xlzWc_Bb7$6EO&=kyo{KRjbOjZ@xzpXF5{;r6D9f#gbO8}+wB2&(;I6_M z*yVNEKuMjLkYs;g%|lOX6;{Uo$C+Z2!JsKqh4N)lY6JubAcCIJ^?&h>Cm!&JeSbRF z(0Ch8MY$rIOD*7|n$Gv052Ag6z*LfE02@ZI9GL`82LbSBDHvPck9Wq?*?1o6K7Y!?mmmJDSOb1aBfCL&EY|U`4u};koB2isK&ivWx z4Ti!YSXfrE#fCAYm#gLO# zG+a%}!rmjh;s*Nq)xT$xT}99&_wa^?pInqx*@>i@XyfS(K`aD@3KT^dnqM^U8IvYv zXH9eckNO7sN>FfN5_!CXYtZTXmKH2_jxGK_+tq;kc2utrLk&ZIcl>y-pQ%uW%e~hx zU;k7}Ldt=F=vOOwuQ_PL_;NEi#$}#ulU8fMQdNg@Jf*PPtFI; zM6d8tP`A1RcnfoizMG)azTME(_Lauwx+gfES8KUOwrSBc6*3t0Ame@z1VN}hjFGy0 zwcwB-W)Z7+o`VI&^S6Cs?fqY2>EYkZOszDY(ZoWa6hhle!)R(t3g>+$D>?Cv?w;P~ z>RKDup}~*jDlc5Hvm~!bZNkKwc2Cd;N9#_jkEs$XLMdgol)}U&CZ1os;HJ;S=q)^E zIVL`N;p#Eti8TU@P2uE}gqZm43-cFj&&$ca&+Zt!m7o;ctt;2RprNq&QpQ#^sO@P~ zb>K)mjHD=qAc;vZK&GBl@p19}k38^&PgsmG4u|UfO|AzRGuw$Z0*tI<5Huw*<(>SD zl6Pza-71ODa7DoskV4RA?}nt^}?(p)(EgP2KUF{RXn=l77Ga}7MA9ef5gCNNDXWm3i`WjT|mviLn28MFbu7f zSCl`QoRGLfQbIrt&&0o8n0ZI>3W3KNgQEwlj{_eHtDfKpaJZ|>=XB1*aD$8uzZ3~; zSFHK!`o%Z@F_M$@O;NN8k$7Vh3wQ6h{T^s@bgI&9Y?K{O4A6u+mvhEBF0u%px^2@p z3-WS*8kWMqOw!=riQrEcuM9%y#@eCHd6Sf~ckU{8uo9`|vEV9pT0+;hC<*w;F39V>CzEvm-pn3z`7 zA$2k&S`%J0n2cWx3!F@ocwZ!4bv?ohH!QIbBa?#1gLVLl9NmfZ5^rKL+g>k0WG&J+V^9->Ca6`^y)nr1-TOBN;B z8gKnuh*bVoT0FnZVeh`Tv#0AJuisaW`+}~w6btiVs4B1g+np=#deW+~s$mpic&z7# zzVG$N9I>Jh48s%#z2RJ%HT9fUr~MH@k?RKsosaeO_T1wS_$_K@&jdG=UM)gg7?v-r z+I;`Uhc-#P9KdRYNl7eU1I!WYlIbFx#VHFWtzm1$yoFn>$!XajgdeSGKL2RIA1cRS zELKQNwiF9-A#8=;@~Mpve=-Pi0INKvGv76b!|xF{Me6Vqq=>Rr9NMK7QNdj}ajFr#q<-bHuu`0diP1A!s$)t=XA5TXQmV zGrD`b?)G}UpZ0nERbehfs&!u1U>YFWbylnO;F`s^JjzlUpD291dwe=#j#yWj_*Ntl zw2Zb}r`P=|#hUUPv%#`xu)l9pTUW>ZPPZ!^ThA`65u1ojwQBK-EoJ%hALj(#Gg&== zlY!|Mq?v(G<4UrEM!#${7*Ed6FL`?1sx_4h7cTn8vcd)XP;%kI^oeYG2y#JKR8qd< zAJ%>9F`A}5Gi^!KoWz<8TTE6LBJ^7mQ(l@^I`1V$!>lD0>50aUmWTa;pjPd?zKEK{ zb4Ei{!iVKRi-?i?}M+hK2(>0uMDa@?PU`8AK0@_+NnW-5ySs59>7<3J6I@eIQ z$>Z^sp&E^-OCFXjs@ihv@;e?4O2HYuBXN#c*TJLIGur+XtM&hIBKHefgh%a;-Y*Zj zoM~kR3*LWh<3s=A355faaQOoXrX!**8=u1*;41L{0nuhu?|Et&XaE2J07*qoM6N<$ Ef~zkHXaE2J literal 0 HcmV?d00001 diff --git a/plants/img/logo.webp b/plants/img/logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..74a728efe8c9e2331bf50e37199cee218bf8cb7d GIT binary patch literal 12720 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 literal 0 HcmV?d00001 diff --git a/plants/index.php b/plants/index.php new file mode 100644 index 0000000..27b0a6d --- /dev/null +++ b/plants/index.php @@ -0,0 +1,341 @@ +prepare("SELECT theme FROM users WHERE id = ?"); + $stmt->execute([$_SESSION['user_id']]); + $result = $stmt->fetch(); + if ($result && !empty($result['theme'])) { + $user_theme = $result['theme']; + } + } catch (PDOException $e) { + // Fehler ignorieren + } +} + +?> + + + + + + Plants + + + + + + + + + + +
+
+
+ +

Plants

+
+
+ + + +
+ + +
+
+
+
+ +
+
+
+
+ +
+
+ + +
+
+
+ +
+
+
+ + + + + + + + +
+
+ +
+ + + + + + + + +
+
+

Plants

+
+

Willkommen zurück!

Bitte logge dich ein, um deine Pflanzen zu sehen.

+
+
+
+ +
+

Noch kein Konto? Jetzt registrieren

+
+ +
+
+ + + + + + + diff --git a/plants/lexikon.js b/plants/lexikon.js new file mode 100644 index 0000000..252cdb5 --- /dev/null +++ b/plants/lexikon.js @@ -0,0 +1,200 @@ +// Version: 29.09.2025 16:05 +import * as api from './api.js'; + +// --- State-Variablen --- +let lexiconGrid; +let lexiconSearch; +let lexiconDetailModal; +let allPlants = []; + +// --- Hilfsfunktion, um das Modal-Element zu holen --- +function getModalElement() { + if (!lexiconDetailModal) { + lexiconDetailModal = document.getElementById('lexiconDetailModal'); + } + return lexiconDetailModal; +} + +// --- Hauptfunktionen für das Lexikon-Modal (exportiert) --- + +export async function openLexiconDetailModal(latinName) { + const modal = getModalElement(); + if (!modal) { + console.error("Lexikon-Detail-Modal nicht im DOM gefunden!"); + return; + } + + try { + const plant = await api.getLexiconEntryDetails(latinName); + + const mainImage = modal.querySelector('#lexiconModalImage'); + const placeholderImg = 'https://placehold.co/800x600/eeeeee/3D403D?text=' + encodeURIComponent(plant.name); + + modal.querySelector('#lexiconModalPlantName').textContent = plant.name; + modal.querySelector('#lexiconModalLatinName').textContent = plant.latin_name; + + const thumbnailContainer = modal.querySelector('.lexicon-modal-thumbnails'); + thumbnailContainer.innerHTML = ''; + + if (plant.photo_gallery && plant.photo_gallery.length > 0) { + mainImage.src = plant.photo_gallery[0]; + + if (plant.photo_gallery.length > 1) { + thumbnailContainer.style.display = 'flex'; + plant.photo_gallery.forEach((photoUrl, index) => { + const thumb = document.createElement('img'); + thumb.src = photoUrl; + thumb.className = 'thumbnail-img'; + if (index === 0) thumb.classList.add('active'); + thumb.addEventListener('click', (e) => { + mainImage.src = photoUrl; + thumbnailContainer.querySelectorAll('.thumbnail-img').forEach(t => t.classList.remove('active')); + e.target.classList.add('active'); + }); + thumbnailContainer.appendChild(thumb); + }); + } else { + thumbnailContainer.style.display = 'none'; + } + } else { + mainImage.src = placeholderImg; + thumbnailContainer.style.display = 'none'; + } + mainImage.onerror = function() { this.src = placeholderImg; }; + + const familySpan = modal.querySelector('#lexiconModalFamily'); + const genusSpan = modal.querySelector('#lexiconModalGenus'); + const metaContainer = modal.querySelector('.lexicon-modal-meta'); + const hasFamily = plant.plant_family && plant.plant_family.toLowerCase() !== 'unbekannt'; + const hasGenus = plant.plant_genus && plant.plant_genus.toLowerCase() !== 'unbekannt'; + familySpan.textContent = hasFamily ? plant.plant_family : ''; + familySpan.parentElement.style.display = hasFamily ? 'block' : 'none'; + genusSpan.textContent = hasGenus ? plant.plant_genus : ''; + genusSpan.parentElement.style.display = hasGenus ? 'block' : 'none'; + metaContainer.style.display = (hasFamily || hasGenus) ? 'flex' : 'none'; + + const descriptionContainer = modal.querySelector('.lexicon-modal-description'); + if (plant.description_full) { + const sections = plant.description_full.split(/\n\s*\n/); + let formattedHtml = ''; + sections.forEach(section => { + const parts = section.split(/:(.*)/s); + if (parts.length > 1) { + const title = parts[0].trim(); + const content = parts[1].trim(); + if (title && content) { + formattedHtml += `

${title}

${content.replace(/\n/g, '
')}

`; + } + } else if (section.trim()) { + formattedHtml += `

${section.trim().replace(/\n/g, '
')}

`; + } + }); + descriptionContainer.innerHTML = formattedHtml; + } else { + descriptionContainer.innerHTML = '

Keine Beschreibung verfügbar.

'; + } + + modal.classList.add('show'); + document.body.classList.add('modal-open'); + } catch (error) { + console.error('Fehler beim Laden der Pflanzendetails:', error); + // Hier könnte man dem User eine UI-Nachricht zeigen + } +} + +export function closeLexiconDetailModal() { + const modal = getModalElement(); + if (modal) { + modal.classList.remove('show'); + if (!document.querySelector('.modal.show')) { + document.body.classList.remove('modal-open'); + } + } +} + + +// --- Funktionen nur für die lexikon.php Seite --- + +async function loadLexiconOverview() { + try { + allPlants = await api.getLexiconEntries(); + renderLexiconOverview(allPlants); + } catch (error) { + console.error('Fehler beim Laden des Lexikons:', error); + if (lexiconGrid) { + lexiconGrid.innerHTML = '

Das Lexikon konnte nicht geladen werden.

'; + } + } +} + +function renderLexiconOverview(plants) { + if (!lexiconGrid) return; + lexiconGrid.innerHTML = ''; + if (plants.length === 0) { + lexiconGrid.innerHTML = '

Noch keine Einträge im Lexikon vorhanden.

'; + return; + } + plants.forEach(plant => { + const card = document.createElement('div'); + card.className = 'lexicon-card'; + card.dataset.latinName = plant.latin_name; + + const placeholderImg = 'https://placehold.co/600x600/eeeeee/3D403D?text=' + encodeURIComponent(plant.name); + + card.innerHTML = ` +
+ ${plant.name} +
+
+

${plant.name}

+

${plant.latin_name}

+
+ `; + lexiconGrid.appendChild(card); + }); +} + +function handleSearch() { + const searchTerm = lexiconSearch.value.toLowerCase(); + const filteredPlants = allPlants.filter(plant => + plant.name.toLowerCase().includes(searchTerm) || + plant.latin_name.toLowerCase().includes(searchTerm) + ); + renderLexiconOverview(filteredPlants); +} + +// --- Initialisierung --- +function init() { + // Diese DOM-Elemente gibt es NUR auf der lexikon.php + lexiconGrid = document.getElementById('lexicon-grid'); + lexiconSearch = document.getElementById('lexiconSearch'); + + // Wenn wir auf der Lexikon-Seite sind, initialisiere die Übersicht + if (lexiconGrid && lexiconSearch) { + loadLexiconOverview(); + lexiconSearch.addEventListener('input', handleSearch); + lexiconGrid.addEventListener('click', (e) => { + const card = e.target.closest('.lexicon-card'); + if (card) { + openLexiconDetailModal(card.dataset.latinName); + } + }); + } + + // Das Modal selbst kann auf beiden Seiten existieren + const modal = getModalElement(); + if (modal) { + const closeButton = modal.querySelector('.close-btn'); + if (closeButton) { + closeButton.addEventListener('click', closeLexiconDetailModal); + } + modal.addEventListener('click', (e) => { + if (e.target === modal) { + closeLexiconDetailModal(); + } + }); + } +} + +document.addEventListener('DOMContentLoaded', init); + diff --git a/plants/lexikon.php b/plants/lexikon.php new file mode 100644 index 0000000..884600b --- /dev/null +++ b/plants/lexikon.php @@ -0,0 +1,115 @@ +prepare("SELECT theme FROM users WHERE id = ?"); + $stmt->execute([$_SESSION['user_id']]); + $result = $stmt->fetch(); + if ($result && !empty($result['theme'])) { + $user_theme = $result['theme']; + } + } catch (PDOException $e) { + // Fehler ignorieren + } +} else { + // Wenn nicht eingeloggt, zur Hauptseite weiterleiten + header('Location: index.php'); + exit; +} + +?> + + + + + + Pflanzen-Lexikon + + + + + + + + +
+ +
+ +
+
+

Pflanzen-Lexikon

+

Durchsuche die von der Community geteilten Pflanzen und lerne mehr über sie.

+
+ +
+ +
+ +
+ +
+
+ + + + + + + + diff --git a/plants/main.js b/plants/main.js new file mode 100644 index 0000000..dcbac50 --- /dev/null +++ b/plants/main.js @@ -0,0 +1,381 @@ +// Version: 01.10.2025 15:30 (Fix DB Autofill Logic) +import * as api from './api.js'; +import * as ui from './ui.js'; +import * as lexicon from './lexikon.js'; + +// === Globaler Zustand === +const AppState = { + plants: [], + settings: {}, + incorrectGuesses: [], + currentView: 'grid', + currentSort: 'date_desc', + fullAiAnalysisResult: null, + pendingEnrichmentPromise: null +}; + +// === Haupt-Initialisierung === +async function loadInitialData() { + try { + const [plants, settings] = await Promise.all([ + api.getPlants(), + api.getUserSettings() + ]); + AppState.plants = plants; + AppState.settings = settings; + renderDashboard(); + } catch (error) { + console.error('Fehler beim Laden der Anfangsdaten:', error); + ui.showToast('App-Daten konnten nicht geladen werden.', true); + } +} + +function renderDashboard() { + const sortedPlants = sortPlants(AppState.plants, AppState.currentSort); + const dashboard = document.getElementById('plant-dashboard'); + if (dashboard) { + const useCompactView = window.matchMedia("(max-width: 768px)").matches && AppState.plants.length >= 3; + dashboard.classList.toggle('compact-view-enabled', useCompactView); + ui.renderPlantDashboard(sortedPlants, dashboard); + } +} + +function sortPlants(plants, sortValue) { + const sorted = [...plants]; + switch (sortValue) { + case 'name_asc': sorted.sort((a, b) => a.name.localeCompare(b.name)); break; + case 'watering_due': + sorted.sort((a, b) => { + const dateA = a.next_watering_due ? new Date(a.next_watering_due) : new Date('9999-12-31'); + const dateB = b.next_watering_due ? new Date(b.next_watering_due) : new Date('9999-12-31'); + return dateA - dateB; + }); + break; + default: // 'date_desc' + sorted.sort((a, b) => { + if (String(a.id).startsWith('temp-')) return -1; + if (String(b.id).startsWith('temp-')) return 1; + return b.id - a.id; + }); + break; + } + return sorted; +} + +// === Event Handler === + +function fileToBase64(file) { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => resolve(reader.result.split(',')[1]); + reader.onerror = error => reject(error); + }); +} + +// --- Dashboard & Globale Aktionen --- +async function handleDashboardClick(e) { + const actionElement = e.target.closest('[data-action]'); + if (!actionElement) return; + + if (actionElement.dataset.action === 'show-lexicon') { + e.preventDefault(); + e.stopPropagation(); + const latinName = actionElement.dataset.latinName; + if (latinName) lexicon.openLexiconDetailModal(latinName); + return; + } + + const card = e.target.closest('[data-id]'); + if (!card) return; + + const plantId = parseInt(card.dataset.id, 10); + const plant = AppState.plants.find(p => p.id === plantId); + if (!plant) return; + + switch (actionElement.dataset.action) { + case 'show-detail': ui.openPlantDetailOverlay(plant); break; + case 'flip': case 'flip-back': + e.target.closest('.plant-card-inner')?.classList.toggle('is-flipped'); + break; + case 'show-care-tips': e.target.closest('.plant-list-item')?.classList.toggle('tips-visible'); break; + case 'toggle-menu': + e.stopPropagation(); + const menuContainer = actionElement.closest('.menu-container'); + menuContainer.parentElement.closest('[data-id]')?.classList.add('menu-open'); + menuContainer.querySelector('.menu-dropdown')?.classList.toggle('show'); + break; + case 'edit': + ui.closePlantDetailOverlay(); + setTimeout(() => ui.openPlantModal(plant, getModalHandlers()), 50); + break; + case 'delete': + if (confirm(`Möchtest du "${plant.name}" wirklich löschen?`)) { + try { + await api.deletePlant(plantId); + ui.closePlantDetailOverlay(); + ui.showToast(`"${plant.name}" wurde gelöscht.`); + await loadInitialData(); + } catch (error) { ui.showToast('Löschen fehlgeschlagen.', true); } + } + break; + case 'water': case 'fertilize': + e.stopPropagation(); + actionElement.disabled = true; + actionElement.classList.add('is-loading'); + try { + const { plant: updatedPlant } = await api.recordCareAction(plantId, actionElement.dataset.action); + const plantIndex = AppState.plants.findIndex(p => p.id === plantId); + if (plantIndex !== -1) AppState.plants[plantIndex] = updatedPlant; + renderDashboard(); + if (document.getElementById('plantDetailOverlay').classList.contains('show')) ui.openPlantDetailOverlay(updatedPlant); + ui.showToast(actionElement.dataset.action === 'water' ? 'Gegossen!' : 'Gedüngt!'); + } catch (error) { ui.showToast(`Aktion fehlgeschlagen.`, true); + } finally { + actionElement.disabled = false; + actionElement.classList.remove('is-loading'); + } + break; + case 'open-diary': + ui.closePlantDetailOverlay(); + setTimeout(() => ui.openDiaryModal(plant), e.target.closest('.plant-detail-overlay') ? 300 : 0); + break; + } +} + +async function handleSaveSettings(settingsToUpdate) { + try { + await api.updateUserSettings(settingsToUpdate); + AppState.settings = {...AppState.settings, ...settingsToUpdate}; + ui.showToast('Einstellungen gespeichert!'); + } catch (error) { + ui.showToast('Einstellungen konnten nicht gespeichert werden.', true); + } +} + +// --- Modal-spezifische Handler --- +function getModalHandlers() { + return { + onPhotoSelect: handlePhotoSelection, + onAnalyze: handleAiAnalysis, + onLatinNameBlur: handleLatinNameBlur, + onSubmit: handlePlantFormSubmit + }; +} + +async function handlePhotoSelection(e) { + const plantPhotoInput = e.target; + if (plantPhotoInput.files && plantPhotoInput.files[0]) { + const reader = new FileReader(); + reader.onload = function() { + ui.showImagePreview(reader.result); + ui.showAiSection(); + ui.clearAiResults(document.getElementById('plantForm')); + AppState.incorrectGuesses = []; + } + reader.readAsDataURL(plantPhotoInput.files[0]); + } +} + +async function handleAiAnalysis() { + const plantPhotoInput = document.getElementById('plantPhoto'); + const analyzeBtn = document.getElementById('analyzeBtn'); + const plantForm = document.getElementById('plantForm'); + const file = plantPhotoInput.files[0]; + if (!file) return; + + analyzeBtn.disabled = true; + AppState.pendingEnrichmentPromise = null; + let cleanupAnimation = () => {}; + + try { + cleanupAnimation = ui.runAiAnimation(document.getElementById('imagePreviewContainer')); + const base64Image = await fileToBase64(file); + const fullAnalysis = await api.performInitialAnalysis(base64Image, AppState.incorrectGuesses); + AppState.fullAiAnalysisResult = fullAnalysis; + cleanupAnimation(); + + const identification = fullAnalysis.identification; + if (!identification || identification.name.toLowerCase() === 'unbekannt' || identification.confidence_score < 75) { + ui.showToast(identification?.identification_notes || 'Pflanze nicht sicher erkannt.', true); + } else { + ui.populateFormWithIdentification(plantForm, identification); + plantForm.querySelector('#aiFullResponse').value = JSON.stringify(fullAnalysis); + AppState.incorrectGuesses.push(identification.latin_name.trim().toLowerCase()); + document.getElementById('retryAiBtn').style.display = 'block'; + + const settings = AppState.settings; + const needsEnrichmentForUI = settings.auto_fill_watering || settings.auto_fill_fertilizing || settings.auto_fill_care_tips; + + // Definiere den Promise, der die Daten holt + const enrichmentPromise = api.getLexiconEntryDetails(identification.latin_name) + .catch(() => api.aiEnrich(identification.latin_name)); + + // Weise den Promise dem globalen Zustand zu, damit die Speicherfunktion darauf warten kann + AppState.pendingEnrichmentPromise = enrichmentPromise; + + // Führe die Logik aus, sobald der Promise erfüllt ist + enrichmentPromise.then(enrichmentData => { + if (enrichmentData) { + // Befülle das versteckte Feld IMMER + plantForm.querySelector('#aiEnrichmentResponse').value = JSON.stringify(enrichmentData); + + // Befülle die sichtbaren Felder NUR, wenn der Nutzer es wünscht + if (settings.auto_fill_watering && plantForm.querySelector('#wateringInterval').value === '') { + plantForm.querySelector('#wateringInterval').value = enrichmentData.watering_interval_days || ''; + } + if (settings.auto_fill_fertilizing && plantForm.querySelector('#fertilizingInterval').value === '') { + plantForm.querySelector('#fertilizingInterval').value = enrichmentData.fertilizing_interval_days || ''; + } + if (settings.auto_fill_care_tips && plantForm.querySelector('#careTips').value === '') { + plantForm.querySelector('#careTips').value = enrichmentData.care_tips || ''; + } + } + }).catch(err => console.error("Fehler bei der Datenanreicherung:", err)); + + // Zeige den Lade-Spinner NUR, wenn der Nutzer die Daten auch sehen will + if (needsEnrichmentForUI) { + ui.showEnrichmentLoader(true); + enrichmentPromise.finally(() => ui.showEnrichmentLoader(false)); + } + } + } catch (error) { + ui.showToast(error.message, true); + cleanupAnimation(); + } finally { + analyzeBtn.disabled = false; + } +} + +async function handleLatinNameBlur(e) { + const latinName = e.target.value.trim(); + if (latinName) { + try { + const lexiconEntry = await api.getLexiconEntryDetails(latinName); + // Hier nutzen wir dieselbe Logik wie oben, um die Felder basierend auf den Settings zu befüllen + const form = document.getElementById('plantForm'); + const settings = AppState.settings; + if (settings.auto_fill_watering && form.querySelector('#wateringInterval').value === '') { + form.querySelector('#wateringInterval').value = lexiconEntry.watering_interval_days || ''; + } + if (settings.auto_fill_fertilizing && form.querySelector('#fertilizingInterval').value === '') { + form.querySelector('#fertilizingInterval').value = lexiconEntry.fertilizing_interval_days || ''; + } + if (settings.auto_fill_care_tips && form.querySelector('#careTips').value === '') { + form.querySelector('#careTips').value = lexiconEntry.care_tips || ''; + } + form.querySelector('#aiEnrichmentResponse').value = JSON.stringify(lexiconEntry); + ui.showToast('Daten aus Lexikon geladen!', false); + } catch (error) { /* Kein Eintrag gefunden, still bleiben */ } + } +} + +function handlePlantFormSubmit(e) { + e.preventDefault(); + const form = e.target; + const formData = new FormData(form); + + const tempId = `temp-${Date.now()}`; + const tempPlant = { + id: tempId, + name: formData.get('name'), + photo: document.getElementById('imagePreview').src, + latin_name: formData.get('latin_name'), + watering_interval: null, + fertilizing_interval: null, + next_watering_due: null, + next_fertilizing_due: null, + care_tips: 'Wird geladen...' + }; + + AppState.plants.unshift(tempPlant); + renderDashboard(); + + ui.closePlantModal(); + ui.showToast('Pflanze wird gespeichert...'); + + (async () => { + try { + if (AppState.pendingEnrichmentPromise) { + await AppState.pendingEnrichmentPromise; + } + + const { plant: finalPlant } = await api.savePlant(new FormData(form)); + + const plantIndex = AppState.plants.findIndex(p => p.id === tempId); + if (plantIndex !== -1) { + AppState.plants[plantIndex] = finalPlant; + } else { + AppState.plants.shift(); + AppState.plants.unshift(finalPlant); + } + + renderDashboard(); + ui.showToast('Pflanze erfolgreich gespeichert!'); + + } catch (error) { + ui.showToast(`Speichern fehlgeschlagen: ${error.message}`, true); + AppState.plants = AppState.plants.filter(p => p.id !== tempId); + renderDashboard(); + } finally { + AppState.pendingEnrichmentPromise = null; + } + })(); +} + + +// === Initialisierung der globalen Listener === +function init() { + document.getElementById('addPlantBtn')?.addEventListener('click', () => ui.openPlantModal(null, getModalHandlers())); + document.getElementById('settingsBtn')?.addEventListener('click', async () => { + try { + const settings = await api.getUserSettings(); + AppState.settings = settings; + ui.openSettingsModal(settings, handleSaveSettings); + } catch(e){ ui.showToast("Einstellungen konnten nicht geladen werden.", true); } + }); + + document.getElementById('plant-dashboard')?.addEventListener('click', handleDashboardClick); + document.getElementById('sortSelect')?.addEventListener('change', (e) => { + AppState.currentSort = e.target.value; + renderDashboard(); + }); + + document.getElementById('viewGridBtn')?.addEventListener('click', () => { + AppState.currentView = 'grid'; + document.getElementById('plant-dashboard')?.classList.remove('list-view'); + document.getElementById('viewGridBtn')?.classList.add('active'); + document.getElementById('viewListBtn')?.classList.remove('active'); + }); + + document.getElementById('viewListBtn')?.addEventListener('click', () => { + AppState.currentView = 'list'; + document.getElementById('plant-dashboard')?.classList.add('list-view'); + document.getElementById('viewListBtn')?.classList.add('active'); + document.getElementById('viewGridBtn')?.classList.remove('active'); + }); + + const plantDetailOverlay = document.getElementById('plantDetailOverlay'); + plantDetailOverlay?.addEventListener('click', (e) => { + if (e.target === plantDetailOverlay) { + ui.closePlantDetailOverlay(); + } else { + handleDashboardClick(e); + } + }); + document.getElementById('plantDetailCloseBtn')?.addEventListener('click', ui.closePlantDetailOverlay); + + window.addEventListener('click', (e) => { + if (!e.target.closest('.menu-container')) { + document.querySelectorAll('.menu-dropdown.show').forEach(menu => { + menu.classList.remove('show'); + menu.closest('[data-id]')?.classList.remove('menu-open'); + }); + } + }); + + loadInitialData(); +} + +document.addEventListener('DOMContentLoaded', init); + diff --git a/plants/style.css b/plants/style.css new file mode 100644 index 0000000..ff86a29 --- /dev/null +++ b/plants/style.css @@ -0,0 +1,1314 @@ +/* Version: 01.10.2025 08:00 */ + +/* =============================================== */ +/* === GLOBALS, VARIABLES & BASE STYLES === */ +/* =============================================== */ +*, *::before, *::after { + box-sizing: border-box; +} + +:root { + --primary-color: #5E8C61; + --secondary-color: #81A182; + --background-color: #FCFCFC; + --surface-color: #FFFFFF; + --text-color: #3D403D; + --text-light: #9E9E9E; + --border-color: #EEEEEE; + --shadow-color: rgba(61, 64, 61, 0.07); + --shadow-color-hover: rgba(61, 64, 61, 0.12); + --status-red: #E57373; + --status-yellow: #FFB74D; + --status-blue: #64B5F6; + --milestone-bg-color: #fffbeb; + --font-family: 'Alan Sans', sans-serif; + --font-mono: 'Roboto Mono', monospace; + --border-radius: 12px; + --border-radius-large: 16px; +} + +/* Manually toggled Dark Mode */ +body[data-theme='dark'] { + --primary-color: #6a9f6d; + --background-color: #121212; + --surface-color: #1E1E1E; + --text-color: #E0E0E0; + --text-light: #8A8A8A; + --border-color: #333333; + --shadow-color: rgba(0, 0, 0, 0.2); + --shadow-color-hover: rgba(0, 0, 0, 0.3); + --milestone-bg-color: #2c2a22; +} + +/* Auto Dark Mode via System Settings */ +@media (prefers-color-scheme: dark) { + body[data-theme='auto'] { + --primary-color: #6a9f6d; + --background-color: #121212; + --surface-color: #1E1E1E; + --text-color: #E0E0E0; + --text-light: #8A8A8A; + --border-color: #333333; + --shadow-color: rgba(0, 0, 0, 0.2); + --shadow-color-hover: rgba(0, 0, 0, 0.3); + --milestone-bg-color: #2c2a22; + } +} + + +body { + font-family: var(--font-family); + background-color: var(--background-color); + color: var(--text-color); + margin: 0; + line-height: 1.6; + transition: background-color 0.3s ease, color 0.3s ease; +} + +body.modal-open { + overflow: hidden; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; +} + +/* --- Keyframe Animations --- */ +@keyframes fadeIn { + from { opacity: 0; transform: translateY(20px); } + to { opacity: 1; transform: translateY(0); } +} + +@keyframes pulse { + 0%, 100% { opacity: 0.7; } + 50% { opacity: 1; } +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + + +/* =============================================== */ +/* === AUTH PAGE (Login/Register) === */ +/* =============================================== */ +.auth-container { + display: flex; + align-items: center; + justify-content: center; + min-height: 100vh; + padding: 20px; +} +.auth-box { + width: 100%; + max-width: 400px; + background: var(--surface-color); + padding: 40px; + border-radius: var(--border-radius-large); + box-shadow: 0 10px 30px var(--shadow-color-hover); +} +.auth-box .logo-title-container { + justify-content: center; + margin-bottom: 25px; +} +.auth-box h2 { + text-align: center; + margin-top: 0; + margin-bottom: 5px; +} +.auth-subtitle { + text-align: center; + color: var(--text-light); + margin-top: 0; + margin-bottom: 30px; +} +.auth-switch { + text-align: center; + margin-top: 20px; + font-size: 0.9rem; +} +.auth-switch a { + color: var(--primary-color); + font-weight: 600; + text-decoration: none; +} +.auth-switch a:hover { + text-decoration: underline; +} + + +/* =============================================== */ +/* === HEADER & NAVIGATION === */ +/* =============================================== */ +.main-header { + background: var(--surface-color); + border-bottom: 1px solid var(--border-color); + padding: 10px 0; + margin-bottom: 15px; +} + +.main-header .container { + display: flex; + justify-content: space-between; + align-items: center; +} + +.logo-title-container { + display: flex; + align-items: center; + gap: 12px; + color: var(--primary-color); +} + +.header-logo { + height: 36px; + width: auto; +} + +.main-header h1 { + margin: 0; + font-weight: 700; +} + +.header-controls { + display: flex; + align-items: center; + gap: 15px; +} + +.header-button-group { + display: flex; + align-items: center; +} +.header-button-group > .add-btn { + margin: 0; + border-radius: 0; + position: relative; +} +.header-button-group > .add-btn:not(:last-child)::after { + content: ''; + position: absolute; + right: 0; + top: 25%; + bottom: 25%; + width: 1px; + background-color: rgba(255, 255, 255, 0.2); +} +.header-button-group > .add-btn:first-child { + border-top-left-radius: var(--border-radius); + border-bottom-left-radius: var(--border-radius); +} +.header-button-group > .add-btn:last-child { + border-top-right-radius: var(--border-radius); + border-bottom-right-radius: var(--border-radius); +} +.add-btn.icon-btn { + padding: 10px 12px; +} +.add-btn.icon-btn span { + display: none; +} +.add-btn span { + display: block; +} + + +/* =============================================== */ +/* === BUTTONS & TOASTS (Allgemein) === */ +/* =============================================== */ +.btn, .add-btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 10px 20px; + border: none; + border-radius: var(--border-radius); + background-color: var(--primary-color); + color: white; + font-family: var(--font-family); + font-size: 1rem; + line-height: 1.2; + cursor: pointer; + transition: background-color 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease; +} +.btn:hover, .add-btn:hover { + background-color: #537d56; + transform: translateY(-2px); + box-shadow: 0 4px 10px var(--shadow-color-hover); +} +.header-button-group > .add-btn:hover { + transform: translateY(0); +} +.btn:active, .add-btn:active { + transform: translateY(0) scale(0.97); + box-shadow: none; + transition-duration: 0.1s; +} +.btn.btn-secondary { + background-color: #e0e0e0; + color: #3D403D; +} +.btn.btn-secondary:hover { + background-color: #d0d0d0; +} +body[data-theme='dark'] .btn.btn-secondary { + background-color: #4a4a4a; + color: var(--text-color); +} +body[data-theme='dark'] .btn.btn-secondary:hover { + background-color: #5a5a5a; +} +.btn.btn-danger { + background-color: transparent; + color: var(--status-red); + border: 1px solid var(--status-red); +} +.btn.btn-danger:hover { + background-color: var(--status-red); + color: white; +} +.btn.btn-ai { + background-color: #8e44ad; + flex-grow: 1; + justify-content: center; + position: relative; + overflow: hidden; + min-height: 44.4px; +} +.btn.btn-ai:hover { + background-color: #7d3c98; +} +.btn:disabled, .btn:disabled:hover { + background-color: #cccccc; + color: #888; + cursor: not-allowed; + transform: none; + box-shadow: none; +} +.auth-btn { + width: 100%; + margin-top: 10px; +} +.btn-retry { + background: none; + border: none; + color: var(--primary-color); + cursor: pointer; + font-size: 0.8rem; + font-weight: 600; + padding: 0; + margin-top: 8px; + text-align: left; + display: block; + width: 100%; +} +.btn-retry:hover { + text-decoration: underline; +} + +.btn.is-loading { + color: transparent !important; + pointer-events: none; + position: relative; +} +.btn.is-loading::after { + content: ''; + display: block; + position: absolute; + left: 50%; + top: 50%; + width: 20px; + height: 20px; + margin-left: -10px; + margin-top: -10px; + border: 2px solid rgba(255, 255, 255, 0.5); + border-top-color: white; + border-radius: 50%; + animation: spin 0.8s linear infinite; +} + + +/* --- Toast Notification --- */ +.toast { + position: fixed; + bottom: 20px; + left: 50%; + transform: translateX(-50%) translateY(100px); + background-color: var(--primary-color); + color: white; + padding: 12px 25px; + border-radius: var(--border-radius); + box-shadow: 0 4px 15px rgba(0,0,0,0.2); + z-index: 2000; + opacity: 0; + transition: transform 0.3s ease, opacity 0.3s ease; + font-weight: 600; +} +.toast.show { + transform: translateX(-50%) translateY(0); + opacity: 1; +} +.toast.error { + background-color: var(--status-red); +} + + +/* =============================================== */ +/* === DASHBOARD LAYOUT & CONTROLS === */ +/* =============================================== */ +.dashboard-controls { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 25px; + gap: 15px; + flex-wrap: wrap; +} +.sort-container { + position: relative; +} +.sort-container select { + color:var(--text-light); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + padding: 8px 30px 8px 12px; + border-radius: 8px; + border: 1px solid var(--border-color); + background-color: var(--surface-color); + font-family: var(--font-family); + font-size: 0.9rem; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%239E9E9E' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 8px center; + background-size: 16px; +} +.view-toggle { + display: flex; + background-color: #f3f4f6; + border-radius: 8px; + padding: 4px; +} +body[data-theme='dark'] .view-toggle { + background-color: #121212; +} +.view-btn { + padding: 6px 10px; + border: none; + background-color: transparent; + border-radius: 6px; + cursor: pointer; + color: var(--text-light); + transition: background-color 0.2s, color 0.2s; +} +.view-btn.active { + background-color: var(--surface-color); + color: var(--primary-color); + box-shadow: 0 1px 3px var(--shadow-color); +} +.plant-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 30px; + transition: grid-template-columns 0.3s ease; +} +.plant-grid.list-view { + display: block; + grid-template-columns: 1fr; + gap: 15px; +} +.empty-state { + grid-column: 1 / -1; + text-align: center; + padding: 60px 20px; + background-color: var(--surface-color); + border-radius: var(--border-radius-large); + border: 2px dashed var(--border-color); +} +.empty-state h2 { + color: var(--primary-color); + margin-top: 0; +} +.empty-state p { + color: var(--text-light); + max-width: 400px; + margin: 10px auto 0; +} + +/* =============================================== */ +/* === LEXIKON PAGE === */ +/* =============================================== */ +.lexicon-intro { + text-align: center; + margin-bottom: 30px; + padding: 20px; + background-color: var(--surface-color); + border-radius: var(--border-radius-large); +} +.lexicon-intro h2 { + margin-top: 0; +} +.search-bar-container { + margin-bottom: 30px; +} +#lexiconSearch { + width: 100%; + padding: 15px 20px; + font-size: 1.1rem; + border-radius: var(--border-radius); + border: 1px solid var(--border-color); + background-color: var(--surface-color); + color: var(--text-color); +} +#lexiconSearch:focus { + outline: none; + border-color: var(--primary-color); + box-shadow: 0 0 0 3px rgba(94, 140, 97, 0.2); +} +.lexicon-card { + background-color: var(--surface-color); + border-radius: var(--border-radius-large); + overflow: hidden; + border: 1px solid var(--border-color); + box-shadow: 0 4px 10px var(--shadow-color); + transition: transform 0.2s ease, box-shadow 0.2s ease; + cursor: pointer; + opacity: 0; + transform: translateY(20px); + animation: fadeIn 0.5s ease-out forwards; +} +.lexicon-card:hover { + transform: translateY(-5px); + box-shadow: 0 8px 20px var(--shadow-color-hover); +} +.lexicon-card-img-container { + width: 100%; + aspect-ratio: 1 / 1; + overflow: hidden; +} +.lexicon-card-img { + width: 100%; + height: 100%; + object-fit: cover; + transition: transform 0.3s ease; +} +.lexicon-card:hover .lexicon-card-img { + transform: scale(1.05); +} +.lexicon-card-info { + padding: 15px 20px; +} +.lexicon-card-info h3 { + margin: 0 0 5px 0; + font-size: 1.2rem; +} +.lexicon-card-info p { + margin: 0; + font-style: italic; + color: var(--text-light); + font-size: 0.9rem; +} + + +/* =============================================== */ +/* === MODAL WINDOWS (General) === */ +/* =============================================== */ +.modal { + display: flex; + align-items: center; + justify-content: center; + position: fixed; + z-index: 1200; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + backdrop-filter: blur(5px); + transition: opacity 0.3s ease, visibility 0.3s ease; + opacity: 0; + visibility: hidden; +} +.modal.show { + opacity: 1; + visibility: visible; +} +.modal-content { + background-color: var(--surface-color); + margin: auto; + border: none; + width: 90%; + max-width: 500px; + border-radius: var(--border-radius-large); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); + transition: transform 0.3s ease; + transform: scale(0.95); + display: flex; + flex-direction: column; + max-height: 90vh; +} +.modal.show .modal-content { + transform: scale(1); +} +.modal-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 15px 25px; + border-bottom: 1px solid var(--border-color); + background-color: #fcfcfc; + flex-shrink: 0; +} +body[data-theme='dark'] .modal-header, +body[data-theme='dark'] .modal-footer { + background-color: #1a1a1a; +} +.modal-header h2 { + margin: 0; + font-size: 1.4rem; +} +.close-btn { + background: none; + border: none; + font-size: 2rem; + cursor: pointer; + color: var(--text-light); +} +.modal-body { + padding: 25px; + overflow-y: auto; +} +.modal-footer { + padding: 15px 25px; + border-top: 1px solid var(--border-color); + background-color: #fcfcfc; + flex-shrink: 0; +} + +/* --- Specific Modals --- */ +.settings-modal-content { + max-width: 420px; +} +.settings-modal-content .modal-body { + padding: 0; + background-color: var(--background-color); +} +.settings-profile-banner { + background: var(--surface-color); + padding: 25px; + display: flex; + flex-direction: column; + align-items: center; + gap: 15px; + border-bottom: 1px solid var(--border-color); +} +.settings-modal-content .modal-body > .settings-card { + margin: 15px; +} +.settings-card { + background: var(--surface-color); + border-radius: var(--border-radius-large); + padding: 20px; + border: 1px solid var(--border-color); +} +.settings-card:last-child { + margin-bottom: 0; +} +.settings-card h3 { + margin-top: 0; + margin-bottom: 18px; + font-size: 1.1rem; + color: var(--primary-color); +} +.profile-pic-container { + position: relative; + flex-shrink: 0; +} +.profile-pic { + width: 80px; + height: 80px; + border-radius: 50%; + object-fit: cover; + border: 3px solid var(--surface-color); + box-shadow: 0 2px 6px rgba(0,0,0,0.1); +} +.btn-change-pic { + position: absolute; + bottom: 2px; + right: 2px; + width: 28px; + height: 28px; + border-radius: 50%; + background: var(--primary-color); + color: white; + border: 2px solid white; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; +} +.profile-info { + display: flex; + align-items: center; + gap: 8px; +} +.profile-username { + font-size: 1.5rem; + font-weight: 600; +} +.btn-edit-username { + background: none; + border: none; + color: var(--text-light); + cursor: pointer; + padding: 5px; +} +.settings-row { + display: flex; + justify-content: space-between; + align-items: flex-start; /* Geändert von 'center' zu 'flex-start' für bessere Ausrichtung */ + margin-bottom: 15px; + gap: 15px; /* Fügt etwas Abstand hinzu */ +} + +.settings-row:last-child { + margin-bottom: 0; +} + +.settings-description { + font-size: 0.85rem; + color: var(--text-light); + margin: 4px 0 0 0; + line-height: 1.4; +} + +.settings-value { + font-weight: 600; + color: var(--text-color); +} +.toggle-switch { + position: relative; + display: inline-block; + width: 44px; + height: 24px; + flex-shrink: 0; /* NEU: Verhindert, dass der Schalter gequetscht wird */ + +} +.toggle-switch input { display: none; } +.slider { + position: absolute; + cursor: pointer; + top: 0; left: 0; right: 0; bottom: 0; + background-color: #767676; + transition: .4s; + border-radius: 24px; +} +.slider:before { + position: absolute; + content: ""; + height: 18px; width: 18px; + left: 3px; bottom: 3px; + background-color: white; + transition: .4s; + border-radius: 50%; +} +input:checked + .slider { background-color: var(--primary-color); } +input:checked + .slider:before { transform: translateX(20px); } +.theme-selector { + display: flex; + background-color: var(--background-color); + border-radius: 8px; + padding: 4px; + border: 1px solid var(--border-color); +} +.theme-btn { + padding: 4px 12px; + border: none; + background-color: transparent; + border-radius: 6px; + cursor: pointer; + color: var(--text-light); + transition: background-color 0.2s, color 0.2s; + font-family: var(--font-family); + font-size: 0.85rem; + font-weight: 600; +} +.theme-btn.active { + background-color: var(--surface-color); + color: var(--primary-color); + box-shadow: 0 1px 3px var(--shadow-color); +} +.full-width { + width: 100%; + margin-bottom: 10px; +} +.full-width:last-child { margin-bottom: 0; } +.danger-zone { + border-color: var(--status-red); +} +.danger-zone h3 { + color: var(--status-red); +} +.diary-modal-content { + max-width: 450px; + height: 85vh; + max-height: 750px; +} +.diary-modal-content .modal-body { + flex-grow: 1; + padding: 0; + display: flex; + flex-direction: column; + overflow: hidden; +} +#diaryContentWrapper { + overflow-y: auto; + padding: 0 25px 25px; +} +#diaryCameraView { + padding: 25px; + display: flex; + flex-direction: column; + justify-content: center; +} +.diary-timeline { + position: relative; + padding-left: 30px; + border-left: 2px solid var(--border-color); + margin-left: 15px; + padding-top: 10px; +} +.diary-date-header { + font-size: 0.8rem; + font-weight: 600; + color: var(--text-light); + background-color: var(--background-color); + padding: 2px 8px; + border-radius: 6px; + display: inline-block; + position: relative; + left: -48px; + margin-top: 25px; + margin-bottom: 20px; +} +.diary-date-header:first-of-type { + margin-top: 0; +} +.diary-entry { + position: relative; + margin-bottom: 20px; +} +.diary-icon { + position: absolute; + left: -48px; + top: 0; + width: 30px; + height: 30px; + border-radius: 50%; + background-color: var(--surface-color); + border: 2px solid var(--border-color); + display: flex; + align-items: center; + justify-content: center; + font-size: 1rem; + transition: all 0.2s ease; +} +.diary-entry-content { + background-color: var(--surface-color); + border: 1px solid var(--border-color); + border-radius: var(--border-radius); + padding: 12px 15px; + transition: all 0.2s ease; + position: relative; +} +.diary-entry.is-milestone .diary-entry-content { + background-color: var(--milestone-bg-color); + border-color: var(--status-yellow); +} +.diary-entry.is-milestone .diary-icon { + background-color: var(--status-yellow); + border-color: var(--status-yellow); + color: white; +} +.diary-entry-title { + font-weight: 600; + margin: 0 0 5px 0; +} +.diary-entry-notes { + font-size: 0.9rem; + color: var(--text-light); + margin: 0; +} +.diary-entry-time { + display: block; + text-align: right; + font-size: 0.75rem; + color: #aaa; + margin-top: 8px; +} +.diary-photo-container { + position: relative; + margin-top: 10px; + border-radius: var(--border-radius); + overflow: hidden; + aspect-ratio: 1 / 1; +} +.diary-photo { + width: 100%; + height: 100%; + object-fit: cover; + display: block; +} +.delete-diary-entry-btn { + position: absolute; + top: 8px; + right: 8px; + width: 30px; + height: 30px; + opacity: 0; + transition: opacity 0.2s; + color: var(--status-red); +} +.diary-entry-content:hover .delete-diary-entry-btn { + opacity: 0.8; +} +.diary-entry-content:hover .delete-diary-entry-btn:hover { + opacity: 1; +} +.set-profile-btn { + position: absolute; + top: 8px; + right: 42px; + opacity: 0; + transition: opacity 0.2s; +} +.diary-entry-content:hover .set-profile-btn { + opacity: 0.8; +} +.diary-entry-content:hover .set-profile-btn:hover { + opacity: 1; +} +.empty-diary { + text-align: center; + padding: 40px 0; + color: var(--text-light); +} +.diary-form .form-group { + margin-bottom: 10px; +} +.diary-input { + width: 100%; + padding: 10px; + border: 1px solid var(--border-color); + border-radius: 8px; + resize: vertical; + min-height: 40px; +} +.diary-form-options { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: 10px; + margin-bottom: 15px; +} +.diary-form-attachments { + display: flex; + gap: 10px; + align-items: center; +} +.diary-form .upload-area.small .btn { + padding: 8px 12px; + font-size: 0.9rem; +} +.diary-form-milestone { + font-size: 0.9rem; + display: flex; + align-items: center; + gap: 8px; + cursor: pointer; + font-weight: 600; + color: var(--text-color); +} +.diary-form-milestone input { + margin: 0; + cursor: pointer; + width: 16px; + height: 16px; +} +.diary-form button[type="submit"] { + width: 100%; +} + +/* =============================================== */ +/* === LEXIKON DETAIL MODAL === */ +/* =============================================== */ +.lexicon-detail-modal-content { + max-width: 700px; + width: 95%; +} +.lexicon-detail-modal-content .modal-body { + padding: 0; +} + +.lexicon-modal-layout { + display: flex; + flex-direction: column; +} +.lexicon-modal-image-gallery { + display: flex; + flex-direction: column; +} +.lexicon-modal-image-container { + width: 100%; + aspect-ratio: 4 / 3; + max-height: 40vh; + background-color: var(--background-color); + flex-shrink: 0; +} +.lexicon-modal-image-container img { + width: 100%; + height: 100%; + object-fit: cover; +} +.lexicon-modal-thumbnails { + display: flex; + gap: 10px; + padding: 10px; + overflow-x: auto; + background-color: var(--background-color); + border-top: 1px solid var(--border-color); +} +.thumbnail-img { + width: 60px; + height: 60px; + object-fit: cover; + border-radius: var(--border-radius); + cursor: pointer; + border: 2px solid transparent; + transition: border-color 0.2s ease, opacity 0.2s ease; + opacity: 0.7; + flex-shrink: 0; +} +.thumbnail-img:hover { + opacity: 1; +} +.thumbnail-img.active { + border-color: var(--primary-color); + opacity: 1; +} +body[data-theme='dark'] .lexicon-modal-thumbnails { + background-color: #2a2a2a; +} +@media (prefers-color-scheme: dark) { + body[data-theme='auto'] .lexicon-modal-thumbnails { + background-color: #2a2a2a; + } +} +.lexicon-modal-info { + padding: 25px 30px 30px; +} +.lexicon-modal-latin { + display: block; + font-size: 1rem; + color: var(--text-light); + margin-top: -10px; + margin-bottom: 20px; +} +.lexicon-modal-info h2 { + margin-top: 0; + margin-bottom: 10px; + font-size: 1.8rem; +} +.lexicon-modal-meta { + display: flex; + gap: 25px; + background-color: var(--background-color); + padding: 15px 20px; + border-radius: var(--border-radius); + margin-bottom: 25px; + border: 1px solid var(--border-color); +} +.lexicon-modal-meta div { + font-size: 0.95rem; +} +.lexicon-modal-meta strong { + display: block; + color: var(--text-light); + font-weight: 600; + margin-bottom: 3px; + font-size: 0.8rem; + text-transform: uppercase; +} +body[data-theme='dark'] .lexicon-modal-meta { + background-color: #2a2a2a; +} +@media (prefers-color-scheme: dark) { + body[data-theme='auto'] .lexicon-modal-meta { + background-color: #2a2a2a; + } +} + + +.lexicon-modal-description p { + margin-top: 0; + margin-bottom: 1em; + font-size: 1rem; + line-height: 1.7; +} +.lexicon-modal-description h3 { + font-weight: 600; + font-size: 1.2rem; + display: block; + margin-top: 1.8em; + margin-bottom: 0.6em; + color: var(--primary-color); + padding-bottom: 5px; + border-bottom: 1px solid var(--border-color); +} +.lexicon-modal-description p:first-of-type + h3 { + margin-top: 0; +} + + +/* =============================================== */ +/* === FORMS (General) & CAMERA VIEW === */ +/* =============================================== */ +.form-group { + margin-bottom: 20px; +} +#ai-analysis-section { + display: flex; + gap: 10px; + align-items: center; +} +#ai-analysis-section .btn-ai { + width: 100%; +} +.form-group label { + display: block; + margin-bottom: 8px; + font-weight: 600; + font-size: 0.9rem; + display: flex; + align-items: center; + gap: 8px; +} +.form-group input, .form-group textarea { + width: 100%; + padding: 12px; + border: 1px solid var(--border-color); + border-radius: 8px; + font-family: var(--font-family); + box-sizing: border-box; + transition: border-color 0.2s, box-shadow 0.2s; + background-color: var(--surface-color); + color: var(--text-color); +} +.form-group input:focus, .form-group textarea:focus { + outline: none; + border-color: var(--primary-color); + box-shadow: 0 0 0 3px rgba(94, 140, 97, 0.2); +} +.form-group-upload { + margin-bottom: 20px; +} +.upload-area { display: flex; align-items: center; justify-content: center; gap: 10px; } +.image-preview-wrapper { + position: relative; + border-radius: var(--border-radius); + overflow: hidden; + border: 1px solid var(--border-color); + width: 100%; + max-width: 350px; + margin: 0 auto; + aspect-ratio: 1 / 1; + background-color: var(--background-color); +} +.image-preview-wrapper.small { + width: 100px; + margin-right: auto; + margin-left: 0; +} +.image-preview-wrapper img { + width: 100%; + height: 100%; + object-fit: cover; + display: block; +} +.preview-actions { + position: absolute; + bottom: 10px; + right: 10px; + display: flex; + gap: 8px; +} +.preview-actions label.card-btn { + padding: 0; +} +.remove-photo-btn { + position: absolute; + top: 5px; + right: 5px; + width: 28px; + height: 28px; + border-radius: 50%; + border: none; + background-color: rgba(0, 0, 0, 0.6); + color: white; + font-size: 1.2rem; + line-height: 1; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; +} +.video-container { + position: relative; + width: 100%; + border-radius: var(--border-radius); + overflow: hidden; + background: #000; + aspect-ratio: 1 / 1; +} +.video-container video { + width: 100%; + height: 100%; + object-fit: cover; + display: block; +} +.viewfinder-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + pointer-events: none; +} +.viewfinder-corner { + position: absolute; + width: 30px; + height: 30px; + border: 4px solid rgba(255, 255, 255, 0.8); +} +.viewfinder-corner.top-left { + top: 25px; left: 25px; + border-right: none; border-bottom: none; + border-top-left-radius: 8px; +} +.viewfinder-corner.top-right { + top: 25px; right: 25px; + border-left: none; border-bottom: none; + border-top-right-radius: 8px; +} +.viewfinder-corner.bottom-left { + bottom: 25px; left: 25px; + border-right: none; border-top: none; + border-bottom-left-radius: 8px; +} +.viewfinder-corner.bottom-right { + bottom: 25px; right: 25px; + border-left: none; border-top: none; + border-bottom-right-radius: 8px; +} +.viewfinder-focus-point { + position: absolute; + top: 50%; left: 50%; + width: 24px; height: 24px; + border: 4px solid rgba(255, 255, 255, 0.9); + border-radius: 50%; + transform: translate(-50%, -50%); +} +.camera-controls { + margin-top: 15px; + display: flex; + justify-content: center; +} + +.enrichment-loader { + width: 16px; + height: 16px; + border: 2px solid var(--primary-color); + border-bottom-color: transparent; + border-radius: 50%; + display: inline-block; + box-sizing: border-box; + animation: spin 1s linear infinite; +} + +/* =============================================== */ +/* === AI SCANNING ANIMATION (v2) === */ +/* =============================================== */ +@keyframes pulse-color { + 0% { + filter: invert(0); + } + 50% { + filter: invert(1); + } + 100% { + filter: invert(0); + } +} + +@keyframes ai-loader-anim { + 0%,10% {border-radius:0} + 30%,40% {border-radius:50% 0} + 60%,70% {border-radius:50%} + 90%,100% {border-radius:0 50%} +} + +.ai-animation-overlay { + position: absolute; + inset: 0; + background-color: rgba(0,0,0,0.5); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + pointer-events: none; + opacity: 0; + transition: opacity 0.3s ease; + z-index: 2; +} +.image-preview-wrapper.scanning .ai-animation-overlay { + opacity: 1; +} +.image-preview-wrapper.scanning #imagePreview { + animation: pulse-color 6s infinite ease-in-out; +} + +.ai-loader { + width: 90px; + aspect-ratio: 1; + display: grid; +} +.ai-loader:before, +.ai-loader:after { + content: ""; + grid-area: 1/1; + width: 42px; + aspect-ratio: 1; + box-shadow: 0 0 0 3px #fff inset; + filter: drop-shadow(48px 48px 0 #fff); + animation: ai-loader-anim 2s infinite alternate; +} +.ai-loader:after { + margin: 0 0 0 auto; + filter: drop-shadow(-48px 48px 0 #fff); + animation-delay: -1s; +} + +.ai-analysis-text { + position: absolute; + top: 20px; + left: 10px; + right: 10px; + font-weight:300; + color: white; + text-shadow: 0 0 2px rgba(0,0,0,0.7); + text-align: center; +} + diff --git a/plants/test.html b/plants/test.html new file mode 100644 index 0000000..747e521 --- /dev/null +++ b/plants/test.html @@ -0,0 +1,82 @@ + + + + + + Benachrichtigungs-Test + + + +
+

Test für Browser-Benachrichtigungen

+

Klicke auf den Knopf, um eine Test-Benachrichtigung auszulösen.

+ +
+ + + + diff --git a/plants/test_prompt.php b/plants/test_prompt.php new file mode 100644 index 0000000..3d386a5 --- /dev/null +++ b/plants/test_prompt.php @@ -0,0 +1,228 @@ + + + + + + + Prompt-Vergleich + + + + +

Prompt-Vergleich

+

Lade ein Bild hoch und vergleiche die Ergebnisse mit dem alten und dem neuen Prompt.

+ +
+ + +
+ + + +
+
+

Alter Prompt

+
+
+
+

Finaler Profi-Prompt (V6)

+
+
+
+ + + + + diff --git a/plants/ui.js b/plants/ui.js new file mode 100644 index 0000000..087a963 --- /dev/null +++ b/plants/ui.js @@ -0,0 +1,553 @@ +// Version: 01.10.2025 11:30 (FINAL LEXICON FIX) +import * as api from './api.js'; + +// === Zustandsvariablen für Event Listener === +let activeModalListeners = new Map(); +let settingsDebounceTimer = null; +let pendingSettings = {}; + +// === Hilfsfunktionen für Event Listener === +function addManagedListener(element, event, handler) { + if (element) { + element.addEventListener(event, handler); + if (!activeModalListeners.has(element)) { + activeModalListeners.set(element, []); + } + activeModalListeners.get(element).push({ event, handler }); + } +} + +function removeAllManagedListeners() { + activeModalListeners.forEach((listeners, element) => { + listeners.forEach(({ event, handler }) => { + element.removeEventListener(event, handler); + }); + }); + activeModalListeners.clear(); +} + +// === Allgemeine UI-Funktionen === +export function showToast(message, isError = false) { + const toast = document.createElement('div'); + toast.className = `toast ${isError ? 'error' : ''}`; + toast.textContent = message; + document.body.appendChild(toast); + setTimeout(() => toast.classList.add('show'), 10); + setTimeout(() => { + toast.classList.remove('show'); + setTimeout(() => document.body.removeChild(toast), 300); + }, 3000); +} + +// === Pflanzen-Dashboard & Karten === +export function renderPlantDashboard(plants, dashboardElement) { + dashboardElement.innerHTML = ''; + const dashboardControls = document.querySelector('.dashboard-controls'); + + if (plants.length === 0) { + dashboardElement.innerHTML = `

Noch keine Pflanzen hier!

Klicke oben auf "hinzufügen", um deine grüne Oase zu starten.

`; + if (dashboardControls) dashboardControls.style.display = 'none'; + return; + } + + if (dashboardControls) dashboardControls.style.display = 'flex'; + + plants.forEach(plant => { + dashboardElement.appendChild(createPlantCardElement(plant)); + dashboardElement.appendChild(createPlantListItemElement(plant)); + dashboardElement.appendChild(createPlantCompactCardElement(plant)); + }); +} + +function formatLastDate(dateString) { + if (!dateString || dateString === '0000-00-00') return ''; + const lastDate = new Date(dateString); + const today = new Date(); + today.setHours(0, 0, 0, 0); + const yesterday = new Date(today); + yesterday.setDate(today.getDate() - 1); + lastDate.setHours(0, 0, 0, 0); + if (lastDate.getTime() === today.getTime()) return 'heute'; + if (lastDate.getTime() === yesterday.getTime()) return 'gestern'; + return `am ${lastDate.toLocaleString('de-DE', { day: '2-digit', month: '2-digit' })}`; +} + +function createPlantCardHTML(plant) { + const today = new Date(); + today.setHours(0, 0, 0, 0); + const msPerDay = 1000 * 60 * 60 * 24; + + const getProgress = (diff, interval) => { + if (diff <= 0) return { percent: 100, status: 'red' }; + if (diff >= interval) return { percent: 0, status: 'green' }; + return { percent: 100 - ((diff / interval) * 100), status: (diff / interval) < 0.25 ? 'yellow' : 'green' }; + }; + + const getStatusText = (days, compact = false) => { + if (days < 0) return `fällig!`; + if (days === 0) return `heute`; + if (days === 1) return `morgen`; + return `in ${days} ${compact ? 'T.' : 'Tagen'}`; + }; + + let waterButtonHTML, compactWaterPillHTML; + if (plant.watering_interval > 0 && plant.next_watering_due) { + const nextWatering = new Date(plant.next_watering_due + 'T00:00:00'); + const diff = Math.round((nextWatering - today) / msPerDay); + const progress = getProgress(diff, plant.watering_interval); + waterButtonHTML = ``; + compactWaterPillHTML = ``; + } else { + waterButtonHTML = ``; + compactWaterPillHTML = ``; + } + + let fertilizeButtonHTML, compactFertilizePillHTML; + if (plant.fertilizing_interval > 0 && plant.next_fertilizing_due) { + const nextFertilizing = new Date(plant.next_fertilizing_due + 'T00:00:00'); + const diff = Math.round((nextFertilizing - today) / msPerDay); + const progress = getProgress(diff, plant.fertilizing_interval); + fertilizeButtonHTML = ``; + compactFertilizePillHTML = ``; + } else { + fertilizeButtonHTML = ``; + compactFertilizePillHTML = ``; + } + + const placeholderImg = 'https://placehold.co/600x600/eeeeee/3D403D?text=' + encodeURIComponent(plant.name); + let tipsContentHTML = plant.latin_name ? `
Botanisch: ${plant.latin_name}
Mehr erfahren →
` : ''; + if (plant.care_tips) { + tipsContentHTML += plant.care_tips.split(/\n\s*\n/).map(tip => `

${tip.replace(/(\p{Emoji}[^:]+:)/gu, '$1')}

`).join(''); + } + if (!plant.care_tips && !plant.latin_name) { + tipsContentHTML = '

Keine Pflegetipps hinterlegt.

'; + } + + return { waterButtonHTML, fertilizeButtonHTML, placeholderImg, tipsContentHTML, compactWaterPillHTML, compactFertilizePillHTML }; +} + +function createPlantCardElement(plant) { + const cardWrapper = document.createElement('div'); + cardWrapper.className = 'plant-card'; + cardWrapper.dataset.id = plant.id; + const { waterButtonHTML, fertilizeButtonHTML, placeholderImg, tipsContentHTML } = createPlantCardHTML(plant); + cardWrapper.innerHTML = `
${plant.name}

${plant.name}

${waterButtonHTML}${fertilizeButtonHTML}
${(plant.care_tips || plant.latin_name) ? `` : ''}

${plant.name}

${tipsContentHTML}
Zum Umdrehen klicken
`; + return cardWrapper; +} + +function createPlantListItemElement(plant) { + const listItem = document.createElement('div'); + listItem.className = 'plant-list-item'; + listItem.dataset.id = plant.id; + const { waterButtonHTML, fertilizeButtonHTML, placeholderImg, tipsContentHTML } = createPlantCardHTML(plant); + listItem.innerHTML = `
${plant.name}

${plant.name}

${waterButtonHTML}${fertilizeButtonHTML}
${(plant.care_tips || plant.latin_name) ? `` : ''}
${tipsContentHTML}
`; + return listItem; +} + +function createPlantCompactCardElement(plant) { + const cardWrapper = document.createElement('div'); + cardWrapper.className = 'plant-compact-card'; + cardWrapper.dataset.id = plant.id; + const { placeholderImg, compactWaterPillHTML, compactFertilizePillHTML } = createPlantCardHTML(plant); + cardWrapper.innerHTML = `
${plant.name}
${plant.name}
${compactWaterPillHTML}${compactFertilizePillHTML}
`; + return cardWrapper; +} + +// === Pflanzen-Modal === +export function openPlantModal(plant = null, handlers = {}) { + const plantModal = document.getElementById('plantModal'); + const plantForm = document.getElementById('plantForm'); + if (!plantModal || !plantForm) return; + + plantForm.reset(); + clearAiResults(plantForm); + + if (plant) { + plantModal.querySelector('#modalTitle').textContent = 'Pflanze bearbeiten'; + document.getElementById('ai-analysis-section').style.display = 'none'; + plantForm.querySelector('#plantId').value = plant.id; + plantForm.querySelector('#plantName').value = plant.name; + plantForm.querySelector('#latinName').value = plant.latin_name || ''; + plantForm.querySelector('#wateringInterval').value = plant.watering_interval > 0 ? plant.watering_interval : ''; + plantForm.querySelector('#fertilizingInterval').value = plant.fertilizing_interval > 0 ? plant.fertilizing_interval : ''; + plantForm.querySelector('#careTips').value = plant.care_tips || ''; + plantForm.querySelector('#currentPhoto').value = plant.photo || ''; + if (plant.photo) showImagePreview(plant.photo); + else { + document.getElementById('initialUploadArea').style.display = 'flex'; + document.getElementById('imagePreviewContainer').style.display = 'none'; + } + } else { + plantModal.querySelector('#modalTitle').textContent = 'Neue Pflanze hinzufügen'; + document.getElementById('ai-analysis-section').style.display = 'none'; + document.getElementById('initialUploadArea').style.display = 'flex'; + document.getElementById('imagePreviewContainer').style.display = 'none'; + } + + addManagedListener(plantForm, 'submit', handlers.onSubmit); + addManagedListener(document.getElementById('plantPhoto'), 'change', handlers.onPhotoSelect); + addManagedListener(document.getElementById('analyzeBtn'), 'click', handlers.onAnalyze); + addManagedListener(document.getElementById('retryAiBtn'), 'click', handlers.onAnalyze); + addManagedListener(document.getElementById('latinName'), 'blur', handlers.onLatinNameBlur); + addManagedListener(document.getElementById('startCameraBtn'), 'click', () => startCamera('main')); + addManagedListener(document.getElementById('retakePhotoBtn'), 'click', () => startCamera('main')); + addManagedListener(document.getElementById('captureBtn'), 'click', () => capturePhoto('main')); + addManagedListener(plantModal.querySelector('.close-btn'), 'click', closePlantModal); + addManagedListener(plantModal, 'click', (e) => { if (e.target === plantModal) closePlantModal(); }); + + plantModal.classList.add('show'); + document.body.classList.add('modal-open'); +} + +export function closePlantModal() { + const plantModal = document.getElementById('plantModal'); + if (plantModal) { + stopCamera('main'); + removeAllManagedListeners(); + plantModal.classList.remove('show'); + if (!document.querySelector('.modal.show')) { + document.body.classList.remove('modal-open'); + } + } +} + +// === Detail Overlay (Mobile) === +export function openPlantDetailOverlay(plant) { + const plantDetailOverlay = document.getElementById('plantDetailOverlay'); + const plantDetailContent = document.getElementById('plantDetailContent'); + if (plantDetailOverlay && plantDetailContent) { + plantDetailContent.innerHTML = ''; + plantDetailContent.appendChild(createPlantCardElement(plant)); + plantDetailOverlay.classList.add('show'); + document.body.classList.add('modal-open'); + } +} + +export function closePlantDetailOverlay() { + const plantDetailOverlay = document.getElementById('plantDetailOverlay'); + if (plantDetailOverlay) { + plantDetailOverlay.classList.remove('show'); + if (!document.querySelector('.modal.show')) { + document.body.classList.remove('modal-open'); + } + } +} + +// === KI UI-Funktionen === +export function showAiSection() { + document.getElementById('ai-analysis-section').style.display = 'flex'; +} + +export function clearAiResults(form) { + if (!form) return; + form.querySelectorAll('input[name^="ai_"]').forEach(el => el.value = ''); + document.getElementById('retryAiBtn').style.display = 'none'; + showEnrichmentLoader(false); +} + +export function runAiAnimation(container) { + if(!container) return () => {}; + const analysisTextElement = container.querySelector('.ai-analysis-text'); + const analysisMessages = ["Initialisiere Scan", "Analysiere Blattform", "Extrahiere Merkmale", "Vergleiche Datenbank", "Bestimme Gattung", "Finalisiere..."]; + let messageIndex = 0; + + container.classList.add('scanning'); + if(analysisTextElement) analysisTextElement.textContent = analysisMessages[messageIndex]; + + const textInterval = setInterval(() => { + messageIndex = (messageIndex + 1) % analysisMessages.length; + if(analysisTextElement) analysisTextElement.textContent = analysisMessages[messageIndex]; + }, 1500); + + return function cleanup() { + clearInterval(textInterval); + container.classList.remove('scanning'); + }; +} + +function ensureEnrichmentLoaders() { + ['wateringInterval', 'fertilizingInterval', 'careTips'].forEach(fieldId => { + const label = document.querySelector(`label[for="${fieldId}"]`); + if (label && !label.querySelector('.enrichment-loader')) { + const loader = document.createElement('span'); + loader.className = 'enrichment-loader'; + loader.style.display = 'none'; + label.appendChild(loader); + } + }); +} + +export function showEnrichmentLoader(isLoading) { + ensureEnrichmentLoaders(); + document.querySelectorAll('.enrichment-loader').forEach(loader => { + loader.style.display = isLoading ? 'inline-block' : 'none'; + }); +} + +export function populateFormWithIdentification(form, idData) { + form.querySelector('#plantName').value = idData.name || ''; + form.querySelector('#latinName').value = idData.latin_name || ''; +} + +export function populateFormWithEnrichment(form, enrichmentData, settings) { + if (settings.auto_fill_watering && form.querySelector('#wateringInterval').value === '') { + form.querySelector('#wateringInterval').value = enrichmentData.watering_interval_days || ''; + } + if (settings.auto_fill_fertilizing && form.querySelector('#fertilizingInterval').value === '') { + form.querySelector('#fertilizingInterval').value = enrichmentData.fertilizing_interval_days || ''; + } + if (settings.auto_fill_care_tips && form.querySelector('#careTips').value === '') { + form.querySelector('#careTips').value = enrichmentData.care_tips || ''; + } + + const enrichmentField = form.querySelector('input[name="ai_enrichment_json"]'); + if (enrichmentField) { + enrichmentField.value = JSON.stringify(enrichmentData); + } +} + +// === Tagebuch-Modal === +export function openDiaryModal(plant) { + const diaryModal = document.getElementById('diaryModal'); + if(!diaryModal) return; + + diaryModal.querySelector('#diaryPlantName').textContent = plant.name; + diaryModal.querySelector('#diaryPlantId').value = plant.id; + document.getElementById('diaryForm')?.reset(); + removeDiaryPhoto(); + + const diaryContent = document.getElementById('diaryContent'); + if(diaryContent) diaryContent.innerHTML = '

Lade Einträge...

'; + + api.getDiaryEntries(plant.id) + .then(entries => renderDiaryEntries(entries, plant.id)) + .catch(() => { + if(diaryContent) diaryContent.innerHTML = '

Einträge konnten nicht geladen werden.

'; + showToast('Tagebuch konnte nicht geladen werden.', true); + }); + + addManagedListener(document.getElementById('diaryForm'), 'submit', handleDiaryFormSubmit); + addManagedListener(diaryModal.querySelector('.close-btn'), 'click', closeDiaryModal); + addManagedListener(diaryModal, 'click', (e) => { if (e.target === diaryModal) closeDiaryModal(); }); + + diaryModal.classList.add('show'); + document.body.classList.add('modal-open'); +} + +async function handleDiaryFormSubmit(e) { + e.preventDefault(); + const diaryForm = document.getElementById('diaryForm'); + const saveBtn = diaryForm.querySelector('button[type="submit"]'); + saveBtn.disabled = true; + try { + const result = await api.addDiaryEntry(new FormData(diaryForm)); + if(result.success) { + showToast('Eintrag gespeichert!'); + const plantId = result.entry.plant_id; + const entries = await api.getDiaryEntries(plantId); + renderDiaryEntries(entries, plantId); + diaryForm.reset(); + removeDiaryPhoto(); + } else { throw new Error(result.error); } + } catch (error) { showToast('Eintrag konnte nicht gespeichert werden.', true); + } finally { + saveBtn.disabled = false; + } +} + + +export function closeDiaryModal() { + const diaryModal = document.getElementById('diaryModal'); + if (diaryModal) { + stopCamera('diary'); + removeAllManagedListeners(); + diaryModal.classList.remove('show'); + if (!document.querySelector('.modal.show')) { + document.body.classList.remove('modal-open'); + } + } +} + +export function renderDiaryEntries(entries, plantId) { + const diaryContent = document.getElementById('diaryContent'); + if (!diaryContent) return; + diaryContent.innerHTML = ''; + if (entries.length === 0) { + diaryContent.innerHTML = '

Noch keine Einträge vorhanden.

'; + return; + } + const groupedEntries = entries.reduce((acc, entry) => { + const date = new Date(entry.entry_date).toLocaleDateString('de-DE', { year: 'numeric', month: 'long', day: 'numeric' }); + if (!acc[date]) acc[date] = []; + acc[date].push(entry); + return acc; + }, {}); + for (const date in groupedEntries) { + const dateHeader = document.createElement('h4'); + dateHeader.className = 'diary-date-header'; + dateHeader.textContent = date; + diaryContent.appendChild(dateHeader); + groupedEntries[date].forEach(entry => diaryContent.appendChild(createDiaryEntryElement(entry, plantId))); + } +} + +function createDiaryEntryElement(entry, plantId) { + const div = document.createElement('div'); + div.className = `diary-entry ${entry.entry_type === 'milestone' ? 'is-milestone' : ''}`; + div.dataset.plantId = plantId; + div.dataset.entryId = entry.id; + if(entry.photo) div.dataset.photo = entry.photo; + const icons = { manual: '📝', watered: '💧', fertilized: '🌱', milestone: '⭐', added: '🎉' }; + const titles = { manual: 'Notiz', watered: 'Gegossen', fertilized: 'Gedüngt', milestone: 'Meilenstein', added: 'Pflanze hinzugefügt' }; + let effectiveType = (entry.entry_type === 'milestone' && entry.notes === 'Pflanze hinzugefügt') ? 'added' : entry.entry_type; + let photoHTML = entry.photo ? `
` : ''; + div.innerHTML = `
${icons[effectiveType] || '📌'}

${titles[effectiveType] || 'Eintrag'}

${(entry.notes && effectiveType !== 'added') ? `

${entry.notes.replace(/\n/g, '
')}

` : ''}${photoHTML}${new Date(entry.entry_date).toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit' })}
`; + return div; +} + +export function removeDiaryPhoto() { + const diaryPhotoInput = document.getElementById('diaryPhoto'); + if(diaryPhotoInput) diaryPhotoInput.value = ''; + document.getElementById('diaryImagePreviewContainer').style.display = 'none'; + document.getElementById('diaryInitialUploadArea').style.display = 'flex'; +} + +// === Settings Modal --- +function handleSettingsChange(e, onSave) { + const target = e.target; + let key, value; + if (target.matches('.toggle-switch input')) { + key = target.id.replace(/-/g, '_'); + value = target.checked; + } else if (target.matches('.theme-btn')) { + key = 'theme'; + value = target.dataset.theme; + document.body.dataset.theme = value; + document.querySelectorAll('.theme-btn').forEach(btn => btn.classList.remove('active')); + target.classList.add('active'); + } else { + return; + } + pendingSettings[key] = value; + clearTimeout(settingsDebounceTimer); + settingsDebounceTimer = setTimeout(() => { + if (Object.keys(pendingSettings).length > 0) { + onSave(pendingSettings); + pendingSettings = {}; + } + }, 750); +} + +export function openSettingsModal(data, onSave) { + const modal = document.getElementById('settingsModal'); + if (modal) { + populateSettingsModal(data); + addManagedListener(modal, 'change', (e) => handleSettingsChange(e, onSave)); + addManagedListener(modal, 'click', (e) => handleSettingsChange(e, onSave)); + addManagedListener(modal.querySelector('.close-btn'), 'click', closeSettingsModal); + addManagedListener(modal, 'click', (e) => { if(e.target === modal) closeSettingsModal(); }); + modal.classList.add('show'); + document.body.classList.add('modal-open'); + } +} + +export function closeSettingsModal() { + const modal = document.getElementById('settingsModal'); + if (modal) { + removeAllManagedListeners(); + modal.classList.remove('show'); + if (!document.querySelector('.modal.show')) { + document.body.classList.remove('modal-open'); + } + } +} + +function populateSettingsModal(data) { + if (!data) return; + const safeSet = (id, property, value) => { + const el = document.getElementById(id); + if (el) el[property] = value; + }; + safeSet('settings-profile-pic', 'src', data.profile_image || `https://placehold.co/100x100/eeeeee/3D403D?text=${data.username.charAt(0)}`); + safeSet('settings-username', 'textContent', data.username); + safeSet('stats-plant-count', 'textContent', data.plant_count); + safeSet('stats-ai-credits', 'textContent', data.ai_credits); + safeSet('allow-photo-sharing', 'checked', data.allow_photo_sharing == 1); + safeSet('auto-fill-watering', 'checked', data.auto_fill_watering == 1); + safeSet('auto-fill-fertilizing', 'checked', data.auto_fill_fertilizing == 1); + safeSet('auto-fill-care-tips', 'checked', data.auto_fill_care_tips == 1); + document.querySelectorAll('.theme-btn').forEach(btn => { + btn.classList.toggle('active', btn.dataset.theme === data.theme); + }); +} + +// === Kamera UI-Funktionen === +let cameraStream = null; + +export function showImagePreview(src) { + const imagePreview = document.getElementById('imagePreview'); + const imagePreviewContainer = document.getElementById('imagePreviewContainer'); + const initialUploadArea = document.getElementById('initialUploadArea'); + if (imagePreview) imagePreview.src = src; + if (imagePreviewContainer) imagePreviewContainer.style.display = 'block'; + if (initialUploadArea) initialUploadArea.style.display = 'none'; +} + +export async function startCamera(context = 'main') { + if (cameraStream) stopCamera(context); + const elements = context === 'main' + ? { view: document.getElementById('cameraView'), form: document.getElementById('formContent'), video: document.getElementById('videoElement') } + : { view: document.getElementById('diaryCameraView'), form: document.getElementById('diaryContentWrapper'), video: document.getElementById('diaryVideoElement'), footer: document.querySelector('#diaryModal .modal-footer') }; + if (!elements.view || !elements.form || !elements.video) return; + try { + cameraStream = await navigator.mediaDevices.getUserMedia({ video: { facingMode: 'environment', width: 1080, height: 1080 } }); + elements.video.srcObject = cameraStream; + elements.form.style.display = 'none'; + if(elements.footer) elements.footer.style.display = 'none'; + elements.view.style.display = 'block'; + } catch (err) { + showToast("Kamerazugriff verweigert.", true); + } +} + +export function stopCamera(context = 'main') { + if (cameraStream) { + cameraStream.getTracks().forEach(track => track.stop()); + cameraStream = null; + } + const elements = context === 'main' + ? { view: document.getElementById('cameraView'), form: document.getElementById('formContent') } + : { view: document.getElementById('diaryCameraView'), form: document.getElementById('diaryContentWrapper'), footer: document.querySelector('#diaryModal .modal-footer') }; + if (elements.view) elements.view.style.display = 'none'; + if (elements.form) elements.form.style.display = 'block'; + if (elements.footer) elements.footer.style.display = 'block'; +} + +export function capturePhoto(context = 'main') { + const elements = context === 'main' + ? { canvas: document.getElementById('photoCanvas'), video: document.getElementById('videoElement'), input: document.getElementById('plantPhoto'), showPreview: showImagePreview } + : { canvas: document.getElementById('diaryPhotoCanvas'), video: document.getElementById('diaryVideoElement'), input: document.getElementById('diaryPhoto'), showPreview: (files) => document.getElementById('plantPhoto').dispatchEvent(new CustomEvent('change', { detail: files })) }; + if (!elements.canvas || !elements.video || !elements.input) return; + const context2d = elements.canvas.getContext('2d'); + const size = Math.min(elements.video.videoWidth, elements.video.videoHeight); + elements.canvas.width = size; + elements.canvas.height = size; + context2d.drawImage(elements.video, (elements.video.videoWidth - size) / 2, (elements.video.videoHeight - size) / 2, size, size, 0, 0, size, size); + const dataUrl = elements.canvas.toDataURL('image/webp'); + if (context === 'main') { + elements.showPreview(dataUrl); + showAiSection(); + clearAiResults(document.getElementById('plantForm')); + } + elements.canvas.toBlob(blob => { + const imageFile = new File([blob], `aufnahme.webp`, { type: 'image/webp' }); + const dataTransfer = new DataTransfer(); + dataTransfer.items.add(imageFile); + elements.input.files = dataTransfer.files; + // Manually trigger change event + const changeEvent = new Event('change', { bubbles: true }); + elements.input.dispatchEvent(changeEvent); + stopCamera(context); + }, 'image/webp'); +} + diff --git a/plants/vendor/autoload.php b/plants/vendor/autoload.php new file mode 100644 index 0000000..20646e4 --- /dev/null +++ b/plants/vendor/autoload.php @@ -0,0 +1,22 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + /** @var \Closure(string):void */ + private static $includeFile; + + /** @var string|null */ + private $vendorDir; + + // PSR-4 + /** + * @var array> + */ + private $prefixLengthsPsr4 = array(); + /** + * @var array> + */ + private $prefixDirsPsr4 = array(); + /** + * @var list + */ + private $fallbackDirsPsr4 = array(); + + // PSR-0 + /** + * List of PSR-0 prefixes + * + * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) + * + * @var array>> + */ + private $prefixesPsr0 = array(); + /** + * @var list + */ + private $fallbackDirsPsr0 = array(); + + /** @var bool */ + private $useIncludePath = false; + + /** + * @var array + */ + private $classMap = array(); + + /** @var bool */ + private $classMapAuthoritative = false; + + /** + * @var array + */ + private $missingClasses = array(); + + /** @var string|null */ + private $apcuPrefix; + + /** + * @var array + */ + private static $registeredLoaders = array(); + + /** + * @param string|null $vendorDir + */ + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + self::initializeIncludeClosure(); + } + + /** + * @return array> + */ + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); + } + + return array(); + } + + /** + * @return array> + */ + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + /** + * @return list + */ + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + /** + * @return list + */ + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + /** + * @return array Array of classname => path + */ + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + * + * @return void + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + * + * @return void + */ + public function add($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 base directories + * + * @return void + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + * + * @return void + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + * + * @return void + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + * + * @return void + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + * + * @return void + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + + if (null === $this->vendorDir) { + return; + } + + if ($prepend) { + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; + } else { + unset(self::$registeredLoaders[$this->vendorDir]); + self::$registeredLoaders[$this->vendorDir] = $this; + } + } + + /** + * Unregisters this instance as an autoloader. + * + * @return void + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + + if (null !== $this->vendorDir) { + unset(self::$registeredLoaders[$this->vendorDir]); + } + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return true|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + $includeFile = self::$includeFile; + $includeFile($file); + + return true; + } + + return null; + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + /** + * Returns the currently registered loaders keyed by their corresponding vendor directories. + * + * @return array + */ + public static function getRegisteredLoaders() + { + return self::$registeredLoaders; + } + + /** + * @param string $class + * @param string $ext + * @return string|false + */ + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } + + /** + * @return void + */ + private static function initializeIncludeClosure() + { + if (self::$includeFile !== null) { + return; + } + + /** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + */ + self::$includeFile = \Closure::bind(static function($file) { + include $file; + }, null, null); + } +} diff --git a/plants/vendor/composer/InstalledVersions.php b/plants/vendor/composer/InstalledVersions.php new file mode 100644 index 0000000..2052022 --- /dev/null +++ b/plants/vendor/composer/InstalledVersions.php @@ -0,0 +1,396 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer; + +use Composer\Autoload\ClassLoader; +use Composer\Semver\VersionParser; + +/** + * This class is copied in every Composer installed project and available to all + * + * See also https://getcomposer.org/doc/07-runtime.md#installed-versions + * + * To require its presence, you can require `composer-runtime-api ^2.0` + * + * @final + */ +class InstalledVersions +{ + /** + * @var string|null if set (by reflection by Composer), this should be set to the path where this class is being copied to + * @internal + */ + private static $selfDir = null; + + /** + * @var mixed[]|null + * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null + */ + private static $installed; + + /** + * @var bool + */ + private static $installedIsLocalDir; + + /** + * @var bool|null + */ + private static $canGetVendors; + + /** + * @var array[] + * @psalm-var array}> + */ + private static $installedByVendor = array(); + + /** + * Returns a list of all package names which are present, either by being installed, replaced or provided + * + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackages() + { + $packages = array(); + foreach (self::getInstalled() as $installed) { + $packages[] = array_keys($installed['versions']); + } + + if (1 === \count($packages)) { + return $packages[0]; + } + + return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); + } + + /** + * Returns a list of all package names with a specific type e.g. 'library' + * + * @param string $type + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackagesByType($type) + { + $packagesByType = array(); + + foreach (self::getInstalled() as $installed) { + foreach ($installed['versions'] as $name => $package) { + if (isset($package['type']) && $package['type'] === $type) { + $packagesByType[] = $name; + } + } + } + + return $packagesByType; + } + + /** + * Checks whether the given package is installed + * + * This also returns true if the package name is provided or replaced by another package + * + * @param string $packageName + * @param bool $includeDevRequirements + * @return bool + */ + public static function isInstalled($packageName, $includeDevRequirements = true) + { + foreach (self::getInstalled() as $installed) { + if (isset($installed['versions'][$packageName])) { + return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false; + } + } + + return false; + } + + /** + * Checks whether the given package satisfies a version constraint + * + * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: + * + * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') + * + * @param VersionParser $parser Install composer/semver to have access to this class and functionality + * @param string $packageName + * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package + * @return bool + */ + public static function satisfies(VersionParser $parser, $packageName, $constraint) + { + $constraint = $parser->parseConstraints((string) $constraint); + $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + + return $provided->matches($constraint); + } + + /** + * Returns a version constraint representing all the range(s) which are installed for a given package + * + * It is easier to use this via isInstalled() with the $constraint argument if you need to check + * whether a given version of a package is installed, and not just whether it exists + * + * @param string $packageName + * @return string Version constraint usable with composer/semver + */ + public static function getVersionRanges($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + $ranges = array(); + if (isset($installed['versions'][$packageName]['pretty_version'])) { + $ranges[] = $installed['versions'][$packageName]['pretty_version']; + } + if (array_key_exists('aliases', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); + } + if (array_key_exists('replaced', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); + } + if (array_key_exists('provided', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); + } + + return implode(' || ', $ranges); + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['version'])) { + return null; + } + + return $installed['versions'][$packageName]['version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getPrettyVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['pretty_version'])) { + return null; + } + + return $installed['versions'][$packageName]['pretty_version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference + */ + public static function getReference($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['reference'])) { + return null; + } + + return $installed['versions'][$packageName]['reference']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. + */ + public static function getInstallPath($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @return array + * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} + */ + public static function getRootPackage() + { + $installed = self::getInstalled(); + + return $installed[0]['root']; + } + + /** + * Returns the raw installed.php data for custom implementations + * + * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. + * @return array[] + * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} + */ + public static function getRawData() + { + @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = include __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + + return self::$installed; + } + + /** + * Returns the raw data of all installed.php which are currently loaded for custom implementations + * + * @return array[] + * @psalm-return list}> + */ + public static function getAllRawData() + { + return self::getInstalled(); + } + + /** + * Lets you reload the static array from another file + * + * This is only useful for complex integrations in which a project needs to use + * this class but then also needs to execute another project's autoloader in process, + * and wants to ensure both projects have access to their version of installed.php. + * + * A typical case would be PHPUnit, where it would need to make sure it reads all + * the data it needs from this class, then call reload() with + * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure + * the project in which it runs can then also use this class safely, without + * interference between PHPUnit's dependencies and the project's dependencies. + * + * @param array[] $data A vendor/composer/installed.php data set + * @return void + * + * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + + // when using reload, we disable the duplicate protection to ensure that self::$installed data is + // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not, + // so we have to assume it does not, and that may result in duplicate data being returned when listing + // all installed packages for example + self::$installedIsLocalDir = false; + } + + /** + * @return string + */ + private static function getSelfDir() + { + if (self::$selfDir === null) { + self::$selfDir = strtr(__DIR__, '\\', '/'); + } + + return self::$selfDir; + } + + /** + * @return array[] + * @psalm-return list}> + */ + private static function getInstalled() + { + if (null === self::$canGetVendors) { + self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); + } + + $installed = array(); + $copiedLocalDir = false; + + if (self::$canGetVendors) { + $selfDir = self::getSelfDir(); + foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + $vendorDir = strtr($vendorDir, '\\', '/'); + if (isset(self::$installedByVendor[$vendorDir])) { + $installed[] = self::$installedByVendor[$vendorDir]; + } elseif (is_file($vendorDir.'/composer/installed.php')) { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = require $vendorDir.'/composer/installed.php'; + self::$installedByVendor[$vendorDir] = $required; + $installed[] = $required; + if (self::$installed === null && $vendorDir.'/composer' === $selfDir) { + self::$installed = $required; + self::$installedIsLocalDir = true; + } + } + if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) { + $copiedLocalDir = true; + } + } + } + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = require __DIR__ . '/installed.php'; + self::$installed = $required; + } else { + self::$installed = array(); + } + } + + if (self::$installed !== array() && !$copiedLocalDir) { + $installed[] = self::$installed; + } + + return $installed; + } +} diff --git a/plants/vendor/composer/LICENSE b/plants/vendor/composer/LICENSE new file mode 100644 index 0000000..f27399a --- /dev/null +++ b/plants/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/plants/vendor/composer/autoload_classmap.php b/plants/vendor/composer/autoload_classmap.php new file mode 100644 index 0000000..5490b88 --- /dev/null +++ b/plants/vendor/composer/autoload_classmap.php @@ -0,0 +1,15 @@ + $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', + 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', + 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', + 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', + 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', + 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', +); diff --git a/plants/vendor/composer/autoload_files.php b/plants/vendor/composer/autoload_files.php new file mode 100644 index 0000000..7ff36b4 --- /dev/null +++ b/plants/vendor/composer/autoload_files.php @@ -0,0 +1,12 @@ + $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', + '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', + 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', +); diff --git a/plants/vendor/composer/autoload_namespaces.php b/plants/vendor/composer/autoload_namespaces.php new file mode 100644 index 0000000..15a2ff3 --- /dev/null +++ b/plants/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ + array($vendorDir . '/symfony/polyfill-php80'), + 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), + 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), + 'PhpOption\\' => array($vendorDir . '/phpoption/phpoption/src/PhpOption'), + 'GrahamCampbell\\ResultType\\' => array($vendorDir . '/graham-campbell/result-type/src'), + 'Dotenv\\' => array($vendorDir . '/vlucas/phpdotenv/src'), +); diff --git a/plants/vendor/composer/autoload_real.php b/plants/vendor/composer/autoload_real.php new file mode 100644 index 0000000..124d9ee --- /dev/null +++ b/plants/vendor/composer/autoload_real.php @@ -0,0 +1,50 @@ +register(true); + + $filesToLoad = \Composer\Autoload\ComposerStaticInite875ae8441d070d7dda5f4b47a2117aa::$files; + $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + + require $file; + } + }, null, null); + foreach ($filesToLoad as $fileIdentifier => $file) { + $requireFile($fileIdentifier, $file); + } + + return $loader; + } +} diff --git a/plants/vendor/composer/autoload_static.php b/plants/vendor/composer/autoload_static.php new file mode 100644 index 0000000..6668bae --- /dev/null +++ b/plants/vendor/composer/autoload_static.php @@ -0,0 +1,81 @@ + __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', + '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', + 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', + ); + + public static $prefixLengthsPsr4 = array ( + 'S' => + array ( + 'Symfony\\Polyfill\\Php80\\' => 23, + 'Symfony\\Polyfill\\Mbstring\\' => 26, + 'Symfony\\Polyfill\\Ctype\\' => 23, + ), + 'P' => + array ( + 'PhpOption\\' => 10, + ), + 'G' => + array ( + 'GrahamCampbell\\ResultType\\' => 26, + ), + 'D' => + array ( + 'Dotenv\\' => 7, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'Symfony\\Polyfill\\Php80\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-php80', + ), + 'Symfony\\Polyfill\\Mbstring\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', + ), + 'Symfony\\Polyfill\\Ctype\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', + ), + 'PhpOption\\' => + array ( + 0 => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption', + ), + 'GrahamCampbell\\ResultType\\' => + array ( + 0 => __DIR__ . '/..' . '/graham-campbell/result-type/src', + ), + 'Dotenv\\' => + array ( + 0 => __DIR__ . '/..' . '/vlucas/phpdotenv/src', + ), + ); + + public static $classMap = array ( + 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', + 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', + 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', + 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInite875ae8441d070d7dda5f4b47a2117aa::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInite875ae8441d070d7dda5f4b47a2117aa::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInite875ae8441d070d7dda5f4b47a2117aa::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/plants/vendor/composer/installed.json b/plants/vendor/composer/installed.json new file mode 100644 index 0000000..ac873d6 --- /dev/null +++ b/plants/vendor/composer/installed.json @@ -0,0 +1,497 @@ +{ + "packages": [ + { + "name": "graham-campbell/result-type", + "version": "v1.1.3", + "version_normalized": "1.1.3.0", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945", + "reference": "3ba905c11371512af9d9bdd27d99b782216b6945", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "time": "2024-07-20T21:45:45+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "install-path": "../graham-campbell/result-type" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.4", + "version_normalized": "1.9.4.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", + "reference": "638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" + }, + "time": "2025-08-21T11:53:16+00:00", + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "install-path": "../phpoption/phpoption" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.33.0", + "version_normalized": "1.33.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "time": "2024-09-09T11:45:10+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-ctype" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.33.0", + "version_normalized": "1.33.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "time": "2024-12-23T08:48:59+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-mbstring" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.33.0", + "version_normalized": "1.33.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "time": "2025-01-02T08:10:11+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-php80" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.2", + "version_normalized": "5.6.2.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.3", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "time": "2025-04-30T23:37:27+00:00", + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "install-path": "../vlucas/phpdotenv" + } + ], + "dev": true, + "dev-package-names": [] +} diff --git a/plants/vendor/composer/installed.php b/plants/vendor/composer/installed.php new file mode 100644 index 0000000..4cb3e4f --- /dev/null +++ b/plants/vendor/composer/installed.php @@ -0,0 +1,77 @@ + array( + 'name' => '__root__', + 'pretty_version' => '1.0.0+no-version-set', + 'version' => '1.0.0.0', + 'reference' => null, + 'type' => 'library', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev' => true, + ), + 'versions' => array( + '__root__' => array( + 'pretty_version' => '1.0.0+no-version-set', + 'version' => '1.0.0.0', + 'reference' => null, + 'type' => 'library', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'graham-campbell/result-type' => array( + 'pretty_version' => 'v1.1.3', + 'version' => '1.1.3.0', + 'reference' => '3ba905c11371512af9d9bdd27d99b782216b6945', + 'type' => 'library', + 'install_path' => __DIR__ . '/../graham-campbell/result-type', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'phpoption/phpoption' => array( + 'pretty_version' => '1.9.4', + 'version' => '1.9.4.0', + 'reference' => '638a154f8d4ee6a5cfa96d6a34dfbe0cffa9566d', + 'type' => 'library', + 'install_path' => __DIR__ . '/../phpoption/phpoption', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-ctype' => array( + 'pretty_version' => 'v1.33.0', + 'version' => '1.33.0.0', + 'reference' => 'a3cc8b044a6ea513310cbd48ef7333b384945638', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-ctype', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-mbstring' => array( + 'pretty_version' => 'v1.33.0', + 'version' => '1.33.0.0', + 'reference' => '6d857f4d76bd4b343eac26d6b539585d2bc56493', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-php80' => array( + 'pretty_version' => 'v1.33.0', + 'version' => '1.33.0.0', + 'reference' => '0cc9dd0f17f61d8131e7df6b84bd344899fe2608', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-php80', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'vlucas/phpdotenv' => array( + 'pretty_version' => 'v5.6.2', + 'version' => '5.6.2.0', + 'reference' => '24ac4c74f91ee2c193fa1aaa5c249cb0822809af', + 'type' => 'library', + 'install_path' => __DIR__ . '/../vlucas/phpdotenv', + 'aliases' => array(), + 'dev_requirement' => false, + ), + ), +); diff --git a/plants/vendor/composer/platform_check.php b/plants/vendor/composer/platform_check.php new file mode 100644 index 0000000..2a9ec55 --- /dev/null +++ b/plants/vendor/composer/platform_check.php @@ -0,0 +1,25 @@ += 70205)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 7.2.5". You are running ' . PHP_VERSION . '.'; +} + +if ($issues) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); + } elseif (!headers_sent()) { + echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; + } + } + throw new \RuntimeException( + 'Composer detected issues in your platform: ' . implode(' ', $issues) + ); +} diff --git a/plants/vendor/graham-campbell/result-type/LICENSE b/plants/vendor/graham-campbell/result-type/LICENSE new file mode 100644 index 0000000..8e7c898 --- /dev/null +++ b/plants/vendor/graham-campbell/result-type/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2020-2024 Graham Campbell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/plants/vendor/graham-campbell/result-type/composer.json b/plants/vendor/graham-campbell/result-type/composer.json new file mode 100644 index 0000000..32bfc81 --- /dev/null +++ b/plants/vendor/graham-campbell/result-type/composer.json @@ -0,0 +1,33 @@ +{ + "name": "graham-campbell/result-type", + "description": "An Implementation Of The Result Type", + "keywords": ["result", "result-type", "Result", "Result Type", "Result-Type", "Graham Campbell", "GrahamCampbell"], + "license": "MIT", + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "GrahamCampbell\\Tests\\ResultType\\": "tests/" + } + }, + "config": { + "preferred-install": "dist" + } +} diff --git a/plants/vendor/graham-campbell/result-type/src/Error.php b/plants/vendor/graham-campbell/result-type/src/Error.php new file mode 100644 index 0000000..2c37c3e --- /dev/null +++ b/plants/vendor/graham-campbell/result-type/src/Error.php @@ -0,0 +1,121 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace GrahamCampbell\ResultType; + +use PhpOption\None; +use PhpOption\Some; + +/** + * @template T + * @template E + * + * @extends \GrahamCampbell\ResultType\Result + */ +final class Error extends Result +{ + /** + * @var E + */ + private $value; + + /** + * Internal constructor for an error value. + * + * @param E $value + * + * @return void + */ + private function __construct($value) + { + $this->value = $value; + } + + /** + * Create a new error value. + * + * @template F + * + * @param F $value + * + * @return \GrahamCampbell\ResultType\Result + */ + public static function create($value) + { + return new self($value); + } + + /** + * Get the success option value. + * + * @return \PhpOption\Option + */ + public function success() + { + return None::create(); + } + + /** + * Map over the success value. + * + * @template S + * + * @param callable(T):S $f + * + * @return \GrahamCampbell\ResultType\Result + */ + public function map(callable $f) + { + return self::create($this->value); + } + + /** + * Flat map over the success value. + * + * @template S + * @template F + * + * @param callable(T):\GrahamCampbell\ResultType\Result $f + * + * @return \GrahamCampbell\ResultType\Result + */ + public function flatMap(callable $f) + { + /** @var \GrahamCampbell\ResultType\Result */ + return self::create($this->value); + } + + /** + * Get the error option value. + * + * @return \PhpOption\Option + */ + public function error() + { + return Some::create($this->value); + } + + /** + * Map over the error value. + * + * @template F + * + * @param callable(E):F $f + * + * @return \GrahamCampbell\ResultType\Result + */ + public function mapError(callable $f) + { + return self::create($f($this->value)); + } +} diff --git a/plants/vendor/graham-campbell/result-type/src/Result.php b/plants/vendor/graham-campbell/result-type/src/Result.php new file mode 100644 index 0000000..8c67bcd --- /dev/null +++ b/plants/vendor/graham-campbell/result-type/src/Result.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace GrahamCampbell\ResultType; + +/** + * @template T + * @template E + */ +abstract class Result +{ + /** + * Get the success option value. + * + * @return \PhpOption\Option + */ + abstract public function success(); + + /** + * Map over the success value. + * + * @template S + * + * @param callable(T):S $f + * + * @return \GrahamCampbell\ResultType\Result + */ + abstract public function map(callable $f); + + /** + * Flat map over the success value. + * + * @template S + * @template F + * + * @param callable(T):\GrahamCampbell\ResultType\Result $f + * + * @return \GrahamCampbell\ResultType\Result + */ + abstract public function flatMap(callable $f); + + /** + * Get the error option value. + * + * @return \PhpOption\Option + */ + abstract public function error(); + + /** + * Map over the error value. + * + * @template F + * + * @param callable(E):F $f + * + * @return \GrahamCampbell\ResultType\Result + */ + abstract public function mapError(callable $f); +} diff --git a/plants/vendor/graham-campbell/result-type/src/Success.php b/plants/vendor/graham-campbell/result-type/src/Success.php new file mode 100644 index 0000000..27cd85e --- /dev/null +++ b/plants/vendor/graham-campbell/result-type/src/Success.php @@ -0,0 +1,120 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace GrahamCampbell\ResultType; + +use PhpOption\None; +use PhpOption\Some; + +/** + * @template T + * @template E + * + * @extends \GrahamCampbell\ResultType\Result + */ +final class Success extends Result +{ + /** + * @var T + */ + private $value; + + /** + * Internal constructor for a success value. + * + * @param T $value + * + * @return void + */ + private function __construct($value) + { + $this->value = $value; + } + + /** + * Create a new error value. + * + * @template S + * + * @param S $value + * + * @return \GrahamCampbell\ResultType\Result + */ + public static function create($value) + { + return new self($value); + } + + /** + * Get the success option value. + * + * @return \PhpOption\Option + */ + public function success() + { + return Some::create($this->value); + } + + /** + * Map over the success value. + * + * @template S + * + * @param callable(T):S $f + * + * @return \GrahamCampbell\ResultType\Result + */ + public function map(callable $f) + { + return self::create($f($this->value)); + } + + /** + * Flat map over the success value. + * + * @template S + * @template F + * + * @param callable(T):\GrahamCampbell\ResultType\Result $f + * + * @return \GrahamCampbell\ResultType\Result + */ + public function flatMap(callable $f) + { + return $f($this->value); + } + + /** + * Get the error option value. + * + * @return \PhpOption\Option + */ + public function error() + { + return None::create(); + } + + /** + * Map over the error value. + * + * @template F + * + * @param callable(E):F $f + * + * @return \GrahamCampbell\ResultType\Result + */ + public function mapError(callable $f) + { + return self::create($this->value); + } +} diff --git a/plants/vendor/phpoption/phpoption/LICENSE b/plants/vendor/phpoption/phpoption/LICENSE new file mode 100644 index 0000000..f49a4e1 --- /dev/null +++ b/plants/vendor/phpoption/phpoption/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/plants/vendor/phpoption/phpoption/composer.json b/plants/vendor/phpoption/phpoption/composer.json new file mode 100644 index 0000000..c077040 --- /dev/null +++ b/plants/vendor/phpoption/phpoption/composer.json @@ -0,0 +1,50 @@ +{ + "name": "phpoption/phpoption", + "description": "Option Type for PHP", + "keywords": ["php", "option", "language", "type"], + "license": "Apache-2.0", + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "autoload-dev": { + "psr-4": { + "PhpOption\\Tests\\": "tests/PhpOption/Tests/" + } + }, + "config": { + "allow-plugins": { + "bamarni/composer-bin-plugin": true + }, + "preferred-install": "dist" + }, + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + } +} diff --git a/plants/vendor/phpoption/phpoption/src/PhpOption/LazyOption.php b/plants/vendor/phpoption/phpoption/src/PhpOption/LazyOption.php new file mode 100644 index 0000000..9cb77c8 --- /dev/null +++ b/plants/vendor/phpoption/phpoption/src/PhpOption/LazyOption.php @@ -0,0 +1,175 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpOption; + +use Traversable; + +/** + * @template T + * + * @extends Option + */ +final class LazyOption extends Option +{ + /** @var callable(mixed...):(Option) */ + private $callback; + + /** @var array */ + private $arguments; + + /** @var Option|null */ + private $option; + + /** + * @template S + * @param callable(mixed...):(Option) $callback + * @param array $arguments + * + * @return LazyOption + */ + public static function create($callback, array $arguments = []): self + { + return new self($callback, $arguments); + } + + /** + * @param callable(mixed...):(Option) $callback + * @param array $arguments + */ + public function __construct($callback, array $arguments = []) + { + if (!is_callable($callback)) { + throw new \InvalidArgumentException('Invalid callback given'); + } + + $this->callback = $callback; + $this->arguments = $arguments; + } + + public function isDefined(): bool + { + return $this->option()->isDefined(); + } + + public function isEmpty(): bool + { + return $this->option()->isEmpty(); + } + + public function get() + { + return $this->option()->get(); + } + + public function getOrElse($default) + { + return $this->option()->getOrElse($default); + } + + public function getOrCall($callable) + { + return $this->option()->getOrCall($callable); + } + + public function getOrThrow(\Exception $ex) + { + return $this->option()->getOrThrow($ex); + } + + public function orElse(Option $else) + { + return $this->option()->orElse($else); + } + + public function ifDefined($callable) + { + $this->option()->forAll($callable); + } + + public function forAll($callable) + { + return $this->option()->forAll($callable); + } + + public function map($callable) + { + return $this->option()->map($callable); + } + + public function flatMap($callable) + { + return $this->option()->flatMap($callable); + } + + public function filter($callable) + { + return $this->option()->filter($callable); + } + + public function filterNot($callable) + { + return $this->option()->filterNot($callable); + } + + public function select($value) + { + return $this->option()->select($value); + } + + public function reject($value) + { + return $this->option()->reject($value); + } + + /** + * @return Traversable + */ + public function getIterator(): Traversable + { + return $this->option()->getIterator(); + } + + public function foldLeft($initialValue, $callable) + { + return $this->option()->foldLeft($initialValue, $callable); + } + + public function foldRight($initialValue, $callable) + { + return $this->option()->foldRight($initialValue, $callable); + } + + /** + * @return Option + */ + private function option(): Option + { + if (null === $this->option) { + /** @var mixed */ + $option = call_user_func_array($this->callback, $this->arguments); + if ($option instanceof Option) { + $this->option = $option; + } else { + throw new \RuntimeException(sprintf('Expected instance of %s', Option::class)); + } + } + + return $this->option; + } +} diff --git a/plants/vendor/phpoption/phpoption/src/PhpOption/None.php b/plants/vendor/phpoption/phpoption/src/PhpOption/None.php new file mode 100644 index 0000000..4b85d22 --- /dev/null +++ b/plants/vendor/phpoption/phpoption/src/PhpOption/None.php @@ -0,0 +1,136 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpOption; + +use EmptyIterator; + +/** + * @extends Option + */ +final class None extends Option +{ + /** @var None|null */ + private static $instance; + + /** + * @return None + */ + public static function create(): self + { + if (null === self::$instance) { + self::$instance = new self(); + } + + return self::$instance; + } + + public function get() + { + throw new \RuntimeException('None has no value.'); + } + + public function getOrCall($callable) + { + return $callable(); + } + + public function getOrElse($default) + { + return $default; + } + + public function getOrThrow(\Exception $ex) + { + throw $ex; + } + + public function isEmpty(): bool + { + return true; + } + + public function isDefined(): bool + { + return false; + } + + public function orElse(Option $else) + { + return $else; + } + + public function ifDefined($callable) + { + // Just do nothing in that case. + } + + public function forAll($callable) + { + return $this; + } + + public function map($callable) + { + return $this; + } + + public function flatMap($callable) + { + return $this; + } + + public function filter($callable) + { + return $this; + } + + public function filterNot($callable) + { + return $this; + } + + public function select($value) + { + return $this; + } + + public function reject($value) + { + return $this; + } + + public function getIterator(): EmptyIterator + { + return new EmptyIterator(); + } + + public function foldLeft($initialValue, $callable) + { + return $initialValue; + } + + public function foldRight($initialValue, $callable) + { + return $initialValue; + } + + private function __construct() + { + } +} diff --git a/plants/vendor/phpoption/phpoption/src/PhpOption/Option.php b/plants/vendor/phpoption/phpoption/src/PhpOption/Option.php new file mode 100644 index 0000000..91fab9c --- /dev/null +++ b/plants/vendor/phpoption/phpoption/src/PhpOption/Option.php @@ -0,0 +1,434 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpOption; + +use ArrayAccess; +use IteratorAggregate; + +/** + * @template T + * + * @implements IteratorAggregate + */ +abstract class Option implements IteratorAggregate +{ + /** + * Creates an option given a return value. + * + * This is intended for consuming existing APIs and allows you to easily + * convert them to an option. By default, we treat ``null`` as the None + * case, and everything else as Some. + * + * @template S + * + * @param S $value The actual return value. + * @param S $noneValue The value which should be considered "None"; null by + * default. + * + * @return Option + */ + public static function fromValue($value, $noneValue = null) + { + if ($value === $noneValue) { + return None::create(); + } + + return new Some($value); + } + + /** + * Creates an option from an array's value. + * + * If the key does not exist in the array, the array is not actually an + * array, or the array's value at the given key is null, None is returned. + * Otherwise, Some is returned wrapping the value at the given key. + * + * @template S + * + * @param array|ArrayAccess|null $array A potential array or \ArrayAccess value. + * @param string|int|null $key The key to check. + * + * @return Option + */ + public static function fromArraysValue($array, $key) + { + if ($key === null || !(is_array($array) || $array instanceof ArrayAccess) || !isset($array[$key])) { + return None::create(); + } + + return new Some($array[$key]); + } + + /** + * Creates a lazy-option with the given callback. + * + * This is also a helper constructor for lazy-consuming existing APIs where + * the return value is not yet an option. By default, we treat ``null`` as + * None case, and everything else as Some. + * + * @template S + * + * @param callable $callback The callback to evaluate. + * @param array $arguments The arguments for the callback. + * @param S $noneValue The value which should be considered "None"; + * null by default. + * + * @return LazyOption + */ + public static function fromReturn($callback, array $arguments = [], $noneValue = null) + { + return new LazyOption(static function () use ($callback, $arguments, $noneValue) { + /** @var mixed */ + $return = call_user_func_array($callback, $arguments); + + if ($return === $noneValue) { + return None::create(); + } + + return new Some($return); + }); + } + + /** + * Option factory, which creates new option based on passed value. + * + * If value is already an option, it simply returns. If value is callable, + * LazyOption with passed callback created and returned. If Option + * returned from callback, it returns directly. On other case value passed + * to Option::fromValue() method. + * + * @template S + * + * @param Option|callable|S $value + * @param S $noneValue Used when $value is mixed or + * callable, for None-check. + * + * @return Option|LazyOption + */ + public static function ensure($value, $noneValue = null) + { + if ($value instanceof self) { + return $value; + } elseif (is_callable($value)) { + return new LazyOption(static function () use ($value, $noneValue) { + /** @var mixed */ + $return = $value(); + + if ($return instanceof self) { + return $return; + } else { + return self::fromValue($return, $noneValue); + } + }); + } else { + return self::fromValue($value, $noneValue); + } + } + + /** + * Lift a function so that it accepts Option as parameters. + * + * We return a new closure that wraps the original callback. If any of the + * parameters passed to the lifted function is empty, the function will + * return a value of None. Otherwise, we will pass all parameters to the + * original callback and return the value inside a new Option, unless an + * Option is returned from the function, in which case, we use that. + * + * @template S + * + * @param callable $callback + * @param mixed $noneValue + * + * @return callable + */ + public static function lift($callback, $noneValue = null) + { + return static function () use ($callback, $noneValue) { + /** @var array */ + $args = func_get_args(); + + $reduced_args = array_reduce( + $args, + /** @param bool $status */ + static function ($status, self $o) { + return $o->isEmpty() ? true : $status; + }, + false + ); + // if at least one parameter is empty, return None + if ($reduced_args) { + return None::create(); + } + + $args = array_map( + /** @return T */ + static function (self $o) { + // it is safe to do so because the fold above checked + // that all arguments are of type Some + /** @var T */ + return $o->get(); + }, + $args + ); + + return self::ensure(call_user_func_array($callback, $args), $noneValue); + }; + } + + /** + * Returns the value if available, or throws an exception otherwise. + * + * @throws \RuntimeException If value is not available. + * + * @return T + */ + abstract public function get(); + + /** + * Returns the value if available, or the default value if not. + * + * @template S + * + * @param S $default + * + * @return T|S + */ + abstract public function getOrElse($default); + + /** + * Returns the value if available, or the results of the callable. + * + * This is preferable over ``getOrElse`` if the computation of the default + * value is expensive. + * + * @template S + * + * @param callable():S $callable + * + * @return T|S + */ + abstract public function getOrCall($callable); + + /** + * Returns the value if available, or throws the passed exception. + * + * @param \Exception $ex + * + * @return T + */ + abstract public function getOrThrow(\Exception $ex); + + /** + * Returns true if no value is available, false otherwise. + * + * @return bool + */ + abstract public function isEmpty(); + + /** + * Returns true if a value is available, false otherwise. + * + * @return bool + */ + abstract public function isDefined(); + + /** + * Returns this option if non-empty, or the passed option otherwise. + * + * This can be used to try multiple alternatives, and is especially useful + * with lazy evaluating options: + * + * ```php + * $repo->findSomething() + * ->orElse(new LazyOption(array($repo, 'findSomethingElse'))) + * ->orElse(new LazyOption(array($repo, 'createSomething'))); + * ``` + * + * @param Option $else + * + * @return Option + */ + abstract public function orElse(self $else); + + /** + * This is similar to map() below except that the return value has no meaning; + * the passed callable is simply executed if the option is non-empty, and + * ignored if the option is empty. + * + * In all cases, the return value of the callable is discarded. + * + * ```php + * $comment->getMaybeFile()->ifDefined(function($file) { + * // Do something with $file here. + * }); + * ``` + * + * If you're looking for something like ``ifEmpty``, you can use ``getOrCall`` + * and ``getOrElse`` in these cases. + * + * @deprecated Use forAll() instead. + * + * @param callable(T):mixed $callable + * + * @return void + */ + abstract public function ifDefined($callable); + + /** + * This is similar to map() except that the return value of the callable has no meaning. + * + * The passed callable is simply executed if the option is non-empty, and ignored if the + * option is empty. This method is preferred for callables with side-effects, while map() + * is intended for callables without side-effects. + * + * @param callable(T):mixed $callable + * + * @return Option + */ + abstract public function forAll($callable); + + /** + * Applies the callable to the value of the option if it is non-empty, + * and returns the return value of the callable wrapped in Some(). + * + * If the option is empty, then the callable is not applied. + * + * ```php + * (new Some("foo"))->map('strtoupper')->get(); // "FOO" + * ``` + * + * @template S + * + * @param callable(T):S $callable + * + * @return Option + */ + abstract public function map($callable); + + /** + * Applies the callable to the value of the option if it is non-empty, and + * returns the return value of the callable directly. + * + * In contrast to ``map``, the return value of the callable is expected to + * be an Option itself; it is not automatically wrapped in Some(). + * + * @template S + * + * @param callable(T):Option $callable must return an Option + * + * @return Option + */ + abstract public function flatMap($callable); + + /** + * If the option is empty, it is returned immediately without applying the callable. + * + * If the option is non-empty, the callable is applied, and if it returns true, + * the option itself is returned; otherwise, None is returned. + * + * @param callable(T):bool $callable + * + * @return Option + */ + abstract public function filter($callable); + + /** + * If the option is empty, it is returned immediately without applying the callable. + * + * If the option is non-empty, the callable is applied, and if it returns false, + * the option itself is returned; otherwise, None is returned. + * + * @param callable(T):bool $callable + * + * @return Option + */ + abstract public function filterNot($callable); + + /** + * If the option is empty, it is returned immediately. + * + * If the option is non-empty, and its value does not equal the passed value + * (via a shallow comparison ===), then None is returned. Otherwise, the + * Option is returned. + * + * In other words, this will filter all but the passed value. + * + * @param T $value + * + * @return Option + */ + abstract public function select($value); + + /** + * If the option is empty, it is returned immediately. + * + * If the option is non-empty, and its value does equal the passed value (via + * a shallow comparison ===), then None is returned; otherwise, the Option is + * returned. + * + * In other words, this will let all values through except the passed value. + * + * @param T $value + * + * @return Option + */ + abstract public function reject($value); + + /** + * Binary operator for the initial value and the option's value. + * + * If empty, the initial value is returned. If non-empty, the callable + * receives the initial value and the option's value as arguments. + * + * ```php + * + * $some = new Some(5); + * $none = None::create(); + * $result = $some->foldLeft(1, function($a, $b) { return $a + $b; }); // int(6) + * $result = $none->foldLeft(1, function($a, $b) { return $a + $b; }); // int(1) + * + * // This can be used instead of something like the following: + * $option = Option::fromValue($integerOrNull); + * $result = 1; + * if ( ! $option->isEmpty()) { + * $result += $option->get(); + * } + * ``` + * + * @template S + * + * @param S $initialValue + * @param callable(S, T):S $callable + * + * @return S + */ + abstract public function foldLeft($initialValue, $callable); + + /** + * foldLeft() but with reversed arguments for the callable. + * + * @template S + * + * @param S $initialValue + * @param callable(T, S):S $callable + * + * @return S + */ + abstract public function foldRight($initialValue, $callable); +} diff --git a/plants/vendor/phpoption/phpoption/src/PhpOption/Some.php b/plants/vendor/phpoption/phpoption/src/PhpOption/Some.php new file mode 100644 index 0000000..032632e --- /dev/null +++ b/plants/vendor/phpoption/phpoption/src/PhpOption/Some.php @@ -0,0 +1,169 @@ + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpOption; + +use ArrayIterator; + +/** + * @template T + * + * @extends Option + */ +final class Some extends Option +{ + /** @var T */ + private $value; + + /** + * @param T $value + */ + public function __construct($value) + { + $this->value = $value; + } + + /** + * @template U + * + * @param U $value + * + * @return Some + */ + public static function create($value): self + { + return new self($value); + } + + public function isDefined(): bool + { + return true; + } + + public function isEmpty(): bool + { + return false; + } + + public function get() + { + return $this->value; + } + + public function getOrElse($default) + { + return $this->value; + } + + public function getOrCall($callable) + { + return $this->value; + } + + public function getOrThrow(\Exception $ex) + { + return $this->value; + } + + public function orElse(Option $else) + { + return $this; + } + + public function ifDefined($callable) + { + $this->forAll($callable); + } + + public function forAll($callable) + { + $callable($this->value); + + return $this; + } + + public function map($callable) + { + return new self($callable($this->value)); + } + + public function flatMap($callable) + { + /** @var mixed */ + $rs = $callable($this->value); + if (!$rs instanceof Option) { + throw new \RuntimeException('Callables passed to flatMap() must return an Option. Maybe you should use map() instead?'); + } + + return $rs; + } + + public function filter($callable) + { + if (true === $callable($this->value)) { + return $this; + } + + return None::create(); + } + + public function filterNot($callable) + { + if (false === $callable($this->value)) { + return $this; + } + + return None::create(); + } + + public function select($value) + { + if ($this->value === $value) { + return $this; + } + + return None::create(); + } + + public function reject($value) + { + if ($this->value === $value) { + return None::create(); + } + + return $this; + } + + /** + * @return ArrayIterator + */ + public function getIterator(): ArrayIterator + { + return new ArrayIterator([$this->value]); + } + + public function foldLeft($initialValue, $callable) + { + return $callable($initialValue, $this->value); + } + + public function foldRight($initialValue, $callable) + { + return $callable($this->value, $initialValue); + } +} diff --git a/plants/vendor/symfony/polyfill-ctype/Ctype.php b/plants/vendor/symfony/polyfill-ctype/Ctype.php new file mode 100644 index 0000000..ba75a2c --- /dev/null +++ b/plants/vendor/symfony/polyfill-ctype/Ctype.php @@ -0,0 +1,232 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Ctype; + +/** + * Ctype implementation through regex. + * + * @internal + * + * @author Gert de Pagter + */ +final class Ctype +{ + /** + * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise. + * + * @see https://php.net/ctype-alnum + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_alnum($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z0-9]/', $text); + } + + /** + * Returns TRUE if every character in text is a letter, FALSE otherwise. + * + * @see https://php.net/ctype-alpha + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_alpha($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z]/', $text); + } + + /** + * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise. + * + * @see https://php.net/ctype-cntrl + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_cntrl($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^\x00-\x1f\x7f]/', $text); + } + + /** + * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise. + * + * @see https://php.net/ctype-digit + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_digit($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^0-9]/', $text); + } + + /** + * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise. + * + * @see https://php.net/ctype-graph + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_graph($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^!-~]/', $text); + } + + /** + * Returns TRUE if every character in text is a lowercase letter. + * + * @see https://php.net/ctype-lower + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_lower($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^a-z]/', $text); + } + + /** + * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all. + * + * @see https://php.net/ctype-print + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_print($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^ -~]/', $text); + } + + /** + * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise. + * + * @see https://php.net/ctype-punct + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_punct($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^!-\/\:-@\[-`\{-~]/', $text); + } + + /** + * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters. + * + * @see https://php.net/ctype-space + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_space($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^\s]/', $text); + } + + /** + * Returns TRUE if every character in text is an uppercase letter. + * + * @see https://php.net/ctype-upper + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_upper($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Z]/', $text); + } + + /** + * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise. + * + * @see https://php.net/ctype-xdigit + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_xdigit($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Fa-f0-9]/', $text); + } + + /** + * Converts integers to their char versions according to normal ctype behaviour, if needed. + * + * If an integer between -128 and 255 inclusive is provided, + * it is interpreted as the ASCII value of a single character + * (negative values have 256 added in order to allow characters in the Extended ASCII range). + * Any other integer is interpreted as a string containing the decimal digits of the integer. + * + * @param mixed $int + * @param string $function + * + * @return mixed + */ + private static function convert_int_to_char_for_ctype($int, $function) + { + if (!\is_int($int)) { + return $int; + } + + if ($int < -128 || $int > 255) { + return (string) $int; + } + + if (\PHP_VERSION_ID >= 80100) { + @trigger_error($function.'(): Argument of type int will be interpreted as string in the future', \E_USER_DEPRECATED); + } + + if ($int < 0) { + $int += 256; + } + + return \chr($int); + } +} diff --git a/plants/vendor/symfony/polyfill-ctype/LICENSE b/plants/vendor/symfony/polyfill-ctype/LICENSE new file mode 100644 index 0000000..7536cae --- /dev/null +++ b/plants/vendor/symfony/polyfill-ctype/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018-present Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/plants/vendor/symfony/polyfill-ctype/README.md b/plants/vendor/symfony/polyfill-ctype/README.md new file mode 100644 index 0000000..b144d03 --- /dev/null +++ b/plants/vendor/symfony/polyfill-ctype/README.md @@ -0,0 +1,12 @@ +Symfony Polyfill / Ctype +======================== + +This component provides `ctype_*` functions to users who run php versions without the ctype extension. + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/plants/vendor/symfony/polyfill-ctype/bootstrap.php b/plants/vendor/symfony/polyfill-ctype/bootstrap.php new file mode 100644 index 0000000..d54524b --- /dev/null +++ b/plants/vendor/symfony/polyfill-ctype/bootstrap.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Ctype as p; + +if (\PHP_VERSION_ID >= 80000) { + return require __DIR__.'/bootstrap80.php'; +} + +if (!function_exists('ctype_alnum')) { + function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); } +} +if (!function_exists('ctype_alpha')) { + function ctype_alpha($text) { return p\Ctype::ctype_alpha($text); } +} +if (!function_exists('ctype_cntrl')) { + function ctype_cntrl($text) { return p\Ctype::ctype_cntrl($text); } +} +if (!function_exists('ctype_digit')) { + function ctype_digit($text) { return p\Ctype::ctype_digit($text); } +} +if (!function_exists('ctype_graph')) { + function ctype_graph($text) { return p\Ctype::ctype_graph($text); } +} +if (!function_exists('ctype_lower')) { + function ctype_lower($text) { return p\Ctype::ctype_lower($text); } +} +if (!function_exists('ctype_print')) { + function ctype_print($text) { return p\Ctype::ctype_print($text); } +} +if (!function_exists('ctype_punct')) { + function ctype_punct($text) { return p\Ctype::ctype_punct($text); } +} +if (!function_exists('ctype_space')) { + function ctype_space($text) { return p\Ctype::ctype_space($text); } +} +if (!function_exists('ctype_upper')) { + function ctype_upper($text) { return p\Ctype::ctype_upper($text); } +} +if (!function_exists('ctype_xdigit')) { + function ctype_xdigit($text) { return p\Ctype::ctype_xdigit($text); } +} diff --git a/plants/vendor/symfony/polyfill-ctype/bootstrap80.php b/plants/vendor/symfony/polyfill-ctype/bootstrap80.php new file mode 100644 index 0000000..ab2f861 --- /dev/null +++ b/plants/vendor/symfony/polyfill-ctype/bootstrap80.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Ctype as p; + +if (!function_exists('ctype_alnum')) { + function ctype_alnum(mixed $text): bool { return p\Ctype::ctype_alnum($text); } +} +if (!function_exists('ctype_alpha')) { + function ctype_alpha(mixed $text): bool { return p\Ctype::ctype_alpha($text); } +} +if (!function_exists('ctype_cntrl')) { + function ctype_cntrl(mixed $text): bool { return p\Ctype::ctype_cntrl($text); } +} +if (!function_exists('ctype_digit')) { + function ctype_digit(mixed $text): bool { return p\Ctype::ctype_digit($text); } +} +if (!function_exists('ctype_graph')) { + function ctype_graph(mixed $text): bool { return p\Ctype::ctype_graph($text); } +} +if (!function_exists('ctype_lower')) { + function ctype_lower(mixed $text): bool { return p\Ctype::ctype_lower($text); } +} +if (!function_exists('ctype_print')) { + function ctype_print(mixed $text): bool { return p\Ctype::ctype_print($text); } +} +if (!function_exists('ctype_punct')) { + function ctype_punct(mixed $text): bool { return p\Ctype::ctype_punct($text); } +} +if (!function_exists('ctype_space')) { + function ctype_space(mixed $text): bool { return p\Ctype::ctype_space($text); } +} +if (!function_exists('ctype_upper')) { + function ctype_upper(mixed $text): bool { return p\Ctype::ctype_upper($text); } +} +if (!function_exists('ctype_xdigit')) { + function ctype_xdigit(mixed $text): bool { return p\Ctype::ctype_xdigit($text); } +} diff --git a/plants/vendor/symfony/polyfill-ctype/composer.json b/plants/vendor/symfony/polyfill-ctype/composer.json new file mode 100644 index 0000000..131ca7a --- /dev/null +++ b/plants/vendor/symfony/polyfill-ctype/composer.json @@ -0,0 +1,38 @@ +{ + "name": "symfony/polyfill-ctype", + "type": "library", + "description": "Symfony polyfill for ctype functions", + "keywords": ["polyfill", "compatibility", "portable", "ctype"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" }, + "files": [ "bootstrap.php" ] + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/plants/vendor/symfony/polyfill-mbstring/LICENSE b/plants/vendor/symfony/polyfill-mbstring/LICENSE new file mode 100644 index 0000000..6e3afce --- /dev/null +++ b/plants/vendor/symfony/polyfill-mbstring/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-present Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/plants/vendor/symfony/polyfill-mbstring/Mbstring.php b/plants/vendor/symfony/polyfill-mbstring/Mbstring.php new file mode 100644 index 0000000..31e36a3 --- /dev/null +++ b/plants/vendor/symfony/polyfill-mbstring/Mbstring.php @@ -0,0 +1,1045 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Mbstring; + +/** + * Partial mbstring implementation in PHP, iconv based, UTF-8 centric. + * + * Implemented: + * - mb_chr - Returns a specific character from its Unicode code point + * - mb_convert_encoding - Convert character encoding + * - mb_convert_variables - Convert character code in variable(s) + * - mb_decode_mimeheader - Decode string in MIME header field + * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED + * - mb_decode_numericentity - Decode HTML numeric string reference to character + * - mb_encode_numericentity - Encode character to HTML numeric string reference + * - mb_convert_case - Perform case folding on a string + * - mb_detect_encoding - Detect character encoding + * - mb_get_info - Get internal settings of mbstring + * - mb_http_input - Detect HTTP input character encoding + * - mb_http_output - Set/Get HTTP output character encoding + * - mb_internal_encoding - Set/Get internal character encoding + * - mb_list_encodings - Returns an array of all supported encodings + * - mb_ord - Returns the Unicode code point of a character + * - mb_output_handler - Callback function converts character encoding in output buffer + * - mb_scrub - Replaces ill-formed byte sequences with substitute characters + * - mb_strlen - Get string length + * - mb_strpos - Find position of first occurrence of string in a string + * - mb_strrpos - Find position of last occurrence of a string in a string + * - mb_str_split - Convert a string to an array + * - mb_strtolower - Make a string lowercase + * - mb_strtoupper - Make a string uppercase + * - mb_substitute_character - Set/Get substitution character + * - mb_substr - Get part of string + * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive + * - mb_stristr - Finds first occurrence of a string within another, case insensitive + * - mb_strrchr - Finds the last occurrence of a character in a string within another + * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive + * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive + * - mb_strstr - Finds first occurrence of a string within another + * - mb_strwidth - Return width of string + * - mb_substr_count - Count the number of substring occurrences + * - mb_ucfirst - Make a string's first character uppercase + * - mb_lcfirst - Make a string's first character lowercase + * - mb_trim - Strip whitespace (or other characters) from the beginning and end of a string + * - mb_ltrim - Strip whitespace (or other characters) from the beginning of a string + * - mb_rtrim - Strip whitespace (or other characters) from the end of a string + * + * Not implemented: + * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more) + * - mb_ereg_* - Regular expression with multibyte support + * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable + * - mb_preferred_mime_name - Get MIME charset string + * - mb_regex_encoding - Returns current encoding for multibyte regex as string + * - mb_regex_set_options - Set/Get the default options for mbregex functions + * - mb_send_mail - Send encoded mail + * - mb_split - Split multibyte string using regular expression + * - mb_strcut - Get part of string + * - mb_strimwidth - Get truncated string with specified width + * + * @author Nicolas Grekas + * + * @internal + */ +final class Mbstring +{ + public const MB_CASE_FOLD = \PHP_INT_MAX; + + private const SIMPLE_CASE_FOLD = [ + ['µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"], + ['μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1", 'ι'], + ]; + + private static $encodingList = ['ASCII', 'UTF-8']; + private static $language = 'neutral'; + private static $internalEncoding = 'UTF-8'; + + public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) + { + if (\is_array($s)) { + $r = []; + foreach ($s as $str) { + $r[] = self::mb_convert_encoding($str, $toEncoding, $fromEncoding); + } + + return $r; + } + + if (\is_array($fromEncoding) || (null !== $fromEncoding && false !== strpos($fromEncoding, ','))) { + $fromEncoding = self::mb_detect_encoding($s, $fromEncoding); + } else { + $fromEncoding = self::getEncoding($fromEncoding); + } + + $toEncoding = self::getEncoding($toEncoding); + + if ('BASE64' === $fromEncoding) { + $s = base64_decode($s); + $fromEncoding = $toEncoding; + } + + if ('BASE64' === $toEncoding) { + return base64_encode($s); + } + + if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) { + if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) { + $fromEncoding = 'Windows-1252'; + } + if ('UTF-8' !== $fromEncoding) { + $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s); + } + + return preg_replace_callback('/[\x80-\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s); + } + + if ('HTML-ENTITIES' === $fromEncoding) { + $s = html_entity_decode($s, \ENT_COMPAT, 'UTF-8'); + $fromEncoding = 'UTF-8'; + } + + return iconv($fromEncoding, $toEncoding.'//IGNORE', $s); + } + + public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars) + { + $ok = true; + array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) { + if (false === $v = self::mb_convert_encoding($v, $toEncoding, $fromEncoding)) { + $ok = false; + } + }); + + return $ok ? $fromEncoding : false; + } + + public static function mb_decode_mimeheader($s) + { + return iconv_mime_decode($s, 2, self::$internalEncoding); + } + + public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null) + { + trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', \E_USER_WARNING); + } + + public static function mb_decode_numericentity($s, $convmap, $encoding = null) + { + if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { + trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); + + return null; + } + + if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) { + return false; + } + + if (null !== $encoding && !\is_scalar($encoding)) { + trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); + + return ''; // Instead of null (cf. mb_encode_numericentity). + } + + $s = (string) $s; + if ('' === $s) { + return ''; + } + + $encoding = self::getEncoding($encoding); + + if ('UTF-8' === $encoding) { + $encoding = null; + if (!preg_match('//u', $s)) { + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); + } + } else { + $s = iconv($encoding, 'UTF-8//IGNORE', $s); + } + + $cnt = floor(\count($convmap) / 4) * 4; + + for ($i = 0; $i < $cnt; $i += 4) { + // collector_decode_htmlnumericentity ignores $convmap[$i + 3] + $convmap[$i] += $convmap[$i + 2]; + $convmap[$i + 1] += $convmap[$i + 2]; + } + + $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) { + $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1]; + for ($i = 0; $i < $cnt; $i += 4) { + if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) { + return self::mb_chr($c - $convmap[$i + 2]); + } + } + + return $m[0]; + }, $s); + + if (null === $encoding) { + return $s; + } + + return iconv('UTF-8', $encoding.'//IGNORE', $s); + } + + public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false) + { + if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { + trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); + + return null; + } + + if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) { + return false; + } + + if (null !== $encoding && !\is_scalar($encoding)) { + trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); + + return null; // Instead of '' (cf. mb_decode_numericentity). + } + + if (null !== $is_hex && !\is_scalar($is_hex)) { + trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', \E_USER_WARNING); + + return null; + } + + $s = (string) $s; + if ('' === $s) { + return ''; + } + + $encoding = self::getEncoding($encoding); + + if ('UTF-8' === $encoding) { + $encoding = null; + if (!preg_match('//u', $s)) { + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); + } + } else { + $s = iconv($encoding, 'UTF-8//IGNORE', $s); + } + + static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4]; + + $cnt = floor(\count($convmap) / 4) * 4; + $i = 0; + $len = \strlen($s); + $result = ''; + + while ($i < $len) { + $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; + $uchr = substr($s, $i, $ulen); + $i += $ulen; + $c = self::mb_ord($uchr); + + for ($j = 0; $j < $cnt; $j += 4) { + if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) { + $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3]; + $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';'; + continue 2; + } + } + $result .= $uchr; + } + + if (null === $encoding) { + return $result; + } + + return iconv('UTF-8', $encoding.'//IGNORE', $result); + } + + public static function mb_convert_case($s, $mode, $encoding = null) + { + $s = (string) $s; + if ('' === $s) { + return ''; + } + + $encoding = self::getEncoding($encoding); + + if ('UTF-8' === $encoding) { + $encoding = null; + if (!preg_match('//u', $s)) { + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); + } + } else { + $s = iconv($encoding, 'UTF-8//IGNORE', $s); + } + + if (\MB_CASE_TITLE == $mode) { + static $titleRegexp = null; + if (null === $titleRegexp) { + $titleRegexp = self::getData('titleCaseRegexp'); + } + $s = preg_replace_callback($titleRegexp, [__CLASS__, 'title_case'], $s); + } else { + if (\MB_CASE_UPPER == $mode) { + static $upper = null; + if (null === $upper) { + $upper = self::getData('upperCase'); + } + $map = $upper; + } else { + if (self::MB_CASE_FOLD === $mode) { + static $caseFolding = null; + if (null === $caseFolding) { + $caseFolding = self::getData('caseFolding'); + } + $s = strtr($s, $caseFolding); + } + + static $lower = null; + if (null === $lower) { + $lower = self::getData('lowerCase'); + } + $map = $lower; + } + + static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4]; + + $i = 0; + $len = \strlen($s); + + while ($i < $len) { + $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; + $uchr = substr($s, $i, $ulen); + $i += $ulen; + + if (isset($map[$uchr])) { + $uchr = $map[$uchr]; + $nlen = \strlen($uchr); + + if ($nlen == $ulen) { + $nlen = $i; + do { + $s[--$nlen] = $uchr[--$ulen]; + } while ($ulen); + } else { + $s = substr_replace($s, $uchr, $i - $ulen, $ulen); + $len += $nlen - $ulen; + $i += $nlen - $ulen; + } + } + } + } + + if (null === $encoding) { + return $s; + } + + return iconv('UTF-8', $encoding.'//IGNORE', $s); + } + + public static function mb_internal_encoding($encoding = null) + { + if (null === $encoding) { + return self::$internalEncoding; + } + + $normalizedEncoding = self::getEncoding($encoding); + + if ('UTF-8' === $normalizedEncoding || false !== @iconv($normalizedEncoding, $normalizedEncoding, ' ')) { + self::$internalEncoding = $normalizedEncoding; + + return true; + } + + if (80000 > \PHP_VERSION_ID) { + return false; + } + + throw new \ValueError(sprintf('Argument #1 ($encoding) must be a valid encoding, "%s" given', $encoding)); + } + + public static function mb_language($lang = null) + { + if (null === $lang) { + return self::$language; + } + + switch ($normalizedLang = strtolower($lang)) { + case 'uni': + case 'neutral': + self::$language = $normalizedLang; + + return true; + } + + if (80000 > \PHP_VERSION_ID) { + return false; + } + + throw new \ValueError(sprintf('Argument #1 ($language) must be a valid language, "%s" given', $lang)); + } + + public static function mb_list_encodings() + { + return ['UTF-8']; + } + + public static function mb_encoding_aliases($encoding) + { + switch (strtoupper($encoding)) { + case 'UTF8': + case 'UTF-8': + return ['utf8']; + } + + return false; + } + + public static function mb_check_encoding($var = null, $encoding = null) + { + if (null === $encoding) { + if (null === $var) { + return false; + } + $encoding = self::$internalEncoding; + } + + if (!\is_array($var)) { + return self::mb_detect_encoding($var, [$encoding]) || false !== @iconv($encoding, $encoding, $var); + } + + foreach ($var as $key => $value) { + if (!self::mb_check_encoding($key, $encoding)) { + return false; + } + if (!self::mb_check_encoding($value, $encoding)) { + return false; + } + } + + return true; + } + + public static function mb_detect_encoding($str, $encodingList = null, $strict = false) + { + if (null === $encodingList) { + $encodingList = self::$encodingList; + } else { + if (!\is_array($encodingList)) { + $encodingList = array_map('trim', explode(',', $encodingList)); + } + $encodingList = array_map('strtoupper', $encodingList); + } + + foreach ($encodingList as $enc) { + switch ($enc) { + case 'ASCII': + if (!preg_match('/[\x80-\xFF]/', $str)) { + return $enc; + } + break; + + case 'UTF8': + case 'UTF-8': + if (preg_match('//u', $str)) { + return 'UTF-8'; + } + break; + + default: + if (0 === strncmp($enc, 'ISO-8859-', 9)) { + return $enc; + } + } + } + + return false; + } + + public static function mb_detect_order($encodingList = null) + { + if (null === $encodingList) { + return self::$encodingList; + } + + if (!\is_array($encodingList)) { + $encodingList = array_map('trim', explode(',', $encodingList)); + } + $encodingList = array_map('strtoupper', $encodingList); + + foreach ($encodingList as $enc) { + switch ($enc) { + default: + if (strncmp($enc, 'ISO-8859-', 9)) { + return false; + } + // no break + case 'ASCII': + case 'UTF8': + case 'UTF-8': + } + } + + self::$encodingList = $encodingList; + + return true; + } + + public static function mb_strlen($s, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return \strlen($s); + } + + return @iconv_strlen($s, $encoding); + } + + public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return strpos($haystack, $needle, $offset); + } + + $needle = (string) $needle; + if ('' === $needle) { + if (80000 > \PHP_VERSION_ID) { + trigger_error(__METHOD__.': Empty delimiter', \E_USER_WARNING); + + return false; + } + + return 0; + } + + return iconv_strpos($haystack, $needle, $offset, $encoding); + } + + public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return strrpos($haystack, $needle, $offset); + } + + if ($offset != (int) $offset) { + $offset = 0; + } elseif ($offset = (int) $offset) { + if ($offset < 0) { + if (0 > $offset += self::mb_strlen($needle)) { + $haystack = self::mb_substr($haystack, 0, $offset, $encoding); + } + $offset = 0; + } else { + $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding); + } + } + + $pos = '' !== $needle || 80000 > \PHP_VERSION_ID + ? iconv_strrpos($haystack, $needle, $encoding) + : self::mb_strlen($haystack, $encoding); + + return false !== $pos ? $offset + $pos : false; + } + + public static function mb_str_split($string, $split_length = 1, $encoding = null) + { + if (null !== $string && !\is_scalar($string) && !(\is_object($string) && method_exists($string, '__toString'))) { + trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', \E_USER_WARNING); + + return null; + } + + if (1 > $split_length = (int) $split_length) { + if (80000 > \PHP_VERSION_ID) { + trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING); + + return false; + } + + throw new \ValueError('Argument #2 ($length) must be greater than 0'); + } + + if (null === $encoding) { + $encoding = mb_internal_encoding(); + } + + if ('UTF-8' === $encoding = self::getEncoding($encoding)) { + $rx = '/('; + while (65535 < $split_length) { + $rx .= '.{65535}'; + $split_length -= 65535; + } + $rx .= '.{'.$split_length.'})/us'; + + return preg_split($rx, $string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); + } + + $result = []; + $length = mb_strlen($string, $encoding); + + for ($i = 0; $i < $length; $i += $split_length) { + $result[] = mb_substr($string, $i, $split_length, $encoding); + } + + return $result; + } + + public static function mb_strtolower($s, $encoding = null) + { + return self::mb_convert_case($s, \MB_CASE_LOWER, $encoding); + } + + public static function mb_strtoupper($s, $encoding = null) + { + return self::mb_convert_case($s, \MB_CASE_UPPER, $encoding); + } + + public static function mb_substitute_character($c = null) + { + if (null === $c) { + return 'none'; + } + if (0 === strcasecmp($c, 'none')) { + return true; + } + if (80000 > \PHP_VERSION_ID) { + return false; + } + if (\is_int($c) || 'long' === $c || 'entity' === $c) { + return false; + } + + throw new \ValueError('Argument #1 ($substitute_character) must be "none", "long", "entity" or a valid codepoint'); + } + + public static function mb_substr($s, $start, $length = null, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return (string) substr($s, $start, null === $length ? 2147483647 : $length); + } + + if ($start < 0) { + $start = iconv_strlen($s, $encoding) + $start; + if ($start < 0) { + $start = 0; + } + } + + if (null === $length) { + $length = 2147483647; + } elseif ($length < 0) { + $length = iconv_strlen($s, $encoding) + $length - $start; + if ($length < 0) { + return ''; + } + } + + return (string) iconv_substr($s, $start, $length, $encoding); + } + + public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) + { + [$haystack, $needle] = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], [ + self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding), + self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding), + ]); + + return self::mb_strpos($haystack, $needle, $offset, $encoding); + } + + public static function mb_stristr($haystack, $needle, $part = false, $encoding = null) + { + $pos = self::mb_stripos($haystack, $needle, 0, $encoding); + + return self::getSubpart($pos, $part, $haystack, $encoding); + } + + public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + $pos = strrpos($haystack, $needle); + } else { + $needle = self::mb_substr($needle, 0, 1, $encoding); + $pos = iconv_strrpos($haystack, $needle, $encoding); + } + + return self::getSubpart($pos, $part, $haystack, $encoding); + } + + public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null) + { + $needle = self::mb_substr($needle, 0, 1, $encoding); + $pos = self::mb_strripos($haystack, $needle, $encoding); + + return self::getSubpart($pos, $part, $haystack, $encoding); + } + + public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) + { + $haystack = self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding); + $needle = self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding); + + $haystack = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $haystack); + $needle = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $needle); + + return self::mb_strrpos($haystack, $needle, $offset, $encoding); + } + + public static function mb_strstr($haystack, $needle, $part = false, $encoding = null) + { + $pos = strpos($haystack, $needle); + if (false === $pos) { + return false; + } + if ($part) { + return substr($haystack, 0, $pos); + } + + return substr($haystack, $pos); + } + + public static function mb_get_info($type = 'all') + { + $info = [ + 'internal_encoding' => self::$internalEncoding, + 'http_output' => 'pass', + 'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)', + 'func_overload' => 0, + 'func_overload_list' => 'no overload', + 'mail_charset' => 'UTF-8', + 'mail_header_encoding' => 'BASE64', + 'mail_body_encoding' => 'BASE64', + 'illegal_chars' => 0, + 'encoding_translation' => 'Off', + 'language' => self::$language, + 'detect_order' => self::$encodingList, + 'substitute_character' => 'none', + 'strict_detection' => 'Off', + ]; + + if ('all' === $type) { + return $info; + } + if (isset($info[$type])) { + return $info[$type]; + } + + return false; + } + + public static function mb_http_input($type = '') + { + return false; + } + + public static function mb_http_output($encoding = null) + { + return null !== $encoding ? 'pass' === $encoding : 'pass'; + } + + public static function mb_strwidth($s, $encoding = null) + { + $encoding = self::getEncoding($encoding); + + if ('UTF-8' !== $encoding) { + $s = iconv($encoding, 'UTF-8//IGNORE', $s); + } + + $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide); + + return ($wide << 1) + iconv_strlen($s, 'UTF-8'); + } + + public static function mb_substr_count($haystack, $needle, $encoding = null) + { + return substr_count($haystack, $needle); + } + + public static function mb_output_handler($contents, $status) + { + return $contents; + } + + public static function mb_chr($code, $encoding = null) + { + if (0x80 > $code %= 0x200000) { + $s = \chr($code); + } elseif (0x800 > $code) { + $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); + } elseif (0x10000 > $code) { + $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); + } else { + $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); + } + + if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { + $s = mb_convert_encoding($s, $encoding, 'UTF-8'); + } + + return $s; + } + + public static function mb_ord($s, $encoding = null) + { + if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { + $s = mb_convert_encoding($s, 'UTF-8', $encoding); + } + + if (1 === \strlen($s)) { + return \ord($s); + } + + $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; + if (0xF0 <= $code) { + return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80; + } + if (0xE0 <= $code) { + return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80; + } + if (0xC0 <= $code) { + return (($code - 0xC0) << 6) + $s[2] - 0x80; + } + + return $code; + } + + public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, ?string $encoding = null): string + { + if (!\in_array($pad_type, [\STR_PAD_RIGHT, \STR_PAD_LEFT, \STR_PAD_BOTH], true)) { + throw new \ValueError('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH'); + } + + if (null === $encoding) { + $encoding = self::mb_internal_encoding(); + } else { + self::assertEncoding($encoding, 'mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given'); + } + + if (self::mb_strlen($pad_string, $encoding) <= 0) { + throw new \ValueError('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string'); + } + + $paddingRequired = $length - self::mb_strlen($string, $encoding); + + if ($paddingRequired < 1) { + return $string; + } + + switch ($pad_type) { + case \STR_PAD_LEFT: + return self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding).$string; + case \STR_PAD_RIGHT: + return $string.self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding); + default: + $leftPaddingLength = floor($paddingRequired / 2); + $rightPaddingLength = $paddingRequired - $leftPaddingLength; + + return self::mb_substr(str_repeat($pad_string, $leftPaddingLength), 0, $leftPaddingLength, $encoding).$string.self::mb_substr(str_repeat($pad_string, $rightPaddingLength), 0, $rightPaddingLength, $encoding); + } + } + + public static function mb_ucfirst(string $string, ?string $encoding = null): string + { + if (null === $encoding) { + $encoding = self::mb_internal_encoding(); + } else { + self::assertEncoding($encoding, 'mb_ucfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given'); + } + + $firstChar = mb_substr($string, 0, 1, $encoding); + $firstChar = mb_convert_case($firstChar, \MB_CASE_TITLE, $encoding); + + return $firstChar.mb_substr($string, 1, null, $encoding); + } + + public static function mb_lcfirst(string $string, ?string $encoding = null): string + { + if (null === $encoding) { + $encoding = self::mb_internal_encoding(); + } else { + self::assertEncoding($encoding, 'mb_lcfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given'); + } + + $firstChar = mb_substr($string, 0, 1, $encoding); + $firstChar = mb_convert_case($firstChar, \MB_CASE_LOWER, $encoding); + + return $firstChar.mb_substr($string, 1, null, $encoding); + } + + private static function getSubpart($pos, $part, $haystack, $encoding) + { + if (false === $pos) { + return false; + } + if ($part) { + return self::mb_substr($haystack, 0, $pos, $encoding); + } + + return self::mb_substr($haystack, $pos, null, $encoding); + } + + private static function html_encoding_callback(array $m) + { + $i = 1; + $entities = ''; + $m = unpack('C*', htmlentities($m[0], \ENT_COMPAT, 'UTF-8')); + + while (isset($m[$i])) { + if (0x80 > $m[$i]) { + $entities .= \chr($m[$i++]); + continue; + } + if (0xF0 <= $m[$i]) { + $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; + } elseif (0xE0 <= $m[$i]) { + $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; + } else { + $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80; + } + + $entities .= '&#'.$c.';'; + } + + return $entities; + } + + private static function title_case(array $s) + { + return self::mb_convert_case($s[1], \MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], \MB_CASE_LOWER, 'UTF-8'); + } + + private static function getData($file) + { + if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) { + return require $file; + } + + return false; + } + + private static function getEncoding($encoding) + { + if (null === $encoding) { + return self::$internalEncoding; + } + + if ('UTF-8' === $encoding) { + return 'UTF-8'; + } + + $encoding = strtoupper($encoding); + + if ('8BIT' === $encoding || 'BINARY' === $encoding) { + return 'CP850'; + } + + if ('UTF8' === $encoding) { + return 'UTF-8'; + } + + return $encoding; + } + + public static function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string + { + return self::mb_internal_trim('{^[%s]+|[%1$s]+$}Du', $string, $characters, $encoding, __FUNCTION__); + } + + public static function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string + { + return self::mb_internal_trim('{^[%s]+}Du', $string, $characters, $encoding, __FUNCTION__); + } + + public static function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string + { + return self::mb_internal_trim('{[%s]+$}Du', $string, $characters, $encoding, __FUNCTION__); + } + + private static function mb_internal_trim(string $regex, string $string, ?string $characters, ?string $encoding, string $function): string + { + if (null === $encoding) { + $encoding = self::mb_internal_encoding(); + } else { + self::assertEncoding($encoding, $function.'(): Argument #3 ($encoding) must be a valid encoding, "%s" given'); + } + + if ('' === $characters) { + return null === $encoding ? $string : self::mb_convert_encoding($string, $encoding); + } + + if ('UTF-8' === $encoding) { + $encoding = null; + if (!preg_match('//u', $string)) { + $string = @iconv('UTF-8', 'UTF-8//IGNORE', $string); + } + if (null !== $characters && !preg_match('//u', $characters)) { + $characters = @iconv('UTF-8', 'UTF-8//IGNORE', $characters); + } + } else { + $string = iconv($encoding, 'UTF-8//IGNORE', $string); + + if (null !== $characters) { + $characters = iconv($encoding, 'UTF-8//IGNORE', $characters); + } + } + + if (null === $characters) { + $characters = "\\0 \f\n\r\t\v\u{00A0}\u{1680}\u{2000}\u{2001}\u{2002}\u{2003}\u{2004}\u{2005}\u{2006}\u{2007}\u{2008}\u{2009}\u{200A}\u{2028}\u{2029}\u{202F}\u{205F}\u{3000}\u{0085}\u{180E}"; + } else { + $characters = preg_quote($characters); + } + + $string = preg_replace(sprintf($regex, $characters), '', $string); + + if (null === $encoding) { + return $string; + } + + return iconv('UTF-8', $encoding.'//IGNORE', $string); + } + + private static function assertEncoding(string $encoding, string $errorFormat): void + { + try { + $validEncoding = @self::mb_check_encoding('', $encoding); + } catch (\ValueError $e) { + throw new \ValueError(sprintf($errorFormat, $encoding)); + } + + // BC for PHP 7.3 and lower + if (!$validEncoding) { + throw new \ValueError(sprintf($errorFormat, $encoding)); + } + } +} diff --git a/plants/vendor/symfony/polyfill-mbstring/README.md b/plants/vendor/symfony/polyfill-mbstring/README.md new file mode 100644 index 0000000..478b40d --- /dev/null +++ b/plants/vendor/symfony/polyfill-mbstring/README.md @@ -0,0 +1,13 @@ +Symfony Polyfill / Mbstring +=========================== + +This component provides a partial, native PHP implementation for the +[Mbstring](https://php.net/mbstring) extension. + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/plants/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php b/plants/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php new file mode 100644 index 0000000..512bba0 --- /dev/null +++ b/plants/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php @@ -0,0 +1,119 @@ + 'i̇', + 'µ' => 'μ', + 'ſ' => 's', + 'ͅ' => 'ι', + 'ς' => 'σ', + 'ϐ' => 'β', + 'ϑ' => 'θ', + 'ϕ' => 'φ', + 'ϖ' => 'π', + 'ϰ' => 'κ', + 'ϱ' => 'ρ', + 'ϵ' => 'ε', + 'ẛ' => 'ṡ', + 'ι' => 'ι', + 'ß' => 'ss', + 'ʼn' => 'ʼn', + 'ǰ' => 'ǰ', + 'ΐ' => 'ΐ', + 'ΰ' => 'ΰ', + 'և' => 'եւ', + 'ẖ' => 'ẖ', + 'ẗ' => 'ẗ', + 'ẘ' => 'ẘ', + 'ẙ' => 'ẙ', + 'ẚ' => 'aʾ', + 'ẞ' => 'ss', + 'ὐ' => 'ὐ', + 'ὒ' => 'ὒ', + 'ὔ' => 'ὔ', + 'ὖ' => 'ὖ', + 'ᾀ' => 'ἀι', + 'ᾁ' => 'ἁι', + 'ᾂ' => 'ἂι', + 'ᾃ' => 'ἃι', + 'ᾄ' => 'ἄι', + 'ᾅ' => 'ἅι', + 'ᾆ' => 'ἆι', + 'ᾇ' => 'ἇι', + 'ᾈ' => 'ἀι', + 'ᾉ' => 'ἁι', + 'ᾊ' => 'ἂι', + 'ᾋ' => 'ἃι', + 'ᾌ' => 'ἄι', + 'ᾍ' => 'ἅι', + 'ᾎ' => 'ἆι', + 'ᾏ' => 'ἇι', + 'ᾐ' => 'ἠι', + 'ᾑ' => 'ἡι', + 'ᾒ' => 'ἢι', + 'ᾓ' => 'ἣι', + 'ᾔ' => 'ἤι', + 'ᾕ' => 'ἥι', + 'ᾖ' => 'ἦι', + 'ᾗ' => 'ἧι', + 'ᾘ' => 'ἠι', + 'ᾙ' => 'ἡι', + 'ᾚ' => 'ἢι', + 'ᾛ' => 'ἣι', + 'ᾜ' => 'ἤι', + 'ᾝ' => 'ἥι', + 'ᾞ' => 'ἦι', + 'ᾟ' => 'ἧι', + 'ᾠ' => 'ὠι', + 'ᾡ' => 'ὡι', + 'ᾢ' => 'ὢι', + 'ᾣ' => 'ὣι', + 'ᾤ' => 'ὤι', + 'ᾥ' => 'ὥι', + 'ᾦ' => 'ὦι', + 'ᾧ' => 'ὧι', + 'ᾨ' => 'ὠι', + 'ᾩ' => 'ὡι', + 'ᾪ' => 'ὢι', + 'ᾫ' => 'ὣι', + 'ᾬ' => 'ὤι', + 'ᾭ' => 'ὥι', + 'ᾮ' => 'ὦι', + 'ᾯ' => 'ὧι', + 'ᾲ' => 'ὰι', + 'ᾳ' => 'αι', + 'ᾴ' => 'άι', + 'ᾶ' => 'ᾶ', + 'ᾷ' => 'ᾶι', + 'ᾼ' => 'αι', + 'ῂ' => 'ὴι', + 'ῃ' => 'ηι', + 'ῄ' => 'ήι', + 'ῆ' => 'ῆ', + 'ῇ' => 'ῆι', + 'ῌ' => 'ηι', + 'ῒ' => 'ῒ', + 'ῖ' => 'ῖ', + 'ῗ' => 'ῗ', + 'ῢ' => 'ῢ', + 'ῤ' => 'ῤ', + 'ῦ' => 'ῦ', + 'ῧ' => 'ῧ', + 'ῲ' => 'ὼι', + 'ῳ' => 'ωι', + 'ῴ' => 'ώι', + 'ῶ' => 'ῶ', + 'ῷ' => 'ῶι', + 'ῼ' => 'ωι', + 'ff' => 'ff', + 'fi' => 'fi', + 'fl' => 'fl', + 'ffi' => 'ffi', + 'ffl' => 'ffl', + 'ſt' => 'st', + 'st' => 'st', + 'ﬓ' => 'մն', + 'ﬔ' => 'մե', + 'ﬕ' => 'մի', + 'ﬖ' => 'վն', + 'ﬗ' => 'մխ', +]; diff --git a/plants/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php b/plants/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php new file mode 100644 index 0000000..fac60b0 --- /dev/null +++ b/plants/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php @@ -0,0 +1,1397 @@ + 'a', + 'B' => 'b', + 'C' => 'c', + 'D' => 'd', + 'E' => 'e', + 'F' => 'f', + 'G' => 'g', + 'H' => 'h', + 'I' => 'i', + 'J' => 'j', + 'K' => 'k', + 'L' => 'l', + 'M' => 'm', + 'N' => 'n', + 'O' => 'o', + 'P' => 'p', + 'Q' => 'q', + 'R' => 'r', + 'S' => 's', + 'T' => 't', + 'U' => 'u', + 'V' => 'v', + 'W' => 'w', + 'X' => 'x', + 'Y' => 'y', + 'Z' => 'z', + 'À' => 'à', + 'Á' => 'á', + 'Â' => 'â', + 'Ã' => 'ã', + 'Ä' => 'ä', + 'Å' => 'å', + 'Æ' => 'æ', + 'Ç' => 'ç', + 'È' => 'è', + 'É' => 'é', + 'Ê' => 'ê', + 'Ë' => 'ë', + 'Ì' => 'ì', + 'Í' => 'í', + 'Î' => 'î', + 'Ï' => 'ï', + 'Ð' => 'ð', + 'Ñ' => 'ñ', + 'Ò' => 'ò', + 'Ó' => 'ó', + 'Ô' => 'ô', + 'Õ' => 'õ', + 'Ö' => 'ö', + 'Ø' => 'ø', + 'Ù' => 'ù', + 'Ú' => 'ú', + 'Û' => 'û', + 'Ü' => 'ü', + 'Ý' => 'ý', + 'Þ' => 'þ', + 'Ā' => 'ā', + 'Ă' => 'ă', + 'Ą' => 'ą', + 'Ć' => 'ć', + 'Ĉ' => 'ĉ', + 'Ċ' => 'ċ', + 'Č' => 'č', + 'Ď' => 'ď', + 'Đ' => 'đ', + 'Ē' => 'ē', + 'Ĕ' => 'ĕ', + 'Ė' => 'ė', + 'Ę' => 'ę', + 'Ě' => 'ě', + 'Ĝ' => 'ĝ', + 'Ğ' => 'ğ', + 'Ġ' => 'ġ', + 'Ģ' => 'ģ', + 'Ĥ' => 'ĥ', + 'Ħ' => 'ħ', + 'Ĩ' => 'ĩ', + 'Ī' => 'ī', + 'Ĭ' => 'ĭ', + 'Į' => 'į', + 'İ' => 'i̇', + 'IJ' => 'ij', + 'Ĵ' => 'ĵ', + 'Ķ' => 'ķ', + 'Ĺ' => 'ĺ', + 'Ļ' => 'ļ', + 'Ľ' => 'ľ', + 'Ŀ' => 'ŀ', + 'Ł' => 'ł', + 'Ń' => 'ń', + 'Ņ' => 'ņ', + 'Ň' => 'ň', + 'Ŋ' => 'ŋ', + 'Ō' => 'ō', + 'Ŏ' => 'ŏ', + 'Ő' => 'ő', + 'Œ' => 'œ', + 'Ŕ' => 'ŕ', + 'Ŗ' => 'ŗ', + 'Ř' => 'ř', + 'Ś' => 'ś', + 'Ŝ' => 'ŝ', + 'Ş' => 'ş', + 'Š' => 'š', + 'Ţ' => 'ţ', + 'Ť' => 'ť', + 'Ŧ' => 'ŧ', + 'Ũ' => 'ũ', + 'Ū' => 'ū', + 'Ŭ' => 'ŭ', + 'Ů' => 'ů', + 'Ű' => 'ű', + 'Ų' => 'ų', + 'Ŵ' => 'ŵ', + 'Ŷ' => 'ŷ', + 'Ÿ' => 'ÿ', + 'Ź' => 'ź', + 'Ż' => 'ż', + 'Ž' => 'ž', + 'Ɓ' => 'ɓ', + 'Ƃ' => 'ƃ', + 'Ƅ' => 'ƅ', + 'Ɔ' => 'ɔ', + 'Ƈ' => 'ƈ', + 'Ɖ' => 'ɖ', + 'Ɗ' => 'ɗ', + 'Ƌ' => 'ƌ', + 'Ǝ' => 'ǝ', + 'Ə' => 'ə', + 'Ɛ' => 'ɛ', + 'Ƒ' => 'ƒ', + 'Ɠ' => 'ɠ', + 'Ɣ' => 'ɣ', + 'Ɩ' => 'ɩ', + 'Ɨ' => 'ɨ', + 'Ƙ' => 'ƙ', + 'Ɯ' => 'ɯ', + 'Ɲ' => 'ɲ', + 'Ɵ' => 'ɵ', + 'Ơ' => 'ơ', + 'Ƣ' => 'ƣ', + 'Ƥ' => 'ƥ', + 'Ʀ' => 'ʀ', + 'Ƨ' => 'ƨ', + 'Ʃ' => 'ʃ', + 'Ƭ' => 'ƭ', + 'Ʈ' => 'ʈ', + 'Ư' => 'ư', + 'Ʊ' => 'ʊ', + 'Ʋ' => 'ʋ', + 'Ƴ' => 'ƴ', + 'Ƶ' => 'ƶ', + 'Ʒ' => 'ʒ', + 'Ƹ' => 'ƹ', + 'Ƽ' => 'ƽ', + 'DŽ' => 'dž', + 'Dž' => 'dž', + 'LJ' => 'lj', + 'Lj' => 'lj', + 'NJ' => 'nj', + 'Nj' => 'nj', + 'Ǎ' => 'ǎ', + 'Ǐ' => 'ǐ', + 'Ǒ' => 'ǒ', + 'Ǔ' => 'ǔ', + 'Ǖ' => 'ǖ', + 'Ǘ' => 'ǘ', + 'Ǚ' => 'ǚ', + 'Ǜ' => 'ǜ', + 'Ǟ' => 'ǟ', + 'Ǡ' => 'ǡ', + 'Ǣ' => 'ǣ', + 'Ǥ' => 'ǥ', + 'Ǧ' => 'ǧ', + 'Ǩ' => 'ǩ', + 'Ǫ' => 'ǫ', + 'Ǭ' => 'ǭ', + 'Ǯ' => 'ǯ', + 'DZ' => 'dz', + 'Dz' => 'dz', + 'Ǵ' => 'ǵ', + 'Ƕ' => 'ƕ', + 'Ƿ' => 'ƿ', + 'Ǹ' => 'ǹ', + 'Ǻ' => 'ǻ', + 'Ǽ' => 'ǽ', + 'Ǿ' => 'ǿ', + 'Ȁ' => 'ȁ', + 'Ȃ' => 'ȃ', + 'Ȅ' => 'ȅ', + 'Ȇ' => 'ȇ', + 'Ȉ' => 'ȉ', + 'Ȋ' => 'ȋ', + 'Ȍ' => 'ȍ', + 'Ȏ' => 'ȏ', + 'Ȑ' => 'ȑ', + 'Ȓ' => 'ȓ', + 'Ȕ' => 'ȕ', + 'Ȗ' => 'ȗ', + 'Ș' => 'ș', + 'Ț' => 'ț', + 'Ȝ' => 'ȝ', + 'Ȟ' => 'ȟ', + 'Ƞ' => 'ƞ', + 'Ȣ' => 'ȣ', + 'Ȥ' => 'ȥ', + 'Ȧ' => 'ȧ', + 'Ȩ' => 'ȩ', + 'Ȫ' => 'ȫ', + 'Ȭ' => 'ȭ', + 'Ȯ' => 'ȯ', + 'Ȱ' => 'ȱ', + 'Ȳ' => 'ȳ', + 'Ⱥ' => 'ⱥ', + 'Ȼ' => 'ȼ', + 'Ƚ' => 'ƚ', + 'Ⱦ' => 'ⱦ', + 'Ɂ' => 'ɂ', + 'Ƀ' => 'ƀ', + 'Ʉ' => 'ʉ', + 'Ʌ' => 'ʌ', + 'Ɇ' => 'ɇ', + 'Ɉ' => 'ɉ', + 'Ɋ' => 'ɋ', + 'Ɍ' => 'ɍ', + 'Ɏ' => 'ɏ', + 'Ͱ' => 'ͱ', + 'Ͳ' => 'ͳ', + 'Ͷ' => 'ͷ', + 'Ϳ' => 'ϳ', + 'Ά' => 'ά', + 'Έ' => 'έ', + 'Ή' => 'ή', + 'Ί' => 'ί', + 'Ό' => 'ό', + 'Ύ' => 'ύ', + 'Ώ' => 'ώ', + 'Α' => 'α', + 'Β' => 'β', + 'Γ' => 'γ', + 'Δ' => 'δ', + 'Ε' => 'ε', + 'Ζ' => 'ζ', + 'Η' => 'η', + 'Θ' => 'θ', + 'Ι' => 'ι', + 'Κ' => 'κ', + 'Λ' => 'λ', + 'Μ' => 'μ', + 'Ν' => 'ν', + 'Ξ' => 'ξ', + 'Ο' => 'ο', + 'Π' => 'π', + 'Ρ' => 'ρ', + 'Σ' => 'σ', + 'Τ' => 'τ', + 'Υ' => 'υ', + 'Φ' => 'φ', + 'Χ' => 'χ', + 'Ψ' => 'ψ', + 'Ω' => 'ω', + 'Ϊ' => 'ϊ', + 'Ϋ' => 'ϋ', + 'Ϗ' => 'ϗ', + 'Ϙ' => 'ϙ', + 'Ϛ' => 'ϛ', + 'Ϝ' => 'ϝ', + 'Ϟ' => 'ϟ', + 'Ϡ' => 'ϡ', + 'Ϣ' => 'ϣ', + 'Ϥ' => 'ϥ', + 'Ϧ' => 'ϧ', + 'Ϩ' => 'ϩ', + 'Ϫ' => 'ϫ', + 'Ϭ' => 'ϭ', + 'Ϯ' => 'ϯ', + 'ϴ' => 'θ', + 'Ϸ' => 'ϸ', + 'Ϲ' => 'ϲ', + 'Ϻ' => 'ϻ', + 'Ͻ' => 'ͻ', + 'Ͼ' => 'ͼ', + 'Ͽ' => 'ͽ', + 'Ѐ' => 'ѐ', + 'Ё' => 'ё', + 'Ђ' => 'ђ', + 'Ѓ' => 'ѓ', + 'Є' => 'є', + 'Ѕ' => 'ѕ', + 'І' => 'і', + 'Ї' => 'ї', + 'Ј' => 'ј', + 'Љ' => 'љ', + 'Њ' => 'њ', + 'Ћ' => 'ћ', + 'Ќ' => 'ќ', + 'Ѝ' => 'ѝ', + 'Ў' => 'ў', + 'Џ' => 'џ', + 'А' => 'а', + 'Б' => 'б', + 'В' => 'в', + 'Г' => 'г', + 'Д' => 'д', + 'Е' => 'е', + 'Ж' => 'ж', + 'З' => 'з', + 'И' => 'и', + 'Й' => 'й', + 'К' => 'к', + 'Л' => 'л', + 'М' => 'м', + 'Н' => 'н', + 'О' => 'о', + 'П' => 'п', + 'Р' => 'р', + 'С' => 'с', + 'Т' => 'т', + 'У' => 'у', + 'Ф' => 'ф', + 'Х' => 'х', + 'Ц' => 'ц', + 'Ч' => 'ч', + 'Ш' => 'ш', + 'Щ' => 'щ', + 'Ъ' => 'ъ', + 'Ы' => 'ы', + 'Ь' => 'ь', + 'Э' => 'э', + 'Ю' => 'ю', + 'Я' => 'я', + 'Ѡ' => 'ѡ', + 'Ѣ' => 'ѣ', + 'Ѥ' => 'ѥ', + 'Ѧ' => 'ѧ', + 'Ѩ' => 'ѩ', + 'Ѫ' => 'ѫ', + 'Ѭ' => 'ѭ', + 'Ѯ' => 'ѯ', + 'Ѱ' => 'ѱ', + 'Ѳ' => 'ѳ', + 'Ѵ' => 'ѵ', + 'Ѷ' => 'ѷ', + 'Ѹ' => 'ѹ', + 'Ѻ' => 'ѻ', + 'Ѽ' => 'ѽ', + 'Ѿ' => 'ѿ', + 'Ҁ' => 'ҁ', + 'Ҋ' => 'ҋ', + 'Ҍ' => 'ҍ', + 'Ҏ' => 'ҏ', + 'Ґ' => 'ґ', + 'Ғ' => 'ғ', + 'Ҕ' => 'ҕ', + 'Җ' => 'җ', + 'Ҙ' => 'ҙ', + 'Қ' => 'қ', + 'Ҝ' => 'ҝ', + 'Ҟ' => 'ҟ', + 'Ҡ' => 'ҡ', + 'Ң' => 'ң', + 'Ҥ' => 'ҥ', + 'Ҧ' => 'ҧ', + 'Ҩ' => 'ҩ', + 'Ҫ' => 'ҫ', + 'Ҭ' => 'ҭ', + 'Ү' => 'ү', + 'Ұ' => 'ұ', + 'Ҳ' => 'ҳ', + 'Ҵ' => 'ҵ', + 'Ҷ' => 'ҷ', + 'Ҹ' => 'ҹ', + 'Һ' => 'һ', + 'Ҽ' => 'ҽ', + 'Ҿ' => 'ҿ', + 'Ӏ' => 'ӏ', + 'Ӂ' => 'ӂ', + 'Ӄ' => 'ӄ', + 'Ӆ' => 'ӆ', + 'Ӈ' => 'ӈ', + 'Ӊ' => 'ӊ', + 'Ӌ' => 'ӌ', + 'Ӎ' => 'ӎ', + 'Ӑ' => 'ӑ', + 'Ӓ' => 'ӓ', + 'Ӕ' => 'ӕ', + 'Ӗ' => 'ӗ', + 'Ә' => 'ә', + 'Ӛ' => 'ӛ', + 'Ӝ' => 'ӝ', + 'Ӟ' => 'ӟ', + 'Ӡ' => 'ӡ', + 'Ӣ' => 'ӣ', + 'Ӥ' => 'ӥ', + 'Ӧ' => 'ӧ', + 'Ө' => 'ө', + 'Ӫ' => 'ӫ', + 'Ӭ' => 'ӭ', + 'Ӯ' => 'ӯ', + 'Ӱ' => 'ӱ', + 'Ӳ' => 'ӳ', + 'Ӵ' => 'ӵ', + 'Ӷ' => 'ӷ', + 'Ӹ' => 'ӹ', + 'Ӻ' => 'ӻ', + 'Ӽ' => 'ӽ', + 'Ӿ' => 'ӿ', + 'Ԁ' => 'ԁ', + 'Ԃ' => 'ԃ', + 'Ԅ' => 'ԅ', + 'Ԇ' => 'ԇ', + 'Ԉ' => 'ԉ', + 'Ԋ' => 'ԋ', + 'Ԍ' => 'ԍ', + 'Ԏ' => 'ԏ', + 'Ԑ' => 'ԑ', + 'Ԓ' => 'ԓ', + 'Ԕ' => 'ԕ', + 'Ԗ' => 'ԗ', + 'Ԙ' => 'ԙ', + 'Ԛ' => 'ԛ', + 'Ԝ' => 'ԝ', + 'Ԟ' => 'ԟ', + 'Ԡ' => 'ԡ', + 'Ԣ' => 'ԣ', + 'Ԥ' => 'ԥ', + 'Ԧ' => 'ԧ', + 'Ԩ' => 'ԩ', + 'Ԫ' => 'ԫ', + 'Ԭ' => 'ԭ', + 'Ԯ' => 'ԯ', + 'Ա' => 'ա', + 'Բ' => 'բ', + 'Գ' => 'գ', + 'Դ' => 'դ', + 'Ե' => 'ե', + 'Զ' => 'զ', + 'Է' => 'է', + 'Ը' => 'ը', + 'Թ' => 'թ', + 'Ժ' => 'ժ', + 'Ի' => 'ի', + 'Լ' => 'լ', + 'Խ' => 'խ', + 'Ծ' => 'ծ', + 'Կ' => 'կ', + 'Հ' => 'հ', + 'Ձ' => 'ձ', + 'Ղ' => 'ղ', + 'Ճ' => 'ճ', + 'Մ' => 'մ', + 'Յ' => 'յ', + 'Ն' => 'ն', + 'Շ' => 'շ', + 'Ո' => 'ո', + 'Չ' => 'չ', + 'Պ' => 'պ', + 'Ջ' => 'ջ', + 'Ռ' => 'ռ', + 'Ս' => 'ս', + 'Վ' => 'վ', + 'Տ' => 'տ', + 'Ր' => 'ր', + 'Ց' => 'ց', + 'Ւ' => 'ւ', + 'Փ' => 'փ', + 'Ք' => 'ք', + 'Օ' => 'օ', + 'Ֆ' => 'ֆ', + 'Ⴀ' => 'ⴀ', + 'Ⴁ' => 'ⴁ', + 'Ⴂ' => 'ⴂ', + 'Ⴃ' => 'ⴃ', + 'Ⴄ' => 'ⴄ', + 'Ⴅ' => 'ⴅ', + 'Ⴆ' => 'ⴆ', + 'Ⴇ' => 'ⴇ', + 'Ⴈ' => 'ⴈ', + 'Ⴉ' => 'ⴉ', + 'Ⴊ' => 'ⴊ', + 'Ⴋ' => 'ⴋ', + 'Ⴌ' => 'ⴌ', + 'Ⴍ' => 'ⴍ', + 'Ⴎ' => 'ⴎ', + 'Ⴏ' => 'ⴏ', + 'Ⴐ' => 'ⴐ', + 'Ⴑ' => 'ⴑ', + 'Ⴒ' => 'ⴒ', + 'Ⴓ' => 'ⴓ', + 'Ⴔ' => 'ⴔ', + 'Ⴕ' => 'ⴕ', + 'Ⴖ' => 'ⴖ', + 'Ⴗ' => 'ⴗ', + 'Ⴘ' => 'ⴘ', + 'Ⴙ' => 'ⴙ', + 'Ⴚ' => 'ⴚ', + 'Ⴛ' => 'ⴛ', + 'Ⴜ' => 'ⴜ', + 'Ⴝ' => 'ⴝ', + 'Ⴞ' => 'ⴞ', + 'Ⴟ' => 'ⴟ', + 'Ⴠ' => 'ⴠ', + 'Ⴡ' => 'ⴡ', + 'Ⴢ' => 'ⴢ', + 'Ⴣ' => 'ⴣ', + 'Ⴤ' => 'ⴤ', + 'Ⴥ' => 'ⴥ', + 'Ⴧ' => 'ⴧ', + 'Ⴭ' => 'ⴭ', + 'Ꭰ' => 'ꭰ', + 'Ꭱ' => 'ꭱ', + 'Ꭲ' => 'ꭲ', + 'Ꭳ' => 'ꭳ', + 'Ꭴ' => 'ꭴ', + 'Ꭵ' => 'ꭵ', + 'Ꭶ' => 'ꭶ', + 'Ꭷ' => 'ꭷ', + 'Ꭸ' => 'ꭸ', + 'Ꭹ' => 'ꭹ', + 'Ꭺ' => 'ꭺ', + 'Ꭻ' => 'ꭻ', + 'Ꭼ' => 'ꭼ', + 'Ꭽ' => 'ꭽ', + 'Ꭾ' => 'ꭾ', + 'Ꭿ' => 'ꭿ', + 'Ꮀ' => 'ꮀ', + 'Ꮁ' => 'ꮁ', + 'Ꮂ' => 'ꮂ', + 'Ꮃ' => 'ꮃ', + 'Ꮄ' => 'ꮄ', + 'Ꮅ' => 'ꮅ', + 'Ꮆ' => 'ꮆ', + 'Ꮇ' => 'ꮇ', + 'Ꮈ' => 'ꮈ', + 'Ꮉ' => 'ꮉ', + 'Ꮊ' => 'ꮊ', + 'Ꮋ' => 'ꮋ', + 'Ꮌ' => 'ꮌ', + 'Ꮍ' => 'ꮍ', + 'Ꮎ' => 'ꮎ', + 'Ꮏ' => 'ꮏ', + 'Ꮐ' => 'ꮐ', + 'Ꮑ' => 'ꮑ', + 'Ꮒ' => 'ꮒ', + 'Ꮓ' => 'ꮓ', + 'Ꮔ' => 'ꮔ', + 'Ꮕ' => 'ꮕ', + 'Ꮖ' => 'ꮖ', + 'Ꮗ' => 'ꮗ', + 'Ꮘ' => 'ꮘ', + 'Ꮙ' => 'ꮙ', + 'Ꮚ' => 'ꮚ', + 'Ꮛ' => 'ꮛ', + 'Ꮜ' => 'ꮜ', + 'Ꮝ' => 'ꮝ', + 'Ꮞ' => 'ꮞ', + 'Ꮟ' => 'ꮟ', + 'Ꮠ' => 'ꮠ', + 'Ꮡ' => 'ꮡ', + 'Ꮢ' => 'ꮢ', + 'Ꮣ' => 'ꮣ', + 'Ꮤ' => 'ꮤ', + 'Ꮥ' => 'ꮥ', + 'Ꮦ' => 'ꮦ', + 'Ꮧ' => 'ꮧ', + 'Ꮨ' => 'ꮨ', + 'Ꮩ' => 'ꮩ', + 'Ꮪ' => 'ꮪ', + 'Ꮫ' => 'ꮫ', + 'Ꮬ' => 'ꮬ', + 'Ꮭ' => 'ꮭ', + 'Ꮮ' => 'ꮮ', + 'Ꮯ' => 'ꮯ', + 'Ꮰ' => 'ꮰ', + 'Ꮱ' => 'ꮱ', + 'Ꮲ' => 'ꮲ', + 'Ꮳ' => 'ꮳ', + 'Ꮴ' => 'ꮴ', + 'Ꮵ' => 'ꮵ', + 'Ꮶ' => 'ꮶ', + 'Ꮷ' => 'ꮷ', + 'Ꮸ' => 'ꮸ', + 'Ꮹ' => 'ꮹ', + 'Ꮺ' => 'ꮺ', + 'Ꮻ' => 'ꮻ', + 'Ꮼ' => 'ꮼ', + 'Ꮽ' => 'ꮽ', + 'Ꮾ' => 'ꮾ', + 'Ꮿ' => 'ꮿ', + 'Ᏸ' => 'ᏸ', + 'Ᏹ' => 'ᏹ', + 'Ᏺ' => 'ᏺ', + 'Ᏻ' => 'ᏻ', + 'Ᏼ' => 'ᏼ', + 'Ᏽ' => 'ᏽ', + 'Ა' => 'ა', + 'Ბ' => 'ბ', + 'Გ' => 'გ', + 'Დ' => 'დ', + 'Ე' => 'ე', + 'Ვ' => 'ვ', + 'Ზ' => 'ზ', + 'Თ' => 'თ', + 'Ი' => 'ი', + 'Კ' => 'კ', + 'Ლ' => 'ლ', + 'Მ' => 'მ', + 'Ნ' => 'ნ', + 'Ო' => 'ო', + 'Პ' => 'პ', + 'Ჟ' => 'ჟ', + 'Რ' => 'რ', + 'Ს' => 'ს', + 'Ტ' => 'ტ', + 'Უ' => 'უ', + 'Ფ' => 'ფ', + 'Ქ' => 'ქ', + 'Ღ' => 'ღ', + 'Ყ' => 'ყ', + 'Შ' => 'შ', + 'Ჩ' => 'ჩ', + 'Ც' => 'ც', + 'Ძ' => 'ძ', + 'Წ' => 'წ', + 'Ჭ' => 'ჭ', + 'Ხ' => 'ხ', + 'Ჯ' => 'ჯ', + 'Ჰ' => 'ჰ', + 'Ჱ' => 'ჱ', + 'Ჲ' => 'ჲ', + 'Ჳ' => 'ჳ', + 'Ჴ' => 'ჴ', + 'Ჵ' => 'ჵ', + 'Ჶ' => 'ჶ', + 'Ჷ' => 'ჷ', + 'Ჸ' => 'ჸ', + 'Ჹ' => 'ჹ', + 'Ჺ' => 'ჺ', + 'Ჽ' => 'ჽ', + 'Ჾ' => 'ჾ', + 'Ჿ' => 'ჿ', + 'Ḁ' => 'ḁ', + 'Ḃ' => 'ḃ', + 'Ḅ' => 'ḅ', + 'Ḇ' => 'ḇ', + 'Ḉ' => 'ḉ', + 'Ḋ' => 'ḋ', + 'Ḍ' => 'ḍ', + 'Ḏ' => 'ḏ', + 'Ḑ' => 'ḑ', + 'Ḓ' => 'ḓ', + 'Ḕ' => 'ḕ', + 'Ḗ' => 'ḗ', + 'Ḙ' => 'ḙ', + 'Ḛ' => 'ḛ', + 'Ḝ' => 'ḝ', + 'Ḟ' => 'ḟ', + 'Ḡ' => 'ḡ', + 'Ḣ' => 'ḣ', + 'Ḥ' => 'ḥ', + 'Ḧ' => 'ḧ', + 'Ḩ' => 'ḩ', + 'Ḫ' => 'ḫ', + 'Ḭ' => 'ḭ', + 'Ḯ' => 'ḯ', + 'Ḱ' => 'ḱ', + 'Ḳ' => 'ḳ', + 'Ḵ' => 'ḵ', + 'Ḷ' => 'ḷ', + 'Ḹ' => 'ḹ', + 'Ḻ' => 'ḻ', + 'Ḽ' => 'ḽ', + 'Ḿ' => 'ḿ', + 'Ṁ' => 'ṁ', + 'Ṃ' => 'ṃ', + 'Ṅ' => 'ṅ', + 'Ṇ' => 'ṇ', + 'Ṉ' => 'ṉ', + 'Ṋ' => 'ṋ', + 'Ṍ' => 'ṍ', + 'Ṏ' => 'ṏ', + 'Ṑ' => 'ṑ', + 'Ṓ' => 'ṓ', + 'Ṕ' => 'ṕ', + 'Ṗ' => 'ṗ', + 'Ṙ' => 'ṙ', + 'Ṛ' => 'ṛ', + 'Ṝ' => 'ṝ', + 'Ṟ' => 'ṟ', + 'Ṡ' => 'ṡ', + 'Ṣ' => 'ṣ', + 'Ṥ' => 'ṥ', + 'Ṧ' => 'ṧ', + 'Ṩ' => 'ṩ', + 'Ṫ' => 'ṫ', + 'Ṭ' => 'ṭ', + 'Ṯ' => 'ṯ', + 'Ṱ' => 'ṱ', + 'Ṳ' => 'ṳ', + 'Ṵ' => 'ṵ', + 'Ṷ' => 'ṷ', + 'Ṹ' => 'ṹ', + 'Ṻ' => 'ṻ', + 'Ṽ' => 'ṽ', + 'Ṿ' => 'ṿ', + 'Ẁ' => 'ẁ', + 'Ẃ' => 'ẃ', + 'Ẅ' => 'ẅ', + 'Ẇ' => 'ẇ', + 'Ẉ' => 'ẉ', + 'Ẋ' => 'ẋ', + 'Ẍ' => 'ẍ', + 'Ẏ' => 'ẏ', + 'Ẑ' => 'ẑ', + 'Ẓ' => 'ẓ', + 'Ẕ' => 'ẕ', + 'ẞ' => 'ß', + 'Ạ' => 'ạ', + 'Ả' => 'ả', + 'Ấ' => 'ấ', + 'Ầ' => 'ầ', + 'Ẩ' => 'ẩ', + 'Ẫ' => 'ẫ', + 'Ậ' => 'ậ', + 'Ắ' => 'ắ', + 'Ằ' => 'ằ', + 'Ẳ' => 'ẳ', + 'Ẵ' => 'ẵ', + 'Ặ' => 'ặ', + 'Ẹ' => 'ẹ', + 'Ẻ' => 'ẻ', + 'Ẽ' => 'ẽ', + 'Ế' => 'ế', + 'Ề' => 'ề', + 'Ể' => 'ể', + 'Ễ' => 'ễ', + 'Ệ' => 'ệ', + 'Ỉ' => 'ỉ', + 'Ị' => 'ị', + 'Ọ' => 'ọ', + 'Ỏ' => 'ỏ', + 'Ố' => 'ố', + 'Ồ' => 'ồ', + 'Ổ' => 'ổ', + 'Ỗ' => 'ỗ', + 'Ộ' => 'ộ', + 'Ớ' => 'ớ', + 'Ờ' => 'ờ', + 'Ở' => 'ở', + 'Ỡ' => 'ỡ', + 'Ợ' => 'ợ', + 'Ụ' => 'ụ', + 'Ủ' => 'ủ', + 'Ứ' => 'ứ', + 'Ừ' => 'ừ', + 'Ử' => 'ử', + 'Ữ' => 'ữ', + 'Ự' => 'ự', + 'Ỳ' => 'ỳ', + 'Ỵ' => 'ỵ', + 'Ỷ' => 'ỷ', + 'Ỹ' => 'ỹ', + 'Ỻ' => 'ỻ', + 'Ỽ' => 'ỽ', + 'Ỿ' => 'ỿ', + 'Ἀ' => 'ἀ', + 'Ἁ' => 'ἁ', + 'Ἂ' => 'ἂ', + 'Ἃ' => 'ἃ', + 'Ἄ' => 'ἄ', + 'Ἅ' => 'ἅ', + 'Ἆ' => 'ἆ', + 'Ἇ' => 'ἇ', + 'Ἐ' => 'ἐ', + 'Ἑ' => 'ἑ', + 'Ἒ' => 'ἒ', + 'Ἓ' => 'ἓ', + 'Ἔ' => 'ἔ', + 'Ἕ' => 'ἕ', + 'Ἠ' => 'ἠ', + 'Ἡ' => 'ἡ', + 'Ἢ' => 'ἢ', + 'Ἣ' => 'ἣ', + 'Ἤ' => 'ἤ', + 'Ἥ' => 'ἥ', + 'Ἦ' => 'ἦ', + 'Ἧ' => 'ἧ', + 'Ἰ' => 'ἰ', + 'Ἱ' => 'ἱ', + 'Ἲ' => 'ἲ', + 'Ἳ' => 'ἳ', + 'Ἴ' => 'ἴ', + 'Ἵ' => 'ἵ', + 'Ἶ' => 'ἶ', + 'Ἷ' => 'ἷ', + 'Ὀ' => 'ὀ', + 'Ὁ' => 'ὁ', + 'Ὂ' => 'ὂ', + 'Ὃ' => 'ὃ', + 'Ὄ' => 'ὄ', + 'Ὅ' => 'ὅ', + 'Ὑ' => 'ὑ', + 'Ὓ' => 'ὓ', + 'Ὕ' => 'ὕ', + 'Ὗ' => 'ὗ', + 'Ὠ' => 'ὠ', + 'Ὡ' => 'ὡ', + 'Ὢ' => 'ὢ', + 'Ὣ' => 'ὣ', + 'Ὤ' => 'ὤ', + 'Ὥ' => 'ὥ', + 'Ὦ' => 'ὦ', + 'Ὧ' => 'ὧ', + 'ᾈ' => 'ᾀ', + 'ᾉ' => 'ᾁ', + 'ᾊ' => 'ᾂ', + 'ᾋ' => 'ᾃ', + 'ᾌ' => 'ᾄ', + 'ᾍ' => 'ᾅ', + 'ᾎ' => 'ᾆ', + 'ᾏ' => 'ᾇ', + 'ᾘ' => 'ᾐ', + 'ᾙ' => 'ᾑ', + 'ᾚ' => 'ᾒ', + 'ᾛ' => 'ᾓ', + 'ᾜ' => 'ᾔ', + 'ᾝ' => 'ᾕ', + 'ᾞ' => 'ᾖ', + 'ᾟ' => 'ᾗ', + 'ᾨ' => 'ᾠ', + 'ᾩ' => 'ᾡ', + 'ᾪ' => 'ᾢ', + 'ᾫ' => 'ᾣ', + 'ᾬ' => 'ᾤ', + 'ᾭ' => 'ᾥ', + 'ᾮ' => 'ᾦ', + 'ᾯ' => 'ᾧ', + 'Ᾰ' => 'ᾰ', + 'Ᾱ' => 'ᾱ', + 'Ὰ' => 'ὰ', + 'Ά' => 'ά', + 'ᾼ' => 'ᾳ', + 'Ὲ' => 'ὲ', + 'Έ' => 'έ', + 'Ὴ' => 'ὴ', + 'Ή' => 'ή', + 'ῌ' => 'ῃ', + 'Ῐ' => 'ῐ', + 'Ῑ' => 'ῑ', + 'Ὶ' => 'ὶ', + 'Ί' => 'ί', + 'Ῠ' => 'ῠ', + 'Ῡ' => 'ῡ', + 'Ὺ' => 'ὺ', + 'Ύ' => 'ύ', + 'Ῥ' => 'ῥ', + 'Ὸ' => 'ὸ', + 'Ό' => 'ό', + 'Ὼ' => 'ὼ', + 'Ώ' => 'ώ', + 'ῼ' => 'ῳ', + 'Ω' => 'ω', + 'K' => 'k', + 'Å' => 'å', + 'Ⅎ' => 'ⅎ', + 'Ⅰ' => 'ⅰ', + 'Ⅱ' => 'ⅱ', + 'Ⅲ' => 'ⅲ', + 'Ⅳ' => 'ⅳ', + 'Ⅴ' => 'ⅴ', + 'Ⅵ' => 'ⅵ', + 'Ⅶ' => 'ⅶ', + 'Ⅷ' => 'ⅷ', + 'Ⅸ' => 'ⅸ', + 'Ⅹ' => 'ⅹ', + 'Ⅺ' => 'ⅺ', + 'Ⅻ' => 'ⅻ', + 'Ⅼ' => 'ⅼ', + 'Ⅽ' => 'ⅽ', + 'Ⅾ' => 'ⅾ', + 'Ⅿ' => 'ⅿ', + 'Ↄ' => 'ↄ', + 'Ⓐ' => 'ⓐ', + 'Ⓑ' => 'ⓑ', + 'Ⓒ' => 'ⓒ', + 'Ⓓ' => 'ⓓ', + 'Ⓔ' => 'ⓔ', + 'Ⓕ' => 'ⓕ', + 'Ⓖ' => 'ⓖ', + 'Ⓗ' => 'ⓗ', + 'Ⓘ' => 'ⓘ', + 'Ⓙ' => 'ⓙ', + 'Ⓚ' => 'ⓚ', + 'Ⓛ' => 'ⓛ', + 'Ⓜ' => 'ⓜ', + 'Ⓝ' => 'ⓝ', + 'Ⓞ' => 'ⓞ', + 'Ⓟ' => 'ⓟ', + 'Ⓠ' => 'ⓠ', + 'Ⓡ' => 'ⓡ', + 'Ⓢ' => 'ⓢ', + 'Ⓣ' => 'ⓣ', + 'Ⓤ' => 'ⓤ', + 'Ⓥ' => 'ⓥ', + 'Ⓦ' => 'ⓦ', + 'Ⓧ' => 'ⓧ', + 'Ⓨ' => 'ⓨ', + 'Ⓩ' => 'ⓩ', + 'Ⰰ' => 'ⰰ', + 'Ⰱ' => 'ⰱ', + 'Ⰲ' => 'ⰲ', + 'Ⰳ' => 'ⰳ', + 'Ⰴ' => 'ⰴ', + 'Ⰵ' => 'ⰵ', + 'Ⰶ' => 'ⰶ', + 'Ⰷ' => 'ⰷ', + 'Ⰸ' => 'ⰸ', + 'Ⰹ' => 'ⰹ', + 'Ⰺ' => 'ⰺ', + 'Ⰻ' => 'ⰻ', + 'Ⰼ' => 'ⰼ', + 'Ⰽ' => 'ⰽ', + 'Ⰾ' => 'ⰾ', + 'Ⰿ' => 'ⰿ', + 'Ⱀ' => 'ⱀ', + 'Ⱁ' => 'ⱁ', + 'Ⱂ' => 'ⱂ', + 'Ⱃ' => 'ⱃ', + 'Ⱄ' => 'ⱄ', + 'Ⱅ' => 'ⱅ', + 'Ⱆ' => 'ⱆ', + 'Ⱇ' => 'ⱇ', + 'Ⱈ' => 'ⱈ', + 'Ⱉ' => 'ⱉ', + 'Ⱊ' => 'ⱊ', + 'Ⱋ' => 'ⱋ', + 'Ⱌ' => 'ⱌ', + 'Ⱍ' => 'ⱍ', + 'Ⱎ' => 'ⱎ', + 'Ⱏ' => 'ⱏ', + 'Ⱐ' => 'ⱐ', + 'Ⱑ' => 'ⱑ', + 'Ⱒ' => 'ⱒ', + 'Ⱓ' => 'ⱓ', + 'Ⱔ' => 'ⱔ', + 'Ⱕ' => 'ⱕ', + 'Ⱖ' => 'ⱖ', + 'Ⱗ' => 'ⱗ', + 'Ⱘ' => 'ⱘ', + 'Ⱙ' => 'ⱙ', + 'Ⱚ' => 'ⱚ', + 'Ⱛ' => 'ⱛ', + 'Ⱜ' => 'ⱜ', + 'Ⱝ' => 'ⱝ', + 'Ⱞ' => 'ⱞ', + 'Ⱡ' => 'ⱡ', + 'Ɫ' => 'ɫ', + 'Ᵽ' => 'ᵽ', + 'Ɽ' => 'ɽ', + 'Ⱨ' => 'ⱨ', + 'Ⱪ' => 'ⱪ', + 'Ⱬ' => 'ⱬ', + 'Ɑ' => 'ɑ', + 'Ɱ' => 'ɱ', + 'Ɐ' => 'ɐ', + 'Ɒ' => 'ɒ', + 'Ⱳ' => 'ⱳ', + 'Ⱶ' => 'ⱶ', + 'Ȿ' => 'ȿ', + 'Ɀ' => 'ɀ', + 'Ⲁ' => 'ⲁ', + 'Ⲃ' => 'ⲃ', + 'Ⲅ' => 'ⲅ', + 'Ⲇ' => 'ⲇ', + 'Ⲉ' => 'ⲉ', + 'Ⲋ' => 'ⲋ', + 'Ⲍ' => 'ⲍ', + 'Ⲏ' => 'ⲏ', + 'Ⲑ' => 'ⲑ', + 'Ⲓ' => 'ⲓ', + 'Ⲕ' => 'ⲕ', + 'Ⲗ' => 'ⲗ', + 'Ⲙ' => 'ⲙ', + 'Ⲛ' => 'ⲛ', + 'Ⲝ' => 'ⲝ', + 'Ⲟ' => 'ⲟ', + 'Ⲡ' => 'ⲡ', + 'Ⲣ' => 'ⲣ', + 'Ⲥ' => 'ⲥ', + 'Ⲧ' => 'ⲧ', + 'Ⲩ' => 'ⲩ', + 'Ⲫ' => 'ⲫ', + 'Ⲭ' => 'ⲭ', + 'Ⲯ' => 'ⲯ', + 'Ⲱ' => 'ⲱ', + 'Ⲳ' => 'ⲳ', + 'Ⲵ' => 'ⲵ', + 'Ⲷ' => 'ⲷ', + 'Ⲹ' => 'ⲹ', + 'Ⲻ' => 'ⲻ', + 'Ⲽ' => 'ⲽ', + 'Ⲿ' => 'ⲿ', + 'Ⳁ' => 'ⳁ', + 'Ⳃ' => 'ⳃ', + 'Ⳅ' => 'ⳅ', + 'Ⳇ' => 'ⳇ', + 'Ⳉ' => 'ⳉ', + 'Ⳋ' => 'ⳋ', + 'Ⳍ' => 'ⳍ', + 'Ⳏ' => 'ⳏ', + 'Ⳑ' => 'ⳑ', + 'Ⳓ' => 'ⳓ', + 'Ⳕ' => 'ⳕ', + 'Ⳗ' => 'ⳗ', + 'Ⳙ' => 'ⳙ', + 'Ⳛ' => 'ⳛ', + 'Ⳝ' => 'ⳝ', + 'Ⳟ' => 'ⳟ', + 'Ⳡ' => 'ⳡ', + 'Ⳣ' => 'ⳣ', + 'Ⳬ' => 'ⳬ', + 'Ⳮ' => 'ⳮ', + 'Ⳳ' => 'ⳳ', + 'Ꙁ' => 'ꙁ', + 'Ꙃ' => 'ꙃ', + 'Ꙅ' => 'ꙅ', + 'Ꙇ' => 'ꙇ', + 'Ꙉ' => 'ꙉ', + 'Ꙋ' => 'ꙋ', + 'Ꙍ' => 'ꙍ', + 'Ꙏ' => 'ꙏ', + 'Ꙑ' => 'ꙑ', + 'Ꙓ' => 'ꙓ', + 'Ꙕ' => 'ꙕ', + 'Ꙗ' => 'ꙗ', + 'Ꙙ' => 'ꙙ', + 'Ꙛ' => 'ꙛ', + 'Ꙝ' => 'ꙝ', + 'Ꙟ' => 'ꙟ', + 'Ꙡ' => 'ꙡ', + 'Ꙣ' => 'ꙣ', + 'Ꙥ' => 'ꙥ', + 'Ꙧ' => 'ꙧ', + 'Ꙩ' => 'ꙩ', + 'Ꙫ' => 'ꙫ', + 'Ꙭ' => 'ꙭ', + 'Ꚁ' => 'ꚁ', + 'Ꚃ' => 'ꚃ', + 'Ꚅ' => 'ꚅ', + 'Ꚇ' => 'ꚇ', + 'Ꚉ' => 'ꚉ', + 'Ꚋ' => 'ꚋ', + 'Ꚍ' => 'ꚍ', + 'Ꚏ' => 'ꚏ', + 'Ꚑ' => 'ꚑ', + 'Ꚓ' => 'ꚓ', + 'Ꚕ' => 'ꚕ', + 'Ꚗ' => 'ꚗ', + 'Ꚙ' => 'ꚙ', + 'Ꚛ' => 'ꚛ', + 'Ꜣ' => 'ꜣ', + 'Ꜥ' => 'ꜥ', + 'Ꜧ' => 'ꜧ', + 'Ꜩ' => 'ꜩ', + 'Ꜫ' => 'ꜫ', + 'Ꜭ' => 'ꜭ', + 'Ꜯ' => 'ꜯ', + 'Ꜳ' => 'ꜳ', + 'Ꜵ' => 'ꜵ', + 'Ꜷ' => 'ꜷ', + 'Ꜹ' => 'ꜹ', + 'Ꜻ' => 'ꜻ', + 'Ꜽ' => 'ꜽ', + 'Ꜿ' => 'ꜿ', + 'Ꝁ' => 'ꝁ', + 'Ꝃ' => 'ꝃ', + 'Ꝅ' => 'ꝅ', + 'Ꝇ' => 'ꝇ', + 'Ꝉ' => 'ꝉ', + 'Ꝋ' => 'ꝋ', + 'Ꝍ' => 'ꝍ', + 'Ꝏ' => 'ꝏ', + 'Ꝑ' => 'ꝑ', + 'Ꝓ' => 'ꝓ', + 'Ꝕ' => 'ꝕ', + 'Ꝗ' => 'ꝗ', + 'Ꝙ' => 'ꝙ', + 'Ꝛ' => 'ꝛ', + 'Ꝝ' => 'ꝝ', + 'Ꝟ' => 'ꝟ', + 'Ꝡ' => 'ꝡ', + 'Ꝣ' => 'ꝣ', + 'Ꝥ' => 'ꝥ', + 'Ꝧ' => 'ꝧ', + 'Ꝩ' => 'ꝩ', + 'Ꝫ' => 'ꝫ', + 'Ꝭ' => 'ꝭ', + 'Ꝯ' => 'ꝯ', + 'Ꝺ' => 'ꝺ', + 'Ꝼ' => 'ꝼ', + 'Ᵹ' => 'ᵹ', + 'Ꝿ' => 'ꝿ', + 'Ꞁ' => 'ꞁ', + 'Ꞃ' => 'ꞃ', + 'Ꞅ' => 'ꞅ', + 'Ꞇ' => 'ꞇ', + 'Ꞌ' => 'ꞌ', + 'Ɥ' => 'ɥ', + 'Ꞑ' => 'ꞑ', + 'Ꞓ' => 'ꞓ', + 'Ꞗ' => 'ꞗ', + 'Ꞙ' => 'ꞙ', + 'Ꞛ' => 'ꞛ', + 'Ꞝ' => 'ꞝ', + 'Ꞟ' => 'ꞟ', + 'Ꞡ' => 'ꞡ', + 'Ꞣ' => 'ꞣ', + 'Ꞥ' => 'ꞥ', + 'Ꞧ' => 'ꞧ', + 'Ꞩ' => 'ꞩ', + 'Ɦ' => 'ɦ', + 'Ɜ' => 'ɜ', + 'Ɡ' => 'ɡ', + 'Ɬ' => 'ɬ', + 'Ɪ' => 'ɪ', + 'Ʞ' => 'ʞ', + 'Ʇ' => 'ʇ', + 'Ʝ' => 'ʝ', + 'Ꭓ' => 'ꭓ', + 'Ꞵ' => 'ꞵ', + 'Ꞷ' => 'ꞷ', + 'Ꞹ' => 'ꞹ', + 'Ꞻ' => 'ꞻ', + 'Ꞽ' => 'ꞽ', + 'Ꞿ' => 'ꞿ', + 'Ꟃ' => 'ꟃ', + 'Ꞔ' => 'ꞔ', + 'Ʂ' => 'ʂ', + 'Ᶎ' => 'ᶎ', + 'Ꟈ' => 'ꟈ', + 'Ꟊ' => 'ꟊ', + 'Ꟶ' => 'ꟶ', + 'A' => 'a', + 'B' => 'b', + 'C' => 'c', + 'D' => 'd', + 'E' => 'e', + 'F' => 'f', + 'G' => 'g', + 'H' => 'h', + 'I' => 'i', + 'J' => 'j', + 'K' => 'k', + 'L' => 'l', + 'M' => 'm', + 'N' => 'n', + 'O' => 'o', + 'P' => 'p', + 'Q' => 'q', + 'R' => 'r', + 'S' => 's', + 'T' => 't', + 'U' => 'u', + 'V' => 'v', + 'W' => 'w', + 'X' => 'x', + 'Y' => 'y', + 'Z' => 'z', + '𐐀' => '𐐨', + '𐐁' => '𐐩', + '𐐂' => '𐐪', + '𐐃' => '𐐫', + '𐐄' => '𐐬', + '𐐅' => '𐐭', + '𐐆' => '𐐮', + '𐐇' => '𐐯', + '𐐈' => '𐐰', + '𐐉' => '𐐱', + '𐐊' => '𐐲', + '𐐋' => '𐐳', + '𐐌' => '𐐴', + '𐐍' => '𐐵', + '𐐎' => '𐐶', + '𐐏' => '𐐷', + '𐐐' => '𐐸', + '𐐑' => '𐐹', + '𐐒' => '𐐺', + '𐐓' => '𐐻', + '𐐔' => '𐐼', + '𐐕' => '𐐽', + '𐐖' => '𐐾', + '𐐗' => '𐐿', + '𐐘' => '𐑀', + '𐐙' => '𐑁', + '𐐚' => '𐑂', + '𐐛' => '𐑃', + '𐐜' => '𐑄', + '𐐝' => '𐑅', + '𐐞' => '𐑆', + '𐐟' => '𐑇', + '𐐠' => '𐑈', + '𐐡' => '𐑉', + '𐐢' => '𐑊', + '𐐣' => '𐑋', + '𐐤' => '𐑌', + '𐐥' => '𐑍', + '𐐦' => '𐑎', + '𐐧' => '𐑏', + '𐒰' => '𐓘', + '𐒱' => '𐓙', + '𐒲' => '𐓚', + '𐒳' => '𐓛', + '𐒴' => '𐓜', + '𐒵' => '𐓝', + '𐒶' => '𐓞', + '𐒷' => '𐓟', + '𐒸' => '𐓠', + '𐒹' => '𐓡', + '𐒺' => '𐓢', + '𐒻' => '𐓣', + '𐒼' => '𐓤', + '𐒽' => '𐓥', + '𐒾' => '𐓦', + '𐒿' => '𐓧', + '𐓀' => '𐓨', + '𐓁' => '𐓩', + '𐓂' => '𐓪', + '𐓃' => '𐓫', + '𐓄' => '𐓬', + '𐓅' => '𐓭', + '𐓆' => '𐓮', + '𐓇' => '𐓯', + '𐓈' => '𐓰', + '𐓉' => '𐓱', + '𐓊' => '𐓲', + '𐓋' => '𐓳', + '𐓌' => '𐓴', + '𐓍' => '𐓵', + '𐓎' => '𐓶', + '𐓏' => '𐓷', + '𐓐' => '𐓸', + '𐓑' => '𐓹', + '𐓒' => '𐓺', + '𐓓' => '𐓻', + '𐲀' => '𐳀', + '𐲁' => '𐳁', + '𐲂' => '𐳂', + '𐲃' => '𐳃', + '𐲄' => '𐳄', + '𐲅' => '𐳅', + '𐲆' => '𐳆', + '𐲇' => '𐳇', + '𐲈' => '𐳈', + '𐲉' => '𐳉', + '𐲊' => '𐳊', + '𐲋' => '𐳋', + '𐲌' => '𐳌', + '𐲍' => '𐳍', + '𐲎' => '𐳎', + '𐲏' => '𐳏', + '𐲐' => '𐳐', + '𐲑' => '𐳑', + '𐲒' => '𐳒', + '𐲓' => '𐳓', + '𐲔' => '𐳔', + '𐲕' => '𐳕', + '𐲖' => '𐳖', + '𐲗' => '𐳗', + '𐲘' => '𐳘', + '𐲙' => '𐳙', + '𐲚' => '𐳚', + '𐲛' => '𐳛', + '𐲜' => '𐳜', + '𐲝' => '𐳝', + '𐲞' => '𐳞', + '𐲟' => '𐳟', + '𐲠' => '𐳠', + '𐲡' => '𐳡', + '𐲢' => '𐳢', + '𐲣' => '𐳣', + '𐲤' => '𐳤', + '𐲥' => '𐳥', + '𐲦' => '𐳦', + '𐲧' => '𐳧', + '𐲨' => '𐳨', + '𐲩' => '𐳩', + '𐲪' => '𐳪', + '𐲫' => '𐳫', + '𐲬' => '𐳬', + '𐲭' => '𐳭', + '𐲮' => '𐳮', + '𐲯' => '𐳯', + '𐲰' => '𐳰', + '𐲱' => '𐳱', + '𐲲' => '𐳲', + '𑢠' => '𑣀', + '𑢡' => '𑣁', + '𑢢' => '𑣂', + '𑢣' => '𑣃', + '𑢤' => '𑣄', + '𑢥' => '𑣅', + '𑢦' => '𑣆', + '𑢧' => '𑣇', + '𑢨' => '𑣈', + '𑢩' => '𑣉', + '𑢪' => '𑣊', + '𑢫' => '𑣋', + '𑢬' => '𑣌', + '𑢭' => '𑣍', + '𑢮' => '𑣎', + '𑢯' => '𑣏', + '𑢰' => '𑣐', + '𑢱' => '𑣑', + '𑢲' => '𑣒', + '𑢳' => '𑣓', + '𑢴' => '𑣔', + '𑢵' => '𑣕', + '𑢶' => '𑣖', + '𑢷' => '𑣗', + '𑢸' => '𑣘', + '𑢹' => '𑣙', + '𑢺' => '𑣚', + '𑢻' => '𑣛', + '𑢼' => '𑣜', + '𑢽' => '𑣝', + '𑢾' => '𑣞', + '𑢿' => '𑣟', + '𖹀' => '𖹠', + '𖹁' => '𖹡', + '𖹂' => '𖹢', + '𖹃' => '𖹣', + '𖹄' => '𖹤', + '𖹅' => '𖹥', + '𖹆' => '𖹦', + '𖹇' => '𖹧', + '𖹈' => '𖹨', + '𖹉' => '𖹩', + '𖹊' => '𖹪', + '𖹋' => '𖹫', + '𖹌' => '𖹬', + '𖹍' => '𖹭', + '𖹎' => '𖹮', + '𖹏' => '𖹯', + '𖹐' => '𖹰', + '𖹑' => '𖹱', + '𖹒' => '𖹲', + '𖹓' => '𖹳', + '𖹔' => '𖹴', + '𖹕' => '𖹵', + '𖹖' => '𖹶', + '𖹗' => '𖹷', + '𖹘' => '𖹸', + '𖹙' => '𖹹', + '𖹚' => '𖹺', + '𖹛' => '𖹻', + '𖹜' => '𖹼', + '𖹝' => '𖹽', + '𖹞' => '𖹾', + '𖹟' => '𖹿', + '𞤀' => '𞤢', + '𞤁' => '𞤣', + '𞤂' => '𞤤', + '𞤃' => '𞤥', + '𞤄' => '𞤦', + '𞤅' => '𞤧', + '𞤆' => '𞤨', + '𞤇' => '𞤩', + '𞤈' => '𞤪', + '𞤉' => '𞤫', + '𞤊' => '𞤬', + '𞤋' => '𞤭', + '𞤌' => '𞤮', + '𞤍' => '𞤯', + '𞤎' => '𞤰', + '𞤏' => '𞤱', + '𞤐' => '𞤲', + '𞤑' => '𞤳', + '𞤒' => '𞤴', + '𞤓' => '𞤵', + '𞤔' => '𞤶', + '𞤕' => '𞤷', + '𞤖' => '𞤸', + '𞤗' => '𞤹', + '𞤘' => '𞤺', + '𞤙' => '𞤻', + '𞤚' => '𞤼', + '𞤛' => '𞤽', + '𞤜' => '𞤾', + '𞤝' => '𞤿', + '𞤞' => '𞥀', + '𞤟' => '𞥁', + '𞤠' => '𞥂', + '𞤡' => '𞥃', +); diff --git a/plants/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php b/plants/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php new file mode 100644 index 0000000..2a8f6e7 --- /dev/null +++ b/plants/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php @@ -0,0 +1,5 @@ + 'A', + 'b' => 'B', + 'c' => 'C', + 'd' => 'D', + 'e' => 'E', + 'f' => 'F', + 'g' => 'G', + 'h' => 'H', + 'i' => 'I', + 'j' => 'J', + 'k' => 'K', + 'l' => 'L', + 'm' => 'M', + 'n' => 'N', + 'o' => 'O', + 'p' => 'P', + 'q' => 'Q', + 'r' => 'R', + 's' => 'S', + 't' => 'T', + 'u' => 'U', + 'v' => 'V', + 'w' => 'W', + 'x' => 'X', + 'y' => 'Y', + 'z' => 'Z', + 'µ' => 'Μ', + 'à' => 'À', + 'á' => 'Á', + 'â' => 'Â', + 'ã' => 'Ã', + 'ä' => 'Ä', + 'å' => 'Å', + 'æ' => 'Æ', + 'ç' => 'Ç', + 'è' => 'È', + 'é' => 'É', + 'ê' => 'Ê', + 'ë' => 'Ë', + 'ì' => 'Ì', + 'í' => 'Í', + 'î' => 'Î', + 'ï' => 'Ï', + 'ð' => 'Ð', + 'ñ' => 'Ñ', + 'ò' => 'Ò', + 'ó' => 'Ó', + 'ô' => 'Ô', + 'õ' => 'Õ', + 'ö' => 'Ö', + 'ø' => 'Ø', + 'ù' => 'Ù', + 'ú' => 'Ú', + 'û' => 'Û', + 'ü' => 'Ü', + 'ý' => 'Ý', + 'þ' => 'Þ', + 'ÿ' => 'Ÿ', + 'ā' => 'Ā', + 'ă' => 'Ă', + 'ą' => 'Ą', + 'ć' => 'Ć', + 'ĉ' => 'Ĉ', + 'ċ' => 'Ċ', + 'č' => 'Č', + 'ď' => 'Ď', + 'đ' => 'Đ', + 'ē' => 'Ē', + 'ĕ' => 'Ĕ', + 'ė' => 'Ė', + 'ę' => 'Ę', + 'ě' => 'Ě', + 'ĝ' => 'Ĝ', + 'ğ' => 'Ğ', + 'ġ' => 'Ġ', + 'ģ' => 'Ģ', + 'ĥ' => 'Ĥ', + 'ħ' => 'Ħ', + 'ĩ' => 'Ĩ', + 'ī' => 'Ī', + 'ĭ' => 'Ĭ', + 'į' => 'Į', + 'ı' => 'I', + 'ij' => 'IJ', + 'ĵ' => 'Ĵ', + 'ķ' => 'Ķ', + 'ĺ' => 'Ĺ', + 'ļ' => 'Ļ', + 'ľ' => 'Ľ', + 'ŀ' => 'Ŀ', + 'ł' => 'Ł', + 'ń' => 'Ń', + 'ņ' => 'Ņ', + 'ň' => 'Ň', + 'ŋ' => 'Ŋ', + 'ō' => 'Ō', + 'ŏ' => 'Ŏ', + 'ő' => 'Ő', + 'œ' => 'Œ', + 'ŕ' => 'Ŕ', + 'ŗ' => 'Ŗ', + 'ř' => 'Ř', + 'ś' => 'Ś', + 'ŝ' => 'Ŝ', + 'ş' => 'Ş', + 'š' => 'Š', + 'ţ' => 'Ţ', + 'ť' => 'Ť', + 'ŧ' => 'Ŧ', + 'ũ' => 'Ũ', + 'ū' => 'Ū', + 'ŭ' => 'Ŭ', + 'ů' => 'Ů', + 'ű' => 'Ű', + 'ų' => 'Ų', + 'ŵ' => 'Ŵ', + 'ŷ' => 'Ŷ', + 'ź' => 'Ź', + 'ż' => 'Ż', + 'ž' => 'Ž', + 'ſ' => 'S', + 'ƀ' => 'Ƀ', + 'ƃ' => 'Ƃ', + 'ƅ' => 'Ƅ', + 'ƈ' => 'Ƈ', + 'ƌ' => 'Ƌ', + 'ƒ' => 'Ƒ', + 'ƕ' => 'Ƕ', + 'ƙ' => 'Ƙ', + 'ƚ' => 'Ƚ', + 'ƞ' => 'Ƞ', + 'ơ' => 'Ơ', + 'ƣ' => 'Ƣ', + 'ƥ' => 'Ƥ', + 'ƨ' => 'Ƨ', + 'ƭ' => 'Ƭ', + 'ư' => 'Ư', + 'ƴ' => 'Ƴ', + 'ƶ' => 'Ƶ', + 'ƹ' => 'Ƹ', + 'ƽ' => 'Ƽ', + 'ƿ' => 'Ƿ', + 'Dž' => 'DŽ', + 'dž' => 'DŽ', + 'Lj' => 'LJ', + 'lj' => 'LJ', + 'Nj' => 'NJ', + 'nj' => 'NJ', + 'ǎ' => 'Ǎ', + 'ǐ' => 'Ǐ', + 'ǒ' => 'Ǒ', + 'ǔ' => 'Ǔ', + 'ǖ' => 'Ǖ', + 'ǘ' => 'Ǘ', + 'ǚ' => 'Ǚ', + 'ǜ' => 'Ǜ', + 'ǝ' => 'Ǝ', + 'ǟ' => 'Ǟ', + 'ǡ' => 'Ǡ', + 'ǣ' => 'Ǣ', + 'ǥ' => 'Ǥ', + 'ǧ' => 'Ǧ', + 'ǩ' => 'Ǩ', + 'ǫ' => 'Ǫ', + 'ǭ' => 'Ǭ', + 'ǯ' => 'Ǯ', + 'Dz' => 'DZ', + 'dz' => 'DZ', + 'ǵ' => 'Ǵ', + 'ǹ' => 'Ǹ', + 'ǻ' => 'Ǻ', + 'ǽ' => 'Ǽ', + 'ǿ' => 'Ǿ', + 'ȁ' => 'Ȁ', + 'ȃ' => 'Ȃ', + 'ȅ' => 'Ȅ', + 'ȇ' => 'Ȇ', + 'ȉ' => 'Ȉ', + 'ȋ' => 'Ȋ', + 'ȍ' => 'Ȍ', + 'ȏ' => 'Ȏ', + 'ȑ' => 'Ȑ', + 'ȓ' => 'Ȓ', + 'ȕ' => 'Ȕ', + 'ȗ' => 'Ȗ', + 'ș' => 'Ș', + 'ț' => 'Ț', + 'ȝ' => 'Ȝ', + 'ȟ' => 'Ȟ', + 'ȣ' => 'Ȣ', + 'ȥ' => 'Ȥ', + 'ȧ' => 'Ȧ', + 'ȩ' => 'Ȩ', + 'ȫ' => 'Ȫ', + 'ȭ' => 'Ȭ', + 'ȯ' => 'Ȯ', + 'ȱ' => 'Ȱ', + 'ȳ' => 'Ȳ', + 'ȼ' => 'Ȼ', + 'ȿ' => 'Ȿ', + 'ɀ' => 'Ɀ', + 'ɂ' => 'Ɂ', + 'ɇ' => 'Ɇ', + 'ɉ' => 'Ɉ', + 'ɋ' => 'Ɋ', + 'ɍ' => 'Ɍ', + 'ɏ' => 'Ɏ', + 'ɐ' => 'Ɐ', + 'ɑ' => 'Ɑ', + 'ɒ' => 'Ɒ', + 'ɓ' => 'Ɓ', + 'ɔ' => 'Ɔ', + 'ɖ' => 'Ɖ', + 'ɗ' => 'Ɗ', + 'ə' => 'Ə', + 'ɛ' => 'Ɛ', + 'ɜ' => 'Ɜ', + 'ɠ' => 'Ɠ', + 'ɡ' => 'Ɡ', + 'ɣ' => 'Ɣ', + 'ɥ' => 'Ɥ', + 'ɦ' => 'Ɦ', + 'ɨ' => 'Ɨ', + 'ɩ' => 'Ɩ', + 'ɪ' => 'Ɪ', + 'ɫ' => 'Ɫ', + 'ɬ' => 'Ɬ', + 'ɯ' => 'Ɯ', + 'ɱ' => 'Ɱ', + 'ɲ' => 'Ɲ', + 'ɵ' => 'Ɵ', + 'ɽ' => 'Ɽ', + 'ʀ' => 'Ʀ', + 'ʂ' => 'Ʂ', + 'ʃ' => 'Ʃ', + 'ʇ' => 'Ʇ', + 'ʈ' => 'Ʈ', + 'ʉ' => 'Ʉ', + 'ʊ' => 'Ʊ', + 'ʋ' => 'Ʋ', + 'ʌ' => 'Ʌ', + 'ʒ' => 'Ʒ', + 'ʝ' => 'Ʝ', + 'ʞ' => 'Ʞ', + 'ͅ' => 'Ι', + 'ͱ' => 'Ͱ', + 'ͳ' => 'Ͳ', + 'ͷ' => 'Ͷ', + 'ͻ' => 'Ͻ', + 'ͼ' => 'Ͼ', + 'ͽ' => 'Ͽ', + 'ά' => 'Ά', + 'έ' => 'Έ', + 'ή' => 'Ή', + 'ί' => 'Ί', + 'α' => 'Α', + 'β' => 'Β', + 'γ' => 'Γ', + 'δ' => 'Δ', + 'ε' => 'Ε', + 'ζ' => 'Ζ', + 'η' => 'Η', + 'θ' => 'Θ', + 'ι' => 'Ι', + 'κ' => 'Κ', + 'λ' => 'Λ', + 'μ' => 'Μ', + 'ν' => 'Ν', + 'ξ' => 'Ξ', + 'ο' => 'Ο', + 'π' => 'Π', + 'ρ' => 'Ρ', + 'ς' => 'Σ', + 'σ' => 'Σ', + 'τ' => 'Τ', + 'υ' => 'Υ', + 'φ' => 'Φ', + 'χ' => 'Χ', + 'ψ' => 'Ψ', + 'ω' => 'Ω', + 'ϊ' => 'Ϊ', + 'ϋ' => 'Ϋ', + 'ό' => 'Ό', + 'ύ' => 'Ύ', + 'ώ' => 'Ώ', + 'ϐ' => 'Β', + 'ϑ' => 'Θ', + 'ϕ' => 'Φ', + 'ϖ' => 'Π', + 'ϗ' => 'Ϗ', + 'ϙ' => 'Ϙ', + 'ϛ' => 'Ϛ', + 'ϝ' => 'Ϝ', + 'ϟ' => 'Ϟ', + 'ϡ' => 'Ϡ', + 'ϣ' => 'Ϣ', + 'ϥ' => 'Ϥ', + 'ϧ' => 'Ϧ', + 'ϩ' => 'Ϩ', + 'ϫ' => 'Ϫ', + 'ϭ' => 'Ϭ', + 'ϯ' => 'Ϯ', + 'ϰ' => 'Κ', + 'ϱ' => 'Ρ', + 'ϲ' => 'Ϲ', + 'ϳ' => 'Ϳ', + 'ϵ' => 'Ε', + 'ϸ' => 'Ϸ', + 'ϻ' => 'Ϻ', + 'а' => 'А', + 'б' => 'Б', + 'в' => 'В', + 'г' => 'Г', + 'д' => 'Д', + 'е' => 'Е', + 'ж' => 'Ж', + 'з' => 'З', + 'и' => 'И', + 'й' => 'Й', + 'к' => 'К', + 'л' => 'Л', + 'м' => 'М', + 'н' => 'Н', + 'о' => 'О', + 'п' => 'П', + 'р' => 'Р', + 'с' => 'С', + 'т' => 'Т', + 'у' => 'У', + 'ф' => 'Ф', + 'х' => 'Х', + 'ц' => 'Ц', + 'ч' => 'Ч', + 'ш' => 'Ш', + 'щ' => 'Щ', + 'ъ' => 'Ъ', + 'ы' => 'Ы', + 'ь' => 'Ь', + 'э' => 'Э', + 'ю' => 'Ю', + 'я' => 'Я', + 'ѐ' => 'Ѐ', + 'ё' => 'Ё', + 'ђ' => 'Ђ', + 'ѓ' => 'Ѓ', + 'є' => 'Є', + 'ѕ' => 'Ѕ', + 'і' => 'І', + 'ї' => 'Ї', + 'ј' => 'Ј', + 'љ' => 'Љ', + 'њ' => 'Њ', + 'ћ' => 'Ћ', + 'ќ' => 'Ќ', + 'ѝ' => 'Ѝ', + 'ў' => 'Ў', + 'џ' => 'Џ', + 'ѡ' => 'Ѡ', + 'ѣ' => 'Ѣ', + 'ѥ' => 'Ѥ', + 'ѧ' => 'Ѧ', + 'ѩ' => 'Ѩ', + 'ѫ' => 'Ѫ', + 'ѭ' => 'Ѭ', + 'ѯ' => 'Ѯ', + 'ѱ' => 'Ѱ', + 'ѳ' => 'Ѳ', + 'ѵ' => 'Ѵ', + 'ѷ' => 'Ѷ', + 'ѹ' => 'Ѹ', + 'ѻ' => 'Ѻ', + 'ѽ' => 'Ѽ', + 'ѿ' => 'Ѿ', + 'ҁ' => 'Ҁ', + 'ҋ' => 'Ҋ', + 'ҍ' => 'Ҍ', + 'ҏ' => 'Ҏ', + 'ґ' => 'Ґ', + 'ғ' => 'Ғ', + 'ҕ' => 'Ҕ', + 'җ' => 'Җ', + 'ҙ' => 'Ҙ', + 'қ' => 'Қ', + 'ҝ' => 'Ҝ', + 'ҟ' => 'Ҟ', + 'ҡ' => 'Ҡ', + 'ң' => 'Ң', + 'ҥ' => 'Ҥ', + 'ҧ' => 'Ҧ', + 'ҩ' => 'Ҩ', + 'ҫ' => 'Ҫ', + 'ҭ' => 'Ҭ', + 'ү' => 'Ү', + 'ұ' => 'Ұ', + 'ҳ' => 'Ҳ', + 'ҵ' => 'Ҵ', + 'ҷ' => 'Ҷ', + 'ҹ' => 'Ҹ', + 'һ' => 'Һ', + 'ҽ' => 'Ҽ', + 'ҿ' => 'Ҿ', + 'ӂ' => 'Ӂ', + 'ӄ' => 'Ӄ', + 'ӆ' => 'Ӆ', + 'ӈ' => 'Ӈ', + 'ӊ' => 'Ӊ', + 'ӌ' => 'Ӌ', + 'ӎ' => 'Ӎ', + 'ӏ' => 'Ӏ', + 'ӑ' => 'Ӑ', + 'ӓ' => 'Ӓ', + 'ӕ' => 'Ӕ', + 'ӗ' => 'Ӗ', + 'ә' => 'Ә', + 'ӛ' => 'Ӛ', + 'ӝ' => 'Ӝ', + 'ӟ' => 'Ӟ', + 'ӡ' => 'Ӡ', + 'ӣ' => 'Ӣ', + 'ӥ' => 'Ӥ', + 'ӧ' => 'Ӧ', + 'ө' => 'Ө', + 'ӫ' => 'Ӫ', + 'ӭ' => 'Ӭ', + 'ӯ' => 'Ӯ', + 'ӱ' => 'Ӱ', + 'ӳ' => 'Ӳ', + 'ӵ' => 'Ӵ', + 'ӷ' => 'Ӷ', + 'ӹ' => 'Ӹ', + 'ӻ' => 'Ӻ', + 'ӽ' => 'Ӽ', + 'ӿ' => 'Ӿ', + 'ԁ' => 'Ԁ', + 'ԃ' => 'Ԃ', + 'ԅ' => 'Ԅ', + 'ԇ' => 'Ԇ', + 'ԉ' => 'Ԉ', + 'ԋ' => 'Ԋ', + 'ԍ' => 'Ԍ', + 'ԏ' => 'Ԏ', + 'ԑ' => 'Ԑ', + 'ԓ' => 'Ԓ', + 'ԕ' => 'Ԕ', + 'ԗ' => 'Ԗ', + 'ԙ' => 'Ԙ', + 'ԛ' => 'Ԛ', + 'ԝ' => 'Ԝ', + 'ԟ' => 'Ԟ', + 'ԡ' => 'Ԡ', + 'ԣ' => 'Ԣ', + 'ԥ' => 'Ԥ', + 'ԧ' => 'Ԧ', + 'ԩ' => 'Ԩ', + 'ԫ' => 'Ԫ', + 'ԭ' => 'Ԭ', + 'ԯ' => 'Ԯ', + 'ա' => 'Ա', + 'բ' => 'Բ', + 'գ' => 'Գ', + 'դ' => 'Դ', + 'ե' => 'Ե', + 'զ' => 'Զ', + 'է' => 'Է', + 'ը' => 'Ը', + 'թ' => 'Թ', + 'ժ' => 'Ժ', + 'ի' => 'Ի', + 'լ' => 'Լ', + 'խ' => 'Խ', + 'ծ' => 'Ծ', + 'կ' => 'Կ', + 'հ' => 'Հ', + 'ձ' => 'Ձ', + 'ղ' => 'Ղ', + 'ճ' => 'Ճ', + 'մ' => 'Մ', + 'յ' => 'Յ', + 'ն' => 'Ն', + 'շ' => 'Շ', + 'ո' => 'Ո', + 'չ' => 'Չ', + 'պ' => 'Պ', + 'ջ' => 'Ջ', + 'ռ' => 'Ռ', + 'ս' => 'Ս', + 'վ' => 'Վ', + 'տ' => 'Տ', + 'ր' => 'Ր', + 'ց' => 'Ց', + 'ւ' => 'Ւ', + 'փ' => 'Փ', + 'ք' => 'Ք', + 'օ' => 'Օ', + 'ֆ' => 'Ֆ', + 'ა' => 'Ა', + 'ბ' => 'Ბ', + 'გ' => 'Გ', + 'დ' => 'Დ', + 'ე' => 'Ე', + 'ვ' => 'Ვ', + 'ზ' => 'Ზ', + 'თ' => 'Თ', + 'ი' => 'Ი', + 'კ' => 'Კ', + 'ლ' => 'Ლ', + 'მ' => 'Მ', + 'ნ' => 'Ნ', + 'ო' => 'Ო', + 'პ' => 'Პ', + 'ჟ' => 'Ჟ', + 'რ' => 'Რ', + 'ს' => 'Ს', + 'ტ' => 'Ტ', + 'უ' => 'Უ', + 'ფ' => 'Ფ', + 'ქ' => 'Ქ', + 'ღ' => 'Ღ', + 'ყ' => 'Ყ', + 'შ' => 'Შ', + 'ჩ' => 'Ჩ', + 'ც' => 'Ც', + 'ძ' => 'Ძ', + 'წ' => 'Წ', + 'ჭ' => 'Ჭ', + 'ხ' => 'Ხ', + 'ჯ' => 'Ჯ', + 'ჰ' => 'Ჰ', + 'ჱ' => 'Ჱ', + 'ჲ' => 'Ჲ', + 'ჳ' => 'Ჳ', + 'ჴ' => 'Ჴ', + 'ჵ' => 'Ჵ', + 'ჶ' => 'Ჶ', + 'ჷ' => 'Ჷ', + 'ჸ' => 'Ჸ', + 'ჹ' => 'Ჹ', + 'ჺ' => 'Ჺ', + 'ჽ' => 'Ჽ', + 'ჾ' => 'Ჾ', + 'ჿ' => 'Ჿ', + 'ᏸ' => 'Ᏸ', + 'ᏹ' => 'Ᏹ', + 'ᏺ' => 'Ᏺ', + 'ᏻ' => 'Ᏻ', + 'ᏼ' => 'Ᏼ', + 'ᏽ' => 'Ᏽ', + 'ᲀ' => 'В', + 'ᲁ' => 'Д', + 'ᲂ' => 'О', + 'ᲃ' => 'С', + 'ᲄ' => 'Т', + 'ᲅ' => 'Т', + 'ᲆ' => 'Ъ', + 'ᲇ' => 'Ѣ', + 'ᲈ' => 'Ꙋ', + 'ᵹ' => 'Ᵹ', + 'ᵽ' => 'Ᵽ', + 'ᶎ' => 'Ᶎ', + 'ḁ' => 'Ḁ', + 'ḃ' => 'Ḃ', + 'ḅ' => 'Ḅ', + 'ḇ' => 'Ḇ', + 'ḉ' => 'Ḉ', + 'ḋ' => 'Ḋ', + 'ḍ' => 'Ḍ', + 'ḏ' => 'Ḏ', + 'ḑ' => 'Ḑ', + 'ḓ' => 'Ḓ', + 'ḕ' => 'Ḕ', + 'ḗ' => 'Ḗ', + 'ḙ' => 'Ḙ', + 'ḛ' => 'Ḛ', + 'ḝ' => 'Ḝ', + 'ḟ' => 'Ḟ', + 'ḡ' => 'Ḡ', + 'ḣ' => 'Ḣ', + 'ḥ' => 'Ḥ', + 'ḧ' => 'Ḧ', + 'ḩ' => 'Ḩ', + 'ḫ' => 'Ḫ', + 'ḭ' => 'Ḭ', + 'ḯ' => 'Ḯ', + 'ḱ' => 'Ḱ', + 'ḳ' => 'Ḳ', + 'ḵ' => 'Ḵ', + 'ḷ' => 'Ḷ', + 'ḹ' => 'Ḹ', + 'ḻ' => 'Ḻ', + 'ḽ' => 'Ḽ', + 'ḿ' => 'Ḿ', + 'ṁ' => 'Ṁ', + 'ṃ' => 'Ṃ', + 'ṅ' => 'Ṅ', + 'ṇ' => 'Ṇ', + 'ṉ' => 'Ṉ', + 'ṋ' => 'Ṋ', + 'ṍ' => 'Ṍ', + 'ṏ' => 'Ṏ', + 'ṑ' => 'Ṑ', + 'ṓ' => 'Ṓ', + 'ṕ' => 'Ṕ', + 'ṗ' => 'Ṗ', + 'ṙ' => 'Ṙ', + 'ṛ' => 'Ṛ', + 'ṝ' => 'Ṝ', + 'ṟ' => 'Ṟ', + 'ṡ' => 'Ṡ', + 'ṣ' => 'Ṣ', + 'ṥ' => 'Ṥ', + 'ṧ' => 'Ṧ', + 'ṩ' => 'Ṩ', + 'ṫ' => 'Ṫ', + 'ṭ' => 'Ṭ', + 'ṯ' => 'Ṯ', + 'ṱ' => 'Ṱ', + 'ṳ' => 'Ṳ', + 'ṵ' => 'Ṵ', + 'ṷ' => 'Ṷ', + 'ṹ' => 'Ṹ', + 'ṻ' => 'Ṻ', + 'ṽ' => 'Ṽ', + 'ṿ' => 'Ṿ', + 'ẁ' => 'Ẁ', + 'ẃ' => 'Ẃ', + 'ẅ' => 'Ẅ', + 'ẇ' => 'Ẇ', + 'ẉ' => 'Ẉ', + 'ẋ' => 'Ẋ', + 'ẍ' => 'Ẍ', + 'ẏ' => 'Ẏ', + 'ẑ' => 'Ẑ', + 'ẓ' => 'Ẓ', + 'ẕ' => 'Ẕ', + 'ẛ' => 'Ṡ', + 'ạ' => 'Ạ', + 'ả' => 'Ả', + 'ấ' => 'Ấ', + 'ầ' => 'Ầ', + 'ẩ' => 'Ẩ', + 'ẫ' => 'Ẫ', + 'ậ' => 'Ậ', + 'ắ' => 'Ắ', + 'ằ' => 'Ằ', + 'ẳ' => 'Ẳ', + 'ẵ' => 'Ẵ', + 'ặ' => 'Ặ', + 'ẹ' => 'Ẹ', + 'ẻ' => 'Ẻ', + 'ẽ' => 'Ẽ', + 'ế' => 'Ế', + 'ề' => 'Ề', + 'ể' => 'Ể', + 'ễ' => 'Ễ', + 'ệ' => 'Ệ', + 'ỉ' => 'Ỉ', + 'ị' => 'Ị', + 'ọ' => 'Ọ', + 'ỏ' => 'Ỏ', + 'ố' => 'Ố', + 'ồ' => 'Ồ', + 'ổ' => 'Ổ', + 'ỗ' => 'Ỗ', + 'ộ' => 'Ộ', + 'ớ' => 'Ớ', + 'ờ' => 'Ờ', + 'ở' => 'Ở', + 'ỡ' => 'Ỡ', + 'ợ' => 'Ợ', + 'ụ' => 'Ụ', + 'ủ' => 'Ủ', + 'ứ' => 'Ứ', + 'ừ' => 'Ừ', + 'ử' => 'Ử', + 'ữ' => 'Ữ', + 'ự' => 'Ự', + 'ỳ' => 'Ỳ', + 'ỵ' => 'Ỵ', + 'ỷ' => 'Ỷ', + 'ỹ' => 'Ỹ', + 'ỻ' => 'Ỻ', + 'ỽ' => 'Ỽ', + 'ỿ' => 'Ỿ', + 'ἀ' => 'Ἀ', + 'ἁ' => 'Ἁ', + 'ἂ' => 'Ἂ', + 'ἃ' => 'Ἃ', + 'ἄ' => 'Ἄ', + 'ἅ' => 'Ἅ', + 'ἆ' => 'Ἆ', + 'ἇ' => 'Ἇ', + 'ἐ' => 'Ἐ', + 'ἑ' => 'Ἑ', + 'ἒ' => 'Ἒ', + 'ἓ' => 'Ἓ', + 'ἔ' => 'Ἔ', + 'ἕ' => 'Ἕ', + 'ἠ' => 'Ἠ', + 'ἡ' => 'Ἡ', + 'ἢ' => 'Ἢ', + 'ἣ' => 'Ἣ', + 'ἤ' => 'Ἤ', + 'ἥ' => 'Ἥ', + 'ἦ' => 'Ἦ', + 'ἧ' => 'Ἧ', + 'ἰ' => 'Ἰ', + 'ἱ' => 'Ἱ', + 'ἲ' => 'Ἲ', + 'ἳ' => 'Ἳ', + 'ἴ' => 'Ἴ', + 'ἵ' => 'Ἵ', + 'ἶ' => 'Ἶ', + 'ἷ' => 'Ἷ', + 'ὀ' => 'Ὀ', + 'ὁ' => 'Ὁ', + 'ὂ' => 'Ὂ', + 'ὃ' => 'Ὃ', + 'ὄ' => 'Ὄ', + 'ὅ' => 'Ὅ', + 'ὑ' => 'Ὑ', + 'ὓ' => 'Ὓ', + 'ὕ' => 'Ὕ', + 'ὗ' => 'Ὗ', + 'ὠ' => 'Ὠ', + 'ὡ' => 'Ὡ', + 'ὢ' => 'Ὢ', + 'ὣ' => 'Ὣ', + 'ὤ' => 'Ὤ', + 'ὥ' => 'Ὥ', + 'ὦ' => 'Ὦ', + 'ὧ' => 'Ὧ', + 'ὰ' => 'Ὰ', + 'ά' => 'Ά', + 'ὲ' => 'Ὲ', + 'έ' => 'Έ', + 'ὴ' => 'Ὴ', + 'ή' => 'Ή', + 'ὶ' => 'Ὶ', + 'ί' => 'Ί', + 'ὸ' => 'Ὸ', + 'ό' => 'Ό', + 'ὺ' => 'Ὺ', + 'ύ' => 'Ύ', + 'ὼ' => 'Ὼ', + 'ώ' => 'Ώ', + 'ᾀ' => 'ἈΙ', + 'ᾁ' => 'ἉΙ', + 'ᾂ' => 'ἊΙ', + 'ᾃ' => 'ἋΙ', + 'ᾄ' => 'ἌΙ', + 'ᾅ' => 'ἍΙ', + 'ᾆ' => 'ἎΙ', + 'ᾇ' => 'ἏΙ', + 'ᾐ' => 'ἨΙ', + 'ᾑ' => 'ἩΙ', + 'ᾒ' => 'ἪΙ', + 'ᾓ' => 'ἫΙ', + 'ᾔ' => 'ἬΙ', + 'ᾕ' => 'ἭΙ', + 'ᾖ' => 'ἮΙ', + 'ᾗ' => 'ἯΙ', + 'ᾠ' => 'ὨΙ', + 'ᾡ' => 'ὩΙ', + 'ᾢ' => 'ὪΙ', + 'ᾣ' => 'ὫΙ', + 'ᾤ' => 'ὬΙ', + 'ᾥ' => 'ὭΙ', + 'ᾦ' => 'ὮΙ', + 'ᾧ' => 'ὯΙ', + 'ᾰ' => 'Ᾰ', + 'ᾱ' => 'Ᾱ', + 'ᾳ' => 'ΑΙ', + 'ι' => 'Ι', + 'ῃ' => 'ΗΙ', + 'ῐ' => 'Ῐ', + 'ῑ' => 'Ῑ', + 'ῠ' => 'Ῠ', + 'ῡ' => 'Ῡ', + 'ῥ' => 'Ῥ', + 'ῳ' => 'ΩΙ', + 'ⅎ' => 'Ⅎ', + 'ⅰ' => 'Ⅰ', + 'ⅱ' => 'Ⅱ', + 'ⅲ' => 'Ⅲ', + 'ⅳ' => 'Ⅳ', + 'ⅴ' => 'Ⅴ', + 'ⅵ' => 'Ⅵ', + 'ⅶ' => 'Ⅶ', + 'ⅷ' => 'Ⅷ', + 'ⅸ' => 'Ⅸ', + 'ⅹ' => 'Ⅹ', + 'ⅺ' => 'Ⅺ', + 'ⅻ' => 'Ⅻ', + 'ⅼ' => 'Ⅼ', + 'ⅽ' => 'Ⅽ', + 'ⅾ' => 'Ⅾ', + 'ⅿ' => 'Ⅿ', + 'ↄ' => 'Ↄ', + 'ⓐ' => 'Ⓐ', + 'ⓑ' => 'Ⓑ', + 'ⓒ' => 'Ⓒ', + 'ⓓ' => 'Ⓓ', + 'ⓔ' => 'Ⓔ', + 'ⓕ' => 'Ⓕ', + 'ⓖ' => 'Ⓖ', + 'ⓗ' => 'Ⓗ', + 'ⓘ' => 'Ⓘ', + 'ⓙ' => 'Ⓙ', + 'ⓚ' => 'Ⓚ', + 'ⓛ' => 'Ⓛ', + 'ⓜ' => 'Ⓜ', + 'ⓝ' => 'Ⓝ', + 'ⓞ' => 'Ⓞ', + 'ⓟ' => 'Ⓟ', + 'ⓠ' => 'Ⓠ', + 'ⓡ' => 'Ⓡ', + 'ⓢ' => 'Ⓢ', + 'ⓣ' => 'Ⓣ', + 'ⓤ' => 'Ⓤ', + 'ⓥ' => 'Ⓥ', + 'ⓦ' => 'Ⓦ', + 'ⓧ' => 'Ⓧ', + 'ⓨ' => 'Ⓨ', + 'ⓩ' => 'Ⓩ', + 'ⰰ' => 'Ⰰ', + 'ⰱ' => 'Ⰱ', + 'ⰲ' => 'Ⰲ', + 'ⰳ' => 'Ⰳ', + 'ⰴ' => 'Ⰴ', + 'ⰵ' => 'Ⰵ', + 'ⰶ' => 'Ⰶ', + 'ⰷ' => 'Ⰷ', + 'ⰸ' => 'Ⰸ', + 'ⰹ' => 'Ⰹ', + 'ⰺ' => 'Ⰺ', + 'ⰻ' => 'Ⰻ', + 'ⰼ' => 'Ⰼ', + 'ⰽ' => 'Ⰽ', + 'ⰾ' => 'Ⰾ', + 'ⰿ' => 'Ⰿ', + 'ⱀ' => 'Ⱀ', + 'ⱁ' => 'Ⱁ', + 'ⱂ' => 'Ⱂ', + 'ⱃ' => 'Ⱃ', + 'ⱄ' => 'Ⱄ', + 'ⱅ' => 'Ⱅ', + 'ⱆ' => 'Ⱆ', + 'ⱇ' => 'Ⱇ', + 'ⱈ' => 'Ⱈ', + 'ⱉ' => 'Ⱉ', + 'ⱊ' => 'Ⱊ', + 'ⱋ' => 'Ⱋ', + 'ⱌ' => 'Ⱌ', + 'ⱍ' => 'Ⱍ', + 'ⱎ' => 'Ⱎ', + 'ⱏ' => 'Ⱏ', + 'ⱐ' => 'Ⱐ', + 'ⱑ' => 'Ⱑ', + 'ⱒ' => 'Ⱒ', + 'ⱓ' => 'Ⱓ', + 'ⱔ' => 'Ⱔ', + 'ⱕ' => 'Ⱕ', + 'ⱖ' => 'Ⱖ', + 'ⱗ' => 'Ⱗ', + 'ⱘ' => 'Ⱘ', + 'ⱙ' => 'Ⱙ', + 'ⱚ' => 'Ⱚ', + 'ⱛ' => 'Ⱛ', + 'ⱜ' => 'Ⱜ', + 'ⱝ' => 'Ⱝ', + 'ⱞ' => 'Ⱞ', + 'ⱡ' => 'Ⱡ', + 'ⱥ' => 'Ⱥ', + 'ⱦ' => 'Ⱦ', + 'ⱨ' => 'Ⱨ', + 'ⱪ' => 'Ⱪ', + 'ⱬ' => 'Ⱬ', + 'ⱳ' => 'Ⱳ', + 'ⱶ' => 'Ⱶ', + 'ⲁ' => 'Ⲁ', + 'ⲃ' => 'Ⲃ', + 'ⲅ' => 'Ⲅ', + 'ⲇ' => 'Ⲇ', + 'ⲉ' => 'Ⲉ', + 'ⲋ' => 'Ⲋ', + 'ⲍ' => 'Ⲍ', + 'ⲏ' => 'Ⲏ', + 'ⲑ' => 'Ⲑ', + 'ⲓ' => 'Ⲓ', + 'ⲕ' => 'Ⲕ', + 'ⲗ' => 'Ⲗ', + 'ⲙ' => 'Ⲙ', + 'ⲛ' => 'Ⲛ', + 'ⲝ' => 'Ⲝ', + 'ⲟ' => 'Ⲟ', + 'ⲡ' => 'Ⲡ', + 'ⲣ' => 'Ⲣ', + 'ⲥ' => 'Ⲥ', + 'ⲧ' => 'Ⲧ', + 'ⲩ' => 'Ⲩ', + 'ⲫ' => 'Ⲫ', + 'ⲭ' => 'Ⲭ', + 'ⲯ' => 'Ⲯ', + 'ⲱ' => 'Ⲱ', + 'ⲳ' => 'Ⲳ', + 'ⲵ' => 'Ⲵ', + 'ⲷ' => 'Ⲷ', + 'ⲹ' => 'Ⲹ', + 'ⲻ' => 'Ⲻ', + 'ⲽ' => 'Ⲽ', + 'ⲿ' => 'Ⲿ', + 'ⳁ' => 'Ⳁ', + 'ⳃ' => 'Ⳃ', + 'ⳅ' => 'Ⳅ', + 'ⳇ' => 'Ⳇ', + 'ⳉ' => 'Ⳉ', + 'ⳋ' => 'Ⳋ', + 'ⳍ' => 'Ⳍ', + 'ⳏ' => 'Ⳏ', + 'ⳑ' => 'Ⳑ', + 'ⳓ' => 'Ⳓ', + 'ⳕ' => 'Ⳕ', + 'ⳗ' => 'Ⳗ', + 'ⳙ' => 'Ⳙ', + 'ⳛ' => 'Ⳛ', + 'ⳝ' => 'Ⳝ', + 'ⳟ' => 'Ⳟ', + 'ⳡ' => 'Ⳡ', + 'ⳣ' => 'Ⳣ', + 'ⳬ' => 'Ⳬ', + 'ⳮ' => 'Ⳮ', + 'ⳳ' => 'Ⳳ', + 'ⴀ' => 'Ⴀ', + 'ⴁ' => 'Ⴁ', + 'ⴂ' => 'Ⴂ', + 'ⴃ' => 'Ⴃ', + 'ⴄ' => 'Ⴄ', + 'ⴅ' => 'Ⴅ', + 'ⴆ' => 'Ⴆ', + 'ⴇ' => 'Ⴇ', + 'ⴈ' => 'Ⴈ', + 'ⴉ' => 'Ⴉ', + 'ⴊ' => 'Ⴊ', + 'ⴋ' => 'Ⴋ', + 'ⴌ' => 'Ⴌ', + 'ⴍ' => 'Ⴍ', + 'ⴎ' => 'Ⴎ', + 'ⴏ' => 'Ⴏ', + 'ⴐ' => 'Ⴐ', + 'ⴑ' => 'Ⴑ', + 'ⴒ' => 'Ⴒ', + 'ⴓ' => 'Ⴓ', + 'ⴔ' => 'Ⴔ', + 'ⴕ' => 'Ⴕ', + 'ⴖ' => 'Ⴖ', + 'ⴗ' => 'Ⴗ', + 'ⴘ' => 'Ⴘ', + 'ⴙ' => 'Ⴙ', + 'ⴚ' => 'Ⴚ', + 'ⴛ' => 'Ⴛ', + 'ⴜ' => 'Ⴜ', + 'ⴝ' => 'Ⴝ', + 'ⴞ' => 'Ⴞ', + 'ⴟ' => 'Ⴟ', + 'ⴠ' => 'Ⴠ', + 'ⴡ' => 'Ⴡ', + 'ⴢ' => 'Ⴢ', + 'ⴣ' => 'Ⴣ', + 'ⴤ' => 'Ⴤ', + 'ⴥ' => 'Ⴥ', + 'ⴧ' => 'Ⴧ', + 'ⴭ' => 'Ⴭ', + 'ꙁ' => 'Ꙁ', + 'ꙃ' => 'Ꙃ', + 'ꙅ' => 'Ꙅ', + 'ꙇ' => 'Ꙇ', + 'ꙉ' => 'Ꙉ', + 'ꙋ' => 'Ꙋ', + 'ꙍ' => 'Ꙍ', + 'ꙏ' => 'Ꙏ', + 'ꙑ' => 'Ꙑ', + 'ꙓ' => 'Ꙓ', + 'ꙕ' => 'Ꙕ', + 'ꙗ' => 'Ꙗ', + 'ꙙ' => 'Ꙙ', + 'ꙛ' => 'Ꙛ', + 'ꙝ' => 'Ꙝ', + 'ꙟ' => 'Ꙟ', + 'ꙡ' => 'Ꙡ', + 'ꙣ' => 'Ꙣ', + 'ꙥ' => 'Ꙥ', + 'ꙧ' => 'Ꙧ', + 'ꙩ' => 'Ꙩ', + 'ꙫ' => 'Ꙫ', + 'ꙭ' => 'Ꙭ', + 'ꚁ' => 'Ꚁ', + 'ꚃ' => 'Ꚃ', + 'ꚅ' => 'Ꚅ', + 'ꚇ' => 'Ꚇ', + 'ꚉ' => 'Ꚉ', + 'ꚋ' => 'Ꚋ', + 'ꚍ' => 'Ꚍ', + 'ꚏ' => 'Ꚏ', + 'ꚑ' => 'Ꚑ', + 'ꚓ' => 'Ꚓ', + 'ꚕ' => 'Ꚕ', + 'ꚗ' => 'Ꚗ', + 'ꚙ' => 'Ꚙ', + 'ꚛ' => 'Ꚛ', + 'ꜣ' => 'Ꜣ', + 'ꜥ' => 'Ꜥ', + 'ꜧ' => 'Ꜧ', + 'ꜩ' => 'Ꜩ', + 'ꜫ' => 'Ꜫ', + 'ꜭ' => 'Ꜭ', + 'ꜯ' => 'Ꜯ', + 'ꜳ' => 'Ꜳ', + 'ꜵ' => 'Ꜵ', + 'ꜷ' => 'Ꜷ', + 'ꜹ' => 'Ꜹ', + 'ꜻ' => 'Ꜻ', + 'ꜽ' => 'Ꜽ', + 'ꜿ' => 'Ꜿ', + 'ꝁ' => 'Ꝁ', + 'ꝃ' => 'Ꝃ', + 'ꝅ' => 'Ꝅ', + 'ꝇ' => 'Ꝇ', + 'ꝉ' => 'Ꝉ', + 'ꝋ' => 'Ꝋ', + 'ꝍ' => 'Ꝍ', + 'ꝏ' => 'Ꝏ', + 'ꝑ' => 'Ꝑ', + 'ꝓ' => 'Ꝓ', + 'ꝕ' => 'Ꝕ', + 'ꝗ' => 'Ꝗ', + 'ꝙ' => 'Ꝙ', + 'ꝛ' => 'Ꝛ', + 'ꝝ' => 'Ꝝ', + 'ꝟ' => 'Ꝟ', + 'ꝡ' => 'Ꝡ', + 'ꝣ' => 'Ꝣ', + 'ꝥ' => 'Ꝥ', + 'ꝧ' => 'Ꝧ', + 'ꝩ' => 'Ꝩ', + 'ꝫ' => 'Ꝫ', + 'ꝭ' => 'Ꝭ', + 'ꝯ' => 'Ꝯ', + 'ꝺ' => 'Ꝺ', + 'ꝼ' => 'Ꝼ', + 'ꝿ' => 'Ꝿ', + 'ꞁ' => 'Ꞁ', + 'ꞃ' => 'Ꞃ', + 'ꞅ' => 'Ꞅ', + 'ꞇ' => 'Ꞇ', + 'ꞌ' => 'Ꞌ', + 'ꞑ' => 'Ꞑ', + 'ꞓ' => 'Ꞓ', + 'ꞔ' => 'Ꞔ', + 'ꞗ' => 'Ꞗ', + 'ꞙ' => 'Ꞙ', + 'ꞛ' => 'Ꞛ', + 'ꞝ' => 'Ꞝ', + 'ꞟ' => 'Ꞟ', + 'ꞡ' => 'Ꞡ', + 'ꞣ' => 'Ꞣ', + 'ꞥ' => 'Ꞥ', + 'ꞧ' => 'Ꞧ', + 'ꞩ' => 'Ꞩ', + 'ꞵ' => 'Ꞵ', + 'ꞷ' => 'Ꞷ', + 'ꞹ' => 'Ꞹ', + 'ꞻ' => 'Ꞻ', + 'ꞽ' => 'Ꞽ', + 'ꞿ' => 'Ꞿ', + 'ꟃ' => 'Ꟃ', + 'ꟈ' => 'Ꟈ', + 'ꟊ' => 'Ꟊ', + 'ꟶ' => 'Ꟶ', + 'ꭓ' => 'Ꭓ', + 'ꭰ' => 'Ꭰ', + 'ꭱ' => 'Ꭱ', + 'ꭲ' => 'Ꭲ', + 'ꭳ' => 'Ꭳ', + 'ꭴ' => 'Ꭴ', + 'ꭵ' => 'Ꭵ', + 'ꭶ' => 'Ꭶ', + 'ꭷ' => 'Ꭷ', + 'ꭸ' => 'Ꭸ', + 'ꭹ' => 'Ꭹ', + 'ꭺ' => 'Ꭺ', + 'ꭻ' => 'Ꭻ', + 'ꭼ' => 'Ꭼ', + 'ꭽ' => 'Ꭽ', + 'ꭾ' => 'Ꭾ', + 'ꭿ' => 'Ꭿ', + 'ꮀ' => 'Ꮀ', + 'ꮁ' => 'Ꮁ', + 'ꮂ' => 'Ꮂ', + 'ꮃ' => 'Ꮃ', + 'ꮄ' => 'Ꮄ', + 'ꮅ' => 'Ꮅ', + 'ꮆ' => 'Ꮆ', + 'ꮇ' => 'Ꮇ', + 'ꮈ' => 'Ꮈ', + 'ꮉ' => 'Ꮉ', + 'ꮊ' => 'Ꮊ', + 'ꮋ' => 'Ꮋ', + 'ꮌ' => 'Ꮌ', + 'ꮍ' => 'Ꮍ', + 'ꮎ' => 'Ꮎ', + 'ꮏ' => 'Ꮏ', + 'ꮐ' => 'Ꮐ', + 'ꮑ' => 'Ꮑ', + 'ꮒ' => 'Ꮒ', + 'ꮓ' => 'Ꮓ', + 'ꮔ' => 'Ꮔ', + 'ꮕ' => 'Ꮕ', + 'ꮖ' => 'Ꮖ', + 'ꮗ' => 'Ꮗ', + 'ꮘ' => 'Ꮘ', + 'ꮙ' => 'Ꮙ', + 'ꮚ' => 'Ꮚ', + 'ꮛ' => 'Ꮛ', + 'ꮜ' => 'Ꮜ', + 'ꮝ' => 'Ꮝ', + 'ꮞ' => 'Ꮞ', + 'ꮟ' => 'Ꮟ', + 'ꮠ' => 'Ꮠ', + 'ꮡ' => 'Ꮡ', + 'ꮢ' => 'Ꮢ', + 'ꮣ' => 'Ꮣ', + 'ꮤ' => 'Ꮤ', + 'ꮥ' => 'Ꮥ', + 'ꮦ' => 'Ꮦ', + 'ꮧ' => 'Ꮧ', + 'ꮨ' => 'Ꮨ', + 'ꮩ' => 'Ꮩ', + 'ꮪ' => 'Ꮪ', + 'ꮫ' => 'Ꮫ', + 'ꮬ' => 'Ꮬ', + 'ꮭ' => 'Ꮭ', + 'ꮮ' => 'Ꮮ', + 'ꮯ' => 'Ꮯ', + 'ꮰ' => 'Ꮰ', + 'ꮱ' => 'Ꮱ', + 'ꮲ' => 'Ꮲ', + 'ꮳ' => 'Ꮳ', + 'ꮴ' => 'Ꮴ', + 'ꮵ' => 'Ꮵ', + 'ꮶ' => 'Ꮶ', + 'ꮷ' => 'Ꮷ', + 'ꮸ' => 'Ꮸ', + 'ꮹ' => 'Ꮹ', + 'ꮺ' => 'Ꮺ', + 'ꮻ' => 'Ꮻ', + 'ꮼ' => 'Ꮼ', + 'ꮽ' => 'Ꮽ', + 'ꮾ' => 'Ꮾ', + 'ꮿ' => 'Ꮿ', + 'a' => 'A', + 'b' => 'B', + 'c' => 'C', + 'd' => 'D', + 'e' => 'E', + 'f' => 'F', + 'g' => 'G', + 'h' => 'H', + 'i' => 'I', + 'j' => 'J', + 'k' => 'K', + 'l' => 'L', + 'm' => 'M', + 'n' => 'N', + 'o' => 'O', + 'p' => 'P', + 'q' => 'Q', + 'r' => 'R', + 's' => 'S', + 't' => 'T', + 'u' => 'U', + 'v' => 'V', + 'w' => 'W', + 'x' => 'X', + 'y' => 'Y', + 'z' => 'Z', + '𐐨' => '𐐀', + '𐐩' => '𐐁', + '𐐪' => '𐐂', + '𐐫' => '𐐃', + '𐐬' => '𐐄', + '𐐭' => '𐐅', + '𐐮' => '𐐆', + '𐐯' => '𐐇', + '𐐰' => '𐐈', + '𐐱' => '𐐉', + '𐐲' => '𐐊', + '𐐳' => '𐐋', + '𐐴' => '𐐌', + '𐐵' => '𐐍', + '𐐶' => '𐐎', + '𐐷' => '𐐏', + '𐐸' => '𐐐', + '𐐹' => '𐐑', + '𐐺' => '𐐒', + '𐐻' => '𐐓', + '𐐼' => '𐐔', + '𐐽' => '𐐕', + '𐐾' => '𐐖', + '𐐿' => '𐐗', + '𐑀' => '𐐘', + '𐑁' => '𐐙', + '𐑂' => '𐐚', + '𐑃' => '𐐛', + '𐑄' => '𐐜', + '𐑅' => '𐐝', + '𐑆' => '𐐞', + '𐑇' => '𐐟', + '𐑈' => '𐐠', + '𐑉' => '𐐡', + '𐑊' => '𐐢', + '𐑋' => '𐐣', + '𐑌' => '𐐤', + '𐑍' => '𐐥', + '𐑎' => '𐐦', + '𐑏' => '𐐧', + '𐓘' => '𐒰', + '𐓙' => '𐒱', + '𐓚' => '𐒲', + '𐓛' => '𐒳', + '𐓜' => '𐒴', + '𐓝' => '𐒵', + '𐓞' => '𐒶', + '𐓟' => '𐒷', + '𐓠' => '𐒸', + '𐓡' => '𐒹', + '𐓢' => '𐒺', + '𐓣' => '𐒻', + '𐓤' => '𐒼', + '𐓥' => '𐒽', + '𐓦' => '𐒾', + '𐓧' => '𐒿', + '𐓨' => '𐓀', + '𐓩' => '𐓁', + '𐓪' => '𐓂', + '𐓫' => '𐓃', + '𐓬' => '𐓄', + '𐓭' => '𐓅', + '𐓮' => '𐓆', + '𐓯' => '𐓇', + '𐓰' => '𐓈', + '𐓱' => '𐓉', + '𐓲' => '𐓊', + '𐓳' => '𐓋', + '𐓴' => '𐓌', + '𐓵' => '𐓍', + '𐓶' => '𐓎', + '𐓷' => '𐓏', + '𐓸' => '𐓐', + '𐓹' => '𐓑', + '𐓺' => '𐓒', + '𐓻' => '𐓓', + '𐳀' => '𐲀', + '𐳁' => '𐲁', + '𐳂' => '𐲂', + '𐳃' => '𐲃', + '𐳄' => '𐲄', + '𐳅' => '𐲅', + '𐳆' => '𐲆', + '𐳇' => '𐲇', + '𐳈' => '𐲈', + '𐳉' => '𐲉', + '𐳊' => '𐲊', + '𐳋' => '𐲋', + '𐳌' => '𐲌', + '𐳍' => '𐲍', + '𐳎' => '𐲎', + '𐳏' => '𐲏', + '𐳐' => '𐲐', + '𐳑' => '𐲑', + '𐳒' => '𐲒', + '𐳓' => '𐲓', + '𐳔' => '𐲔', + '𐳕' => '𐲕', + '𐳖' => '𐲖', + '𐳗' => '𐲗', + '𐳘' => '𐲘', + '𐳙' => '𐲙', + '𐳚' => '𐲚', + '𐳛' => '𐲛', + '𐳜' => '𐲜', + '𐳝' => '𐲝', + '𐳞' => '𐲞', + '𐳟' => '𐲟', + '𐳠' => '𐲠', + '𐳡' => '𐲡', + '𐳢' => '𐲢', + '𐳣' => '𐲣', + '𐳤' => '𐲤', + '𐳥' => '𐲥', + '𐳦' => '𐲦', + '𐳧' => '𐲧', + '𐳨' => '𐲨', + '𐳩' => '𐲩', + '𐳪' => '𐲪', + '𐳫' => '𐲫', + '𐳬' => '𐲬', + '𐳭' => '𐲭', + '𐳮' => '𐲮', + '𐳯' => '𐲯', + '𐳰' => '𐲰', + '𐳱' => '𐲱', + '𐳲' => '𐲲', + '𑣀' => '𑢠', + '𑣁' => '𑢡', + '𑣂' => '𑢢', + '𑣃' => '𑢣', + '𑣄' => '𑢤', + '𑣅' => '𑢥', + '𑣆' => '𑢦', + '𑣇' => '𑢧', + '𑣈' => '𑢨', + '𑣉' => '𑢩', + '𑣊' => '𑢪', + '𑣋' => '𑢫', + '𑣌' => '𑢬', + '𑣍' => '𑢭', + '𑣎' => '𑢮', + '𑣏' => '𑢯', + '𑣐' => '𑢰', + '𑣑' => '𑢱', + '𑣒' => '𑢲', + '𑣓' => '𑢳', + '𑣔' => '𑢴', + '𑣕' => '𑢵', + '𑣖' => '𑢶', + '𑣗' => '𑢷', + '𑣘' => '𑢸', + '𑣙' => '𑢹', + '𑣚' => '𑢺', + '𑣛' => '𑢻', + '𑣜' => '𑢼', + '𑣝' => '𑢽', + '𑣞' => '𑢾', + '𑣟' => '𑢿', + '𖹠' => '𖹀', + '𖹡' => '𖹁', + '𖹢' => '𖹂', + '𖹣' => '𖹃', + '𖹤' => '𖹄', + '𖹥' => '𖹅', + '𖹦' => '𖹆', + '𖹧' => '𖹇', + '𖹨' => '𖹈', + '𖹩' => '𖹉', + '𖹪' => '𖹊', + '𖹫' => '𖹋', + '𖹬' => '𖹌', + '𖹭' => '𖹍', + '𖹮' => '𖹎', + '𖹯' => '𖹏', + '𖹰' => '𖹐', + '𖹱' => '𖹑', + '𖹲' => '𖹒', + '𖹳' => '𖹓', + '𖹴' => '𖹔', + '𖹵' => '𖹕', + '𖹶' => '𖹖', + '𖹷' => '𖹗', + '𖹸' => '𖹘', + '𖹹' => '𖹙', + '𖹺' => '𖹚', + '𖹻' => '𖹛', + '𖹼' => '𖹜', + '𖹽' => '𖹝', + '𖹾' => '𖹞', + '𖹿' => '𖹟', + '𞤢' => '𞤀', + '𞤣' => '𞤁', + '𞤤' => '𞤂', + '𞤥' => '𞤃', + '𞤦' => '𞤄', + '𞤧' => '𞤅', + '𞤨' => '𞤆', + '𞤩' => '𞤇', + '𞤪' => '𞤈', + '𞤫' => '𞤉', + '𞤬' => '𞤊', + '𞤭' => '𞤋', + '𞤮' => '𞤌', + '𞤯' => '𞤍', + '𞤰' => '𞤎', + '𞤱' => '𞤏', + '𞤲' => '𞤐', + '𞤳' => '𞤑', + '𞤴' => '𞤒', + '𞤵' => '𞤓', + '𞤶' => '𞤔', + '𞤷' => '𞤕', + '𞤸' => '𞤖', + '𞤹' => '𞤗', + '𞤺' => '𞤘', + '𞤻' => '𞤙', + '𞤼' => '𞤚', + '𞤽' => '𞤛', + '𞤾' => '𞤜', + '𞤿' => '𞤝', + '𞥀' => '𞤞', + '𞥁' => '𞤟', + '𞥂' => '𞤠', + '𞥃' => '𞤡', + 'ß' => 'SS', + 'ff' => 'FF', + 'fi' => 'FI', + 'fl' => 'FL', + 'ffi' => 'FFI', + 'ffl' => 'FFL', + 'ſt' => 'ST', + 'st' => 'ST', + 'և' => 'ԵՒ', + 'ﬓ' => 'ՄՆ', + 'ﬔ' => 'ՄԵ', + 'ﬕ' => 'ՄԻ', + 'ﬖ' => 'ՎՆ', + 'ﬗ' => 'ՄԽ', + 'ʼn' => 'ʼN', + 'ΐ' => 'Ϊ́', + 'ΰ' => 'Ϋ́', + 'ǰ' => 'J̌', + 'ẖ' => 'H̱', + 'ẗ' => 'T̈', + 'ẘ' => 'W̊', + 'ẙ' => 'Y̊', + 'ẚ' => 'Aʾ', + 'ὐ' => 'Υ̓', + 'ὒ' => 'Υ̓̀', + 'ὔ' => 'Υ̓́', + 'ὖ' => 'Υ̓͂', + 'ᾶ' => 'Α͂', + 'ῆ' => 'Η͂', + 'ῒ' => 'Ϊ̀', + 'ΐ' => 'Ϊ́', + 'ῖ' => 'Ι͂', + 'ῗ' => 'Ϊ͂', + 'ῢ' => 'Ϋ̀', + 'ΰ' => 'Ϋ́', + 'ῤ' => 'Ρ̓', + 'ῦ' => 'Υ͂', + 'ῧ' => 'Ϋ͂', + 'ῶ' => 'Ω͂', + 'ᾈ' => 'ἈΙ', + 'ᾉ' => 'ἉΙ', + 'ᾊ' => 'ἊΙ', + 'ᾋ' => 'ἋΙ', + 'ᾌ' => 'ἌΙ', + 'ᾍ' => 'ἍΙ', + 'ᾎ' => 'ἎΙ', + 'ᾏ' => 'ἏΙ', + 'ᾘ' => 'ἨΙ', + 'ᾙ' => 'ἩΙ', + 'ᾚ' => 'ἪΙ', + 'ᾛ' => 'ἫΙ', + 'ᾜ' => 'ἬΙ', + 'ᾝ' => 'ἭΙ', + 'ᾞ' => 'ἮΙ', + 'ᾟ' => 'ἯΙ', + 'ᾨ' => 'ὨΙ', + 'ᾩ' => 'ὩΙ', + 'ᾪ' => 'ὪΙ', + 'ᾫ' => 'ὫΙ', + 'ᾬ' => 'ὬΙ', + 'ᾭ' => 'ὭΙ', + 'ᾮ' => 'ὮΙ', + 'ᾯ' => 'ὯΙ', + 'ᾼ' => 'ΑΙ', + 'ῌ' => 'ΗΙ', + 'ῼ' => 'ΩΙ', + 'ᾲ' => 'ᾺΙ', + 'ᾴ' => 'ΆΙ', + 'ῂ' => 'ῊΙ', + 'ῄ' => 'ΉΙ', + 'ῲ' => 'ῺΙ', + 'ῴ' => 'ΏΙ', + 'ᾷ' => 'Α͂Ι', + 'ῇ' => 'Η͂Ι', + 'ῷ' => 'Ω͂Ι', +); diff --git a/plants/vendor/symfony/polyfill-mbstring/bootstrap.php b/plants/vendor/symfony/polyfill-mbstring/bootstrap.php new file mode 100644 index 0000000..ff51ae0 --- /dev/null +++ b/plants/vendor/symfony/polyfill-mbstring/bootstrap.php @@ -0,0 +1,172 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Mbstring as p; + +if (\PHP_VERSION_ID >= 80000) { + return require __DIR__.'/bootstrap80.php'; +} + +if (!function_exists('mb_convert_encoding')) { + function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); } +} +if (!function_exists('mb_decode_mimeheader')) { + function mb_decode_mimeheader($string) { return p\Mbstring::mb_decode_mimeheader($string); } +} +if (!function_exists('mb_encode_mimeheader')) { + function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = "\r\n", $indent = 0) { return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); } +} +if (!function_exists('mb_decode_numericentity')) { + function mb_decode_numericentity($string, $map, $encoding = null) { return p\Mbstring::mb_decode_numericentity($string, $map, $encoding); } +} +if (!function_exists('mb_encode_numericentity')) { + function mb_encode_numericentity($string, $map, $encoding = null, $hex = false) { return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); } +} +if (!function_exists('mb_convert_case')) { + function mb_convert_case($string, $mode, $encoding = null) { return p\Mbstring::mb_convert_case($string, $mode, $encoding); } +} +if (!function_exists('mb_internal_encoding')) { + function mb_internal_encoding($encoding = null) { return p\Mbstring::mb_internal_encoding($encoding); } +} +if (!function_exists('mb_language')) { + function mb_language($language = null) { return p\Mbstring::mb_language($language); } +} +if (!function_exists('mb_list_encodings')) { + function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); } +} +if (!function_exists('mb_encoding_aliases')) { + function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); } +} +if (!function_exists('mb_check_encoding')) { + function mb_check_encoding($value = null, $encoding = null) { return p\Mbstring::mb_check_encoding($value, $encoding); } +} +if (!function_exists('mb_detect_encoding')) { + function mb_detect_encoding($string, $encodings = null, $strict = false) { return p\Mbstring::mb_detect_encoding($string, $encodings, $strict); } +} +if (!function_exists('mb_detect_order')) { + function mb_detect_order($encoding = null) { return p\Mbstring::mb_detect_order($encoding); } +} +if (!function_exists('mb_parse_str')) { + function mb_parse_str($string, &$result = []) { parse_str($string, $result); return (bool) $result; } +} +if (!function_exists('mb_strlen')) { + function mb_strlen($string, $encoding = null) { return p\Mbstring::mb_strlen($string, $encoding); } +} +if (!function_exists('mb_strpos')) { + function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); } +} +if (!function_exists('mb_strtolower')) { + function mb_strtolower($string, $encoding = null) { return p\Mbstring::mb_strtolower($string, $encoding); } +} +if (!function_exists('mb_strtoupper')) { + function mb_strtoupper($string, $encoding = null) { return p\Mbstring::mb_strtoupper($string, $encoding); } +} +if (!function_exists('mb_substitute_character')) { + function mb_substitute_character($substitute_character = null) { return p\Mbstring::mb_substitute_character($substitute_character); } +} +if (!function_exists('mb_substr')) { + function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\Mbstring::mb_substr($string, $start, $length, $encoding); } +} +if (!function_exists('mb_stripos')) { + function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); } +} +if (!function_exists('mb_stristr')) { + function mb_stristr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); } +} +if (!function_exists('mb_strrchr')) { + function mb_strrchr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); } +} +if (!function_exists('mb_strrichr')) { + function mb_strrichr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); } +} +if (!function_exists('mb_strripos')) { + function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); } +} +if (!function_exists('mb_strrpos')) { + function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); } +} +if (!function_exists('mb_strstr')) { + function mb_strstr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); } +} +if (!function_exists('mb_get_info')) { + function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); } +} +if (!function_exists('mb_http_output')) { + function mb_http_output($encoding = null) { return p\Mbstring::mb_http_output($encoding); } +} +if (!function_exists('mb_strwidth')) { + function mb_strwidth($string, $encoding = null) { return p\Mbstring::mb_strwidth($string, $encoding); } +} +if (!function_exists('mb_substr_count')) { + function mb_substr_count($haystack, $needle, $encoding = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $encoding); } +} +if (!function_exists('mb_output_handler')) { + function mb_output_handler($string, $status) { return p\Mbstring::mb_output_handler($string, $status); } +} +if (!function_exists('mb_http_input')) { + function mb_http_input($type = null) { return p\Mbstring::mb_http_input($type); } +} + +if (!function_exists('mb_convert_variables')) { + function mb_convert_variables($to_encoding, $from_encoding, &...$vars) { return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, ...$vars); } +} + +if (!function_exists('mb_ord')) { + function mb_ord($string, $encoding = null) { return p\Mbstring::mb_ord($string, $encoding); } +} +if (!function_exists('mb_chr')) { + function mb_chr($codepoint, $encoding = null) { return p\Mbstring::mb_chr($codepoint, $encoding); } +} +if (!function_exists('mb_scrub')) { + function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? mb_internal_encoding() : $encoding; return mb_convert_encoding($string, $encoding, $encoding); } +} +if (!function_exists('mb_str_split')) { + function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $length, $encoding); } +} + +if (!function_exists('mb_str_pad')) { + function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } +} + +if (!function_exists('mb_ucfirst')) { + function mb_ucfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_ucfirst($string, $encoding); } +} + +if (!function_exists('mb_lcfirst')) { + function mb_lcfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); } +} + +if (!function_exists('mb_trim')) { + function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_trim($string, $characters, $encoding); } +} + +if (!function_exists('mb_ltrim')) { + function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_ltrim($string, $characters, $encoding); } +} + +if (!function_exists('mb_rtrim')) { + function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_rtrim($string, $characters, $encoding); } +} + + +if (extension_loaded('mbstring')) { + return; +} + +if (!defined('MB_CASE_UPPER')) { + define('MB_CASE_UPPER', 0); +} +if (!defined('MB_CASE_LOWER')) { + define('MB_CASE_LOWER', 1); +} +if (!defined('MB_CASE_TITLE')) { + define('MB_CASE_TITLE', 2); +} diff --git a/plants/vendor/symfony/polyfill-mbstring/bootstrap80.php b/plants/vendor/symfony/polyfill-mbstring/bootstrap80.php new file mode 100644 index 0000000..5236e6d --- /dev/null +++ b/plants/vendor/symfony/polyfill-mbstring/bootstrap80.php @@ -0,0 +1,167 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Mbstring as p; + +if (!function_exists('mb_convert_encoding')) { + function mb_convert_encoding(array|string|null $string, ?string $to_encoding, array|string|null $from_encoding = null): array|string|false { return p\Mbstring::mb_convert_encoding($string ?? '', (string) $to_encoding, $from_encoding); } +} +if (!function_exists('mb_decode_mimeheader')) { + function mb_decode_mimeheader(?string $string): string { return p\Mbstring::mb_decode_mimeheader((string) $string); } +} +if (!function_exists('mb_encode_mimeheader')) { + function mb_encode_mimeheader(?string $string, ?string $charset = null, ?string $transfer_encoding = null, ?string $newline = "\r\n", ?int $indent = 0): string { return p\Mbstring::mb_encode_mimeheader((string) $string, $charset, $transfer_encoding, (string) $newline, (int) $indent); } +} +if (!function_exists('mb_decode_numericentity')) { + function mb_decode_numericentity(?string $string, array $map, ?string $encoding = null): string { return p\Mbstring::mb_decode_numericentity((string) $string, $map, $encoding); } +} +if (!function_exists('mb_encode_numericentity')) { + function mb_encode_numericentity(?string $string, array $map, ?string $encoding = null, ?bool $hex = false): string { return p\Mbstring::mb_encode_numericentity((string) $string, $map, $encoding, (bool) $hex); } +} +if (!function_exists('mb_convert_case')) { + function mb_convert_case(?string $string, ?int $mode, ?string $encoding = null): string { return p\Mbstring::mb_convert_case((string) $string, (int) $mode, $encoding); } +} +if (!function_exists('mb_internal_encoding')) { + function mb_internal_encoding(?string $encoding = null): string|bool { return p\Mbstring::mb_internal_encoding($encoding); } +} +if (!function_exists('mb_language')) { + function mb_language(?string $language = null): string|bool { return p\Mbstring::mb_language($language); } +} +if (!function_exists('mb_list_encodings')) { + function mb_list_encodings(): array { return p\Mbstring::mb_list_encodings(); } +} +if (!function_exists('mb_encoding_aliases')) { + function mb_encoding_aliases(?string $encoding): array { return p\Mbstring::mb_encoding_aliases((string) $encoding); } +} +if (!function_exists('mb_check_encoding')) { + function mb_check_encoding(array|string|null $value = null, ?string $encoding = null): bool { return p\Mbstring::mb_check_encoding($value, $encoding); } +} +if (!function_exists('mb_detect_encoding')) { + function mb_detect_encoding(?string $string, array|string|null $encodings = null, ?bool $strict = false): string|false { return p\Mbstring::mb_detect_encoding((string) $string, $encodings, (bool) $strict); } +} +if (!function_exists('mb_detect_order')) { + function mb_detect_order(array|string|null $encoding = null): array|bool { return p\Mbstring::mb_detect_order($encoding); } +} +if (!function_exists('mb_parse_str')) { + function mb_parse_str(?string $string, &$result = []): bool { parse_str((string) $string, $result); return (bool) $result; } +} +if (!function_exists('mb_strlen')) { + function mb_strlen(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strlen((string) $string, $encoding); } +} +if (!function_exists('mb_strpos')) { + function mb_strpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strpos((string) $haystack, (string) $needle, (int) $offset, $encoding); } +} +if (!function_exists('mb_strtolower')) { + function mb_strtolower(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtolower((string) $string, $encoding); } +} +if (!function_exists('mb_strtoupper')) { + function mb_strtoupper(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtoupper((string) $string, $encoding); } +} +if (!function_exists('mb_substitute_character')) { + function mb_substitute_character(string|int|null $substitute_character = null): string|int|bool { return p\Mbstring::mb_substitute_character($substitute_character); } +} +if (!function_exists('mb_substr')) { + function mb_substr(?string $string, ?int $start, ?int $length = null, ?string $encoding = null): string { return p\Mbstring::mb_substr((string) $string, (int) $start, $length, $encoding); } +} +if (!function_exists('mb_stripos')) { + function mb_stripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_stripos((string) $haystack, (string) $needle, (int) $offset, $encoding); } +} +if (!function_exists('mb_stristr')) { + function mb_stristr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_stristr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } +} +if (!function_exists('mb_strrchr')) { + function mb_strrchr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrchr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } +} +if (!function_exists('mb_strrichr')) { + function mb_strrichr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrichr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } +} +if (!function_exists('mb_strripos')) { + function mb_strripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strripos((string) $haystack, (string) $needle, (int) $offset, $encoding); } +} +if (!function_exists('mb_strrpos')) { + function mb_strrpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strrpos((string) $haystack, (string) $needle, (int) $offset, $encoding); } +} +if (!function_exists('mb_strstr')) { + function mb_strstr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strstr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } +} +if (!function_exists('mb_get_info')) { + function mb_get_info(?string $type = 'all'): array|string|int|false|null { return p\Mbstring::mb_get_info((string) $type); } +} +if (!function_exists('mb_http_output')) { + function mb_http_output(?string $encoding = null): string|bool { return p\Mbstring::mb_http_output($encoding); } +} +if (!function_exists('mb_strwidth')) { + function mb_strwidth(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strwidth((string) $string, $encoding); } +} +if (!function_exists('mb_substr_count')) { + function mb_substr_count(?string $haystack, ?string $needle, ?string $encoding = null): int { return p\Mbstring::mb_substr_count((string) $haystack, (string) $needle, $encoding); } +} +if (!function_exists('mb_output_handler')) { + function mb_output_handler(?string $string, ?int $status): string { return p\Mbstring::mb_output_handler((string) $string, (int) $status); } +} +if (!function_exists('mb_http_input')) { + function mb_http_input(?string $type = null): array|string|false { return p\Mbstring::mb_http_input($type); } +} + +if (!function_exists('mb_convert_variables')) { + function mb_convert_variables(?string $to_encoding, array|string|null $from_encoding, mixed &$var, mixed &...$vars): string|false { return p\Mbstring::mb_convert_variables((string) $to_encoding, $from_encoding ?? '', $var, ...$vars); } +} + +if (!function_exists('mb_ord')) { + function mb_ord(?string $string, ?string $encoding = null): int|false { return p\Mbstring::mb_ord((string) $string, $encoding); } +} +if (!function_exists('mb_chr')) { + function mb_chr(?int $codepoint, ?string $encoding = null): string|false { return p\Mbstring::mb_chr((int) $codepoint, $encoding); } +} +if (!function_exists('mb_scrub')) { + function mb_scrub(?string $string, ?string $encoding = null): string { $encoding ??= mb_internal_encoding(); return mb_convert_encoding((string) $string, $encoding, $encoding); } +} +if (!function_exists('mb_str_split')) { + function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = null): array { return p\Mbstring::mb_str_split((string) $string, (int) $length, $encoding); } +} + +if (!function_exists('mb_str_pad')) { + function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } +} + +if (!function_exists('mb_ucfirst')) { + function mb_ucfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_ucfirst($string, $encoding); } +} + +if (!function_exists('mb_lcfirst')) { + function mb_lcfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); } +} + +if (!function_exists('mb_trim')) { + function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_trim($string, $characters, $encoding); } +} + +if (!function_exists('mb_ltrim')) { + function mb_ltrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_ltrim($string, $characters, $encoding); } +} + +if (!function_exists('mb_rtrim')) { + function mb_rtrim(string $string, ?string $characters = null, ?string $encoding = null): string { return p\Mbstring::mb_rtrim($string, $characters, $encoding); } +} + +if (extension_loaded('mbstring')) { + return; +} + +if (!defined('MB_CASE_UPPER')) { + define('MB_CASE_UPPER', 0); +} +if (!defined('MB_CASE_LOWER')) { + define('MB_CASE_LOWER', 1); +} +if (!defined('MB_CASE_TITLE')) { + define('MB_CASE_TITLE', 2); +} diff --git a/plants/vendor/symfony/polyfill-mbstring/composer.json b/plants/vendor/symfony/polyfill-mbstring/composer.json new file mode 100644 index 0000000..daa07f8 --- /dev/null +++ b/plants/vendor/symfony/polyfill-mbstring/composer.json @@ -0,0 +1,39 @@ +{ + "name": "symfony/polyfill-mbstring", + "type": "library", + "description": "Symfony polyfill for the Mbstring extension", + "keywords": ["polyfill", "shim", "compatibility", "portable", "mbstring"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2", + "ext-iconv": "*" + }, + "provide": { + "ext-mbstring": "*" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" }, + "files": [ "bootstrap.php" ] + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/plants/vendor/symfony/polyfill-php80/LICENSE b/plants/vendor/symfony/polyfill-php80/LICENSE new file mode 100644 index 0000000..0ed3a24 --- /dev/null +++ b/plants/vendor/symfony/polyfill-php80/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2020-present Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/plants/vendor/symfony/polyfill-php80/Php80.php b/plants/vendor/symfony/polyfill-php80/Php80.php new file mode 100644 index 0000000..362dd1a --- /dev/null +++ b/plants/vendor/symfony/polyfill-php80/Php80.php @@ -0,0 +1,115 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Php80; + +/** + * @author Ion Bazan + * @author Nico Oelgart + * @author Nicolas Grekas + * + * @internal + */ +final class Php80 +{ + public static function fdiv(float $dividend, float $divisor): float + { + return @($dividend / $divisor); + } + + public static function get_debug_type($value): string + { + switch (true) { + case null === $value: return 'null'; + case \is_bool($value): return 'bool'; + case \is_string($value): return 'string'; + case \is_array($value): return 'array'; + case \is_int($value): return 'int'; + case \is_float($value): return 'float'; + case \is_object($value): break; + case $value instanceof \__PHP_Incomplete_Class: return '__PHP_Incomplete_Class'; + default: + if (null === $type = @get_resource_type($value)) { + return 'unknown'; + } + + if ('Unknown' === $type) { + $type = 'closed'; + } + + return "resource ($type)"; + } + + $class = \get_class($value); + + if (false === strpos($class, '@')) { + return $class; + } + + return (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous'; + } + + public static function get_resource_id($res): int + { + if (!\is_resource($res) && null === @get_resource_type($res)) { + throw new \TypeError(sprintf('Argument 1 passed to get_resource_id() must be of the type resource, %s given', get_debug_type($res))); + } + + return (int) $res; + } + + public static function preg_last_error_msg(): string + { + switch (preg_last_error()) { + case \PREG_INTERNAL_ERROR: + return 'Internal error'; + case \PREG_BAD_UTF8_ERROR: + return 'Malformed UTF-8 characters, possibly incorrectly encoded'; + case \PREG_BAD_UTF8_OFFSET_ERROR: + return 'The offset did not correspond to the beginning of a valid UTF-8 code point'; + case \PREG_BACKTRACK_LIMIT_ERROR: + return 'Backtrack limit exhausted'; + case \PREG_RECURSION_LIMIT_ERROR: + return 'Recursion limit exhausted'; + case \PREG_JIT_STACKLIMIT_ERROR: + return 'JIT stack limit exhausted'; + case \PREG_NO_ERROR: + return 'No error'; + default: + return 'Unknown error'; + } + } + + public static function str_contains(string $haystack, string $needle): bool + { + return '' === $needle || false !== strpos($haystack, $needle); + } + + public static function str_starts_with(string $haystack, string $needle): bool + { + return 0 === strncmp($haystack, $needle, \strlen($needle)); + } + + public static function str_ends_with(string $haystack, string $needle): bool + { + if ('' === $needle || $needle === $haystack) { + return true; + } + + if ('' === $haystack) { + return false; + } + + $needleLength = \strlen($needle); + + return $needleLength <= \strlen($haystack) && 0 === substr_compare($haystack, $needle, -$needleLength); + } +} diff --git a/plants/vendor/symfony/polyfill-php80/PhpToken.php b/plants/vendor/symfony/polyfill-php80/PhpToken.php new file mode 100644 index 0000000..cd78c4c --- /dev/null +++ b/plants/vendor/symfony/polyfill-php80/PhpToken.php @@ -0,0 +1,106 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Php80; + +/** + * @author Fedonyuk Anton + * + * @internal + */ +class PhpToken implements \Stringable +{ + /** + * @var int + */ + public $id; + + /** + * @var string + */ + public $text; + + /** + * @var -1|positive-int + */ + public $line; + + /** + * @var int + */ + public $pos; + + /** + * @param -1|positive-int $line + */ + public function __construct(int $id, string $text, int $line = -1, int $position = -1) + { + $this->id = $id; + $this->text = $text; + $this->line = $line; + $this->pos = $position; + } + + public function getTokenName(): ?string + { + if ('UNKNOWN' === $name = token_name($this->id)) { + $name = \strlen($this->text) > 1 || \ord($this->text) < 32 ? null : $this->text; + } + + return $name; + } + + /** + * @param int|string|array $kind + */ + public function is($kind): bool + { + foreach ((array) $kind as $value) { + if (\in_array($value, [$this->id, $this->text], true)) { + return true; + } + } + + return false; + } + + public function isIgnorable(): bool + { + return \in_array($this->id, [\T_WHITESPACE, \T_COMMENT, \T_DOC_COMMENT, \T_OPEN_TAG], true); + } + + public function __toString(): string + { + return (string) $this->text; + } + + /** + * @return list + */ + public static function tokenize(string $code, int $flags = 0): array + { + $line = 1; + $position = 0; + $tokens = token_get_all($code, $flags); + foreach ($tokens as $index => $token) { + if (\is_string($token)) { + $id = \ord($token); + $text = $token; + } else { + [$id, $text, $line] = $token; + } + $tokens[$index] = new static($id, $text, $line, $position); + $position += \strlen($text); + } + + return $tokens; + } +} diff --git a/plants/vendor/symfony/polyfill-php80/README.md b/plants/vendor/symfony/polyfill-php80/README.md new file mode 100644 index 0000000..3816c55 --- /dev/null +++ b/plants/vendor/symfony/polyfill-php80/README.md @@ -0,0 +1,25 @@ +Symfony Polyfill / Php80 +======================== + +This component provides features added to PHP 8.0 core: + +- [`Stringable`](https://php.net/stringable) interface +- [`fdiv`](https://php.net/fdiv) +- [`ValueError`](https://php.net/valueerror) class +- [`UnhandledMatchError`](https://php.net/unhandledmatcherror) class +- `FILTER_VALIDATE_BOOL` constant +- [`get_debug_type`](https://php.net/get_debug_type) +- [`PhpToken`](https://php.net/phptoken) class +- [`preg_last_error_msg`](https://php.net/preg_last_error_msg) +- [`str_contains`](https://php.net/str_contains) +- [`str_starts_with`](https://php.net/str_starts_with) +- [`str_ends_with`](https://php.net/str_ends_with) +- [`get_resource_id`](https://php.net/get_resource_id) + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/plants/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php b/plants/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php new file mode 100644 index 0000000..2b95542 --- /dev/null +++ b/plants/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#[Attribute(Attribute::TARGET_CLASS)] +final class Attribute +{ + public const TARGET_CLASS = 1; + public const TARGET_FUNCTION = 2; + public const TARGET_METHOD = 4; + public const TARGET_PROPERTY = 8; + public const TARGET_CLASS_CONSTANT = 16; + public const TARGET_PARAMETER = 32; + public const TARGET_ALL = 63; + public const IS_REPEATABLE = 64; + + /** @var int */ + public $flags; + + public function __construct(int $flags = self::TARGET_ALL) + { + $this->flags = $flags; + } +} diff --git a/plants/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php b/plants/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php new file mode 100644 index 0000000..bd1212f --- /dev/null +++ b/plants/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID < 80000 && extension_loaded('tokenizer')) { + class PhpToken extends Symfony\Polyfill\Php80\PhpToken + { + } +} diff --git a/plants/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php b/plants/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php new file mode 100644 index 0000000..7c62d75 --- /dev/null +++ b/plants/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID < 80000) { + interface Stringable + { + /** + * @return string + */ + public function __toString(); + } +} diff --git a/plants/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php b/plants/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php new file mode 100644 index 0000000..01c6c6c --- /dev/null +++ b/plants/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID < 80000) { + class UnhandledMatchError extends Error + { + } +} diff --git a/plants/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php b/plants/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php new file mode 100644 index 0000000..783dbc2 --- /dev/null +++ b/plants/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID < 80000) { + class ValueError extends Error + { + } +} diff --git a/plants/vendor/symfony/polyfill-php80/bootstrap.php b/plants/vendor/symfony/polyfill-php80/bootstrap.php new file mode 100644 index 0000000..e5f7dbc --- /dev/null +++ b/plants/vendor/symfony/polyfill-php80/bootstrap.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Php80 as p; + +if (\PHP_VERSION_ID >= 80000) { + return; +} + +if (!defined('FILTER_VALIDATE_BOOL') && defined('FILTER_VALIDATE_BOOLEAN')) { + define('FILTER_VALIDATE_BOOL', \FILTER_VALIDATE_BOOLEAN); +} + +if (!function_exists('fdiv')) { + function fdiv(float $num1, float $num2): float { return p\Php80::fdiv($num1, $num2); } +} +if (!function_exists('preg_last_error_msg')) { + function preg_last_error_msg(): string { return p\Php80::preg_last_error_msg(); } +} +if (!function_exists('str_contains')) { + function str_contains(?string $haystack, ?string $needle): bool { return p\Php80::str_contains($haystack ?? '', $needle ?? ''); } +} +if (!function_exists('str_starts_with')) { + function str_starts_with(?string $haystack, ?string $needle): bool { return p\Php80::str_starts_with($haystack ?? '', $needle ?? ''); } +} +if (!function_exists('str_ends_with')) { + function str_ends_with(?string $haystack, ?string $needle): bool { return p\Php80::str_ends_with($haystack ?? '', $needle ?? ''); } +} +if (!function_exists('get_debug_type')) { + function get_debug_type($value): string { return p\Php80::get_debug_type($value); } +} +if (!function_exists('get_resource_id')) { + function get_resource_id($resource): int { return p\Php80::get_resource_id($resource); } +} diff --git a/plants/vendor/symfony/polyfill-php80/composer.json b/plants/vendor/symfony/polyfill-php80/composer.json new file mode 100644 index 0000000..a503b03 --- /dev/null +++ b/plants/vendor/symfony/polyfill-php80/composer.json @@ -0,0 +1,37 @@ +{ + "name": "symfony/polyfill-php80", + "type": "library", + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "keywords": ["polyfill", "shim", "compatibility", "portable"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Php80\\": "" }, + "files": [ "bootstrap.php" ], + "classmap": [ "Resources/stubs" ] + }, + "minimum-stability": "dev", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/plants/vendor/vlucas/phpdotenv/LICENSE b/plants/vendor/vlucas/phpdotenv/LICENSE new file mode 100644 index 0000000..922c552 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/LICENSE @@ -0,0 +1,30 @@ +BSD 3-Clause License + +Copyright (c) 2014, Graham Campbell. +Copyright (c) 2013, Vance Lucas. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/plants/vendor/vlucas/phpdotenv/composer.json b/plants/vendor/vlucas/phpdotenv/composer.json new file mode 100644 index 0000000..3636317 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/composer.json @@ -0,0 +1,60 @@ +{ + "name": "vlucas/phpdotenv", + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": ["env", "dotenv", "environment"], + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "require": { + "php": "^7.2.5 || ^8.0", + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.3", + "phpoption/phpoption": "^1.9.3", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "ext-filter": "*", + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit":"^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Dotenv\\Tests\\": "tests/Dotenv/" + } + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "config": { + "allow-plugins": { + "bamarni/composer-bin-plugin": true + }, + "preferred-install": "dist" + }, + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Dotenv.php b/plants/vendor/vlucas/phpdotenv/src/Dotenv.php new file mode 100644 index 0000000..34ca850 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Dotenv.php @@ -0,0 +1,267 @@ +store = $store; + $this->parser = $parser; + $this->loader = $loader; + $this->repository = $repository; + } + + /** + * Create a new dotenv instance. + * + * @param \Dotenv\Repository\RepositoryInterface $repository + * @param string|string[] $paths + * @param string|string[]|null $names + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @return \Dotenv\Dotenv + */ + public static function create(RepositoryInterface $repository, $paths, $names = null, bool $shortCircuit = true, ?string $fileEncoding = null) + { + $builder = $names === null ? StoreBuilder::createWithDefaultName() : StoreBuilder::createWithNoNames(); + + foreach ((array) $paths as $path) { + $builder = $builder->addPath($path); + } + + foreach ((array) $names as $name) { + $builder = $builder->addName($name); + } + + if ($shortCircuit) { + $builder = $builder->shortCircuit(); + } + + return new self($builder->fileEncoding($fileEncoding)->make(), new Parser(), new Loader(), $repository); + } + + /** + * Create a new mutable dotenv instance with default repository. + * + * @param string|string[] $paths + * @param string|string[]|null $names + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @return \Dotenv\Dotenv + */ + public static function createMutable($paths, $names = null, bool $shortCircuit = true, ?string $fileEncoding = null) + { + $repository = RepositoryBuilder::createWithDefaultAdapters()->make(); + + return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding); + } + + /** + * Create a new mutable dotenv instance with default repository with the putenv adapter. + * + * @param string|string[] $paths + * @param string|string[]|null $names + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @return \Dotenv\Dotenv + */ + public static function createUnsafeMutable($paths, $names = null, bool $shortCircuit = true, ?string $fileEncoding = null) + { + $repository = RepositoryBuilder::createWithDefaultAdapters() + ->addAdapter(PutenvAdapter::class) + ->make(); + + return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding); + } + + /** + * Create a new immutable dotenv instance with default repository. + * + * @param string|string[] $paths + * @param string|string[]|null $names + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @return \Dotenv\Dotenv + */ + public static function createImmutable($paths, $names = null, bool $shortCircuit = true, ?string $fileEncoding = null) + { + $repository = RepositoryBuilder::createWithDefaultAdapters()->immutable()->make(); + + return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding); + } + + /** + * Create a new immutable dotenv instance with default repository with the putenv adapter. + * + * @param string|string[] $paths + * @param string|string[]|null $names + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @return \Dotenv\Dotenv + */ + public static function createUnsafeImmutable($paths, $names = null, bool $shortCircuit = true, ?string $fileEncoding = null) + { + $repository = RepositoryBuilder::createWithDefaultAdapters() + ->addAdapter(PutenvAdapter::class) + ->immutable() + ->make(); + + return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding); + } + + /** + * Create a new dotenv instance with an array backed repository. + * + * @param string|string[] $paths + * @param string|string[]|null $names + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @return \Dotenv\Dotenv + */ + public static function createArrayBacked($paths, $names = null, bool $shortCircuit = true, ?string $fileEncoding = null) + { + $repository = RepositoryBuilder::createWithNoAdapters()->addAdapter(ArrayAdapter::class)->make(); + + return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding); + } + + /** + * Parse the given content and resolve nested variables. + * + * This method behaves just like load(), only without mutating your actual + * environment. We do this by using an array backed repository. + * + * @param string $content + * + * @throws \Dotenv\Exception\InvalidFileException + * + * @return array + */ + public static function parse(string $content) + { + $repository = RepositoryBuilder::createWithNoAdapters()->addAdapter(ArrayAdapter::class)->make(); + + $phpdotenv = new self(new StringStore($content), new Parser(), new Loader(), $repository); + + return $phpdotenv->load(); + } + + /** + * Read and load environment file(s). + * + * @throws \Dotenv\Exception\InvalidPathException|\Dotenv\Exception\InvalidEncodingException|\Dotenv\Exception\InvalidFileException + * + * @return array + */ + public function load() + { + $entries = $this->parser->parse($this->store->read()); + + return $this->loader->load($this->repository, $entries); + } + + /** + * Read and load environment file(s), silently failing if no files can be read. + * + * @throws \Dotenv\Exception\InvalidEncodingException|\Dotenv\Exception\InvalidFileException + * + * @return array + */ + public function safeLoad() + { + try { + return $this->load(); + } catch (InvalidPathException $e) { + // suppressing exception + return []; + } + } + + /** + * Required ensures that the specified variables exist, and returns a new validator object. + * + * @param string|string[] $variables + * + * @return \Dotenv\Validator + */ + public function required($variables) + { + return (new Validator($this->repository, (array) $variables))->required(); + } + + /** + * Returns a new validator object that won't check if the specified variables exist. + * + * @param string|string[] $variables + * + * @return \Dotenv\Validator + */ + public function ifPresent($variables) + { + return new Validator($this->repository, (array) $variables); + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Exception/ExceptionInterface.php b/plants/vendor/vlucas/phpdotenv/src/Exception/ExceptionInterface.php new file mode 100644 index 0000000..1e80f53 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Exception/ExceptionInterface.php @@ -0,0 +1,12 @@ + + */ + public function load(RepositoryInterface $repository, array $entries) + { + /** @var array */ + return \array_reduce($entries, static function (array $vars, Entry $entry) use ($repository) { + $name = $entry->getName(); + + $value = $entry->getValue()->map(static function (Value $value) use ($repository) { + return Resolver::resolve($repository, $value); + }); + + if ($value->isDefined()) { + $inner = $value->get(); + if ($repository->set($name, $inner)) { + return \array_merge($vars, [$name => $inner]); + } + } else { + if ($repository->clear($name)) { + return \array_merge($vars, [$name => null]); + } + } + + return $vars; + }, []); + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Loader/LoaderInterface.php b/plants/vendor/vlucas/phpdotenv/src/Loader/LoaderInterface.php new file mode 100644 index 0000000..f40d6ad --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Loader/LoaderInterface.php @@ -0,0 +1,20 @@ + + */ + public function load(RepositoryInterface $repository, array $entries); +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Loader/Resolver.php b/plants/vendor/vlucas/phpdotenv/src/Loader/Resolver.php new file mode 100644 index 0000000..ab5adf8 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Loader/Resolver.php @@ -0,0 +1,65 @@ +getVars(), static function (string $s, int $i) use ($repository) { + return Str::substr($s, 0, $i).self::resolveVariable($repository, Str::substr($s, $i)); + }, $value->getChars()); + } + + /** + * Resolve a single nested variable. + * + * @param \Dotenv\Repository\RepositoryInterface $repository + * @param string $str + * + * @return string + */ + private static function resolveVariable(RepositoryInterface $repository, string $str) + { + return Regex::replaceCallback( + '/\A\${([a-zA-Z0-9_.]+)}/', + static function (array $matches) use ($repository) { + /** @var string */ + return Option::fromValue($repository->get($matches[1]))->getOrElse($matches[0]); + }, + $str, + 1 + )->success()->getOrElse($str); + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Parser/Entry.php b/plants/vendor/vlucas/phpdotenv/src/Parser/Entry.php new file mode 100644 index 0000000..716f422 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Parser/Entry.php @@ -0,0 +1,59 @@ +name = $name; + $this->value = $value; + } + + /** + * Get the entry name. + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Get the entry value. + * + * @return \PhpOption\Option<\Dotenv\Parser\Value> + */ + public function getValue() + { + /** @var \PhpOption\Option<\Dotenv\Parser\Value> */ + return Option::fromValue($this->value); + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Parser/EntryParser.php b/plants/vendor/vlucas/phpdotenv/src/Parser/EntryParser.php new file mode 100644 index 0000000..85e5fa3 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Parser/EntryParser.php @@ -0,0 +1,300 @@ + + */ + public static function parse(string $entry) + { + return self::splitStringIntoParts($entry)->flatMap(static function (array $parts) { + [$name, $value] = $parts; + + return self::parseName($name)->flatMap(static function (string $name) use ($value) { + /** @var Result */ + $parsedValue = $value === null ? Success::create(null) : self::parseValue($value); + + return $parsedValue->map(static function (?Value $value) use ($name) { + return new Entry($name, $value); + }); + }); + }); + } + + /** + * Split the compound string into parts. + * + * @param string $line + * + * @return \GrahamCampbell\ResultType\Result + */ + private static function splitStringIntoParts(string $line) + { + /** @var array{string, string|null} */ + $result = Str::pos($line, '=')->map(static function () use ($line) { + return \array_map('trim', \explode('=', $line, 2)); + })->getOrElse([$line, null]); + + if ($result[0] === '') { + /** @var \GrahamCampbell\ResultType\Result */ + return Error::create(self::getErrorMessage('an unexpected equals', $line)); + } + + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create($result); + } + + /** + * Parse the given variable name. + * + * That is, strip the optional quotes and leading "export" from the + * variable name. We wrap the answer in a result type. + * + * @param string $name + * + * @return \GrahamCampbell\ResultType\Result + */ + private static function parseName(string $name) + { + if (Str::len($name) > 8 && Str::substr($name, 0, 6) === 'export' && \ctype_space(Str::substr($name, 6, 1))) { + $name = \ltrim(Str::substr($name, 6)); + } + + if (self::isQuotedName($name)) { + $name = Str::substr($name, 1, -1); + } + + if (!self::isValidName($name)) { + /** @var \GrahamCampbell\ResultType\Result */ + return Error::create(self::getErrorMessage('an invalid name', $name)); + } + + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create($name); + } + + /** + * Is the given variable name quoted? + * + * @param string $name + * + * @return bool + */ + private static function isQuotedName(string $name) + { + if (Str::len($name) < 3) { + return false; + } + + $first = Str::substr($name, 0, 1); + $last = Str::substr($name, -1, 1); + + return ($first === '"' && $last === '"') || ($first === '\'' && $last === '\''); + } + + /** + * Is the given variable name valid? + * + * @param string $name + * + * @return bool + */ + private static function isValidName(string $name) + { + return Regex::matches('~(*UTF8)\A[\p{Ll}\p{Lu}\p{M}\p{N}_.]+\z~', $name)->success()->getOrElse(false); + } + + /** + * Parse the given variable value. + * + * This has the effect of stripping quotes and comments, dealing with + * special characters, and locating nested variables, but not resolving + * them. Formally, we run a finite state automaton with an output tape: a + * transducer. We wrap the answer in a result type. + * + * @param string $value + * + * @return \GrahamCampbell\ResultType\Result<\Dotenv\Parser\Value, string> + */ + private static function parseValue(string $value) + { + if (\trim($value) === '') { + /** @var \GrahamCampbell\ResultType\Result<\Dotenv\Parser\Value, string> */ + return Success::create(Value::blank()); + } + + return \array_reduce(\iterator_to_array(Lexer::lex($value)), static function (Result $data, string $token) { + return $data->flatMap(static function (array $data) use ($token) { + return self::processToken($data[1], $token)->map(static function (array $val) use ($data) { + return [$data[0]->append($val[0], $val[1]), $val[2]]; + }); + }); + }, Success::create([Value::blank(), self::INITIAL_STATE]))->flatMap(static function (array $result) { + /** @psalm-suppress DocblockTypeContradiction */ + if (in_array($result[1], self::REJECT_STATES, true)) { + /** @var \GrahamCampbell\ResultType\Result<\Dotenv\Parser\Value, string> */ + return Error::create('a missing closing quote'); + } + + /** @var \GrahamCampbell\ResultType\Result<\Dotenv\Parser\Value, string> */ + return Success::create($result[0]); + })->mapError(static function (string $err) use ($value) { + return self::getErrorMessage($err, $value); + }); + } + + /** + * Process the given token. + * + * @param int $state + * @param string $token + * + * @return \GrahamCampbell\ResultType\Result + */ + private static function processToken(int $state, string $token) + { + switch ($state) { + case self::INITIAL_STATE: + if ($token === '\'') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::SINGLE_QUOTED_STATE]); + } elseif ($token === '"') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::DOUBLE_QUOTED_STATE]); + } elseif ($token === '#') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::COMMENT_STATE]); + } elseif ($token === '$') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create([$token, true, self::UNQUOTED_STATE]); + } else { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create([$token, false, self::UNQUOTED_STATE]); + } + case self::UNQUOTED_STATE: + if ($token === '#') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::COMMENT_STATE]); + } elseif (\ctype_space($token)) { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::WHITESPACE_STATE]); + } elseif ($token === '$') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create([$token, true, self::UNQUOTED_STATE]); + } else { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create([$token, false, self::UNQUOTED_STATE]); + } + case self::SINGLE_QUOTED_STATE: + if ($token === '\'') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::WHITESPACE_STATE]); + } else { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create([$token, false, self::SINGLE_QUOTED_STATE]); + } + case self::DOUBLE_QUOTED_STATE: + if ($token === '"') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::WHITESPACE_STATE]); + } elseif ($token === '\\') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::ESCAPE_SEQUENCE_STATE]); + } elseif ($token === '$') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create([$token, true, self::DOUBLE_QUOTED_STATE]); + } else { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create([$token, false, self::DOUBLE_QUOTED_STATE]); + } + case self::ESCAPE_SEQUENCE_STATE: + if ($token === '"' || $token === '\\') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create([$token, false, self::DOUBLE_QUOTED_STATE]); + } elseif ($token === '$') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create([$token, false, self::DOUBLE_QUOTED_STATE]); + } else { + $first = Str::substr($token, 0, 1); + if (\in_array($first, ['f', 'n', 'r', 't', 'v'], true)) { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create([\stripcslashes('\\'.$first).Str::substr($token, 1), false, self::DOUBLE_QUOTED_STATE]); + } else { + /** @var \GrahamCampbell\ResultType\Result */ + return Error::create('an unexpected escape sequence'); + } + } + case self::WHITESPACE_STATE: + if ($token === '#') { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::COMMENT_STATE]); + } elseif (!\ctype_space($token)) { + /** @var \GrahamCampbell\ResultType\Result */ + return Error::create('unexpected whitespace'); + } else { + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::WHITESPACE_STATE]); + } + case self::COMMENT_STATE: + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create(['', false, self::COMMENT_STATE]); + default: + throw new \Error('Parser entered invalid state.'); + } + } + + /** + * Generate a friendly error message. + * + * @param string $cause + * @param string $subject + * + * @return string + */ + private static function getErrorMessage(string $cause, string $subject) + { + return \sprintf( + 'Encountered %s at [%s].', + $cause, + \strtok($subject, "\n") + ); + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Parser/Lexer.php b/plants/vendor/vlucas/phpdotenv/src/Parser/Lexer.php new file mode 100644 index 0000000..981af24 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Parser/Lexer.php @@ -0,0 +1,58 @@ + + */ + public static function lex(string $content) + { + static $regex; + + if ($regex === null) { + $regex = '(('.\implode(')|(', self::PATTERNS).'))A'; + } + + $offset = 0; + + while (isset($content[$offset])) { + if (!\preg_match($regex, $content, $matches, 0, $offset)) { + throw new \Error(\sprintf('Lexer encountered unexpected character [%s].', $content[$offset])); + } + + $offset += \strlen($matches[0]); + + yield $matches[0]; + } + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Parser/Lines.php b/plants/vendor/vlucas/phpdotenv/src/Parser/Lines.php new file mode 100644 index 0000000..b3af160 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Parser/Lines.php @@ -0,0 +1,127 @@ +map(static function () use ($line) { + return self::looksLikeMultilineStop($line, true) === false; + })->getOrElse(false); + } + + /** + * Determine if the given line can be the start of a multiline variable. + * + * @param string $line + * @param bool $started + * + * @return bool + */ + private static function looksLikeMultilineStop(string $line, bool $started) + { + if ($line === '"') { + return true; + } + + return Regex::occurrences('/(?=([^\\\\]"))/', \str_replace('\\\\', '', $line))->map(static function (int $count) use ($started) { + return $started ? $count > 1 : $count >= 1; + })->success()->getOrElse(false); + } + + /** + * Determine if the line in the file is a comment or whitespace. + * + * @param string $line + * + * @return bool + */ + private static function isCommentOrWhitespace(string $line) + { + $line = \trim($line); + + return $line === '' || (isset($line[0]) && $line[0] === '#'); + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Parser/Parser.php b/plants/vendor/vlucas/phpdotenv/src/Parser/Parser.php new file mode 100644 index 0000000..bca8ec5 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Parser/Parser.php @@ -0,0 +1,53 @@ +mapError(static function () { + return 'Could not split into separate lines.'; + })->flatMap(static function (array $lines) { + return self::process(Lines::process($lines)); + })->mapError(static function (string $error) { + throw new InvalidFileException(\sprintf('Failed to parse dotenv file. %s', $error)); + })->success()->get(); + } + + /** + * Convert the raw entries into proper entries. + * + * @param string[] $entries + * + * @return \GrahamCampbell\ResultType\Result<\Dotenv\Parser\Entry[], string> + */ + private static function process(array $entries) + { + /** @var \GrahamCampbell\ResultType\Result<\Dotenv\Parser\Entry[], string> */ + return \array_reduce($entries, static function (Result $result, string $raw) { + return $result->flatMap(static function (array $entries) use ($raw) { + return EntryParser::parse($raw)->map(static function (Entry $entry) use ($entries) { + /** @var \Dotenv\Parser\Entry[] */ + return \array_merge($entries, [$entry]); + }); + }); + }, Success::create([])); + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Parser/ParserInterface.php b/plants/vendor/vlucas/phpdotenv/src/Parser/ParserInterface.php new file mode 100644 index 0000000..17cc42a --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Parser/ParserInterface.php @@ -0,0 +1,19 @@ +chars = $chars; + $this->vars = $vars; + } + + /** + * Create an empty value instance. + * + * @return \Dotenv\Parser\Value + */ + public static function blank() + { + return new self('', []); + } + + /** + * Create a new value instance, appending the characters. + * + * @param string $chars + * @param bool $var + * + * @return \Dotenv\Parser\Value + */ + public function append(string $chars, bool $var) + { + return new self( + $this->chars.$chars, + $var ? \array_merge($this->vars, [Str::len($this->chars)]) : $this->vars + ); + } + + /** + * Get the string representation of the parsed value. + * + * @return string + */ + public function getChars() + { + return $this->chars; + } + + /** + * Get the locations of the variables in the value. + * + * @return int[] + */ + public function getVars() + { + $vars = $this->vars; + + \rsort($vars); + + return $vars; + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/AdapterInterface.php b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/AdapterInterface.php new file mode 100644 index 0000000..5604398 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/AdapterInterface.php @@ -0,0 +1,15 @@ + + */ + public static function create(); +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.php b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.php new file mode 100644 index 0000000..af0aae1 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.php @@ -0,0 +1,89 @@ + + */ + public static function create() + { + if (self::isSupported()) { + /** @var \PhpOption\Option */ + return Some::create(new self()); + } + + return None::create(); + } + + /** + * Determines if the adapter is supported. + * + * This happens if PHP is running as an Apache module. + * + * @return bool + */ + private static function isSupported() + { + return \function_exists('apache_getenv') && \function_exists('apache_setenv'); + } + + /** + * Read an environment variable, if it exists. + * + * @param non-empty-string $name + * + * @return \PhpOption\Option + */ + public function read(string $name) + { + /** @var \PhpOption\Option */ + return Option::fromValue(apache_getenv($name))->filter(static function ($value) { + return \is_string($value) && $value !== ''; + }); + } + + /** + * Write to an environment variable, if possible. + * + * @param non-empty-string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + return apache_setenv($name, $value); + } + + /** + * Delete an environment variable, if possible. + * + * @param non-empty-string $name + * + * @return bool + */ + public function delete(string $name) + { + return apache_setenv($name, ''); + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php new file mode 100644 index 0000000..7c3740d --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php @@ -0,0 +1,80 @@ + + */ + private $variables; + + /** + * Create a new array adapter instance. + * + * @return void + */ + private function __construct() + { + $this->variables = []; + } + + /** + * Create a new instance of the adapter, if it is available. + * + * @return \PhpOption\Option<\Dotenv\Repository\Adapter\AdapterInterface> + */ + public static function create() + { + /** @var \PhpOption\Option */ + return Some::create(new self()); + } + + /** + * Read an environment variable, if it exists. + * + * @param non-empty-string $name + * + * @return \PhpOption\Option + */ + public function read(string $name) + { + return Option::fromArraysValue($this->variables, $name); + } + + /** + * Write to an environment variable, if possible. + * + * @param non-empty-string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + $this->variables[$name] = $value; + + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param non-empty-string $name + * + * @return bool + */ + public function delete(string $name) + { + unset($this->variables[$name]); + + return true; + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php new file mode 100644 index 0000000..9eb1947 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php @@ -0,0 +1,89 @@ + + */ + public static function create() + { + /** @var \PhpOption\Option */ + return Some::create(new self()); + } + + /** + * Read an environment variable, if it exists. + * + * @param non-empty-string $name + * + * @return \PhpOption\Option + */ + public function read(string $name) + { + /** @var \PhpOption\Option */ + return Option::fromArraysValue($_ENV, $name) + ->filter(static function ($value) { + return \is_scalar($value); + }) + ->map(static function ($value) { + if ($value === false) { + return 'false'; + } + + if ($value === true) { + return 'true'; + } + + /** @psalm-suppress PossiblyInvalidCast */ + return (string) $value; + }); + } + + /** + * Write to an environment variable, if possible. + * + * @param non-empty-string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + $_ENV[$name] = $value; + + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param non-empty-string $name + * + * @return bool + */ + public function delete(string $name) + { + unset($_ENV[$name]); + + return true; + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/GuardedWriter.php b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/GuardedWriter.php new file mode 100644 index 0000000..fed8b9b --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/GuardedWriter.php @@ -0,0 +1,85 @@ +writer = $writer; + $this->allowList = $allowList; + } + + /** + * Write to an environment variable, if possible. + * + * @param non-empty-string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + // Don't set non-allowed variables + if (!$this->isAllowed($name)) { + return false; + } + + // Set the value on the inner writer + return $this->writer->write($name, $value); + } + + /** + * Delete an environment variable, if possible. + * + * @param non-empty-string $name + * + * @return bool + */ + public function delete(string $name) + { + // Don't clear non-allowed variables + if (!$this->isAllowed($name)) { + return false; + } + + // Set the value on the inner writer + return $this->writer->delete($name); + } + + /** + * Determine if the given variable is allowed. + * + * @param non-empty-string $name + * + * @return bool + */ + private function isAllowed(string $name) + { + return \in_array($name, $this->allowList, true); + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ImmutableWriter.php b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ImmutableWriter.php new file mode 100644 index 0000000..3b279b8 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ImmutableWriter.php @@ -0,0 +1,110 @@ + + */ + private $loaded; + + /** + * Create a new immutable writer instance. + * + * @param \Dotenv\Repository\Adapter\WriterInterface $writer + * @param \Dotenv\Repository\Adapter\ReaderInterface $reader + * + * @return void + */ + public function __construct(WriterInterface $writer, ReaderInterface $reader) + { + $this->writer = $writer; + $this->reader = $reader; + $this->loaded = []; + } + + /** + * Write to an environment variable, if possible. + * + * @param non-empty-string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + // Don't overwrite existing environment variables + // Ruby's dotenv does this with `ENV[key] ||= value` + if ($this->isExternallyDefined($name)) { + return false; + } + + // Set the value on the inner writer + if (!$this->writer->write($name, $value)) { + return false; + } + + // Record that we have loaded the variable + $this->loaded[$name] = ''; + + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param non-empty-string $name + * + * @return bool + */ + public function delete(string $name) + { + // Don't clear existing environment variables + if ($this->isExternallyDefined($name)) { + return false; + } + + // Clear the value on the inner writer + if (!$this->writer->delete($name)) { + return false; + } + + // Leave the variable as fair game + unset($this->loaded[$name]); + + return true; + } + + /** + * Determine if the given variable is externally defined. + * + * That is, is it an "existing" variable. + * + * @param non-empty-string $name + * + * @return bool + */ + private function isExternallyDefined(string $name) + { + return $this->reader->read($name)->isDefined() && !isset($this->loaded[$name]); + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiReader.php b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiReader.php new file mode 100644 index 0000000..0cfda6f --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiReader.php @@ -0,0 +1,48 @@ +readers = $readers; + } + + /** + * Read an environment variable, if it exists. + * + * @param non-empty-string $name + * + * @return \PhpOption\Option + */ + public function read(string $name) + { + foreach ($this->readers as $reader) { + $result = $reader->read($name); + if ($result->isDefined()) { + return $result; + } + } + + return None::create(); + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiWriter.php b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiWriter.php new file mode 100644 index 0000000..15a9d8f --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiWriter.php @@ -0,0 +1,64 @@ +writers = $writers; + } + + /** + * Write to an environment variable, if possible. + * + * @param non-empty-string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + foreach ($this->writers as $writers) { + if (!$writers->write($name, $value)) { + return false; + } + } + + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param non-empty-string $name + * + * @return bool + */ + public function delete(string $name) + { + foreach ($this->writers as $writers) { + if (!$writers->delete($name)) { + return false; + } + } + + return true; + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php new file mode 100644 index 0000000..6d017cd --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php @@ -0,0 +1,91 @@ + + */ + public static function create() + { + if (self::isSupported()) { + /** @var \PhpOption\Option */ + return Some::create(new self()); + } + + return None::create(); + } + + /** + * Determines if the adapter is supported. + * + * @return bool + */ + private static function isSupported() + { + return \function_exists('getenv') && \function_exists('putenv'); + } + + /** + * Read an environment variable, if it exists. + * + * @param non-empty-string $name + * + * @return \PhpOption\Option + */ + public function read(string $name) + { + /** @var \PhpOption\Option */ + return Option::fromValue(\getenv($name), false)->filter(static function ($value) { + return \is_string($value); + }); + } + + /** + * Write to an environment variable, if possible. + * + * @param non-empty-string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + \putenv("$name=$value"); + + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param non-empty-string $name + * + * @return bool + */ + public function delete(string $name) + { + \putenv($name); + + return true; + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php new file mode 100644 index 0000000..306a63f --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php @@ -0,0 +1,17 @@ + + */ + public function read(string $name); +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReplacingWriter.php b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReplacingWriter.php new file mode 100644 index 0000000..4c92a4f --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReplacingWriter.php @@ -0,0 +1,104 @@ + + */ + private $seen; + + /** + * Create a new replacement writer instance. + * + * @param \Dotenv\Repository\Adapter\WriterInterface $writer + * @param \Dotenv\Repository\Adapter\ReaderInterface $reader + * + * @return void + */ + public function __construct(WriterInterface $writer, ReaderInterface $reader) + { + $this->writer = $writer; + $this->reader = $reader; + $this->seen = []; + } + + /** + * Write to an environment variable, if possible. + * + * @param non-empty-string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + if ($this->exists($name)) { + return $this->writer->write($name, $value); + } + + // succeed if nothing to do + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param non-empty-string $name + * + * @return bool + */ + public function delete(string $name) + { + if ($this->exists($name)) { + return $this->writer->delete($name); + } + + // succeed if nothing to do + return true; + } + + /** + * Does the given environment variable exist. + * + * Returns true if it currently exists, or existed at any point in the past + * that we are aware of. + * + * @param non-empty-string $name + * + * @return bool + */ + private function exists(string $name) + { + if (isset($this->seen[$name])) { + return true; + } + + if ($this->reader->read($name)->isDefined()) { + $this->seen[$name] = ''; + + return true; + } + + return false; + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php new file mode 100644 index 0000000..f93b6e5 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php @@ -0,0 +1,89 @@ + + */ + public static function create() + { + /** @var \PhpOption\Option */ + return Some::create(new self()); + } + + /** + * Read an environment variable, if it exists. + * + * @param non-empty-string $name + * + * @return \PhpOption\Option + */ + public function read(string $name) + { + /** @var \PhpOption\Option */ + return Option::fromArraysValue($_SERVER, $name) + ->filter(static function ($value) { + return \is_scalar($value); + }) + ->map(static function ($value) { + if ($value === false) { + return 'false'; + } + + if ($value === true) { + return 'true'; + } + + /** @psalm-suppress PossiblyInvalidCast */ + return (string) $value; + }); + } + + /** + * Write to an environment variable, if possible. + * + * @param non-empty-string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + $_SERVER[$name] = $value; + + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param non-empty-string $name + * + * @return bool + */ + public function delete(string $name) + { + unset($_SERVER[$name]); + + return true; + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php new file mode 100644 index 0000000..4cb3d61 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php @@ -0,0 +1,27 @@ +reader = $reader; + $this->writer = $writer; + } + + /** + * Determine if the given environment variable is defined. + * + * @param string $name + * + * @return bool + */ + public function has(string $name) + { + return '' !== $name && $this->reader->read($name)->isDefined(); + } + + /** + * Get an environment variable. + * + * @param string $name + * + * @throws \InvalidArgumentException + * + * @return string|null + */ + public function get(string $name) + { + if ('' === $name) { + throw new InvalidArgumentException('Expected name to be a non-empty string.'); + } + + return $this->reader->read($name)->getOrElse(null); + } + + /** + * Set an environment variable. + * + * @param string $name + * @param string $value + * + * @throws \InvalidArgumentException + * + * @return bool + */ + public function set(string $name, string $value) + { + if ('' === $name) { + throw new InvalidArgumentException('Expected name to be a non-empty string.'); + } + + return $this->writer->write($name, $value); + } + + /** + * Clear an environment variable. + * + * @param string $name + * + * @throws \InvalidArgumentException + * + * @return bool + */ + public function clear(string $name) + { + if ('' === $name) { + throw new InvalidArgumentException('Expected name to be a non-empty string.'); + } + + return $this->writer->delete($name); + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Repository/RepositoryBuilder.php b/plants/vendor/vlucas/phpdotenv/src/Repository/RepositoryBuilder.php new file mode 100644 index 0000000..7607924 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Repository/RepositoryBuilder.php @@ -0,0 +1,272 @@ +readers = $readers; + $this->writers = $writers; + $this->immutable = $immutable; + $this->allowList = $allowList; + } + + /** + * Create a new repository builder instance with no adapters added. + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public static function createWithNoAdapters() + { + return new self(); + } + + /** + * Create a new repository builder instance with the default adapters added. + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public static function createWithDefaultAdapters() + { + $adapters = \iterator_to_array(self::defaultAdapters()); + + return new self($adapters, $adapters); + } + + /** + * Return the array of default adapters. + * + * @return \Generator<\Dotenv\Repository\Adapter\AdapterInterface> + */ + private static function defaultAdapters() + { + foreach (self::DEFAULT_ADAPTERS as $adapter) { + $instance = $adapter::create(); + if ($instance->isDefined()) { + yield $instance->get(); + } + } + } + + /** + * Determine if the given name if of an adapterclass. + * + * @param string $name + * + * @return bool + */ + private static function isAnAdapterClass(string $name) + { + if (!\class_exists($name)) { + return false; + } + + return (new ReflectionClass($name))->implementsInterface(AdapterInterface::class); + } + + /** + * Creates a repository builder with the given reader added. + * + * Accepts either a reader instance, or a class-string for an adapter. If + * the adapter is not supported, then we silently skip adding it. + * + * @param \Dotenv\Repository\Adapter\ReaderInterface|string $reader + * + * @throws \InvalidArgumentException + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public function addReader($reader) + { + if (!(\is_string($reader) && self::isAnAdapterClass($reader)) && !($reader instanceof ReaderInterface)) { + throw new InvalidArgumentException( + \sprintf( + 'Expected either an instance of %s or a class-string implementing %s', + ReaderInterface::class, + AdapterInterface::class + ) + ); + } + + $optional = Some::create($reader)->flatMap(static function ($reader) { + return \is_string($reader) ? $reader::create() : Some::create($reader); + }); + + $readers = \array_merge($this->readers, \iterator_to_array($optional)); + + return new self($readers, $this->writers, $this->immutable, $this->allowList); + } + + /** + * Creates a repository builder with the given writer added. + * + * Accepts either a writer instance, or a class-string for an adapter. If + * the adapter is not supported, then we silently skip adding it. + * + * @param \Dotenv\Repository\Adapter\WriterInterface|string $writer + * + * @throws \InvalidArgumentException + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public function addWriter($writer) + { + if (!(\is_string($writer) && self::isAnAdapterClass($writer)) && !($writer instanceof WriterInterface)) { + throw new InvalidArgumentException( + \sprintf( + 'Expected either an instance of %s or a class-string implementing %s', + WriterInterface::class, + AdapterInterface::class + ) + ); + } + + $optional = Some::create($writer)->flatMap(static function ($writer) { + return \is_string($writer) ? $writer::create() : Some::create($writer); + }); + + $writers = \array_merge($this->writers, \iterator_to_array($optional)); + + return new self($this->readers, $writers, $this->immutable, $this->allowList); + } + + /** + * Creates a repository builder with the given adapter added. + * + * Accepts either an adapter instance, or a class-string for an adapter. If + * the adapter is not supported, then we silently skip adding it. We will + * add the adapter as both a reader and a writer. + * + * @param \Dotenv\Repository\Adapter\WriterInterface|string $adapter + * + * @throws \InvalidArgumentException + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public function addAdapter($adapter) + { + if (!(\is_string($adapter) && self::isAnAdapterClass($adapter)) && !($adapter instanceof AdapterInterface)) { + throw new InvalidArgumentException( + \sprintf( + 'Expected either an instance of %s or a class-string implementing %s', + WriterInterface::class, + AdapterInterface::class + ) + ); + } + + $optional = Some::create($adapter)->flatMap(static function ($adapter) { + return \is_string($adapter) ? $adapter::create() : Some::create($adapter); + }); + + $readers = \array_merge($this->readers, \iterator_to_array($optional)); + $writers = \array_merge($this->writers, \iterator_to_array($optional)); + + return new self($readers, $writers, $this->immutable, $this->allowList); + } + + /** + * Creates a repository builder with mutability enabled. + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public function immutable() + { + return new self($this->readers, $this->writers, true, $this->allowList); + } + + /** + * Creates a repository builder with the given allow list. + * + * @param string[]|null $allowList + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public function allowList(?array $allowList = null) + { + return new self($this->readers, $this->writers, $this->immutable, $allowList); + } + + /** + * Creates a new repository instance. + * + * @return \Dotenv\Repository\RepositoryInterface + */ + public function make() + { + $reader = new MultiReader($this->readers); + $writer = new MultiWriter($this->writers); + + if ($this->immutable) { + $writer = new ImmutableWriter($writer, $reader); + } + + if ($this->allowList !== null) { + $writer = new GuardedWriter($writer, $this->allowList); + } + + return new AdapterRepository($reader, $writer); + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Repository/RepositoryInterface.php b/plants/vendor/vlucas/phpdotenv/src/Repository/RepositoryInterface.php new file mode 100644 index 0000000..d9b18a4 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Repository/RepositoryInterface.php @@ -0,0 +1,51 @@ + + */ + public static function read(array $filePaths, bool $shortCircuit = true, ?string $fileEncoding = null) + { + $output = []; + + foreach ($filePaths as $filePath) { + $content = self::readFromFile($filePath, $fileEncoding); + if ($content->isDefined()) { + $output[$filePath] = $content->get(); + if ($shortCircuit) { + break; + } + } + } + + return $output; + } + + /** + * Read the given file. + * + * @param string $path + * @param string|null $encoding + * + * @throws \Dotenv\Exception\InvalidEncodingException + * + * @return \PhpOption\Option + */ + private static function readFromFile(string $path, ?string $encoding = null) + { + /** @var Option */ + $content = Option::fromValue(@\file_get_contents($path), false); + + return $content->flatMap(static function (string $content) use ($encoding) { + return Str::utf8($content, $encoding)->mapError(static function (string $error) { + throw new InvalidEncodingException($error); + })->success(); + }); + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Store/FileStore.php b/plants/vendor/vlucas/phpdotenv/src/Store/FileStore.php new file mode 100644 index 0000000..e7a4d3f --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Store/FileStore.php @@ -0,0 +1,72 @@ +filePaths = $filePaths; + $this->shortCircuit = $shortCircuit; + $this->fileEncoding = $fileEncoding; + } + + /** + * Read the content of the environment file(s). + * + * @throws \Dotenv\Exception\InvalidEncodingException|\Dotenv\Exception\InvalidPathException + * + * @return string + */ + public function read() + { + if ($this->filePaths === []) { + throw new InvalidPathException('At least one environment file path must be provided.'); + } + + $contents = Reader::read($this->filePaths, $this->shortCircuit, $this->fileEncoding); + + if (\count($contents) > 0) { + return \implode("\n", $contents); + } + + throw new InvalidPathException( + \sprintf('Unable to read any of the environment file(s) at [%s].', \implode(', ', $this->filePaths)) + ); + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Store/StoreBuilder.php b/plants/vendor/vlucas/phpdotenv/src/Store/StoreBuilder.php new file mode 100644 index 0000000..2ce0851 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Store/StoreBuilder.php @@ -0,0 +1,141 @@ +paths = $paths; + $this->names = $names; + $this->shortCircuit = $shortCircuit; + $this->fileEncoding = $fileEncoding; + } + + /** + * Create a new store builder instance with no names. + * + * @return \Dotenv\Store\StoreBuilder + */ + public static function createWithNoNames() + { + return new self(); + } + + /** + * Create a new store builder instance with the default name. + * + * @return \Dotenv\Store\StoreBuilder + */ + public static function createWithDefaultName() + { + return new self([], [self::DEFAULT_NAME]); + } + + /** + * Creates a store builder with the given path added. + * + * @param string $path + * + * @return \Dotenv\Store\StoreBuilder + */ + public function addPath(string $path) + { + return new self(\array_merge($this->paths, [$path]), $this->names, $this->shortCircuit, $this->fileEncoding); + } + + /** + * Creates a store builder with the given name added. + * + * @param string $name + * + * @return \Dotenv\Store\StoreBuilder + */ + public function addName(string $name) + { + return new self($this->paths, \array_merge($this->names, [$name]), $this->shortCircuit, $this->fileEncoding); + } + + /** + * Creates a store builder with short circuit mode enabled. + * + * @return \Dotenv\Store\StoreBuilder + */ + public function shortCircuit() + { + return new self($this->paths, $this->names, true, $this->fileEncoding); + } + + /** + * Creates a store builder with the specified file encoding. + * + * @param string|null $fileEncoding + * + * @return \Dotenv\Store\StoreBuilder + */ + public function fileEncoding(?string $fileEncoding = null) + { + return new self($this->paths, $this->names, $this->shortCircuit, $fileEncoding); + } + + /** + * Creates a new store instance. + * + * @return \Dotenv\Store\StoreInterface + */ + public function make() + { + return new FileStore( + Paths::filePaths($this->paths, $this->names), + $this->shortCircuit, + $this->fileEncoding + ); + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Store/StoreInterface.php b/plants/vendor/vlucas/phpdotenv/src/Store/StoreInterface.php new file mode 100644 index 0000000..6f5b986 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Store/StoreInterface.php @@ -0,0 +1,17 @@ +content = $content; + } + + /** + * Read the content of the environment file(s). + * + * @return string + */ + public function read() + { + return $this->content; + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Util/Regex.php b/plants/vendor/vlucas/phpdotenv/src/Util/Regex.php new file mode 100644 index 0000000..599f09c --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Util/Regex.php @@ -0,0 +1,112 @@ + + */ + public static function matches(string $pattern, string $subject) + { + return self::pregAndWrap(static function (string $subject) use ($pattern) { + return @\preg_match($pattern, $subject) === 1; + }, $subject); + } + + /** + * Perform a preg match all, wrapping up the result. + * + * @param string $pattern + * @param string $subject + * + * @return \GrahamCampbell\ResultType\Result + */ + public static function occurrences(string $pattern, string $subject) + { + return self::pregAndWrap(static function (string $subject) use ($pattern) { + return (int) @\preg_match_all($pattern, $subject); + }, $subject); + } + + /** + * Perform a preg replace callback, wrapping up the result. + * + * @param string $pattern + * @param callable(string[]): string $callback + * @param string $subject + * @param int|null $limit + * + * @return \GrahamCampbell\ResultType\Result + */ + public static function replaceCallback(string $pattern, callable $callback, string $subject, ?int $limit = null) + { + return self::pregAndWrap(static function (string $subject) use ($pattern, $callback, $limit) { + return (string) @\preg_replace_callback($pattern, $callback, $subject, $limit ?? -1); + }, $subject); + } + + /** + * Perform a preg split, wrapping up the result. + * + * @param string $pattern + * @param string $subject + * + * @return \GrahamCampbell\ResultType\Result + */ + public static function split(string $pattern, string $subject) + { + return self::pregAndWrap(static function (string $subject) use ($pattern) { + /** @var string[] */ + return (array) @\preg_split($pattern, $subject); + }, $subject); + } + + /** + * Perform a preg operation, wrapping up the result. + * + * @template V + * + * @param callable(string): V $operation + * @param string $subject + * + * @return \GrahamCampbell\ResultType\Result + */ + private static function pregAndWrap(callable $operation, string $subject) + { + $result = $operation($subject); + + if (\preg_last_error() !== \PREG_NO_ERROR) { + /** @var \GrahamCampbell\ResultType\Result */ + return Error::create(\preg_last_error_msg()); + } + + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create($result); + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Util/Str.php b/plants/vendor/vlucas/phpdotenv/src/Util/Str.php new file mode 100644 index 0000000..b113d78 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Util/Str.php @@ -0,0 +1,108 @@ + + */ + public static function utf8(string $input, ?string $encoding = null) + { + if ($encoding !== null && !\in_array($encoding, \mb_list_encodings(), true)) { + /** @var \GrahamCampbell\ResultType\Result */ + return Error::create( + \sprintf('Illegal character encoding [%s] specified.', $encoding) + ); + } + + $converted = $encoding === null ? + @\mb_convert_encoding($input, 'UTF-8') : + @\mb_convert_encoding($input, 'UTF-8', $encoding); + + if (!is_string($converted)) { + /** @var \GrahamCampbell\ResultType\Result */ + return Error::create( + \sprintf('Conversion from encoding [%s] failed.', $encoding ?? 'NULL') + ); + } + + /** + * this is for support UTF-8 with BOM encoding + * @see https://en.wikipedia.org/wiki/Byte_order_mark + * @see https://github.com/vlucas/phpdotenv/issues/500 + */ + if (\substr($converted, 0, 3) == "\xEF\xBB\xBF") { + $converted = \substr($converted, 3); + } + + /** @var \GrahamCampbell\ResultType\Result */ + return Success::create($converted); + } + + /** + * Search for a given substring of the input. + * + * @param string $haystack + * @param string $needle + * + * @return \PhpOption\Option + */ + public static function pos(string $haystack, string $needle) + { + /** @var \PhpOption\Option */ + return Option::fromValue(\mb_strpos($haystack, $needle, 0, 'UTF-8'), false); + } + + /** + * Grab the specified substring of the input. + * + * @param string $input + * @param int $start + * @param int|null $length + * + * @return string + */ + public static function substr(string $input, int $start, ?int $length = null) + { + return \mb_substr($input, $start, $length, 'UTF-8'); + } + + /** + * Compute the length of the given string. + * + * @param string $input + * + * @return int + */ + public static function len(string $input) + { + return \mb_strlen($input, 'UTF-8'); + } +} diff --git a/plants/vendor/vlucas/phpdotenv/src/Validator.php b/plants/vendor/vlucas/phpdotenv/src/Validator.php new file mode 100644 index 0000000..d5580c7 --- /dev/null +++ b/plants/vendor/vlucas/phpdotenv/src/Validator.php @@ -0,0 +1,207 @@ +repository = $repository; + $this->variables = $variables; + } + + /** + * Assert that each variable is present. + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function required() + { + return $this->assert( + static function (?string $value) { + return $value !== null; + }, + 'is missing' + ); + } + + /** + * Assert that each variable is not empty. + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function notEmpty() + { + return $this->assertNullable( + static function (string $value) { + return Str::len(\trim($value)) > 0; + }, + 'is empty' + ); + } + + /** + * Assert that each specified variable is an integer. + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function isInteger() + { + return $this->assertNullable( + static function (string $value) { + return \ctype_digit($value); + }, + 'is not an integer' + ); + } + + /** + * Assert that each specified variable is a boolean. + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function isBoolean() + { + return $this->assertNullable( + static function (string $value) { + if ($value === '') { + return false; + } + + return \filter_var($value, \FILTER_VALIDATE_BOOLEAN, \FILTER_NULL_ON_FAILURE) !== null; + }, + 'is not a boolean' + ); + } + + /** + * Assert that each variable is amongst the given choices. + * + * @param string[] $choices + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function allowedValues(array $choices) + { + return $this->assertNullable( + static function (string $value) use ($choices) { + return \in_array($value, $choices, true); + }, + \sprintf('is not one of [%s]', \implode(', ', $choices)) + ); + } + + /** + * Assert that each variable matches the given regular expression. + * + * @param string $regex + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function allowedRegexValues(string $regex) + { + return $this->assertNullable( + static function (string $value) use ($regex) { + return Regex::matches($regex, $value)->success()->getOrElse(false); + }, + \sprintf('does not match "%s"', $regex) + ); + } + + /** + * Assert that the callback returns true for each variable. + * + * @param callable(?string):bool $callback + * @param string $message + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function assert(callable $callback, string $message) + { + $failing = []; + + foreach ($this->variables as $variable) { + if ($callback($this->repository->get($variable)) === false) { + $failing[] = \sprintf('%s %s', $variable, $message); + } + } + + if (\count($failing) > 0) { + throw new ValidationException(\sprintf( + 'One or more environment variables failed assertions: %s.', + \implode(', ', $failing) + )); + } + + return $this; + } + + /** + * Assert that the callback returns true for each variable. + * + * Skip checking null variable values. + * + * @param callable(string):bool $callback + * @param string $message + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function assertNullable(callable $callback, string $message) + { + return $this->assert( + static function (?string $value) use ($callback) { + if ($value === null) { + return true; + } + + return $callback($value); + }, + $message + ); + } +} diff --git a/storymachine/.env.example b/storymachine/.env.example new file mode 100644 index 0000000..c094e45 --- /dev/null +++ b/storymachine/.env.example @@ -0,0 +1 @@ +GEMINI_API_KEY="your_gemini_api_key_here" diff --git a/storymachine/api_proxy.php b/storymachine/api_proxy.php new file mode 100644 index 0000000..b05812b --- /dev/null +++ b/storymachine/api_proxy.php @@ -0,0 +1,99 @@ + + 'Nur POST-Anfragen sind erlaubt.']); + exit; +} + +// 3. API-Schlüssel sicher aus .env laden +$apiKey = ''; +$envFiles = [__DIR__ . '/.env', __DIR__ . '/../home/.env']; +foreach ($envFiles as $envFile) { + if (file_exists($envFile)) { + foreach (file($envFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $line) { + $line = trim($line); + if ($line === '' || $line[0] === '#') continue; + if (strpos($line, '=') !== false) { + list($k, $v) = explode('=', $line, 2); + if (trim($k) === 'GEMINI_API_KEY') { + $apiKey = trim(trim($v), '"\''); + break 2; + } + } + } + } +} + +if (empty($apiKey)) { + http_response_code(500); + echo json_encode(['error' => 'API-Schlüssel nicht konfiguriert.']); + exit; +} + +// 4. Lese die JSON-Daten, die vom Frontend (JavaScript) gesendet wurden. +$json_input = file_get_contents('php://input'); +$request_data = json_decode($json_input, true); + +// Überprüfen, ob die Daten korrekt sind +if (json_last_error() !== JSON_ERROR_NONE || !isset($request_data['apiUrl']) || !isset($request_data['payload'])) { + http_response_code(400); // Bad Request + echo json_encode(['error' => 'Ungültige Anfrage-Daten.']); + exit; +} + +$apiUrl = $request_data['apiUrl']; +$payload = $request_data['payload']; + +// SSRF-Schutz: Nur generativelanguage.googleapis.com erlauben +$parsed = parse_url($apiUrl); +if (!isset($parsed['host']) || $parsed['host'] !== 'generativelanguage.googleapis.com') { + http_response_code(403); + echo json_encode(['error' => 'Ungültiges API-Ziel.']); + exit; +} + +// 5. Baue die vollständige URL für die Google API zusammen. +$fullApiUrl = $apiUrl . '?key=' . $apiKey; + +// 6. Sende die Anfrage mit cURL an die Google API (Standardmethode in PHP). +$ch = curl_init(); + +curl_setopt_array($ch, [ + CURLOPT_URL => $fullApiUrl, + CURLOPT_RETURNTRANSFER => true, // Gib die Antwort als String zurück + CURLOPT_POST => true, // Es ist eine POST-Anfrage + CURLOPT_POSTFIELDS => json_encode($payload), // Der JSON-Body der Anfrage + CURLOPT_HTTPHEADER => [ // Wichtige Header setzen + 'Content-Type: application/json', + ], +]); + +// Führe die Anfrage aus +$response_body = curl_exec($ch); +$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); // Hole den HTTP-Statuscode der Antwort + +// Prüfe auf Fehler bei der cURL-Anfrage selbst +if (curl_errno($ch)) { + http_response_code(500); + echo json_encode(['error' => 'Fehler bei der Weiterleitung der Anfrage: ' . curl_error($ch)]); + exit; +} + +curl_close($ch); + +// 7. Leite die Antwort von Google direkt an dein Frontend weiter. +// Setze den HTTP-Statuscode auf den gleichen, den wir von Google bekommen haben. +http_response_code($http_code); +echo $response_body; + +?> \ No newline at end of file diff --git a/storymachine/index.php b/storymachine/index.php new file mode 100644 index 0000000..29be0f0 --- /dev/null +++ b/storymachine/index.php @@ -0,0 +1,877 @@ + + + + + + + + Deine magische Geschichten-Maschine + + + + + + + + + + + + + +
+ +
+

+ Die magische Geschichten-Maschine +

+ +
+ +
+

Für wen ist die Geschichte?

+
+ + + + +
+
+ +
+

Wähle aus, worum es gehen soll!

+
+
+

👆 Wähle zuerst eine Altersgruppe aus, um Ideen zu laden!

+
+ +
+
+ +
+ + +
+
+ + + + +
+ + + + + \ No newline at end of file diff --git a/test/index.html b/test/index.html new file mode 100644 index 0000000..090d6b2 --- /dev/null +++ b/test/index.html @@ -0,0 +1,22 @@ + + + + + + Test Projekt + + +

Zugriff gewährt!

+

Willkommen im Test-Projekt, .

+ + \ No newline at end of file diff --git a/test/index.php b/test/index.php new file mode 100644 index 0000000..090d6b2 --- /dev/null +++ b/test/index.php @@ -0,0 +1,22 @@ + + + + + + Test Projekt + + +

Zugriff gewährt!

+

Willkommen im Test-Projekt, .

+ + \ No newline at end of file